ETH Price: $2,103.64 (+0.10%)

Transaction Decoder

Block:
16719926 at Feb-27-2023 01:48:47 PM +UTC
Transaction Fee:
0.003030559643040623 ETH $6.38
Gas Used:
128,677 Gas / 23.551680899 Gwei

Emitted Events:

200 0xe21ebcd28d37a67757b9bc7b290f4c4928a430b1.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x000000000000000000000000573d2335f039c4f6cbb394bc8a6c13d930343339, 0x00000000000000000000000032978167f4f07dae4e95120c38f986d78ac198cc, 0x00000000000000000000000000000000000000000000000000000000000004a2 )
201 DuneDiamond.0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925( 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925, 0x000000000000000000000000573d2335f039c4f6cbb394bc8a6c13d930343339, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x00000000000000000000000000000000000000000000000000000000000004a2 )
202 DuneDiamond.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x000000000000000000000000573d2335f039c4f6cbb394bc8a6c13d930343339, 0x00000000000000000000000032978167f4f07dae4e95120c38f986d78ac198cc, 0x00000000000000000000000000000000000000000000000000000000000004a2 )

Account State Difference:

  Address   Before After State Difference Code
0x07F4D069...8D951a002
0x573d2335...930343339
0.013573321842524711 Eth
Nonce: 59
0.010542762199484088 Eth
Nonce: 60
0.003030559643040623
(builder0x69)
2.064631164096565561 Eth2.064695502596565561 Eth0.0000643385
0xe21EBCD2...928A430b1

Execution Trace

The Saudis: SAUD Token.b88d4fde( )
  • 0xf71db91691b200ee5fbfd8f59c30d813b35e9669.b88d4fde( )
    • DuneDiamond.23b872dd( )
      • 0x6bfc971ff46934817ebe5b218da5d9b0bf1ed077.23b872dd( )
        // SPDX-License-Identifier: UNLICENSED
        pragma solidity ^0.8.13;
        import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
        import { IOpenseaSeaportConduitController } from "./Interfaces.sol";
        library Constants {
        \tstring public constant NAME = "The Saudis Soulbound";
        \tstring public constant SYMBOL = "SASB";
        \tuint256 public constant MATURITY_TIMESTAMP = 1657825200 + 40 days;
        \tIERC721 public constant SAUD_CONTRACT = IERC721(0xe21EBCD28d37A67757B9Bc7b290f4C4928A430b1);
        \tIOpenseaSeaportConduitController public constant OPENSEA_SEAPORT_CONDUIT_CONTROLLER = IOpenseaSeaportConduitController(0x00000000F9490004C11Cef243f5400493c00Ad63);
            address public constant OPENSEA_SEAPORT = 0x00000000006c3852cbEf3e08E8dF289169EdE581;
        \taddress public constant ROYALTY_WALLET_ADDRESS = 0xbfE5D10F8DeDed4706C212399D74289f860ac289;
        \tuint96 public constant ROYALTY_BASIS_POINTS = 750;
        }// SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
        pragma solidity ^0.8.0;
        import "../../utils/introspection/IERC165.sol";
        /**
         * @dev Required interface of an ERC721 compliant contract.
         */
        interface IERC721 is IERC165 {
            /**
             * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
             */
            event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
            /**
             * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
             */
            event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
            /**
             * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
             */
            event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
            /**
             * @dev Returns the number of tokens in ``owner``'s account.
             */
            function balanceOf(address owner) external view returns (uint256 balance);
            /**
             * @dev Returns the owner of the `tokenId` token.
             *
             * Requirements:
             *
             * - `tokenId` must exist.
             */
            function ownerOf(uint256 tokenId) external view returns (address owner);
            /**
             * @dev Safely transfers `tokenId` token from `from` to `to`.
             *
             * 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;
            /**
             * @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 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 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 the account approved for `tokenId` token.
             *
             * Requirements:
             *
             * - `tokenId` must exist.
             */
            function getApproved(uint256 tokenId) external view returns (address operator);
            /**
             * @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);
        }
        // SPDX-License-Identifier: UNLICENSED
        // © 2022 [XXX]. All rights reserved.
        pragma solidity ^0.8.13;
        /******************************************************************************\\
        * Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
        * EIP-2535 Diamond Standard: https://eips.ethereum.org/EIPS/eip-2535
        /******************************************************************************/
        interface IDiamondCut {
            enum FacetCutAction {Add, Replace, Remove}
            // Add=0, Replace=1, Remove=2
            struct FacetCut {
                address facetAddress;
                FacetCutAction action;
                bytes4[] functionSelectors;
            }
            /// @notice Add/replace/remove any number of functions and optionally execute
            ///         a function with delegatecall
            /// @param _diamondCut Contains the facet addresses and function selectors
            /// @param _init The address of the contract or facet to execute _calldata
            /// @param _calldata A function call, including function selector and arguments
            ///                  _calldata is executed with delegatecall on _init
            function diamondCut(
                FacetCut[] calldata _diamondCut,
                address _init,
                bytes calldata _calldata
            ) external;
            event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
        }
        // A loupe is a small magnifying glass used to look at diamonds.
        // These functions look at diamonds
        interface IDiamondLoupe {
            /// These functions are expected to be called frequently
            /// by tools.
            struct Facet {
                address facetAddress;
                bytes4[] functionSelectors;
            }
            /// @notice Gets all facet addresses and their four byte function selectors.
            /// @return facets_ Facet
            function facets() external view returns (Facet[] memory facets_);
            /// @notice Gets all the function selectors supported by a specific facet.
            /// @param _facet The facet address.
            /// @return facetFunctionSelectors_
            function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_);
            /// @notice Get all the facet addresses used by a diamond.
            /// @return facetAddresses_
            function facetAddresses() external view returns (address[] memory facetAddresses_);
            /// @notice Gets the facet that supports the given selector.
            /// @dev If facet is not found return address(0).
            /// @param _functionSelector The function selector.
            /// @return facetAddress_ The facet address.
            function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_);
        }
        interface IOpenseaSeaportConduitController {
            function getConduit(bytes32 conduitKey) external view returns (address conduit, bool exists);
            function getChannelStatus(address conduit, address channel) external view returns (bool isOpen);
        }
        /// @title ERC-173 Contract Ownership Standard
        ///  Note: the ERC-165 identifier for this interface is 0x7f5828d0
        /* is ERC165 */
        interface IERC173 {
            /// @dev This emits when ownership of a contract changes.
            event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
            /// @notice Get the address of the owner
            /// @return owner_ The address of the owner.
            function owner() external view returns (address owner_);
            /// @notice Set the address of the new owner of the contract
            /// @dev Set _newOwner to address(0) to renounce any ownership.
            /// @param _newOwner The address of the new owner of the contract
            function transferOwnership(address _newOwner) external;
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
        pragma solidity ^0.8.0;
        /**
         * @dev Interface of the ERC165 standard, as defined in the
         * https://eips.ethereum.org/EIPS/eip-165[EIP].
         *
         * Implementers can declare support of contract interfaces, which can then be
         * queried by others ({ERC165Checker}).
         *
         * For an implementation, see {ERC165}.
         */
        interface IERC165 {
            /**
             * @dev Returns true if this contract implements the interface defined by
             * `interfaceId`. See the corresponding
             * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
             * to learn more about how these ids are created.
             *
             * This function call must use less than 30 000 gas.
             */
            function supportsInterface(bytes4 interfaceId) external view returns (bool);
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)
        pragma solidity ^0.8.0;
        /**
         * @dev Provides a set of functions to operate with Base64 strings.
         *
         * _Available since v4.5._
         */
        library Base64 {
            /**
             * @dev Base64 Encoding/Decoding Table
             */
            string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
            /**
             * @dev Converts a `bytes` to its Bytes64 `string` representation.
             */
            function encode(bytes memory data) internal pure returns (string memory) {
                /**
                 * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
                 * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
                 */
                if (data.length == 0) return "";
                // Loads the table into memory
                string memory table = _TABLE;
                // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
                // and split into 4 numbers of 6 bits.
                // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
                // - `data.length + 2`  -> Round up
                // - `/ 3`              -> Number of 3-bytes chunks
                // - `4 *`              -> 4 characters for each chunk
                string memory result = new string(4 * ((data.length + 2) / 3));
                /// @solidity memory-safe-assembly
                assembly {
                    // Prepare the lookup table (skip the first "length" byte)
                    let tablePtr := add(table, 1)
                    // Prepare result pointer, jump over length
                    let resultPtr := add(result, 32)
                    // Run over the input, 3 bytes at a time
                    for {
                        let dataPtr := data
                        let endPtr := add(data, mload(data))
                    } lt(dataPtr, endPtr) {
                    } {
                        // Advance 3 bytes
                        dataPtr := add(dataPtr, 3)
                        let input := mload(dataPtr)
                        // To write each character, shift the 3 bytes (18 bits) chunk
                        // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                        // and apply logical AND with 0x3F which is the number of
                        // the previous character in the ASCII table prior to the Base64 Table
                        // The result is then added to the table to get the character to write,
                        // and finally write it in the result pointer but with a left shift
                        // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits
                        mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                        resultPtr := add(resultPtr, 1) // Advance
                        mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                        resultPtr := add(resultPtr, 1) // Advance
                        mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                        resultPtr := add(resultPtr, 1) // Advance
                        mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                        resultPtr := add(resultPtr, 1) // Advance
                    }
                    // When data `bytes` is not exactly 3 bytes long
                    // it is padded with `=` characters at the end
                    switch mod(mload(data), 3)
                    case 1 {
                        mstore8(sub(resultPtr, 1), 0x3d)
                        mstore8(sub(resultPtr, 2), 0x3d)
                    }
                    case 2 {
                        mstore8(sub(resultPtr, 1), 0x3d)
                    }
                }
                return result;
            }
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
        pragma solidity ^0.8.0;
        /**
         * @dev String operations.
         */
        library Strings {
            bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
            uint8 private constant _ADDRESS_LENGTH = 20;
            /**
             * @dev Converts a `uint256` to its ASCII `string` decimal representation.
             */
            function toString(uint256 value) internal pure returns (string memory) {
                // Inspired by OraclizeAPI's implementation - MIT licence
                // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
                if (value == 0) {
                    return "0";
                }
                uint256 temp = value;
                uint256 digits;
                while (temp != 0) {
                    digits++;
                    temp /= 10;
                }
                bytes memory buffer = new bytes(digits);
                while (value != 0) {
                    digits -= 1;
                    buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
                    value /= 10;
                }
                return string(buffer);
            }
            /**
             * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
             */
            function toHexString(uint256 value) internal pure returns (string memory) {
                if (value == 0) {
                    return "0x00";
                }
                uint256 temp = value;
                uint256 length = 0;
                while (temp != 0) {
                    length++;
                    temp >>= 8;
                }
                return toHexString(value, length);
            }
            /**
             * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
             */
            function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
                bytes memory buffer = new bytes(2 * length + 2);
                buffer[0] = "0";
                buffer[1] = "x";
                for (uint256 i = 2 * length + 1; i > 1; --i) {
                    buffer[i] = _HEX_SYMBOLS[value & 0xf];
                    value >>= 4;
                }
                require(value == 0, "Strings: hex length insufficient");
                return string(buffer);
            }
            /**
             * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
             */
            function toHexString(address addr) internal pure returns (string memory) {
                return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
            }
        }
        // SPDX-License-Identifier: UNLICENSED
        // © 2022 [XXX]. All rights reserved.
        pragma solidity ^0.8.13;
        import "@openzeppelin/contracts/access/Ownable.sol";
        import "@openzeppelin/contracts/security/Pausable.sol";
        import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
        import { AppStorage } from "../Structs.sol";
        import "../Interfaces.sol";
        import "../LibDiamond.sol";
        /*
            @dev
            This contract is part of a diamond / facets implementation as described
            in EIP 2535 (https://eips.ethereum.org/EIPS/eip-2535)
        */
        contract BaseFacet is Ownable, Pausable, ReentrancyGuard {
        \tfunction getState()
        \t\tinternal pure returns (AppStorage storage s)
        \t{
        \t\treturn LibDiamond.appStorage();
        \t}
        }
        // SPDX-License-Identifier: UNLICENSED
        // © 2022 [XXX]. All rights reserved.
        pragma solidity ^0.8.13;
        struct Chapter {
        \tstring name;
        \tstring description;
        \tuint8 attributeTypeCount;
        \t// attributeTypeId => attributeType
        \tmapping(uint8 => Attribute.Type) attributeTypes;
        \t// tokenId => (attributeTypeId => Bitfield of attribute available)
        \tmapping(
        \t\tuint256 => mapping(
        \t\t\tuint8 => uint256
        \t\t)
        \t) availableAttributes;
        \t// tokenId => (attributeTypeId => attributeId active)
        \tmapping(
        \t\tuint256 => mapping(
        \t\t\tuint8 => uint8
        \t\t)
        \t) activeAttributes;
        }
        library Attribute {
        \tstruct Selection {
        \t\tstring name;
        \t\tstring description;
        \t\tstring dataUri;
        \t}
        \tstruct Type {
        \t\tstring name;
        \t\tstring description;
        \t\tuint8 zIndex;
        \t\tbool visible;
        \t\tmapping(uint8 => Selection) selections;
        \t}
        }
        struct AppStorage {
        \t// =============================================================================
        \t// Artwork
        \t// =============================================================================
        \t// attributeTypeId reserved for chapters 
        \tuint8 chapterId;
        \tmapping(uint8 => Chapter) chapters;
        \t// attributeTypeId => attributeType
        \tmapping(uint8 => Attribute.Type) attributeTypes;
        \t// tokenId => (attributeTypeId => Bitfield of attribute available)
        \tmapping(
        \t\tuint256 => mapping(
        \t\t\tuint8 => uint256
        \t\t)
        \t) availableAttributes;
        \t// tokenId => (attributeTypeId => attributeId active)
        \tmapping(
        \t\tuint256 => mapping(
        \t\t\tuint8 => uint8
        \t\t)
        \t) activeAttributes;
        \t
        \tstring tokenBaseExternalUrl;
        \tstring contractLevelImageUrl;
        \tstring contractLevelExternalUrl;
        \t// =============================================================================
        \t// Royalty
        \t// =============================================================================
        \taddress royaltyWalletAddress;
        \tuint96 royaltyBasisPoints;
        }
        struct FacetAddressAndPosition {
        \taddress facetAddress;
        \tuint16 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
        }
        struct FacetFunctionSelectors {
        \tbytes4[] functionSelectors;
        \tuint16 facetAddressPosition; // position of facetAddress in facetAddresses array
        }
        struct DiamondStorage {
        \t// maps function selector to the facet address and
        \t// the position of the selector in the facetFunctionSelectors.selectors array
        \tmapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
        \t// maps facet addresses to function selectors
        \tmapping(address => FacetFunctionSelectors) facetFunctionSelectors;
        \t// facet addresses
        \taddress[] facetAddresses;
        \t// Used to query if a contract implements an interface.
        \t// Used to implement ERC-165.
        \tmapping(bytes4 => bool) supportedInterfaces;
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
             */
            function onERC721Received(
                address operator,
                address from,
                uint256 tokenId,
                bytes calldata data
            ) external returns (bytes4);
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
        pragma solidity ^0.8.0;
        import "../IERC721.sol";
        /**
         * @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);
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
        pragma solidity ^0.8.1;
        /**
         * @dev Collection of functions related to the address type
         */
        library Address {
            /**
             * @dev Returns true if `account` is a contract.
             *
             * [IMPORTANT]
             * ====
             * It is unsafe to assume that an address for which this function returns
             * false is an externally-owned account (EOA) and not a contract.
             *
             * Among others, `isContract` will return false for the following
             * types of addresses:
             *
             *  - an externally-owned account
             *  - a contract in construction
             *  - an address where a contract will be created
             *  - an address where a contract lived, but was destroyed
             * ====
             *
             * [IMPORTANT]
             * ====
             * You shouldn't rely on `isContract` to protect against flash loan attacks!
             *
             * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
             * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
             * constructor.
             * ====
             */
            function isContract(address account) internal view returns (bool) {
                // This method relies on extcodesize/address.code.length, which returns 0
                // for contracts in construction, since the code is only stored at the end
                // of the constructor execution.
                return account.code.length > 0;
            }
            /**
             * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
             * `recipient`, forwarding all available gas and reverting on errors.
             *
             * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
             * of certain opcodes, possibly making contracts go over the 2300 gas limit
             * imposed by `transfer`, making them unable to receive funds via
             * `transfer`. {sendValue} removes this limitation.
             *
             * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
             *
             * IMPORTANT: because control is transferred to `recipient`, care must be
             * taken to not create reentrancy vulnerabilities. Consider using
             * {ReentrancyGuard} or the
             * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
             */
            function sendValue(address payable recipient, uint256 amount) internal {
                require(address(this).balance >= amount, "Address: insufficient balance");
                (bool success, ) = recipient.call{value: amount}("");
                require(success, "Address: unable to send value, recipient may have reverted");
            }
            /**
             * @dev Performs a Solidity function call using a low level `call`. A
             * plain `call` is an unsafe replacement for a function call: use this
             * function instead.
             *
             * If `target` reverts with a revert reason, it is bubbled up by this
             * function (like regular Solidity function calls).
             *
             * Returns the raw returned data. To convert to the expected return value,
             * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
             *
             * Requirements:
             *
             * - `target` must be a contract.
             * - calling `target` with `data` must not revert.
             *
             * _Available since v3.1._
             */
            function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                return functionCall(target, data, "Address: low-level call failed");
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
             * `errorMessage` as a fallback revert reason when `target` reverts.
             *
             * _Available since v3.1._
             */
            function functionCall(
                address target,
                bytes memory data,
                string memory errorMessage
            ) internal returns (bytes memory) {
                return functionCallWithValue(target, data, 0, errorMessage);
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
             * but also transferring `value` wei to `target`.
             *
             * Requirements:
             *
             * - the calling contract must have an ETH balance of at least `value`.
             * - the called Solidity function must be `payable`.
             *
             * _Available since v3.1._
             */
            function functionCallWithValue(
                address target,
                bytes memory data,
                uint256 value
            ) internal returns (bytes memory) {
                return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
            }
            /**
             * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
             * with `errorMessage` as a fallback revert reason when `target` reverts.
             *
             * _Available since v3.1._
             */
            function functionCallWithValue(
                address target,
                bytes memory data,
                uint256 value,
                string memory errorMessage
            ) internal returns (bytes memory) {
                require(address(this).balance >= value, "Address: insufficient balance for call");
                require(isContract(target), "Address: call to non-contract");
                (bool success, bytes memory returndata) = target.call{value: value}(data);
                return verifyCallResult(success, returndata, errorMessage);
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
             * but performing a static call.
             *
             * _Available since v3.3._
             */
            function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                return functionStaticCall(target, data, "Address: low-level static call failed");
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
             * but performing a static call.
             *
             * _Available since v3.3._
             */
            function functionStaticCall(
                address target,
                bytes memory data,
                string memory errorMessage
            ) internal view returns (bytes memory) {
                require(isContract(target), "Address: static call to non-contract");
                (bool success, bytes memory returndata) = target.staticcall(data);
                return verifyCallResult(success, returndata, errorMessage);
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
             * but performing a delegate call.
             *
             * _Available since v3.4._
             */
            function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
                return functionDelegateCall(target, data, "Address: low-level delegate call failed");
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
             * but performing a delegate call.
             *
             * _Available since v3.4._
             */
            function functionDelegateCall(
                address target,
                bytes memory data,
                string memory errorMessage
            ) internal returns (bytes memory) {
                require(isContract(target), "Address: delegate call to non-contract");
                (bool success, bytes memory returndata) = target.delegatecall(data);
                return verifyCallResult(success, returndata, errorMessage);
            }
            /**
             * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
             * revert reason using the provided one.
             *
             * _Available since v4.3._
             */
            function verifyCallResult(
                bool success,
                bytes memory returndata,
                string memory errorMessage
            ) internal pure returns (bytes memory) {
                if (success) {
                    return returndata;
                } else {
                    // Look for revert reason and bubble it up if present
                    if (returndata.length > 0) {
                        // The easiest way to bubble the revert reason is using memory via assembly
                        /// @solidity memory-safe-assembly
                        assembly {
                            let returndata_size := mload(returndata)
                            revert(add(32, returndata), returndata_size)
                        }
                    } else {
                        revert(errorMessage);
                    }
                }
            }
        }
        // SPDX-License-Identifier: MIT
        // 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;
            }
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
        pragma solidity ^0.8.0;
        import "./IERC165.sol";
        /**
         * @dev Implementation of the {IERC165} interface.
         *
         * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
         * for the additional interface id that will be supported. For example:
         *
         * ```solidity
         * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
         *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
         * }
         * ```
         *
         * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
         */
        abstract contract ERC165 is IERC165 {
            /**
             * @dev See {IERC165-supportsInterface}.
             */
            function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
                return interfaceId == type(IERC165).interfaceId;
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >= 0.4.22 <0.9.0;
        library console {
        \taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
        \tfunction _sendLogPayload(bytes memory payload) private view {
        \t\tuint256 payloadLength = payload.length;
        \t\taddress consoleAddress = CONSOLE_ADDRESS;
        \t\tassembly {
        \t\t\tlet payloadStart := add(payload, 32)
        \t\t\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
        \t\t}
        \t}
        \tfunction log() internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log()"));
        \t}
        \tfunction logInt(int p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
        \t}
        \tfunction logUint(uint p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
        \t}
        \tfunction logString(string memory p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
        \t}
        \tfunction logBool(bool p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
        \t}
        \tfunction logAddress(address p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
        \t}
        \tfunction logBytes(bytes memory p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
        \t}
        \tfunction logBytes1(bytes1 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
        \t}
        \tfunction logBytes2(bytes2 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
        \t}
        \tfunction logBytes3(bytes3 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
        \t}
        \tfunction logBytes4(bytes4 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
        \t}
        \tfunction logBytes5(bytes5 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
        \t}
        \tfunction logBytes6(bytes6 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
        \t}
        \tfunction logBytes7(bytes7 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
        \t}
        \tfunction logBytes8(bytes8 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
        \t}
        \tfunction logBytes9(bytes9 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
        \t}
        \tfunction logBytes10(bytes10 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
        \t}
        \tfunction logBytes11(bytes11 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
        \t}
        \tfunction logBytes12(bytes12 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
        \t}
        \tfunction logBytes13(bytes13 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
        \t}
        \tfunction logBytes14(bytes14 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
        \t}
        \tfunction logBytes15(bytes15 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
        \t}
        \tfunction logBytes16(bytes16 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
        \t}
        \tfunction logBytes17(bytes17 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
        \t}
        \tfunction logBytes18(bytes18 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
        \t}
        \tfunction logBytes19(bytes19 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
        \t}
        \tfunction logBytes20(bytes20 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
        \t}
        \tfunction logBytes21(bytes21 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
        \t}
        \tfunction logBytes22(bytes22 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
        \t}
        \tfunction logBytes23(bytes23 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
        \t}
        \tfunction logBytes24(bytes24 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
        \t}
        \tfunction logBytes25(bytes25 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
        \t}
        \tfunction logBytes26(bytes26 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
        \t}
        \tfunction logBytes27(bytes27 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
        \t}
        \tfunction logBytes28(bytes28 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
        \t}
        \tfunction logBytes29(bytes29 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
        \t}
        \tfunction logBytes30(bytes30 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
        \t}
        \tfunction logBytes31(bytes31 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
        \t}
        \tfunction logBytes32(bytes32 p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
        \t}
        \tfunction log(uint p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
        \t}
        \tfunction log(string memory p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
        \t}
        \tfunction log(bool p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
        \t}
        \tfunction log(address p0) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
        \t}
        \tfunction log(uint p0, uint p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
        \t}
        \tfunction log(uint p0, string memory p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
        \t}
        \tfunction log(uint p0, bool p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
        \t}
        \tfunction log(uint p0, address p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
        \t}
        \tfunction log(string memory p0, uint p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
        \t}
        \tfunction log(string memory p0, string memory p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
        \t}
        \tfunction log(string memory p0, bool p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
        \t}
        \tfunction log(string memory p0, address p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
        \t}
        \tfunction log(bool p0, uint p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
        \t}
        \tfunction log(bool p0, string memory p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
        \t}
        \tfunction log(bool p0, bool p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
        \t}
        \tfunction log(bool p0, address p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
        \t}
        \tfunction log(address p0, uint p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
        \t}
        \tfunction log(address p0, string memory p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
        \t}
        \tfunction log(address p0, bool p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
        \t}
        \tfunction log(address p0, address p1) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
        \t}
        \tfunction log(uint p0, uint p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, uint p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, uint p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, uint p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, string memory p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, string memory p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, string memory p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, string memory p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, bool p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, bool p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, bool p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, bool p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, address p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, address p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, address p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, address p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, uint p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, uint p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, uint p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, uint p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, string memory p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, string memory p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, string memory p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, string memory p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, bool p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, bool p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, bool p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, bool p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, address p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, address p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, address p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
        \t}
        \tfunction log(string memory p0, address p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, uint p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, uint p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, uint p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, uint p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, string memory p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, string memory p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, string memory p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, string memory p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, bool p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, bool p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, bool p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, bool p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, address p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, address p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, address p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
        \t}
        \tfunction log(bool p0, address p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
        \t}
        \tfunction log(address p0, uint p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
        \t}
        \tfunction log(address p0, uint p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
        \t}
        \tfunction log(address p0, uint p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
        \t}
        \tfunction log(address p0, uint p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
        \t}
        \tfunction log(address p0, string memory p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
        \t}
        \tfunction log(address p0, string memory p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
        \t}
        \tfunction log(address p0, string memory p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
        \t}
        \tfunction log(address p0, string memory p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
        \t}
        \tfunction log(address p0, bool p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
        \t}
        \tfunction log(address p0, bool p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
        \t}
        \tfunction log(address p0, bool p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
        \t}
        \tfunction log(address p0, bool p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
        \t}
        \tfunction log(address p0, address p1, uint p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
        \t}
        \tfunction log(address p0, address p1, string memory p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
        \t}
        \tfunction log(address p0, address p1, bool p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
        \t}
        \tfunction log(address p0, address p1, address p2) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
        \t}
        \tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, uint p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, string memory p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, bool p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(uint p0, address p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, uint p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, bool p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(string memory p0, address p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, uint p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, string memory p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, bool p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(bool p0, address p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, uint p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, string memory p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, bool p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, uint p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, uint p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, uint p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, uint p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, string memory p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, string memory p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, string memory p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, bool p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, bool p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, bool p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, bool p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, address p2, uint p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, address p2, string memory p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, address p2, bool p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
        \t}
        \tfunction log(address p0, address p1, address p2, address p3) internal view {
        \t\t_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
        \t}
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
        pragma solidity ^0.8.0;
        import "../utils/Context.sol";
        /**
         * @dev Contract module which provides a basic access control mechanism, where
         * there is an account (an owner) that can be granted exclusive access to
         * specific functions.
         *
         * By default, the owner account will be the one that deploys the contract. This
         * can later be changed with {transferOwnership}.
         *
         * This module is used through inheritance. It will make available the modifier
         * `onlyOwner`, which can be applied to your functions to restrict their use to
         * the owner.
         */
        abstract contract Ownable is Context {
            address private _owner;
            event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
            /**
             * @dev Initializes the contract setting the deployer as the initial owner.
             */
            constructor() {
                _transferOwnership(_msgSender());
            }
            /**
             * @dev Throws if called by any account other than the owner.
             */
            modifier onlyOwner() {
                _checkOwner();
                _;
            }
            /**
             * @dev Returns the address of the current owner.
             */
            function owner() public view virtual returns (address) {
                return _owner;
            }
            /**
             * @dev Throws if the sender is not the owner.
             */
            function _checkOwner() internal view virtual {
                require(owner() == _msgSender(), "Ownable: caller is not the owner");
            }
            /**
             * @dev Leaves the contract without owner. It will not be possible to call
             * `onlyOwner` functions anymore. Can only be called by the current owner.
             *
             * NOTE: Renouncing ownership will leave the contract without an owner,
             * thereby removing any functionality that is only available to the owner.
             */
            function renounceOwnership() public virtual onlyOwner {
                _transferOwnership(address(0));
            }
            /**
             * @dev Transfers ownership of the contract to a new account (`newOwner`).
             * Can only be called by the current owner.
             */
            function transferOwnership(address newOwner) public virtual onlyOwner {
                require(newOwner != address(0), "Ownable: new owner is the zero address");
                _transferOwnership(newOwner);
            }
            /**
             * @dev Transfers ownership of the contract to a new account (`newOwner`).
             * Internal function without access restriction.
             */
            function _transferOwnership(address newOwner) internal virtual {
                address oldOwner = _owner;
                _owner = newOwner;
                emit OwnershipTransferred(oldOwner, newOwner);
            }
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
        pragma solidity ^0.8.0;
        import "../utils/Context.sol";
        /**
         * @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 Modifier to make a function callable only when the contract is not paused.
             *
             * Requirements:
             *
             * - The contract must not be paused.
             */
            modifier whenNotPaused() {
                _requireNotPaused();
                _;
            }
            /**
             * @dev Modifier to make a function callable only when the contract is paused.
             *
             * Requirements:
             *
             * - The contract must be paused.
             */
            modifier whenPaused() {
                _requirePaused();
                _;
            }
            /**
             * @dev Returns true if the contract is paused, and false otherwise.
             */
            function paused() public view virtual returns (bool) {
                return _paused;
            }
            /**
             * @dev Throws if the contract is paused.
             */
            function _requireNotPaused() internal view virtual {
                require(!paused(), "Pausable: paused");
            }
            /**
             * @dev Throws if the contract is not paused.
             */
            function _requirePaused() internal view virtual {
                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());
            }
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
        pragma solidity ^0.8.0;
        /**
         * @dev Contract module that helps prevent reentrant calls to a function.
         *
         * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
         * available, which can be applied to functions to make sure there are no nested
         * (reentrant) calls to them.
         *
         * Note that because there is a single `nonReentrant` guard, functions marked as
         * `nonReentrant` may not call one another. This can be worked around by making
         * those functions `private`, and then adding `external` `nonReentrant` entry
         * points to them.
         *
         * TIP: If you would like to learn more about reentrancy and alternative ways
         * to protect against it, check out our blog post
         * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
         */
        abstract contract ReentrancyGuard {
            // Booleans are more expensive than uint256 or any type that takes up a full
            // word because each write operation emits an extra SLOAD to first read the
            // slot's contents, replace the bits taken up by the boolean, and then write
            // back. This is the compiler's defense against contract upgrades and
            // pointer aliasing, and it cannot be disabled.
            // The values being non-zero value makes deployment a bit more expensive,
            // but in exchange the refund on every call to nonReentrant will be lower in
            // amount. Since refunds are capped to a percentage of the total
            // transaction's gas, it is best to keep them low in cases like this one, to
            // increase the likelihood of the full refund coming into effect.
            uint256 private constant _NOT_ENTERED = 1;
            uint256 private constant _ENTERED = 2;
            uint256 private _status;
            constructor() {
                _status = _NOT_ENTERED;
            }
            /**
             * @dev Prevents a contract from calling itself, directly or indirectly.
             * Calling a `nonReentrant` function from another `nonReentrant`
             * function is not supported. It is possible to prevent this from happening
             * by making the `nonReentrant` function external, and making it call a
             * `private` function that does the actual work.
             */
            modifier nonReentrant() {
                // On the first call to nonReentrant, _notEntered will be true
                require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
                // Any calls to nonReentrant after this point will fail
                _status = _ENTERED;
                _;
                // By storing the original value once again, a refund is triggered (see
                // https://eips.ethereum.org/EIPS/eip-2200)
                _status = _NOT_ENTERED;
            }
        }
        // SPDX-License-Identifier: UNLICENSED
        // © 2022 [XXX]. All rights reserved.
        pragma solidity ^0.8.13;
        /******************************************************************************\\
        * Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
        * EIP-2535 Diamond Standard: https://eips.ethereum.org/EIPS/eip-2535
        /******************************************************************************/
        import "./Interfaces.sol";
        import { DiamondStorage, AppStorage } from "./Structs.sol";
        library LibDiamond {
            // ==================== Diamond Constants ====================
            bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage");
            bytes32 constant APP_STORAGE_POSITION = keccak256("diamond.standard.app.storage");
            event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata);
            function diamondStorage() internal pure returns (DiamondStorage storage ds) {
                bytes32 position = DIAMOND_STORAGE_POSITION;
                assembly {
                    ds.slot := position
                }
            }
            function appStorage() internal pure returns (AppStorage storage _as) {
                bytes32 position = APP_STORAGE_POSITION;
                assembly {
                    _as.slot := position
                }
            }
            // Internal function version of diamondCut
            function diamondCut(
                IDiamondCut.FacetCut[] memory _diamondCut,
                address _init,
                bytes memory _calldata
            ) internal {
                for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {
                    IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
                    if (action == IDiamondCut.FacetCutAction.Add) {
                        addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
                    } else if (action == IDiamondCut.FacetCutAction.Replace) {
                        replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
                    } else if (action == IDiamondCut.FacetCutAction.Remove) {
                        removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
                    } else {
                        revert("LibDiamondCut: Incorrect FacetCutAction");
                    }
                }
                emit DiamondCut(_diamondCut, _init, _calldata);
                initializeDiamondCut(_init, _calldata);
            }
            function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
                require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
                DiamondStorage storage ds = diamondStorage();
                // uint16 selectorCount = uint16(diamondStorage().selectors.length);
                require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
                uint16 selectorPosition = uint16(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
                // add new facet address if it does not exist
                if (selectorPosition == 0) {
                    addFacet(ds, _facetAddress);
                }
                for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
                    require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists");
                    addFunction(ds, selector, selectorPosition, _facetAddress);
                    selectorPosition++;
                }
            }
            function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
                require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
                DiamondStorage storage ds = diamondStorage();
                require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
                uint16 selectorPosition = uint16(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
                // add new facet address if it does not exist
                if (selectorPosition == 0) {
                    addFacet(ds, _facetAddress);
                }
                for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
                    require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function");
                    removeFunction(ds, oldFacetAddress, selector);
                    addFunction(ds, selector, selectorPosition, _facetAddress);
                    selectorPosition++;
                }
            }
            function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
                require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
                DiamondStorage storage ds = diamondStorage();
                // if function does not exist then do nothing and return
                require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)");
                for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {
                    bytes4 selector = _functionSelectors[selectorIndex];
                    address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
                    removeFunction(ds, oldFacetAddress, selector);
                }
            }
        \tfunction addFacet(DiamondStorage storage ds, address _facetAddress) internal {
                enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code");
                ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = uint16(ds.facetAddresses.length);
                ds.facetAddresses.push(_facetAddress);
            }
        \tfunction addFunction(DiamondStorage storage ds, bytes4 _selector, uint16 _selectorPosition, address _facetAddress) internal {
                ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition;
                ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
                ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
            }
            function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal {
                require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist");
                // an immutable function is a function defined directly in a diamond
                require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function");
                // replace selector with last selector, then delete last selector
                uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition;
                uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;
                // if not the same then replace _selector with lastSelector
                if (selectorPosition != lastSelectorPosition) {
                    bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;
                    ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint16(selectorPosition);
                }
                // delete the last selector
                ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
                delete ds.selectorToFacetAndPosition[_selector];
                // if no more selectors for facet address then delete the facet address
                if (lastSelectorPosition == 0) {
                    // replace facet address with last facet address and delete last facet address
                    uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
                    uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
                    if (facetAddressPosition != lastFacetAddressPosition) {
                        address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
                        ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
                        ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = uint16(facetAddressPosition);
                    }
                    ds.facetAddresses.pop();
                    delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
                }
            }
            function initializeDiamondCut(address _init, bytes memory _calldata) internal {
                if (_init == address(0)) {
                    require(_calldata.length == 0, "LibDiamondCut: _init is address(0) but_calldata is not empty");
                } else {
                    require(_calldata.length > 0, "LibDiamondCut: _calldata is empty but _init is not address(0)");
                    if (_init != address(this)) {
                        enforceHasContractCode(_init, "LibDiamondCut: _init address has no code");
                    }
                    (bool success, bytes memory error) = _init.delegatecall(_calldata);
                    if (!success) {
                        if (error.length > 0) {
                            // bubble up the error
                            revert(string(error));
                        } else {
                            revert("LibDiamondCut: _init function reverted");
                        }
                    }
                }
            }
            function enforceHasContractCode(address _contract, string memory _errorMessage) internal view {
                uint256 contractSize;
                assembly {
                    contractSize := extcodesize(_contract)
                }
                require(contractSize > 0, _errorMessage);
            }
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)
        pragma solidity ^0.8.0;
        import "../utils/introspection/IERC165.sol";
        /**
         * @dev Interface for the NFT Royalty Standard.
         *
         * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
         * support for royalty payments across all NFT marketplaces and ecosystem participants.
         *
         * _Available since v4.5._
         */
        interface IERC2981 is IERC165 {
            /**
             * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
             * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
             */
            function royaltyInfo(uint256 tokenId, uint256 salePrice)
                external
                view
                returns (address receiver, uint256 royaltyAmount);
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol)
        pragma solidity ^0.8.0;
        import "../token/ERC721/IERC721.sol";
        // SPDX-License-Identifier: UNLICENSED
        // © 2022 [XXX]. All rights reserved.
        pragma solidity ^0.8.13;
        import { IDiamondCut, IDiamondLoupe, IERC173 } from "./Interfaces.sol";
        import { IERC721Metadata } from "@openzeppelin/contracts/interfaces/IERC721Metadata.sol";
        import { IERC721 } from "@openzeppelin/contracts/interfaces/IERC721.sol";
        import { IERC165 } from "@openzeppelin/contracts/interfaces/IERC165.sol";
        import { IERC2981 } from "@openzeppelin/contracts/interfaces/IERC2981.sol";
        import "./Constants.sol";
        import "./facets/DiamondCutAndLoupeFacet.sol";
        import "./LibDiamond.sol";
        /*
            @dev
            This contract is using the very robust and innovative EIP 2535 (https://eips.ethereum.org/EIPS/eip-2535) which
            allows a contract to be organized in the most efficient way
        */
        contract DuneDiamond is BaseFacet {
            constructor(address _diamondCutAndLoupeFacetAddress) {
                // adding ERC165 data
                DiamondStorage storage ds = LibDiamond.diamondStorage();
                ds.supportedInterfaces[type(IERC165).interfaceId] = true;
                ds.supportedInterfaces[type(IDiamondCut).interfaceId] = true;
                ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true;
                ds.supportedInterfaces[type(IERC173).interfaceId] = true;
        \t\tds.supportedInterfaces[type(IERC721).interfaceId] = true;
        \t\tds.supportedInterfaces[type(IERC721Metadata).interfaceId] = true;
        \t\tds.supportedInterfaces[type(IERC2981).interfaceId] = true;
        \t\t// Init appStorage
        \t\tAppStorage storage s = LibDiamond.appStorage();
        \t\ts.chapterId = 0;
        \t\tbytes4[] memory selectors = new bytes4[](6);
                selectors[0] = DiamondCutAndLoupeFacet.diamondCut.selector;
                selectors[1] = DiamondCutAndLoupeFacet.facets.selector;
                selectors[2] = DiamondCutAndLoupeFacet.facetFunctionSelectors.selector;
                selectors[3] = DiamondCutAndLoupeFacet.facetAddresses.selector;
                selectors[4] = DiamondCutAndLoupeFacet.facetAddress.selector;
        \t\tselectors[5] = DiamondCutAndLoupeFacet.supportsInterface.selector;
                LibDiamond.addFunctions(_diamondCutAndLoupeFacetAddress, selectors);
            }
            // =========== Lifecycle ===========
            // Find facet for function that is called and execute the
            // function if a facet is found and return any value.
            // To learn more about this implementation read EIP 2535
            fallback() external payable {
                address facet = LibDiamond.diamondStorage().selectorToFacetAndPosition[msg.sig].facetAddress;
                require(facet != address(0), "Diamond: Function does not exist");
                assembly {
                    calldatacopy(0, 0, calldatasize())
                    let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)
                    returndatacopy(0, 0, returndatasize())
                    switch result
                    case 0 {
                        revert(0, returndatasize())
                    }
                    default {
                        return (0, returndatasize())
                    }
                }
            }
            /*
                @dev
                To enable receiving ETH
            */
            receive() external payable {}
        }
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Metadata.sol)
        pragma solidity ^0.8.0;
        import "../token/ERC721/extensions/IERC721Metadata.sol";
        // SPDX-License-Identifier: MIT
        // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)
        pragma solidity ^0.8.0;
        import "../utils/introspection/IERC165.sol";
        // SPDX-License-Identifier: MIT
        pragma solidity ^0.8.13;
        /******************************************************************************\\
        * Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
        * EIP-2535 Diamond Standard: https://eips.ethereum.org/EIPS/eip-2535
        /******************************************************************************/
        import { DiamondStorage } from "../Structs.sol";
        import "../LibDiamond.sol";
        import { IERC165 } from "@openzeppelin/contracts/interfaces/IERC165.sol";
        import "./BaseFacet.sol";
        /*
            @dev
            The facet that handling all diamond related logic and can be called only by @Diamond
            This contract is part of a diamond / facets implementation as described
            in EIP 2535 (https://eips.ethereum.org/EIPS/eip-2535)
        */
        contract DiamondCutAndLoupeFacet is BaseFacet, IDiamondCut, IDiamondLoupe, IERC165 {
            /// @notice Add/replace/remove any number of functions and optionally execute
            ///         a function with delegatecall
            /// @param _diamondCut Contains the facet addresses and function selectors
            /// @param _init The address of the contract or facet to execute _calldata
            /// @param _calldata A function call, including function selector and arguments
            ///                  _calldata is executed with delegatecall on _init
            function diamondCut(
                IDiamondCut.FacetCut[] calldata _diamondCut,
                address _init,
                bytes calldata _calldata
            ) external onlyOwner {
                LibDiamond.diamondCut(_diamondCut, _init, _calldata);
            }
            /// These functions are expected to be called frequently by tools.
            /// @notice Gets all facets and their selectors.
            /// @return facets_ Facet
            function facets() external override view returns (Facet[] memory facets_) {
                DiamondStorage storage ds = LibDiamond.diamondStorage();
                uint256 numFacets = ds.facetAddresses.length;
                facets_ = new Facet[](numFacets);
                for (uint256 i; i < numFacets; i++) {
                    address facetAddress_ = ds.facetAddresses[i];
                    facets_[i].facetAddress = facetAddress_;
                    facets_[i].functionSelectors = ds.facetFunctionSelectors[facetAddress_].functionSelectors;
                }
            }
            /// @notice Gets all the function selectors provided by a facet.
            /// @param _facet The facet address.
            /// @return facetFunctionSelectors_
            function facetFunctionSelectors(address _facet) external override view returns (bytes4[] memory facetFunctionSelectors_) {
                DiamondStorage storage ds = LibDiamond.diamondStorage();
                facetFunctionSelectors_ = ds.facetFunctionSelectors[_facet].functionSelectors;
            }
            /// @notice Get all the facet addresses used by a diamond.
            /// @return facetAddresses_
            function facetAddresses() external override view returns (address[] memory facetAddresses_) {
                DiamondStorage storage ds = LibDiamond.diamondStorage();
                facetAddresses_ = ds.facetAddresses;
            }
            /// @notice Gets the facet that supports the given selector.
            /// @dev If facet is not found return address(0).
            /// @param _functionSelector The function selector.
            /// @return facetAddress_ The facet address.
            function facetAddress(bytes4 _functionSelector) external override view returns (address facetAddress_) {
                DiamondStorage storage ds = LibDiamond.diamondStorage();
                facetAddress_ = ds.selectorToFacetAndPosition[_functionSelector].facetAddress;
            }
        \t // This implements ERC-165.
            function supportsInterface(bytes4 _interfaceId) external override view returns (bool) {
                DiamondStorage storage ds = LibDiamond.diamondStorage();
                return ds.supportedInterfaces[_interfaceId];
            }
        }