Token Sunflower Land

 

Overview ERC-721

Total Supply:
156,045 SL

Holders:
146,903 addresses
 
Balance
1 SL
0x1b79f876ef30a0a1b469f97b0d186bdc03464ffe
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SunflowerLand

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-14
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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: contracts/GameOwner.sol


pragma solidity ^0.8.0;



contract GameOwner is Ownable {
  mapping (address => bool) gameRoles;

  function addGameRole(address _game) public onlyOwner {
      gameRoles[_game] = true;
  }

  function removeGameRole(address _game) public onlyOwner {
      gameRoles[_game] = false;
  }

  modifier onlyGame {
    require(gameRoles[_msgSender()] == true, "SunflowerLandGame: You are not the game");
    _;
  }

}
// File: @openzeppelin/contracts/security/Pausable.sol


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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

// File: @openzeppelin/contracts/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/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// 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/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/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/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @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, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/Farm.sol


pragma solidity ^0.8.0;






struct Farm {
    address owner;
    address account;
    uint256 tokenId;
}

contract SunflowerLand is ERC721Enumerable, Pausable, GameOwner {
    /*
     * Each farm has its own contract address deployed
     * This enables the NFT to actually own the resources and tokens
    */
    mapping (uint => address) farms;

    string private baseURI = "https://sunflower-land.com/play/nfts/farm/";

    event LandCreated(address indexed owner, address indexed landAddress, uint indexed tokenId);

    constructor() ERC721("Sunflower Land", "SL") {
        gameRoles[msg.sender] = true;
    }

    function setBaseUri(string memory uri) public onlyOwner {
        baseURI = uri;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    function pause() public onlyOwner {
        return _pause();
    }

    function unpause() public onlyOwner {
        return _unpause();
    }


    function mint(address account) public onlyGame returns (bool){
        uint256 tokenId = totalSupply() + 1;
        _mint(account, tokenId);

        // Create identifiable farm contract
        FarmHolder farm = new FarmHolder(this, tokenId);
        farms[tokenId] = address(farm);

        emit LandCreated(account, address(farm), tokenId);

        return true;
	}

    function gameTransfer(address from, address to, uint256 tokenId) public onlyGame returns (bool){
        _transfer(from, to, tokenId);
        return true;

    }

    function gameApprove(address to, uint256 tokenId) public onlyGame returns (bool) {
        _approve(to, tokenId);
        return true;

    }

    function gameBurn(uint256 tokenId) public onlyGame returns (bool){
        _burn(tokenId);
        return true;
    }
    
    /**
     * Load a farm, the owner and its identifiable address (account) on the blockchain
     */
    function getFarm(uint256 tokenId) public view returns (Farm memory) {
        address account = farms[tokenId];
        address owner = ownerOf(tokenId);

        return Farm({
            account: account,
            owner: owner,
            tokenId: tokenId
        });
    }

    /**
     * Get multiple farms for a single owner
     */
    function getFarms(address account) public view returns (Farm[] memory) {
        uint balance = balanceOf(account);

        Farm[] memory accountFarms = new Farm[](balance);
        for (uint i = 0; i < balance; i++) {
            uint tokenId = tokenOfOwnerByIndex(msg.sender, i);
            accountFarms[i] = Farm({
                tokenId: tokenId,
                account: farms[tokenId],
                owner: account
            });
        }

        return accountFarms;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

contract FarmHolder is ERC165, IERC1155Receiver {
    SunflowerLand private farm;
    uint private id;

    constructor(SunflowerLand _farm, uint _id) {
        farm = _farm;
        id = _id;
    }

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }

    // Fallback function to help someone accidentally sending eth to this contract
    function withdraw() public {
        require(farm.ownerOf(id) == msg.sender, "You are not the owner");
        payable(msg.sender).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"landAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"LandCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"_game","type":"address"}],"name":"addGameRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"gameApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"gameBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"gameTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFarm","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct Farm","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getFarms","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct Farm[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_game","type":"address"}],"name":"removeGameRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","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":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060600160405280602a815260200162005909602a9139600d9080519060200190620000359291906200024b565b503480156200004357600080fd5b506040518060400160405280600e81526020017f53756e666c6f776572204c616e640000000000000000000000000000000000008152506040518060400160405280600281526020017f534c0000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c89291906200024b565b508060019080519060200190620000e19291906200024b565b5050506000600a60006101000a81548160ff0219169083151502179055506200011f620001136200017d60201b60201c565b6200018560201b60201c565b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000360565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025990620002fb565b90600052602060002090601f0160209004810192826200027d5760008555620002c9565b82601f106200029857805160ff1916838001178555620002c9565b82800160010185558215620002c9579182015b82811115620002c8578251825591602001919060010190620002ab565b5b509050620002d89190620002dc565b5090565b5b80821115620002f7576000816000905550600101620002dd565b5090565b600060028204905060018216806200031457607f821691505b602082108114156200032b576200032a62000331565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61559980620003706000396000f3fe60806040523480156200001157600080fd5b5060043610620002145760003560e01c80636a6278421162000129578063a0bcfc7f11620000b1578063c87b56dd116200007b578063c87b56dd1462000639578063e985e9c5146200066f578063f027853d14620006a5578063f2fde38b14620006db5762000214565b8063a0bcfc7f14620005a3578063a22cb46514620005c3578063a8a99ce814620005e3578063b88d4fde14620006195762000214565b80637f28189f11620000f35780637f28189f146200051d5780638456cb5914620005535780638da5cb5b146200055f57806395d89b4114620005815762000214565b80636a627842146200048557806370a0823114620004bb578063715018a614620004f15780637323b8fa14620004fd5762000214565b80632f745c5911620001ad57806353fd88bf116200017757806353fd88bf14620003c15780635c975abb14620003f757806362252bc314620004195780636352211e146200044f5762000214565b80632f745c5914620003295780633f4ba83a146200035f57806342842e0e146200036b5780634f6ccce7146200038b5762000214565b8063095ea7b311620001ef578063095ea7b314620002a757806318160ddd14620002c757806319892b5114620002e957806323b872dd14620003095762000214565b806301ffc9a7146200021957806306fdde03146200024f578063081812fc1462000271575b600080fd5b6200023760048036038101906200023191906200344c565b620006fb565b60405162000246919062003b7d565b60405180910390f35b6200025962000778565b60405162000268919062003bc7565b60405180910390f35b6200028f600480360381019062000289919062003501565b62000812565b6040516200029e919062003ae8565b60405180910390f35b620002c56004803603810190620002bf919062003405565b6200089c565b005b620002d1620009c5565b604051620002e0919062003ef4565b60405180910390f35b62000307600480360381019062000301919062003258565b620009d2565b005b620003276004803603810190620003219190620032d1565b62000ab0565b005b62000347600480360381019062000341919062003405565b62000b19565b60405162000356919062003ef4565b60405180910390f35b6200036962000bc3565b005b620003896004803603810190620003839190620032d1565b62000c52565b005b620003a96004803603810190620003a3919062003501565b62000c74565b604051620003b8919062003ef4565b60405180910390f35b620003df6004803603810190620003d9919062003501565b62000ced565b604051620003ee919062003ed7565b60405180910390f35b6200040162000d8e565b60405162000410919062003b7d565b60405180910390f35b620004376004803603810190620004319190620032d1565b62000da5565b60405162000446919062003b7d565b60405180910390f35b6200046d600480360381019062000467919062003501565b62000e5e565b6040516200047c919062003ae8565b60405180910390f35b620004a360048036038101906200049d919062003258565b62000f13565b604051620004b2919062003b7d565b60405180910390f35b620004d96004803603810190620004d3919062003258565b620010d3565b604051620004e8919062003ef4565b60405180910390f35b620004fb6200118e565b005b6200051b600480360381019062000515919062003258565b6200121f565b005b6200053b600480360381019062000535919062003258565b620012fd565b6040516200054a919062003b59565b60405180910390f35b6200055d62001446565b005b62000569620014d5565b60405162000578919062003ae8565b60405180910390f35b6200058b620014ff565b6040516200059a919062003bc7565b60405180910390f35b620005c16004803603810190620005bb9190620034b0565b62001599565b005b620005e16004803603810190620005db9190620033be565b62001638565b005b620006016004803603810190620005fb919062003405565b62001652565b60405162000610919062003b7d565b60405180910390f35b6200063760048036038101906200063191906200332d565b62001709565b005b62000657600480360381019062000651919062003501565b62001774565b60405162000666919062003bc7565b60405180910390f35b6200068d60048036038101906200068791906200328a565b62001828565b6040516200069c919062003b7d565b60405180910390f35b620006c36004803603810190620006bd919062003501565b620018bc565b604051620006d2919062003b7d565b60405180910390f35b620006f96004803603810190620006f3919062003258565b62001971565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480620007715750620007708262001a75565b5b9050919050565b6060600080546200078990620041e9565b80601f0160208091040260200160405190810160405280929190818152602001828054620007b790620041e9565b8015620008085780601f10620007dc5761010080835404028352916020019162000808565b820191906000526020600020905b815481529060010190602001808311620007ea57829003601f168201915b5050505050905090565b60006200081f8262001b5b565b62000861576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008589062003e0b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000620008a98262000e5e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200091d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009149062003e71565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166200093e62001bc7565b73ffffffffffffffffffffffffffffffffffffffff16148062000972575062000971816200096b62001bc7565b62001828565b5b620009b4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009ab9062003d83565b60405180910390fd5b620009c0838362001bcf565b505050565b6000600880549050905090565b620009dc62001bc7565b73ffffffffffffffffffffffffffffffffffffffff16620009fc620014d5565b73ffffffffffffffffffffffffffffffffffffffff161462000a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a4c9062003e2d565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b62000ac562000abe62001bc7565b8262001c8a565b62000b07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000afe9062003e93565b60405180910390fd5b62000b1483838362001d75565b505050565b600062000b2683620010d3565b821062000b6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b619062003c2f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b62000bcd62001bc7565b73ffffffffffffffffffffffffffffffffffffffff1662000bed620014d5565b73ffffffffffffffffffffffffffffffffffffffff161462000c46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c3d9062003e2d565b60405180910390fd5b62000c5062001fee565b565b62000c6f8383836040518060200160405280600081525062001709565b505050565b600062000c80620009c5565b821062000cc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cbb9062003eb5565b60405180910390fd5b6008828154811062000cdb5762000cda62004397565b5b90600052602060002001549050919050565b62000cf762002fde565b6000600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600062000d3c8462000e5e565b905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018581525092505050919050565b6000600a60009054906101000a900460ff16905090565b600060011515600b600062000db962001bc7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151462000e46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e3d9062003cd9565b60405180910390fd5b62000e5384848462001d75565b600190509392505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000f0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f019062003dc7565b60405180910390fd5b80915050919050565b600060011515600b600062000f2762001bc7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151462000fb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000fab9062003cd9565b60405180910390fd5b6000600162000fc2620009c5565b62000fce919062004022565b905062000fdc838262002099565b6000308260405162000fee906200302b565b62000ffb92919062003b9a565b604051809103906000f08015801562001018573d6000803e3d6000fd5b50905080600c600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f2033309a512cebe519f0cd056ad2ee64848f60e920742d29e8c22d81e803a4be60405160405180910390a4600192505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001147576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200113e9062003da5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6200119862001bc7565b73ffffffffffffffffffffffffffffffffffffffff16620011b8620014d5565b73ffffffffffffffffffffffffffffffffffffffff161462001211576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012089062003e2d565b60405180910390fd5b6200121d600062002281565b565b6200122962001bc7565b73ffffffffffffffffffffffffffffffffffffffff1662001249620014d5565b73ffffffffffffffffffffffffffffffffffffffff1614620012a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012999062003e2d565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606060006200130c83620010d3565b905060008167ffffffffffffffff8111156200132d576200132c620043c6565b5b6040519080825280602002602001820160405280156200136a57816020015b6200135662002fde565b8152602001906001900390816200134c5790505b50905060005b828110156200143b57600062001387338362000b19565b905060405180606001604052808773ffffffffffffffffffffffffffffffffffffffff168152602001600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281525083838151811062001419576200141862004397565b5b6020026020010181905250508080620014329062004255565b91505062001370565b508092505050919050565b6200145062001bc7565b73ffffffffffffffffffffffffffffffffffffffff1662001470620014d5565b73ffffffffffffffffffffffffffffffffffffffff1614620014c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014c09062003e2d565b60405180910390fd5b620014d362002347565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546200151090620041e9565b80601f01602080910402602001604051908101604052809291908181526020018280546200153e90620041e9565b80156200158f5780601f1062001563576101008083540402835291602001916200158f565b820191906000526020600020905b8154815290600101906020018083116200157157829003601f168201915b5050505050905090565b620015a362001bc7565b73ffffffffffffffffffffffffffffffffffffffff16620015c3620014d5565b73ffffffffffffffffffffffffffffffffffffffff16146200161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620016139062003e2d565b60405180910390fd5b80600d90805190602001906200163492919062003039565b5050565b6200164e6200164662001bc7565b8383620023f3565b5050565b600060011515600b60006200166662001bc7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514620016f3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620016ea9062003cd9565b60405180910390fd5b620016ff838362001bcf565b6001905092915050565b6200171e6200171762001bc7565b8362001c8a565b62001760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620017579062003e93565b60405180910390fd5b6200176e8484848462002565565b50505050565b6060620017818262001b5b565b620017c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620017ba9062003e4f565b60405180910390fd5b6000620017cf620025c8565b90506000815111620017f1576040518060200160405280600081525062001820565b80620017fd8462002662565b6040516020016200181092919062003ac0565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060011515600b6000620018d062001bc7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146200195d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019549062003cd9565b60405180910390fd5b6200196882620027dc565b60019050919050565b6200197b62001bc7565b73ffffffffffffffffffffffffffffffffffffffff166200199b620014d5565b73ffffffffffffffffffffffffffffffffffffffff1614620019f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019eb9062003e2d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562001a67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a5e9062003c73565b60405180910390fd5b62001a728162002281565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148062001b4157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8062001b54575062001b538262002903565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1662001c448362000e5e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600062001c978262001b5b565b62001cd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001cd09062003d3f565b60405180910390fd5b600062001ce68362000e5e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148062001d5857508373ffffffffffffffffffffffffffffffffffffffff1662001d408462000812565b73ffffffffffffffffffffffffffffffffffffffff16145b8062001d6c575062001d6b818562001828565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1662001d978262000e5e565b73ffffffffffffffffffffffffffffffffffffffff161462001df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001de79062003c95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001e63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001e5a9062003cfb565b60405180910390fd5b62001e708383836200296d565b62001e7d60008262001bcf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462001ecf9190620040b7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462001f28919062004022565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a462001fe9838383620029cc565b505050565b62001ff862000d8e565b6200203a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620020319062003c0d565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6200208062001bc7565b6040516200208f919062003ae8565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200210c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620021039062003de9565b60405180910390fd5b620021178162001b5b565b156200215a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620021519062003cb7565b60405180910390fd5b62002168600083836200296d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620021ba919062004022565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200227d60008383620029cc565b5050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200235162000d8e565b1562002394576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200238b9062003d61565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620023da62001bc7565b604051620023e9919062003ae8565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562002465576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200245c9062003d1d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405162002558919062003b7d565b60405180910390a3505050565b6200257284848462001d75565b6200258084848484620029d1565b620025c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620025b99062003c51565b60405180910390fd5b50505050565b6060600d8054620025d990620041e9565b80601f01602080910402602001604051908101604052809291908181526020018280546200260790620041e9565b8015620026585780601f106200262c5761010080835404028352916020019162002658565b820191906000526020600020905b8154815290600101906020018083116200263a57829003601f168201915b5050505050905090565b60606000821415620026ac576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050620027d7565b600082905060005b60008214620026e4578080620026ca9062004255565b915050600a82620026dc91906200407f565b9150620026b4565b60008167ffffffffffffffff811115620027035762002702620043c6565b5b6040519080825280601f01601f191660200182016040528015620027365781602001600182028036833780820191505090505b5090505b60008514620027d057600182620027529190620040b7565b9150600a85620027639190620042a3565b603062002771919062004022565b60f81b8183815181106200278a576200278962004397565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85620027c891906200407f565b94506200273a565b8093505050505b919050565b6000620027e98262000e5e565b9050620027f9816000846200296d565b6200280660008362001bcf565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620028589190620040b7565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620028ff81600084620029cc565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6200297a83838362002b7a565b6200298462000d8e565b15620029c7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620029be9062003beb565b60405180910390fd5b505050565b505050565b6000620029f48473ffffffffffffffffffffffffffffffffffffffff1662002c9e565b1562002b6d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262002a2062001bc7565b8786866040518563ffffffff1660e01b815260040162002a44949392919062003b05565b602060405180830381600087803b15801562002a5f57600080fd5b505af192505050801562002a9357506040513d601f19601f8201168201806040525081019062002a9091906200347e565b60015b62002b1c573d806000811462002ac6576040519150601f19603f3d011682016040523d82523d6000602084013e62002acb565b606091505b5060008151141562002b14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162002b0b9062003c51565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062002b72565b600190505b949350505050565b62002b8783838362002cc1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562002bce5762002bc88162002cc6565b62002c10565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462002c0f5762002c0e838262002d0f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562002c575762002c518162002e81565b62002c99565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462002c985762002c97828262002f5d565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162002d1e84620010d3565b62002d2a9190620040b7565b905060006007600084815260200190815260200160002054905081811462002e10576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062002e979190620040b7565b905060006009600084815260200190815260200160002054905060006008838154811062002eca5762002ec962004397565b5b90600052602060002001549050806008838154811062002eef5762002eee62004397565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062002f415762002f4062004368565b5b6001900381819060005260206000200160009055905550505050565b600062002f6a83620010d3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b610afb8062004a6983390190565b8280546200304790620041e9565b90600052602060002090601f0160209004810192826200306b5760008555620030b7565b82601f106200308657805160ff1916838001178555620030b7565b82800160010185558215620030b7579182015b82811115620030b657825182559160200191906001019062003099565b5b509050620030c69190620030ca565b5090565b5b80821115620030e5576000816000905550600101620030cb565b5090565b600062003100620030fa8462003f3a565b62003f11565b9050828152602081018484840111156200311f576200311e620043fa565b5b6200312c848285620041a4565b509392505050565b60006200314b620031458462003f70565b62003f11565b9050828152602081018484840111156200316a5762003169620043fa565b5b62003177848285620041a4565b509392505050565b600081359050620031908162004a00565b92915050565b600081359050620031a78162004a1a565b92915050565b600081359050620031be8162004a34565b92915050565b600081519050620031d58162004a34565b92915050565b600082601f830112620031f357620031f2620043f5565b5b813562003205848260208601620030e9565b91505092915050565b600082601f830112620032265762003225620043f5565b5b81356200323884826020860162003134565b91505092915050565b600081359050620032528162004a4e565b92915050565b60006020828403121562003271576200327062004404565b5b600062003281848285016200317f565b91505092915050565b60008060408385031215620032a457620032a362004404565b5b6000620032b4858286016200317f565b9250506020620032c7858286016200317f565b9150509250929050565b600080600060608486031215620032ed57620032ec62004404565b5b6000620032fd868287016200317f565b935050602062003310868287016200317f565b9250506040620033238682870162003241565b9150509250925092565b600080600080608085870312156200334a576200334962004404565b5b60006200335a878288016200317f565b94505060206200336d878288016200317f565b9350506040620033808782880162003241565b925050606085013567ffffffffffffffff811115620033a457620033a3620043ff565b5b620033b287828801620031db565b91505092959194509250565b60008060408385031215620033d857620033d762004404565b5b6000620033e8858286016200317f565b9250506020620033fb8582860162003196565b9150509250929050565b600080604083850312156200341f576200341e62004404565b5b60006200342f858286016200317f565b9250506020620034428582860162003241565b9150509250929050565b60006020828403121562003465576200346462004404565b5b60006200347584828501620031ad565b91505092915050565b60006020828403121562003497576200349662004404565b5b6000620034a784828501620031c4565b91505092915050565b600060208284031215620034c957620034c862004404565b5b600082013567ffffffffffffffff811115620034ea57620034e9620043ff565b5b620034f8848285016200320e565b91505092915050565b6000602082840312156200351a576200351962004404565b5b60006200352a8482850162003241565b91505092915050565b600062003541838362003a0e565b60608301905092915050565b6200355881620040f2565b82525050565b6200356981620040f2565b82525050565b60006200357c8262003fb6565b62003588818562003fe4565b9350620035958362003fa6565b8060005b83811015620035cc578151620035b0888262003533565b9750620035bd8362003fd7565b92505060018101905062003599565b5085935050505092915050565b620035e48162004106565b82525050565b6000620035f78262003fc1565b62003603818562003ff5565b935062003615818560208601620041b3565b620036208162004409565b840191505092915050565b620036368162004168565b82525050565b6000620036498262003fcc565b62003655818562004006565b935062003667818560208601620041b3565b620036728162004409565b840191505092915050565b60006200368a8262003fcc565b62003696818562004017565b9350620036a8818560208601620041b3565b80840191505092915050565b6000620036c3602b8362004006565b9150620036d0826200441a565b604082019050919050565b6000620036ea60148362004006565b9150620036f78262004469565b602082019050919050565b600062003711602b8362004006565b91506200371e8262004492565b604082019050919050565b60006200373860328362004006565b91506200374582620044e1565b604082019050919050565b60006200375f60268362004006565b91506200376c8262004530565b604082019050919050565b60006200378660258362004006565b915062003793826200457f565b604082019050919050565b6000620037ad601c8362004006565b9150620037ba82620045ce565b602082019050919050565b6000620037d460278362004006565b9150620037e182620045f7565b604082019050919050565b6000620037fb60248362004006565b9150620038088262004646565b604082019050919050565b60006200382260198362004006565b91506200382f8262004695565b602082019050919050565b600062003849602c8362004006565b91506200385682620046be565b604082019050919050565b60006200387060108362004006565b91506200387d826200470d565b602082019050919050565b60006200389760388362004006565b9150620038a48262004736565b604082019050919050565b6000620038be602a8362004006565b9150620038cb8262004785565b604082019050919050565b6000620038e560298362004006565b9150620038f282620047d4565b604082019050919050565b60006200390c60208362004006565b9150620039198262004823565b602082019050919050565b600062003933602c8362004006565b915062003940826200484c565b604082019050919050565b60006200395a60208362004006565b915062003967826200489b565b602082019050919050565b600062003981602f8362004006565b91506200398e82620048c4565b604082019050919050565b6000620039a860218362004006565b9150620039b58262004913565b604082019050919050565b6000620039cf60318362004006565b9150620039dc8262004962565b604082019050919050565b6000620039f6602c8362004006565b915062003a0382620049b1565b604082019050919050565b60608201600082015162003a2660008501826200354d565b50602082015162003a3b60208501826200354d565b50604082015162003a50604085018262003a9e565b50505050565b60608201600082015162003a6e60008501826200354d565b50602082015162003a8360208501826200354d565b50604082015162003a98604085018262003a9e565b50505050565b62003aa9816200415e565b82525050565b62003aba816200415e565b82525050565b600062003ace82856200367d565b915062003adc82846200367d565b91508190509392505050565b600060208201905062003aff60008301846200355e565b92915050565b600060808201905062003b1c60008301876200355e565b62003b2b60208301866200355e565b62003b3a604083018562003aaf565b818103606083015262003b4e8184620035ea565b905095945050505050565b6000602082019050818103600083015262003b7581846200356f565b905092915050565b600060208201905062003b946000830184620035d9565b92915050565b600060408201905062003bb160008301856200362b565b62003bc0602083018462003aaf565b9392505050565b6000602082019050818103600083015262003be381846200363c565b905092915050565b6000602082019050818103600083015262003c0681620036b4565b9050919050565b6000602082019050818103600083015262003c2881620036db565b9050919050565b6000602082019050818103600083015262003c4a8162003702565b9050919050565b6000602082019050818103600083015262003c6c8162003729565b9050919050565b6000602082019050818103600083015262003c8e8162003750565b9050919050565b6000602082019050818103600083015262003cb08162003777565b9050919050565b6000602082019050818103600083015262003cd2816200379e565b9050919050565b6000602082019050818103600083015262003cf481620037c5565b9050919050565b6000602082019050818103600083015262003d1681620037ec565b9050919050565b6000602082019050818103600083015262003d388162003813565b9050919050565b6000602082019050818103600083015262003d5a816200383a565b9050919050565b6000602082019050818103600083015262003d7c8162003861565b9050919050565b6000602082019050818103600083015262003d9e8162003888565b9050919050565b6000602082019050818103600083015262003dc081620038af565b9050919050565b6000602082019050818103600083015262003de281620038d6565b9050919050565b6000602082019050818103600083015262003e0481620038fd565b9050919050565b6000602082019050818103600083015262003e268162003924565b9050919050565b6000602082019050818103600083015262003e48816200394b565b9050919050565b6000602082019050818103600083015262003e6a8162003972565b9050919050565b6000602082019050818103600083015262003e8c8162003999565b9050919050565b6000602082019050818103600083015262003eae81620039c0565b9050919050565b6000602082019050818103600083015262003ed081620039e7565b9050919050565b600060608201905062003eee600083018462003a56565b92915050565b600060208201905062003f0b600083018462003aaf565b92915050565b600062003f1d62003f30565b905062003f2b82826200421f565b919050565b6000604051905090565b600067ffffffffffffffff82111562003f585762003f57620043c6565b5b62003f638262004409565b9050602081019050919050565b600067ffffffffffffffff82111562003f8e5762003f8d620043c6565b5b62003f998262004409565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006200402f826200415e565b91506200403c836200415e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620040745762004073620042db565b5b828201905092915050565b60006200408c826200415e565b915062004099836200415e565b925082620040ac57620040ab6200430a565b5b828204905092915050565b6000620040c4826200415e565b9150620040d1836200415e565b925082821015620040e757620040e6620042db565b5b828203905092915050565b6000620040ff826200413e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600062004175826200417c565b9050919050565b6000620041898262004190565b9050919050565b60006200419d826200413e565b9050919050565b82818337600083830152505050565b60005b83811015620041d3578082015181840152602081019050620041b6565b83811115620041e3576000848401525b50505050565b600060028204905060018216806200420257607f821691505b6020821081141562004219576200421862004339565b5b50919050565b6200422a8262004409565b810181811067ffffffffffffffff821117156200424c576200424b620043c6565b5b80604052505050565b600062004262826200415e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620042985762004297620042db565b5b600182019050919050565b6000620042b0826200415e565b9150620042bd836200415e565b925082620042d057620042cf6200430a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53756e666c6f7765724c616e6447616d653a20596f7520617265206e6f74207460008201527f68652067616d6500000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b62004a0b81620040f2565b811462004a1757600080fd5b50565b62004a258162004106565b811462004a3157600080fd5b50565b62004a3f8162004112565b811462004a4b57600080fd5b50565b62004a59816200415e565b811462004a6557600080fd5b5056fe608060405234801561001057600080fd5b50604051610afb380380610afb833981810160405281019061003291906100aa565b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600181905550505061016b565b60008151905061008f8161013d565b92915050565b6000815190506100a481610154565b92915050565b600080604083850312156100c1576100c0610138565b5b60006100cf85828601610080565b92505060206100e085828601610095565b9150509250929050565b60006100f58261010e565b9050919050565b6000610107826100ea565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b610146816100fc565b811461015157600080fd5b50565b61015d8161012e565b811461016857600080fd5b50565b6109818061017a6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a7146100515780633ccfd60b14610081578063bc197c811461008b578063f23a6e61146100bb575b600080fd5b61006b6004803603810190610066919061064f565b6100eb565b60405161007891906106cc565b60405180910390f35b610089610165565b005b6100a560048036038101906100a091906104e9565b6102c6565b6040516100b291906106e7565b60405180910390f35b6100d560048036038101906100d091906105b8565b6102db565b6040516100e291906106e7565b60405180910390f35b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061015e575061015d826102f0565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e6001546040518263ffffffff1660e01b81526004016101d79190610722565b60206040518083038186803b1580156101ef57600080fd5b505afa158015610203573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022791906104bc565b73ffffffffffffffffffffffffffffffffffffffff161461027d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027490610702565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156102c3573d6000803e3d6000fd5b50565b600063bc197c8160e01b905095945050505050565b600063f23a6e6160e01b905095945050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600061036d61036884610762565b61073d565b905080838252602082019050828560208602820111156103905761038f6108b8565b5b60005b858110156103c057816103a688826104a7565b845260208401935060208301925050600181019050610393565b5050509392505050565b60006103dd6103d88461078e565b61073d565b9050828152602081018484840111156103f9576103f86108bd565b5b610404848285610844565b509392505050565b60008135905061041b81610906565b92915050565b60008151905061043081610906565b92915050565b600082601f83011261044b5761044a6108b3565b5b813561045b84826020860161035a565b91505092915050565b6000813590506104738161091d565b92915050565b600082601f83011261048e5761048d6108b3565b5b813561049e8482602086016103ca565b91505092915050565b6000813590506104b681610934565b92915050565b6000602082840312156104d2576104d16108c7565b5b60006104e084828501610421565b91505092915050565b600080600080600060a08688031215610505576105046108c7565b5b60006105138882890161040c565b95505060206105248882890161040c565b945050604086013567ffffffffffffffff811115610545576105446108c2565b5b61055188828901610436565b935050606086013567ffffffffffffffff811115610572576105716108c2565b5b61057e88828901610436565b925050608086013567ffffffffffffffff81111561059f5761059e6108c2565b5b6105ab88828901610479565b9150509295509295909350565b600080600080600060a086880312156105d4576105d36108c7565b5b60006105e28882890161040c565b95505060206105f38882890161040c565b9450506040610604888289016104a7565b9350506060610615888289016104a7565b925050608086013567ffffffffffffffff811115610636576106356108c2565b5b61064288828901610479565b9150509295509295909350565b600060208284031215610665576106646108c7565b5b600061067384828501610464565b91505092915050565b610685816107e2565b82525050565b610694816107ee565b82525050565b60006106a76015836107bf565b91506106b2826108dd565b602082019050919050565b6106c68161083a565b82525050565b60006020820190506106e1600083018461067c565b92915050565b60006020820190506106fc600083018461068b565b92915050565b6000602082019050818103600083015261071b8161069a565b9050919050565b600060208201905061073760008301846106bd565b92915050565b6000610747610758565b90506107538282610853565b919050565b6000604051905090565b600067ffffffffffffffff82111561077d5761077c610884565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156107a9576107a8610884565b5b6107b2826108cc565b9050602081019050919050565b600082825260208201905092915050565b60006107db8261081a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b61085c826108cc565b810181811067ffffffffffffffff8211171561087b5761087a610884565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b61090f816107d0565b811461091a57600080fd5b50565b610926816107ee565b811461093157600080fd5b50565b61093d8161083a565b811461094857600080fd5b5056fea2646970667358221220e37a91e3a0f88089acc15ec1d2db7604ae74d375c36d807aedee17aefae8d4be64736f6c63430008070033a2646970667358221220b86211fc6947607110cffeb964dbeb797283cfee270c66b4d83d59bb5082169764736f6c6343000807003368747470733a2f2f73756e666c6f7765722d6c616e642e636f6d2f706c61792f6e6674732f6661726d2f

Deployed ByteCode Sourcemap

51920:2992:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45618:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31478:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33037:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32560:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46258:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5790:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33787:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45926:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52731:72;;;:::i;:::-;;34197:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46448:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53765:288;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7152:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53200:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31172:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52813:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30902:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;:::i;:::-;;5693:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54125:501;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52655:68;;;:::i;:::-;;4079:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31647:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52451:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33330:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53374:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34453:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31822:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33556:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53527:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45618:224;45720:4;45759:35;45744:50;;;:11;:50;;;;:90;;;;45798:36;45822:11;45798:23;:36::i;:::-;45744:90;45737:97;;45618:224;;;:::o;31478:100::-;31532:13;31565:5;31558:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31478:100;:::o;33037:221::-;33113:7;33141:16;33149:7;33141;:16::i;:::-;33133:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33226:15;:24;33242:7;33226:24;;;;;;;;;;;;;;;;;;;;;33219:31;;33037:221;;;:::o;32560:411::-;32641:13;32657:23;32672:7;32657:14;:23::i;:::-;32641:39;;32705:5;32699:11;;:2;:11;;;;32691:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32799:5;32783:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32808:37;32825:5;32832:12;:10;:12::i;:::-;32808:16;:37::i;:::-;32783:62;32761:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32942:21;32951:2;32955:7;32942:8;:21::i;:::-;32630:341;32560:411;;:::o;46258:113::-;46319:7;46346:10;:17;;;;46339:24;;46258:113;:::o;5790:95::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5874:5:::1;5855:9;:16;5865:5;5855:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;5790:95:::0;:::o;33787:339::-;33982:41;34001:12;:10;:12::i;:::-;34015:7;33982:18;:41::i;:::-;33974:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34090:28;34100:4;34106:2;34110:7;34090:9;:28::i;:::-;33787:339;;;:::o;45926:256::-;46023:7;46059:23;46076:5;46059:16;:23::i;:::-;46051:5;:31;46043:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46148:12;:19;46161:5;46148:19;;;;;;;;;;;;;;;:26;46168:5;46148:26;;;;;;;;;;;;46141:33;;45926:256;;;;:::o;52731:72::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52785:10:::1;:8;:10::i;:::-;52731:72::o:0;34197:185::-;34335:39;34352:4;34358:2;34362:7;34335:39;;;;;;;;;;;;:16;:39::i;:::-;34197:185;;;:::o;46448:233::-;46523:7;46559:30;:28;:30::i;:::-;46551:5;:38;46543:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46656:10;46667:5;46656:17;;;;;;;;:::i;:::-;;;;;;;;;;46649:24;;46448:233;;;:::o;53765:288::-;53820:11;;:::i;:::-;53844:15;53862:5;:14;53868:7;53862:14;;;;;;;;;;;;;;;;;;;;;53844:32;;53887:13;53903:16;53911:7;53903;:16::i;:::-;53887:32;;53939:106;;;;;;;;53997:5;53939:106;;;;;;53968:7;53939:106;;;;;;54026:7;53939:106;;;53932:113;;;;53765:288;;;:::o;7152:86::-;7199:4;7223:7;;;;;;;;;;;7216:14;;7152:86;:::o;53200:166::-;53290:4;5951;5924:31;;:9;:23;5934:12;:10;:12::i;:::-;5924:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;5916:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53306:28:::1;53316:4;53322:2;53326:7;53306:9;:28::i;:::-;53352:4;53345:11;;53200:166:::0;;;;;:::o;31172:239::-;31244:7;31264:13;31280:7;:16;31288:7;31280:16;;;;;;;;;;;;;;;;;;;;;31264:32;;31332:1;31315:19;;:5;:19;;;;31307:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31398:5;31391:12;;;31172:239;;;:::o;52813:379::-;52869:4;5951;5924:31;;:9;:23;5934:12;:10;:12::i;:::-;5924:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;5916:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52885:15:::1;52919:1;52903:13;:11;:13::i;:::-;:17;;;;:::i;:::-;52885:35;;52931:23;52937:7;52946;52931:5;:23::i;:::-;53013:15;53046:4;53052:7;53031:29;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53013:47;;53096:4;53071:5;:14;53077:7;53071:14;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;53155:7;53148:4;53119:44;;53131:7;53119:44;;;;;;;;;;;;53183:4;53176:11;;;;52813:379:::0;;;:::o;30902:208::-;30974:7;31019:1;31002:19;;:5;:19;;;;30994:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31086:9;:16;31096:5;31086:16;;;;;;;;;;;;;;;;31079:23;;30902:208;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;5693:91::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5774:4:::1;5755:9;:16;5765:5;5755:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;5693:91:::0;:::o;54125:501::-;54181:13;54207:12;54222:18;54232:7;54222:9;:18::i;:::-;54207:33;;54253:26;54293:7;54282:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;54253:48;;54317:6;54312:275;54333:7;54329:1;:11;54312:275;;;54362:12;54377:34;54397:10;54409:1;54377:19;:34::i;:::-;54362:49;;54444:131;;;;;;;;54552:7;54444:131;;;;;;54512:5;:14;54518:7;54512:14;;;;;;;;;;;;;;;;;;;;;54444:131;;;;;;54477:7;54444:131;;;54426:12;54439:1;54426:15;;;;;;;;:::i;:::-;;;;;;;:149;;;;54347:240;54342:3;;;;;:::i;:::-;;;;54312:275;;;;54606:12;54599:19;;;;54125:501;;;:::o;52655:68::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52707:8:::1;:6;:8::i;:::-;52655:68::o:0;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;31647:104::-;31703:13;31736:7;31729:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31647:104;:::o;52451:88::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52528:3:::1;52518:7;:13;;;;;;;;;;;;:::i;:::-;;52451:88:::0;:::o;33330:155::-;33425:52;33444:12;:10;:12::i;:::-;33458:8;33468;33425:18;:52::i;:::-;33330:155;;:::o;53374:145::-;53449:4;5951;5924:31;;:9;:23;5934:12;:10;:12::i;:::-;5924:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;5916:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53466:21:::1;53475:2;53479:7;53466:8;:21::i;:::-;53505:4;53498:11;;53374:145:::0;;;;:::o;34453:328::-;34628:41;34647:12;:10;:12::i;:::-;34661:7;34628:18;:41::i;:::-;34620:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34734:39;34748:4;34754:2;34758:7;34767:5;34734:13;:39::i;:::-;34453:328;;;;:::o;31822:334::-;31895:13;31929:16;31937:7;31929;:16::i;:::-;31921:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32010:21;32034:10;:8;:10::i;:::-;32010:34;;32086:1;32068:7;32062:21;:25;:86;;;;;;;;;;;;;;;;;32114:7;32123:18;:7;:16;:18::i;:::-;32097:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32062:86;32055:93;;;31822:334;;;:::o;33556:164::-;33653:4;33677:18;:25;33696:5;33677:25;;;;;;;;;;;;;;;:35;33703:8;33677:35;;;;;;;;;;;;;;;;;;;;;;;;;33670:42;;33556:164;;;;:::o;53527:120::-;53587:4;5951;5924:31;;:9;:23;5934:12;:10;:12::i;:::-;5924:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;5916:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53603:14:::1;53609:7;53603:5;:14::i;:::-;53635:4;53628:11;;53527:120:::0;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;30533:305::-;30635:4;30687:25;30672:40;;;:11;:40;;;;:105;;;;30744:33;30729:48;;;:11;:48;;;;30672:105;:158;;;;30794:36;30818:11;30794:23;:36::i;:::-;30672:158;30652:178;;30533:305;;;:::o;36291:127::-;36356:4;36408:1;36380:30;;:7;:16;36388:7;36380:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36373:37;;36291:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;40437:174::-;40539:2;40512:15;:24;40528:7;40512:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40595:7;40591:2;40557:46;;40566:23;40581:7;40566:14;:23::i;:::-;40557:46;;;;;;;;;;;;40437:174;;:::o;36585:348::-;36678:4;36703:16;36711:7;36703;:16::i;:::-;36695:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36779:13;36795:23;36810:7;36795:14;:23::i;:::-;36779:39;;36848:5;36837:16;;:7;:16;;;:51;;;;36881:7;36857:31;;:20;36869:7;36857:11;:20::i;:::-;:31;;;36837:51;:87;;;;36892:32;36909:5;36916:7;36892:16;:32::i;:::-;36837:87;36829:96;;;36585:348;;;;:::o;39694:625::-;39853:4;39826:31;;:23;39841:7;39826:14;:23::i;:::-;:31;;;39818:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39932:1;39918:16;;:2;:16;;;;39910:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39988:39;40009:4;40015:2;40019:7;39988:20;:39::i;:::-;40092:29;40109:1;40113:7;40092:8;:29::i;:::-;40153:1;40134:9;:15;40144:4;40134:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40182:1;40165:9;:13;40175:2;40165:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40213:2;40194:7;:16;40202:7;40194:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40252:7;40248:2;40233:27;;40242:4;40233:27;;;;;;;;;;;;40273:38;40293:4;40299:2;40303:7;40273:19;:38::i;:::-;39694:625;;;:::o;8211:120::-;7755:8;:6;:8::i;:::-;7747:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;8280:5:::1;8270:7;;:15;;;;;;;;;;;;;;;;;;8301:22;8310:12;:10;:12::i;:::-;8301:22;;;;;;:::i;:::-;;;;;;;;8211:120::o:0;38269:439::-;38363:1;38349:16;;:2;:16;;;;38341:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38422:16;38430:7;38422;:16::i;:::-;38421:17;38413:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38484:45;38513:1;38517:2;38521:7;38484:20;:45::i;:::-;38559:1;38542:9;:13;38552:2;38542:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38590:2;38571:7;:16;38579:7;38571:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38635:7;38631:2;38610:33;;38627:1;38610:33;;;;;;;;;;;;38656:44;38684:1;38688:2;38692:7;38656:19;:44::i;:::-;38269:439;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;7952:118::-;7478:8;:6;:8::i;:::-;7477:9;7469:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;8022:4:::1;8012:7;;:14;;;;;;;;;;;;;;;;;;8042:20;8049:12;:10;:12::i;:::-;8042:20;;;;;;:::i;:::-;;;;;;;;7952:118::o:0;40753:315::-;40908:8;40899:17;;:5;:17;;;;40891:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40995:8;40957:18;:25;40976:5;40957:25;;;;;;;;;;;;;;;:35;40983:8;40957:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41041:8;41019:41;;41034:5;41019:41;;;41051:8;41019:41;;;;;;:::i;:::-;;;;;;;;40753:315;;;:::o;35663:::-;35820:28;35830:4;35836:2;35840:7;35820:9;:28::i;:::-;35867:48;35890:4;35896:2;35900:7;35909:5;35867:22;:48::i;:::-;35859:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35663:315;;;;:::o;52547:100::-;52599:13;52632:7;52625:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52547:100;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;38937:420::-;38997:13;39013:23;39028:7;39013:14;:23::i;:::-;38997:39;;39049:48;39070:5;39085:1;39089:7;39049:20;:48::i;:::-;39138:29;39155:1;39159:7;39138:8;:29::i;:::-;39200:1;39180:9;:16;39190:5;39180:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;39219:7;:16;39227:7;39219:16;;;;;;;;;;;;39212:23;;;;;;;;;;;39281:7;39277:1;39253:36;;39262:5;39253:36;;;;;;;;;;;;39302:47;39322:5;39337:1;39341:7;39302:19;:47::i;:::-;38986:371;38937:420;:::o;22207:157::-;22292:4;22331:25;22316:40;;;:11;:40;;;;22309:47;;22207:157;;;:::o;54634:275::-;54778:45;54805:4;54811:2;54815:7;54778:26;:45::i;:::-;54845:8;:6;:8::i;:::-;54844:9;54836:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54634:275;;;:::o;43515:125::-;;;;:::o;41633:799::-;41788:4;41809:15;:2;:13;;;:15::i;:::-;41805:620;;;41861:2;41845:36;;;41882:12;:10;:12::i;:::-;41896:4;41902:7;41911:5;41845:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41841:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42104:1;42087:6;:13;:18;42083:272;;;42130:60;;;;;;;;;;:::i;:::-;;;;;;;;42083:272;42305:6;42299:13;42290:6;42286:2;42282:15;42275:38;41841:529;41978:41;;;41968:51;;;:6;:51;;;;41961:58;;;;;41805:620;42409:4;42402:11;;41633:799;;;;;;;:::o;47294:589::-;47438:45;47465:4;47471:2;47475:7;47438:26;:45::i;:::-;47516:1;47500:18;;:4;:18;;;47496:187;;;47535:40;47567:7;47535:31;:40::i;:::-;47496:187;;;47605:2;47597:10;;:4;:10;;;47593:90;;47624:47;47657:4;47663:7;47624:32;:47::i;:::-;47593:90;47496:187;47711:1;47697:16;;:2;:16;;;47693:183;;;47730:45;47767:7;47730:36;:45::i;:::-;47693:183;;;47803:4;47797:10;;:2;:10;;;47793:83;;47824:40;47852:2;47856:7;47824:27;:40::i;:::-;47793:83;47693:183;47294:589;;;:::o;9571:326::-;9631:4;9888:1;9866:7;:19;;;:23;9859:30;;9571:326;;;:::o;43004:126::-;;;;:::o;48606:164::-;48710:10;:17;;;;48683:15;:24;48699:7;48683:24;;;;;;;;;;;:44;;;;48738:10;48754:7;48738:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48606:164;:::o;49397:988::-;49663:22;49713:1;49688:22;49705:4;49688:16;:22::i;:::-;:26;;;;:::i;:::-;49663:51;;49725:18;49746:17;:26;49764:7;49746:26;;;;;;;;;;;;49725:47;;49893:14;49879:10;:28;49875:328;;49924:19;49946:12;:18;49959:4;49946:18;;;;;;;;;;;;;;;:34;49965:14;49946:34;;;;;;;;;;;;49924:56;;50030:11;49997:12;:18;50010:4;49997:18;;;;;;;;;;;;;;;:30;50016:10;49997:30;;;;;;;;;;;:44;;;;50147:10;50114:17;:30;50132:11;50114:30;;;;;;;;;;;:43;;;;49909:294;49875:328;50299:17;:26;50317:7;50299:26;;;;;;;;;;;50292:33;;;50343:12;:18;50356:4;50343:18;;;;;;;;;;;;;;;:34;50362:14;50343:34;;;;;;;;;;;50336:41;;;49478:907;;49397:988;;:::o;50680:1079::-;50933:22;50978:1;50958:10;:17;;;;:21;;;;:::i;:::-;50933:46;;50990:18;51011:15;:24;51027:7;51011:24;;;;;;;;;;;;50990:45;;51362:19;51384:10;51395:14;51384:26;;;;;;;;:::i;:::-;;;;;;;;;;51362:48;;51448:11;51423:10;51434;51423:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;51559:10;51528:15;:28;51544:11;51528:28;;;;;;;;;;;:41;;;;51700:15;:24;51716:7;51700:24;;;;;;;;;;;51693:31;;;51735:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50751:1008;;;50680:1079;:::o;48184:221::-;48269:14;48286:20;48303:2;48286:16;:20::i;:::-;48269:37;;48344:7;48317:12;:16;48330:2;48317:16;;;;;;;;;;;;;;;:24;48334:6;48317:24;;;;;;;;;;;:34;;;;48391:6;48362:17;:26;48380:7;48362:26;;;;;;;;;;;:35;;;;48258:147;48184:221;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:267::-;7271:10;7292:90;7378:3;7370:6;7292:90;:::i;:::-;7414:4;7409:3;7405:14;7391:28;;7158:267;;;;:::o;7431:108::-;7508:24;7526:5;7508:24;:::i;:::-;7503:3;7496:37;7431:108;;:::o;7545:118::-;7632:24;7650:5;7632:24;:::i;:::-;7627:3;7620:37;7545:118;;:::o;7707:908::-;7870:3;7899:76;7969:5;7899:76;:::i;:::-;7991:108;8092:6;8087:3;7991:108;:::i;:::-;7984:115;;8123:78;8195:5;8123:78;:::i;:::-;8224:7;8255:1;8240:350;8265:6;8262:1;8259:13;8240:350;;;8341:6;8335:13;8368:107;8471:3;8456:13;8368:107;:::i;:::-;8361:114;;8498:82;8573:6;8498:82;:::i;:::-;8488:92;;8300:290;8287:1;8284;8280:9;8275:14;;8240:350;;;8244:14;8606:3;8599:10;;7875:740;;;7707:908;;;;:::o;8621:109::-;8702:21;8717:5;8702:21;:::i;:::-;8697:3;8690:34;8621:109;;:::o;8736:360::-;8822:3;8850:38;8882:5;8850:38;:::i;:::-;8904:70;8967:6;8962:3;8904:70;:::i;:::-;8897:77;;8983:52;9028:6;9023:3;9016:4;9009:5;9005:16;8983:52;:::i;:::-;9060:29;9082:6;9060:29;:::i;:::-;9055:3;9051:39;9044:46;;8826:270;8736:360;;;;:::o;9102:175::-;9211:59;9264:5;9211:59;:::i;:::-;9206:3;9199:72;9102:175;;:::o;9283:364::-;9371:3;9399:39;9432:5;9399:39;:::i;:::-;9454:71;9518:6;9513:3;9454:71;:::i;:::-;9447:78;;9534:52;9579:6;9574:3;9567:4;9560:5;9556:16;9534:52;:::i;:::-;9611:29;9633:6;9611:29;:::i;:::-;9606:3;9602:39;9595:46;;9375:272;9283:364;;;;:::o;9653:377::-;9759:3;9787:39;9820:5;9787:39;:::i;:::-;9842:89;9924:6;9919:3;9842:89;:::i;:::-;9835:96;;9940:52;9985:6;9980:3;9973:4;9966:5;9962:16;9940:52;:::i;:::-;10017:6;10012:3;10008:16;10001:23;;9763:267;9653:377;;;;:::o;10036:366::-;10178:3;10199:67;10263:2;10258:3;10199:67;:::i;:::-;10192:74;;10275:93;10364:3;10275:93;:::i;:::-;10393:2;10388:3;10384:12;10377:19;;10036:366;;;:::o;10408:::-;10550:3;10571:67;10635:2;10630:3;10571:67;:::i;:::-;10564:74;;10647:93;10736:3;10647:93;:::i;:::-;10765:2;10760:3;10756:12;10749:19;;10408:366;;;:::o;10780:::-;10922:3;10943:67;11007:2;11002:3;10943:67;:::i;:::-;10936:74;;11019:93;11108:3;11019:93;:::i;:::-;11137:2;11132:3;11128:12;11121:19;;10780:366;;;:::o;11152:::-;11294:3;11315:67;11379:2;11374:3;11315:67;:::i;:::-;11308:74;;11391:93;11480:3;11391:93;:::i;:::-;11509:2;11504:3;11500:12;11493:19;;11152:366;;;:::o;11524:::-;11666:3;11687:67;11751:2;11746:3;11687:67;:::i;:::-;11680:74;;11763:93;11852:3;11763:93;:::i;:::-;11881:2;11876:3;11872:12;11865:19;;11524:366;;;:::o;11896:::-;12038:3;12059:67;12123:2;12118:3;12059:67;:::i;:::-;12052:74;;12135:93;12224:3;12135:93;:::i;:::-;12253:2;12248:3;12244:12;12237:19;;11896:366;;;:::o;12268:::-;12410:3;12431:67;12495:2;12490:3;12431:67;:::i;:::-;12424:74;;12507:93;12596:3;12507:93;:::i;:::-;12625:2;12620:3;12616:12;12609:19;;12268:366;;;:::o;12640:::-;12782:3;12803:67;12867:2;12862:3;12803:67;:::i;:::-;12796:74;;12879:93;12968:3;12879:93;:::i;:::-;12997:2;12992:3;12988:12;12981:19;;12640:366;;;:::o;13012:::-;13154:3;13175:67;13239:2;13234:3;13175:67;:::i;:::-;13168:74;;13251:93;13340:3;13251:93;:::i;:::-;13369:2;13364:3;13360:12;13353:19;;13012:366;;;:::o;13384:::-;13526:3;13547:67;13611:2;13606:3;13547:67;:::i;:::-;13540:74;;13623:93;13712:3;13623:93;:::i;:::-;13741:2;13736:3;13732:12;13725:19;;13384:366;;;:::o;13756:::-;13898:3;13919:67;13983:2;13978:3;13919:67;:::i;:::-;13912:74;;13995:93;14084:3;13995:93;:::i;:::-;14113:2;14108:3;14104:12;14097:19;;13756:366;;;:::o;14128:::-;14270:3;14291:67;14355:2;14350:3;14291:67;:::i;:::-;14284:74;;14367:93;14456:3;14367:93;:::i;:::-;14485:2;14480:3;14476:12;14469:19;;14128:366;;;:::o;14500:::-;14642:3;14663:67;14727:2;14722:3;14663:67;:::i;:::-;14656:74;;14739:93;14828:3;14739:93;:::i;:::-;14857:2;14852:3;14848:12;14841:19;;14500:366;;;:::o;14872:::-;15014:3;15035:67;15099:2;15094:3;15035:67;:::i;:::-;15028:74;;15111:93;15200:3;15111:93;:::i;:::-;15229:2;15224:3;15220:12;15213:19;;14872:366;;;:::o;15244:::-;15386:3;15407:67;15471:2;15466:3;15407:67;:::i;:::-;15400:74;;15483:93;15572:3;15483:93;:::i;:::-;15601:2;15596:3;15592:12;15585:19;;15244:366;;;:::o;15616:::-;15758:3;15779:67;15843:2;15838:3;15779:67;:::i;:::-;15772:74;;15855:93;15944:3;15855:93;:::i;:::-;15973:2;15968:3;15964:12;15957:19;;15616:366;;;:::o;15988:::-;16130:3;16151:67;16215:2;16210:3;16151:67;:::i;:::-;16144:74;;16227:93;16316:3;16227:93;:::i;:::-;16345:2;16340:3;16336:12;16329:19;;15988:366;;;:::o;16360:::-;16502:3;16523:67;16587:2;16582:3;16523:67;:::i;:::-;16516:74;;16599:93;16688:3;16599:93;:::i;:::-;16717:2;16712:3;16708:12;16701:19;;16360:366;;;:::o;16732:::-;16874:3;16895:67;16959:2;16954:3;16895:67;:::i;:::-;16888:74;;16971:93;17060:3;16971:93;:::i;:::-;17089:2;17084:3;17080:12;17073:19;;16732:366;;;:::o;17104:::-;17246:3;17267:67;17331:2;17326:3;17267:67;:::i;:::-;17260:74;;17343:93;17432:3;17343:93;:::i;:::-;17461:2;17456:3;17452:12;17445:19;;17104:366;;;:::o;17476:::-;17618:3;17639:67;17703:2;17698:3;17639:67;:::i;:::-;17632:74;;17715:93;17804:3;17715:93;:::i;:::-;17833:2;17828:3;17824:12;17817:19;;17476:366;;;:::o;17848:::-;17990:3;18011:67;18075:2;18070:3;18011:67;:::i;:::-;18004:74;;18087:93;18176:3;18087:93;:::i;:::-;18205:2;18200:3;18196:12;18189:19;;17848:366;;;:::o;18254:672::-;18385:4;18380:3;18376:14;18473:4;18466:5;18462:16;18456:23;18492:63;18549:4;18544:3;18540:14;18526:12;18492:63;:::i;:::-;18400:165;18650:4;18643:5;18639:16;18633:23;18669:63;18726:4;18721:3;18717:14;18703:12;18669:63;:::i;:::-;18575:167;18827:4;18820:5;18816:16;18810:23;18846:63;18903:4;18898:3;18894:14;18880:12;18846:63;:::i;:::-;18752:167;18354:572;18254:672;;:::o;18966:682::-;19107:4;19102:3;19098:14;19195:4;19188:5;19184:16;19178:23;19214:63;19271:4;19266:3;19262:14;19248:12;19214:63;:::i;:::-;19122:165;19372:4;19365:5;19361:16;19355:23;19391:63;19448:4;19443:3;19439:14;19425:12;19391:63;:::i;:::-;19297:167;19549:4;19542:5;19538:16;19532:23;19568:63;19625:4;19620:3;19616:14;19602:12;19568:63;:::i;:::-;19474:167;19076:572;18966:682;;:::o;19654:108::-;19731:24;19749:5;19731:24;:::i;:::-;19726:3;19719:37;19654:108;;:::o;19768:118::-;19855:24;19873:5;19855:24;:::i;:::-;19850:3;19843:37;19768:118;;:::o;19892:435::-;20072:3;20094:95;20185:3;20176:6;20094:95;:::i;:::-;20087:102;;20206:95;20297:3;20288:6;20206:95;:::i;:::-;20199:102;;20318:3;20311:10;;19892:435;;;;;:::o;20333:222::-;20426:4;20464:2;20453:9;20449:18;20441:26;;20477:71;20545:1;20534:9;20530:17;20521:6;20477:71;:::i;:::-;20333:222;;;;:::o;20561:640::-;20756:4;20794:3;20783:9;20779:19;20771:27;;20808:71;20876:1;20865:9;20861:17;20852:6;20808:71;:::i;:::-;20889:72;20957:2;20946:9;20942:18;20933:6;20889:72;:::i;:::-;20971;21039:2;21028:9;21024:18;21015:6;20971:72;:::i;:::-;21090:9;21084:4;21080:20;21075:2;21064:9;21060:18;21053:48;21118:76;21189:4;21180:6;21118:76;:::i;:::-;21110:84;;20561:640;;;;;;;:::o;21207:461::-;21394:4;21432:2;21421:9;21417:18;21409:26;;21481:9;21475:4;21471:20;21467:1;21456:9;21452:17;21445:47;21509:152;21656:4;21647:6;21509:152;:::i;:::-;21501:160;;21207:461;;;;:::o;21674:210::-;21761:4;21799:2;21788:9;21784:18;21776:26;;21812:65;21874:1;21863:9;21859:17;21850:6;21812:65;:::i;:::-;21674:210;;;;:::o;21890:376::-;22033:4;22071:2;22060:9;22056:18;22048:26;;22084:93;22174:1;22163:9;22159:17;22150:6;22084:93;:::i;:::-;22187:72;22255:2;22244:9;22240:18;22231:6;22187:72;:::i;:::-;21890:376;;;;;:::o;22272:313::-;22385:4;22423:2;22412:9;22408:18;22400:26;;22472:9;22466:4;22462:20;22458:1;22447:9;22443:17;22436:47;22500:78;22573:4;22564:6;22500:78;:::i;:::-;22492:86;;22272:313;;;;:::o;22591:419::-;22757:4;22795:2;22784:9;22780:18;22772:26;;22844:9;22838:4;22834:20;22830:1;22819:9;22815:17;22808:47;22872:131;22998:4;22872:131;:::i;:::-;22864:139;;22591:419;;;:::o;23016:::-;23182:4;23220:2;23209:9;23205:18;23197:26;;23269:9;23263:4;23259:20;23255:1;23244:9;23240:17;23233:47;23297:131;23423:4;23297:131;:::i;:::-;23289:139;;23016:419;;;:::o;23441:::-;23607:4;23645:2;23634:9;23630:18;23622:26;;23694:9;23688:4;23684:20;23680:1;23669:9;23665:17;23658:47;23722:131;23848:4;23722:131;:::i;:::-;23714:139;;23441:419;;;:::o;23866:::-;24032:4;24070:2;24059:9;24055:18;24047:26;;24119:9;24113:4;24109:20;24105:1;24094:9;24090:17;24083:47;24147:131;24273:4;24147:131;:::i;:::-;24139:139;;23866:419;;;:::o;24291:::-;24457:4;24495:2;24484:9;24480:18;24472:26;;24544:9;24538:4;24534:20;24530:1;24519:9;24515:17;24508:47;24572:131;24698:4;24572:131;:::i;:::-;24564:139;;24291:419;;;:::o;24716:::-;24882:4;24920:2;24909:9;24905:18;24897:26;;24969:9;24963:4;24959:20;24955:1;24944:9;24940:17;24933:47;24997:131;25123:4;24997:131;:::i;:::-;24989:139;;24716:419;;;:::o;25141:::-;25307:4;25345:2;25334:9;25330:18;25322:26;;25394:9;25388:4;25384:20;25380:1;25369:9;25365:17;25358:47;25422:131;25548:4;25422:131;:::i;:::-;25414:139;;25141:419;;;:::o;25566:::-;25732:4;25770:2;25759:9;25755:18;25747:26;;25819:9;25813:4;25809:20;25805:1;25794:9;25790:17;25783:47;25847:131;25973:4;25847:131;:::i;:::-;25839:139;;25566:419;;;:::o;25991:::-;26157:4;26195:2;26184:9;26180:18;26172:26;;26244:9;26238:4;26234:20;26230:1;26219:9;26215:17;26208:47;26272:131;26398:4;26272:131;:::i;:::-;26264:139;;25991:419;;;:::o;26416:::-;26582:4;26620:2;26609:9;26605:18;26597:26;;26669:9;26663:4;26659:20;26655:1;26644:9;26640:17;26633:47;26697:131;26823:4;26697:131;:::i;:::-;26689:139;;26416:419;;;:::o;26841:::-;27007:4;27045:2;27034:9;27030:18;27022:26;;27094:9;27088:4;27084:20;27080:1;27069:9;27065:17;27058:47;27122:131;27248:4;27122:131;:::i;:::-;27114:139;;26841:419;;;:::o;27266:::-;27432:4;27470:2;27459:9;27455:18;27447:26;;27519:9;27513:4;27509:20;27505:1;27494:9;27490:17;27483:47;27547:131;27673:4;27547:131;:::i;:::-;27539:139;;27266:419;;;:::o;27691:::-;27857:4;27895:2;27884:9;27880:18;27872:26;;27944:9;27938:4;27934:20;27930:1;27919:9;27915:17;27908:47;27972:131;28098:4;27972:131;:::i;:::-;27964:139;;27691:419;;;:::o;28116:::-;28282:4;28320:2;28309:9;28305:18;28297:26;;28369:9;28363:4;28359:20;28355:1;28344:9;28340:17;28333:47;28397:131;28523:4;28397:131;:::i;:::-;28389:139;;28116:419;;;:::o;28541:::-;28707:4;28745:2;28734:9;28730:18;28722:26;;28794:9;28788:4;28784:20;28780:1;28769:9;28765:17;28758:47;28822:131;28948:4;28822:131;:::i;:::-;28814:139;;28541:419;;;:::o;28966:::-;29132:4;29170:2;29159:9;29155:18;29147:26;;29219:9;29213:4;29209:20;29205:1;29194:9;29190:17;29183:47;29247:131;29373:4;29247:131;:::i;:::-;29239:139;;28966:419;;;:::o;29391:::-;29557:4;29595:2;29584:9;29580:18;29572:26;;29644:9;29638:4;29634:20;29630:1;29619:9;29615:17;29608:47;29672:131;29798:4;29672:131;:::i;:::-;29664:139;;29391:419;;;:::o;29816:::-;29982:4;30020:2;30009:9;30005:18;29997:26;;30069:9;30063:4;30059:20;30055:1;30044:9;30040:17;30033:47;30097:131;30223:4;30097:131;:::i;:::-;30089:139;;29816:419;;;:::o;30241:::-;30407:4;30445:2;30434:9;30430:18;30422:26;;30494:9;30488:4;30484:20;30480:1;30469:9;30465:17;30458:47;30522:131;30648:4;30522:131;:::i;:::-;30514:139;;30241:419;;;:::o;30666:::-;30832:4;30870:2;30859:9;30855:18;30847:26;;30919:9;30913:4;30909:20;30905:1;30894:9;30890:17;30883:47;30947:131;31073:4;30947:131;:::i;:::-;30939:139;;30666:419;;;:::o;31091:::-;31257:4;31295:2;31284:9;31280:18;31272:26;;31344:9;31338:4;31334:20;31330:1;31319:9;31315:17;31308:47;31372:131;31498:4;31372:131;:::i;:::-;31364:139;;31091:419;;;:::o;31516:::-;31682:4;31720:2;31709:9;31705:18;31697:26;;31769:9;31763:4;31759:20;31755:1;31744:9;31740:17;31733:47;31797:131;31923:4;31797:131;:::i;:::-;31789:139;;31516:419;;;:::o;31941:310::-;32078:4;32116:2;32105:9;32101:18;32093:26;;32129:115;32241:1;32230:9;32226:17;32217:6;32129:115;:::i;:::-;31941:310;;;;:::o;32257:222::-;32350:4;32388:2;32377:9;32373:18;32365:26;;32401:71;32469:1;32458:9;32454:17;32445:6;32401:71;:::i;:::-;32257:222;;;;:::o;32485:129::-;32519:6;32546:20;;:::i;:::-;32536:30;;32575:33;32603:4;32595:6;32575:33;:::i;:::-;32485:129;;;:::o;32620:75::-;32653:6;32686:2;32680:9;32670:19;;32620:75;:::o;32701:307::-;32762:4;32852:18;32844:6;32841:30;32838:56;;;32874:18;;:::i;:::-;32838:56;32912:29;32934:6;32912:29;:::i;:::-;32904:37;;32996:4;32990;32986:15;32978:23;;32701:307;;;:::o;33014:308::-;33076:4;33166:18;33158:6;33155:30;33152:56;;;33188:18;;:::i;:::-;33152:56;33226:29;33248:6;33226:29;:::i;:::-;33218:37;;33310:4;33304;33300:15;33292:23;;33014:308;;;:::o;33328:154::-;33417:4;33440:3;33432:11;;33470:4;33465:3;33461:14;33453:22;;33328:154;;;:::o;33488:136::-;33577:6;33611:5;33605:12;33595:22;;33488:136;;;:::o;33630:98::-;33681:6;33715:5;33709:12;33699:22;;33630:98;;;:::o;33734:99::-;33786:6;33820:5;33814:12;33804:22;;33734:99;;;:::o;33839:135::-;33931:4;33963;33958:3;33954:14;33946:22;;33839:135;;;:::o;33980:206::-;34101:11;34135:6;34130:3;34123:19;34175:4;34170:3;34166:14;34151:29;;33980:206;;;;:::o;34192:168::-;34275:11;34309:6;34304:3;34297:19;34349:4;34344:3;34340:14;34325:29;;34192:168;;;;:::o;34366:169::-;34450:11;34484:6;34479:3;34472:19;34524:4;34519:3;34515:14;34500:29;;34366:169;;;;:::o;34541:148::-;34643:11;34680:3;34665:18;;34541:148;;;;:::o;34695:305::-;34735:3;34754:20;34772:1;34754:20;:::i;:::-;34749:25;;34788:20;34806:1;34788:20;:::i;:::-;34783:25;;34942:1;34874:66;34870:74;34867:1;34864:81;34861:107;;;34948:18;;:::i;:::-;34861:107;34992:1;34989;34985:9;34978:16;;34695:305;;;;:::o;35006:185::-;35046:1;35063:20;35081:1;35063:20;:::i;:::-;35058:25;;35097:20;35115:1;35097:20;:::i;:::-;35092:25;;35136:1;35126:35;;35141:18;;:::i;:::-;35126:35;35183:1;35180;35176:9;35171:14;;35006:185;;;;:::o;35197:191::-;35237:4;35257:20;35275:1;35257:20;:::i;:::-;35252:25;;35291:20;35309:1;35291:20;:::i;:::-;35286:25;;35330:1;35327;35324:8;35321:34;;;35335:18;;:::i;:::-;35321:34;35380:1;35377;35373:9;35365:17;;35197:191;;;;:::o;35394:96::-;35431:7;35460:24;35478:5;35460:24;:::i;:::-;35449:35;;35394:96;;;:::o;35496:90::-;35530:7;35573:5;35566:13;35559:21;35548:32;;35496:90;;;:::o;35592:149::-;35628:7;35668:66;35661:5;35657:78;35646:89;;35592:149;;;:::o;35747:126::-;35784:7;35824:42;35817:5;35813:54;35802:65;;35747:126;;;:::o;35879:77::-;35916:7;35945:5;35934:16;;35879:77;;;:::o;35962:148::-;36034:9;36067:37;36098:5;36067:37;:::i;:::-;36054:50;;35962:148;;;:::o;36116:126::-;36166:9;36199:37;36230:5;36199:37;:::i;:::-;36186:50;;36116:126;;;:::o;36248:113::-;36298:9;36331:24;36349:5;36331:24;:::i;:::-;36318:37;;36248:113;;;:::o;36367:154::-;36451:6;36446:3;36441;36428:30;36513:1;36504:6;36499:3;36495:16;36488:27;36367:154;;;:::o;36527:307::-;36595:1;36605:113;36619:6;36616:1;36613:13;36605:113;;;36704:1;36699:3;36695:11;36689:18;36685:1;36680:3;36676:11;36669:39;36641:2;36638:1;36634:10;36629:15;;36605:113;;;36736:6;36733:1;36730:13;36727:101;;;36816:1;36807:6;36802:3;36798:16;36791:27;36727:101;36576:258;36527:307;;;:::o;36840:320::-;36884:6;36921:1;36915:4;36911:12;36901:22;;36968:1;36962:4;36958:12;36989:18;36979:81;;37045:4;37037:6;37033:17;37023:27;;36979:81;37107:2;37099:6;37096:14;37076:18;37073:38;37070:84;;;37126:18;;:::i;:::-;37070:84;36891:269;36840:320;;;:::o;37166:281::-;37249:27;37271:4;37249:27;:::i;:::-;37241:6;37237:40;37379:6;37367:10;37364:22;37343:18;37331:10;37328:34;37325:62;37322:88;;;37390:18;;:::i;:::-;37322:88;37430:10;37426:2;37419:22;37209:238;37166:281;;:::o;37453:233::-;37492:3;37515:24;37533:5;37515:24;:::i;:::-;37506:33;;37561:66;37554:5;37551:77;37548:103;;;37631:18;;:::i;:::-;37548:103;37678:1;37671:5;37667:13;37660:20;;37453:233;;;:::o;37692:176::-;37724:1;37741:20;37759:1;37741:20;:::i;:::-;37736:25;;37775:20;37793:1;37775:20;:::i;:::-;37770:25;;37814:1;37804:35;;37819:18;;:::i;:::-;37804:35;37860:1;37857;37853:9;37848:14;;37692:176;;;;:::o;37874:180::-;37922:77;37919:1;37912:88;38019:4;38016:1;38009:15;38043:4;38040:1;38033:15;38060:180;38108:77;38105:1;38098:88;38205:4;38202:1;38195:15;38229:4;38226:1;38219:15;38246:180;38294:77;38291:1;38284:88;38391:4;38388:1;38381:15;38415:4;38412:1;38405:15;38432:180;38480:77;38477:1;38470:88;38577:4;38574:1;38567:15;38601:4;38598:1;38591:15;38618:180;38666:77;38663:1;38656:88;38763:4;38760:1;38753:15;38787:4;38784:1;38777:15;38804:180;38852:77;38849:1;38842:88;38949:4;38946:1;38939:15;38973:4;38970:1;38963:15;38990:117;39099:1;39096;39089:12;39113:117;39222:1;39219;39212:12;39236:117;39345:1;39342;39335:12;39359:117;39468:1;39465;39458:12;39482:102;39523:6;39574:2;39570:7;39565:2;39558:5;39554:14;39550:28;39540:38;;39482:102;;;:::o;39590:230::-;39730:34;39726:1;39718:6;39714:14;39707:58;39799:13;39794:2;39786:6;39782:15;39775:38;39590:230;:::o;39826:170::-;39966:22;39962:1;39954:6;39950:14;39943:46;39826:170;:::o;40002:230::-;40142:34;40138:1;40130:6;40126:14;40119:58;40211:13;40206:2;40198:6;40194:15;40187:38;40002:230;:::o;40238:237::-;40378:34;40374:1;40366:6;40362:14;40355:58;40447:20;40442:2;40434:6;40430:15;40423:45;40238:237;:::o;40481:225::-;40621:34;40617:1;40609:6;40605:14;40598:58;40690:8;40685:2;40677:6;40673:15;40666:33;40481:225;:::o;40712:224::-;40852:34;40848:1;40840:6;40836:14;40829:58;40921:7;40916:2;40908:6;40904:15;40897:32;40712:224;:::o;40942:178::-;41082:30;41078:1;41070:6;41066:14;41059:54;40942:178;:::o;41126:226::-;41266:34;41262:1;41254:6;41250:14;41243:58;41335:9;41330:2;41322:6;41318:15;41311:34;41126:226;:::o;41358:223::-;41498:34;41494:1;41486:6;41482:14;41475:58;41567:6;41562:2;41554:6;41550:15;41543:31;41358:223;:::o;41587:175::-;41727:27;41723:1;41715:6;41711:14;41704:51;41587:175;:::o;41768:231::-;41908:34;41904:1;41896:6;41892:14;41885:58;41977:14;41972:2;41964:6;41960:15;41953:39;41768:231;:::o;42005:166::-;42145:18;42141:1;42133:6;42129:14;42122:42;42005:166;:::o;42177:243::-;42317:34;42313:1;42305:6;42301:14;42294:58;42386:26;42381:2;42373:6;42369:15;42362:51;42177:243;:::o;42426:229::-;42566:34;42562:1;42554:6;42550:14;42543:58;42635:12;42630:2;42622:6;42618:15;42611:37;42426:229;:::o;42661:228::-;42801:34;42797:1;42789:6;42785:14;42778:58;42870:11;42865:2;42857:6;42853:15;42846:36;42661:228;:::o;42895:182::-;43035:34;43031:1;43023:6;43019:14;43012:58;42895:182;:::o;43083:231::-;43223:34;43219:1;43211:6;43207:14;43200:58;43292:14;43287:2;43279:6;43275:15;43268:39;43083:231;:::o;43320:182::-;43460:34;43456:1;43448:6;43444:14;43437:58;43320:182;:::o;43508:234::-;43648:34;43644:1;43636:6;43632:14;43625:58;43717:17;43712:2;43704:6;43700:15;43693:42;43508:234;:::o;43748:220::-;43888:34;43884:1;43876:6;43872:14;43865:58;43957:3;43952:2;43944:6;43940:15;43933:28;43748:220;:::o;43974:236::-;44114:34;44110:1;44102:6;44098:14;44091:58;44183:19;44178:2;44170:6;44166:15;44159:44;43974:236;:::o;44216:231::-;44356:34;44352:1;44344:6;44340:14;44333:58;44425:14;44420:2;44412:6;44408:15;44401:39;44216:231;:::o;44453:122::-;44526:24;44544:5;44526:24;:::i;:::-;44519:5;44516:35;44506:63;;44565:1;44562;44555:12;44506:63;44453:122;:::o;44581:116::-;44651:21;44666:5;44651:21;:::i;:::-;44644:5;44641:32;44631:60;;44687:1;44684;44677:12;44631:60;44581:116;:::o;44703:120::-;44775:23;44792:5;44775:23;:::i;:::-;44768:5;44765:34;44755:62;;44813:1;44810;44803:12;44755:62;44703:120;:::o;44829:122::-;44902:24;44920:5;44902:24;:::i;:::-;44895:5;44892:35;44882:63;;44941:1;44938;44931:12;44882:63;44829:122;:::o

Swarm Source

ipfs://b86211fc6947607110cffeb964dbeb797283cfee270c66b4d83d59bb50821697
Loading