Indexing Tokens - We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0x04d00E9104987e41c5BF3E98dbaA58E1CB7a420e

Contract Name
RateLimitNFTViewsFacet
Creator
0x046bf7–da7b9c at 0x769ca7–7a69f8
Balance
0 LIT
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
2793492
Contract name:
RateLimitNFTViewsFacet




Optimization enabled
false
Compiler version
v0.8.24+commit.e11b9ed9




Verified at
2024-07-09T04:27:57.767541Z

contracts/lit-node/RateLimitNFT/RateLimitNFTViewsFacet.sol

//SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.17;
import { ERC721Upgradeable } from "@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/ERC721Upgradeable.sol";
import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import { ERC721BurnableUpgradeable } from "@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";
import { ERC721EnumerableUpgradeable } from "@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";
import { IERC721Enumerable } from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import { IERC721Metadata } from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import { Base64 } from "@openzeppelin/contracts/utils/Base64.sol";
import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
import { ReentrancyGuardUpgradeable } from "@gnus.ai/contracts-upgradeable-diamond/contracts/security/ReentrancyGuardUpgradeable.sol";
import { ERC165Upgradeable } from "@gnus.ai/contracts-upgradeable-diamond/contracts/utils/introspection/ERC165Upgradeable.sol";
import { IERC165Upgradeable } from "@gnus.ai/contracts-upgradeable-diamond/contracts/utils/introspection/IERC165Upgradeable.sol";
import { LibDiamond } from "../../libraries/LibDiamond.sol";
import { LibRateLimitNFTStorage } from "./LibRateLimitNFTStorage.sol";
import "hardhat/console.sol";
/// @title Rate Limit NFT
///
/// @dev This is the contract for the Rate Limit NFTs
/// So the general idea here is that you can mint one of these NFTs to pay for service on Lit
/// And how it works, is that you can buy X requestsPerKilosecond over a period of time
/// 1 requestsPerKilosecond = 0.001 requests per second and
/// 1000 requestsPerKilosecond = 1 request per second
contract RateLimitNFTViewsFacet {
using Strings for uint256;
/* ========== VIEWS ========== */
function viewStorage()
internal
pure
returns (LibRateLimitNFTStorage.RateLimitNFTStorage storage)
{
return LibRateLimitNFTStorage.getStorage();
}
function freeMintSigner() public view returns (address) {
return viewStorage().freeMintSigner;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Strings.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
import "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _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) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

solidity-bytes-utils/contracts/BytesLib.sol

// SPDX-License-Identifier: Unlicense
/*
* @title Solidity Bytes Arrays Utils
* @author Gonçalo Sá <goncalo.sa@consensys.net>
*
* @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
*/
pragma solidity >=0.8.0 <0.9.0;
library BytesLib {
function concat(
bytes memory _preBytes,
bytes memory _postBytes
)
internal
pure
returns (bytes memory)
{
bytes memory tempBytes;
assembly {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// Store the length of the first bytes array at the beginning of
// the memory for tempBytes.
let length := mload(_preBytes)
mstore(tempBytes, length)
// Maintain a memory counter for the current write location in the
// temp bytes array by adding the 32 bytes for the array length to
// the starting location.
let mc := add(tempBytes, 0x20)
// Stop copying when the memory counter reaches the length of the
// first bytes array.
let end := add(mc, length)
for {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/security/ReentrancyGuardStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ReentrancyGuardUpgradeable } from "./ReentrancyGuardUpgradeable.sol";
library ReentrancyGuardStorage {
struct Layout {
uint256 _status;
}
bytes32 internal constant STORAGE_SLOT = keccak256('openzeppelin.contracts.storage.ReentrancyGuard');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

// 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);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/AccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/utils/introspection/ERC165Upgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable {
function __ERC165_init() internal onlyInitializing {
}
function __ERC165_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/proxy/utils/InitializableStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { Initializable } from "./Initializable.sol";
library InitializableStorage {
struct Layout {
/*
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 _initialized;
/*
* @dev Indicates that the contract is in the process of being initialized.
*/
bool _initializing;
}
bytes32 internal constant STORAGE_SLOT = keccak256('openzeppelin.contracts.storage.Initializable');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IDiamond.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
interface IDiamond {
enum FacetCutAction {
Add,
Replace,
Remove
}
// Add=0, Replace=1, Remove=2
struct FacetCut {
address facetAddress;
FacetCutAction action;
bytes4[] functionSelectors;
}
event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/utils/math/MathUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library MathUpgradeable {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/security/ReentrancyGuardUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
import { ReentrancyGuardStorage } from "./ReentrancyGuardStorage.sol";
import "../proxy/utils/Initializable.sol";
/**
* @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 ReentrancyGuardUpgradeable is Initializable {
using ReentrancyGuardStorage for ReentrancyGuardStorage.Layout;
// 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;
function __ReentrancyGuard_init() internal onlyInitializing {
__ReentrancyGuard_init_unchained();
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../IERC721Upgradeable.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721EnumerableUpgradeable is IERC721Upgradeable {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/IERC721.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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);
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/extensions/ERC721EnumerableStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ERC721EnumerableUpgradeable } from "./ERC721EnumerableUpgradeable.sol";
library ERC721EnumerableStorage {
struct Layout {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) _allTokensIndex;
}
bytes32 internal constant STORAGE_SLOT = keccak256('openzeppelin.contracts.storage.ERC721Enumerable');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/lit-core/ContractResolver.sol

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "hardhat/console.sol";
contract ContractResolver is AccessControl {
/* ========== TYPE DEFINITIONS ========== */
// the comments following each one of these are the keccak256 hashes of the string values
// this is very useful if you have to manually set any of these, so that you
// don't have to calculate the hahes yourself.
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN"); // 0xdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42
bytes32 public constant RELEASE_REGISTER_CONTRACT =
keccak256("RELEASE_REGISTER"); // 0x3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ec
bytes32 public constant STAKING_CONTRACT = keccak256("STAKING"); // 0x080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887b
bytes32 public constant STAKING_BALANCES_CONTRACT =
keccak256("STAKING_BALANCES"); // 0xaa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d72
bytes32 public constant MULTI_SENDER_CONTRACT = keccak256("MULTI_SENDER"); // 0xdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da7243
bytes32 public constant LIT_TOKEN_CONTRACT = keccak256("LIT_TOKEN");
bytes32 public constant PUB_KEY_ROUTER_CONTRACT =
keccak256("PUB_KEY_ROUTER"); // 0xb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f7
bytes32 public constant PKP_NFT_CONTRACT = keccak256("PKP_NFT"); // 0xb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b0
bytes32 public constant RATE_LIMIT_NFT_CONTRACT =
keccak256("RATE_LIMIT_NFT"); // 0xb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a918
bytes32 public constant PKP_HELPER_CONTRACT = keccak256("PKP_HELPER"); // 0x27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b44388755765
bytes32 public constant PKP_HELPER_V2_CONTRACT = keccak256("PKP_HELPER_V2"); // 0x58a0044e0ecd81025e398bf1815075d1234cbac3749614b0b33a404c2ee2babf
bytes32 public constant PKP_PERMISSIONS_CONTRACT =
keccak256("PKP_PERMISSIONS"); // 0x54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebe
bytes32 public constant PKP_NFT_METADATA_CONTRACT =
keccak256("PKP_NFT_METADATA"); // 0xf14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727a
bytes32 public constant ALLOWLIST_CONTRACT = keccak256("ALLOWLIST"); // 0x74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bca
bytes32 public constant DOMAIN_WALLET_REGISTRY =
keccak256("DOMAIN_WALLET_REGISTRY");
bytes32 public constant HD_KEY_DERIVER_CONTRACT =
keccak256("HD_KEY_DERIVER");
bytes32 public constant BACKUP_RECOVERY_CONTRACT =
keccak256("BACKUP_RECOVERY");
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IDiamondCut.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
import { IDiamond } from "./IDiamond.sol";
interface IDiamondCut is IDiamond {
/// @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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

// 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);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/utils/ContextUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/utils/StringsUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/MathUpgradeable.sol";
import "./math/SignedMathUpgradeable.sol";
/**
* @dev String operations.
*/
library StringsUpgradeable {
bytes16 private constant _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) {
unchecked {
uint256 length = MathUpgradeable.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/extensions/IERC721MetadataUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721Upgradeable.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721MetadataUpgradeable is IERC721Upgradeable {
/**
* @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);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/IERC721Upgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165Upgradeable.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721Upgradeable is IERC165Upgradeable {
/**
* @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);
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

hardhat/console.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/IERC721ReceiverUpgradeable.sol

// 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 IERC721ReceiverUpgradeable {
/**
* @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);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/ERC721Upgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
import "./IERC721Upgradeable.sol";
import "./IERC721ReceiverUpgradeable.sol";
import "./extensions/IERC721MetadataUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/StringsUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.sol";
import { ERC721Storage } from "./ERC721Storage.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {
using ERC721Storage for ERC721Storage.Layout;
using AddressUpgradeable for address;
using StringsUpgradeable for uint256;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {
__ERC721_init_unchained(name_, symbol_);
}
function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
ERC721Storage.layout()._name = name_;
ERC721Storage.layout()._symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/ERC721Storage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ERC721Upgradeable } from "./ERC721Upgradeable.sol";
library ERC721Storage {
struct Layout {
// Token name
string _name;
// Token symbol
string _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) _owners;
// Mapping owner address to token count
mapping(address => uint256) _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) _operatorApprovals;
}
bytes32 internal constant STORAGE_SLOT = keccak256('openzeppelin.contracts.storage.ERC721');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/utils/AddressUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [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
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Base64.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.6) (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)
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/math/Math.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/math/SignedMath.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/proxy/utils/Initializable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
import { InitializableStorage } from "./InitializableStorage.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/structs/EnumerableSet.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/extensions/ERC721BurnableUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol)
pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "../../../utils/ContextUpgradeable.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @title ERC721 Burnable Token
* @dev ERC721 Token that can be burned (destroyed).
*/
abstract contract ERC721BurnableUpgradeable is Initializable, ContextUpgradeable, ERC721Upgradeable {
function __ERC721Burnable_init() internal onlyInitializing {
}
function __ERC721Burnable_init_unchained() internal onlyInitializing {
}
/**
* @dev Burns `tokenId`. See {ERC721-_burn}.
*
* Requirements:
*
* - The caller must own `tokenId` or be an approved operator.
*/
function burn(uint256 tokenId) public virtual {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_burn(tokenId);
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/libraries/LibDiamond.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/******************************************************************************\
* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
import { IDiamond } from "../interfaces/IDiamond.sol";
import { IDiamondCut } from "../interfaces/IDiamondCut.sol";
// Remember to add the loupe functions from DiamondLoupeFacet to the diamond.
// The loupe functions are required by the EIP2535 Diamonds standard
error NoSelectorsGivenToAdd();
error NotContractOwner(address _user, address _contractOwner);
error NoSelectorsProvidedForFacetForCut(address _facetAddress);
error CannotAddSelectorsToZeroAddress(bytes4[] _selectors);
error NoBytecodeAtAddress(address _contractAddress, string _message);
error IncorrectFacetCutAction(uint8 _action);
error CannotAddFunctionToDiamondThatAlreadyExists(bytes4 _selector);
error CannotReplaceFunctionsFromFacetWithZeroAddress(bytes4[] _selectors);
error CannotReplaceImmutableFunction(bytes4 _selector);
error CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet(
bytes4 _selector
);
error CannotReplaceFunctionThatDoesNotExists(bytes4 _selector);
error RemoveFacetAddressMustBeZeroAddress(address _facetAddress);
error CannotRemoveFunctionThatDoesNotExist(bytes4 _selector);
error CannotRemoveImmutableFunction(bytes4 _selector);
error InitializationFunctionReverted(
address _initializationContractAddress,
bytes _calldata
);
library LibDiamond {
bytes32 constant DIAMOND_STORAGE_POSITION =
keccak256("diamond.standard.diamond.storage");
struct FacetAddressAndSelectorPosition {
address facetAddress;
uint16 selectorPosition;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../ERC721Upgradeable.sol";
import "./IERC721EnumerableUpgradeable.sol";
import { ERC721EnumerableStorage } from "./ERC721EnumerableStorage.sol";
import "../../../proxy/utils/Initializable.sol";
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable {
using ERC721EnumerableStorage for ERC721EnumerableStorage.Layout;
function __ERC721Enumerable_init() internal onlyInitializing {
}
function __ERC721Enumerable_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC721Upgradeable) returns (bool) {
return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Upgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return ERC721EnumerableStorage.layout()._ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/lit-node/RateLimitNFT/LibRateLimitNFTStorage.sol

//SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.17;
import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import { BitMaps } from "@openzeppelin/contracts/utils/structs/BitMaps.sol";
import "solidity-bytes-utils/contracts/BytesLib.sol";
import { ContractResolver } from "../../lit-core/ContractResolver.sol";
library LibRateLimitNFTStorage {
using EnumerableSet for EnumerableSet.AddressSet;
struct RateLimit {
uint256 requestsPerKilosecond;
uint256 expiresAt;
}
bytes32 constant RATELIMIT_NFT_POSITION = keccak256("ratelimitnft.storage");
struct RateLimitNFTStorage {
ContractResolver contractResolver;
ContractResolver.Env env;
address freeMintSigner;
uint256 additionalRequestsPerKilosecondCost;
uint256 tokenIdCounter;
uint256 defaultRateLimitWindowSeconds;
uint256 RLIHolderRateLimitWindowSeconds;
uint256 freeRequestsPerRateLimitWindow;
mapping(uint256 => RateLimit) capacity;
mapping(bytes32 => bool) redeemedFreeMints;
uint256 maxRequestsPerKilosecond;
uint256 maxExpirationSeconds;
// maps midnight timestamps (divisible by 86400) to the total requests sold that will expire at that time
mapping(uint256 => uint256) totalSoldRequestsPerKilosecondByExpirationTime;
}
// Return ERC721 storage struct for reading and writing
function getStorage()
internal
pure
returns (RateLimitNFTStorage storage storageStruct)
{
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/utils/introspection/IERC165Upgradeable.sol

// 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 IERC165Upgradeable {
/**
* @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);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

// 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;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/structs/BitMaps.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/BitMaps.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.
* Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
*/
library BitMaps {
struct BitMap {
mapping(uint256 => uint256) _data;
}
/**
* @dev Returns whether the bit at `index` is set.
*/
function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
uint256 bucket = index >> 8;
uint256 mask = 1 << (index & 0xff);
return bitmap._data[bucket] & mask != 0;
}
/**
* @dev Sets the bit at `index` to the boolean `value`.
*/
function setTo(BitMap storage bitmap, uint256 index, bool value) internal {
if (value) {
set(bitmap, index);
} else {
unset(bitmap, index);
}
}
/**
* @dev Sets the bit at `index`.
*/
function set(BitMap storage bitmap, uint256 index) internal {
uint256 bucket = index >> 8;
uint256 mask = 1 << (index & 0xff);
bitmap._data[bucket] |= mask;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/IAccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@gnus.ai/contracts-upgradeable-diamond/contracts/utils/math/SignedMathUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMathUpgradeable {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract ABI

[{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RLIHolderRateLimitWindowSeconds","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"additionalRequestsPerKilosecondCost","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateCost","inputs":[{"type":"uint256","name":"requestsPerKilosecond","internalType":"uint256"},{"type":"uint256","name":"expiresAt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateRequestsPerKilosecond","inputs":[{"type":"uint256","name":"payingAmount","internalType":"uint256"},{"type":"uint256","name":"expiresAt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct LibRateLimitNFTStorage.RateLimit","components":[{"type":"uint256","name":"requestsPerKilosecond","internalType":"uint256"},{"type":"uint256","name":"expiresAt","internalType":"uint256"}]}],"name":"capacity","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkBelowMaxRequestsPerKilosecond","inputs":[{"type":"uint256","name":"requestedRequestsPerKilosecond","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentSoldRequestsPerKilosecond","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"defaultRateLimitWindowSeconds","inputs":[]},{"type":"function","stateMutability":"view","outputs":[],"name":"freeMintSigTest","inputs":[{"type":"uint256","name":"expiresAt","internalType":"uint256"},{"type":"uint256","name":"requestsPerKilosecond","internalType":"uint256"},{"type":"bytes32","name":"msgHash","internalType":"bytes32"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"sVal","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"freeMintSigner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"freeRequestsPerRateLimitWindow","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExpired","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxExpirationSeconds","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxRequestsPerKilosecond","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"prefixed","inputs":[{"type":"bytes32","name":"hash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"redeemedFreeMints","inputs":[{"type":"bytes32","name":"msgHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenIdCounter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenSVG","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSoldRequestsPerKilosecondByExpirationTime","inputs":[{"type":"uint256","name":"expiresAt","internalType":"uint256"}]}]
            

Contract Creation Code

0x608060405234801561001057600080fd5b5061246c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806398bdf6f5116100ad578063ba49dcdd11610071578063ba49dcdd14610346578063ce39469614610364578063d9548e5314610394578063ea736df1146103c4578063fb24b22e146103e257610121565b806398bdf6f51461027a5780639bac5f7a14610298578063ab1bbeca146102c8578063b94a2102146102f8578063ba45b2ba1461031657610121565b80633b1a72cc116100f45780633b1a72cc146101ae5780634659470d146101de5780634a5f3acd146101fc57806372384aea1461021a5780638b49038d1461024a57610121565b8063056bcfeb146101265780631f2757131461014457806326894764146101745780633488ab1314610192575b600080fd5b61012e610400565b60405161013b9190611034565b60405180910390f35b61015e6004803603810190610159919061108a565b610413565b60405161016b91906110c6565b60405180910390f35b61017c610443565b6040516101899190611034565b60405180910390f35b6101ac60048036038101906101a79190611146565b610456565b005b6101c860048036038101906101c3919061108a565b61062d565b6040516101d591906111ee565b60405180910390f35b6101e6610660565b6040516101f39190611034565b60405180910390f35b610204610673565b6040516102119190611034565b60405180910390f35b610234600480360381019061022f9190611209565b610686565b60405161024191906111ee565b60405180910390f35b610264600480360381019061025f9190611209565b6106b4565b6040516102719190611034565b60405180910390f35b6102826106da565b60405161028f9190611034565b60405180910390f35b6102b260048036038101906102ad9190611209565b6106ed565b6040516102bf91906112c6565b60405180910390f35b6102e260048036038101906102dd9190611209565b6107b6565b6040516102ef9190611326565b60405180910390f35b610300610800565b60405161030d9190611382565b60405180910390f35b610330600480360381019061032b919061139d565b610833565b60405161033d9190611034565b60405180910390f35b61034e6109b0565b60405161035b9190611034565b60405180910390f35b61037e6004803603810190610379919061139d565b6109c3565b60405161038b9190611034565b60405180910390f35b6103ae60048036038101906103a99190611209565b610b40565b6040516103bb91906111ee565b60405180910390f35b6103cc610b6c565b6040516103d99190611034565b60405180910390f35b6103ea610c1f565b6040516103f79190611034565b60405180910390f35b600061040a610c32565b60090154905090565b6000816040516020016104269190611455565b604051602081830303815290604052805190602001209050919050565b600061044d610c32565b60060154905090565b6000610489878760405160200161046e92919061149c565b60405160208183030381529060405280519060200120610413565b90508481146104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490611560565b60405180910390fd5b6000600186868686604051600081526020016040526040516104f2949392919061158f565b6020604051602081039080840390855afa158015610514573d6000803e3d6000fd5b505050602060405103519050610528610c32565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b09061166c565b60405180910390fd5b6105c1610c32565b600801600087815260200190815260200160002060009054906101000a900460ff1615610623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061a906116fe565b60405180910390fd5b5050505050505050565b6000610637610c32565b600801600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061066a610c32565b60020154905090565b600061067d610c32565b60050154905090565b600080610691610b6c565b905061069b610c32565b6009015483826106ab919061174d565b10915050919050565b60006106be610c32565b600b016000838152602001908152602001600020549050919050565b60006106e4610c32565b60030154905090565b606060006040518061048001604052806104568152602001611fa161045691399050600061078b8261073d610720610c32565b600701600088815260200190815260200160002060010154610c41565b610765610748610c32565b600701600089815260200190815260200160002060000154610c41565b60405160200161077793929190611a59565b604051602081830303815290604052610d0f565b90508060405160200161079e9190611b02565b60405160208183030381529060405292505050919050565b6107be611001565b6107c6610c32565b6007016000838152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050919050565b600061080a610c32565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000808311610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90611b70565b60405180910390fd5b4282116108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090611c02565b60405180910390fd5b6108c1610c32565b600a015442836108d19190611c22565b10610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890611cee565b60405180910390fd5b600062015180836109229190611d3d565b14610962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095990611de0565b60405180910390fd5b600042836109709190611c22565b905060006103e861097f610c32565b600201548361098e9190611e00565b6109989190611e42565b856109a39190611e42565b9050809250505092915050565b60006109ba610c32565b600a0154905090565b6000808311610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe90611ee5565b60405180910390fd5b610a0f610c32565b600a015442610a1e919061174d565b8210610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5690611cee565b60405180910390fd5b428211610aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9890611f51565b60405180910390fd5b60006201518083610ab29190611d3d565b14610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae990611de0565b60405180910390fd5b60004283610b009190611c22565b905060006103e8610b0f610c32565b600201548387610b1f9190611e00565b610b299190611e00565b610b339190611e42565b9050809250505092915050565b600042610b4b610c32565b60070160008481526020019081526020016000206001015411159050919050565b60008060006201518060016201518042610b869190611e42565b610b90919061174d565b610b9a9190611e00565b9050600062015180610baa610c32565b600a0154610bb89190611e42565b905060005b81811015610c1557610bcd610c32565b600b0160006201518083610be19190611e00565b85610bec919061174d565b81526020019081526020016000205484610c06919061174d565b93508080600101915050610bbd565b5082935050505090565b6000610c29610c32565b60040154905090565b6000610c3c610e81565b905090565b606060006001610c5084610eae565b01905060008167ffffffffffffffff811115610c6f57610c6e611f71565b5b6040519080825280601f01601f191660200182016040528015610ca15781602001600182028036833780820191505090505b509050600082602001820190505b600115610d04578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581610cf857610cf7611d0e565b5b04945060008503610caf575b819350505050919050565b60606000825103610d3157604051806020016040528060008152509050610e7c565b60006040518060600160405280604081526020016123f76040913990506000600360028551610d60919061174d565b610d6a9190611e42565b6004610d769190611e00565b67ffffffffffffffff811115610d8f57610d8e611f71565b5b6040519080825280601f01601f191660200182016040528015610dc15781602001600182028036833780820191505090505b50905060018201602082018586518701602081018051600082525b82841015610e37576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865360018601955050610ddc565b80825260038a510660018114610e545760028114610e6757610e6f565b603d6001870353603d6002870353610e6f565b603d60018703535b5050505050505080925050505b919050565b6000807fabadc12421bfd5fb851c0e35f5644a00ae1d8c897839e46c1876e0db52058c9090508091505090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610f0c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381610f0257610f01611d0e565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310610f49576d04ee2d6d415b85acef81000000008381610f3f57610f3e611d0e565b5b0492506020810190505b662386f26fc100008310610f7857662386f26fc100008381610f6e57610f6d611d0e565b5b0492506010810190505b6305f5e1008310610fa1576305f5e1008381610f9757610f96611d0e565b5b0492506008810190505b6127108310610fc6576127108381610fbc57610fbb611d0e565b5b0492506004810190505b60648310610fe95760648381610fdf57610fde611d0e565b5b0492506002810190505b600a8310610ff8576001810190505b80915050919050565b604051806040016040528060008152602001600081525090565b6000819050919050565b61102e8161101b565b82525050565b60006020820190506110496000830184611025565b92915050565b600080fd5b6000819050919050565b61106781611054565b811461107257600080fd5b50565b6000813590506110848161105e565b92915050565b6000602082840312156110a05761109f61104f565b5b60006110ae84828501611075565b91505092915050565b6110c081611054565b82525050565b60006020820190506110db60008301846110b7565b92915050565b6110ea8161101b565b81146110f557600080fd5b50565b600081359050611107816110e1565b92915050565b600060ff82169050919050565b6111238161110d565b811461112e57600080fd5b50565b6000813590506111408161111a565b92915050565b60008060008060008060c087890312156111635761116261104f565b5b600061117189828a016110f8565b965050602061118289828a016110f8565b955050604061119389828a01611075565b94505060606111a489828a01611131565b93505060806111b589828a01611075565b92505060a06111c689828a01611075565b9150509295509295509295565b60008115159050919050565b6111e8816111d3565b82525050565b600060208201905061120360008301846111df565b92915050565b60006020828403121561121f5761121e61104f565b5b600061122d848285016110f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611270578082015181840152602081019050611255565b60008484015250505050565b6000601f19601f8301169050919050565b600061129882611236565b6112a28185611241565b93506112b2818560208601611252565b6112bb8161127c565b840191505092915050565b600060208201905081810360008301526112e0818461128d565b905092915050565b6112f18161101b565b82525050565b60408201600082015161130d60008501826112e8565b50602082015161132060208501826112e8565b50505050565b600060408201905061133b60008301846112f7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061136c82611341565b9050919050565b61137c81611361565b82525050565b60006020820190506113976000830184611373565b92915050565b600080604083850312156113b4576113b361104f565b5b60006113c2858286016110f8565b92505060206113d3858286016110f8565b9150509250929050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061141e601c836113dd565b9150611429826113e8565b601c82019050919050565b6000819050919050565b61144f61144a82611054565b611434565b82525050565b600061146082611411565b915061146c828461143e565b60208201915081905092915050565b6000819050919050565b6114966114918261101b565b61147b565b82525050565b60006114a88285611485565b6020820191506114b88284611485565b6020820191508190509392505050565b7f546865206d736748617368206973206e6f7420612068617368206f662074686560008201527f20657870697265734174202b2072657175657374735065724b696c6f7365636f60208201527f6e642e20204578706c61696e20796f757273656c662100000000000000000000604082015250565b600061154a605683611241565b9150611555826114c8565b606082019050919050565b600060208201905081810360008301526115798161153d565b9050919050565b6115898161110d565b82525050565b60006080820190506115a460008301876110b7565b6115b16020830186611580565b6115be60408301856110b7565b6115cb60608301846110b7565b95945050505050565b7f5468697320667265654d696e7420776173206e6f74207369676e65642062792060008201527f667265654d696e745369676e65722e2020486f7720656d626172617373696e6760208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b6000611656604183611241565b9150611661826115d4565b606082019050919050565b6000602082019050818103600083015261168581611649565b9050919050565b7f5468697320667265654d696e742068617320616c7265616479206265656e207260008201527f656465656d65642e2020486f7720656d626172617373696e672e000000000000602082015250565b60006116e8603a83611241565b91506116f38261168c565b604082019050919050565b60006020820190508181036000830152611717816116db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006117588261101b565b91506117638361101b565b925082820190508082111561177b5761177a61171e565b5b92915050565b7f7b226e616d65223a20224c69742050726f746f636f6c2052617465204c696d6960008201527f7420496e637265617365222c20226465736372697074696f6e223a202254686960208201527f73204e465420656e7469746c65732074686520686f6c64657220746f2061207260408201527f617465206c696d697420696e637265617365206f6e20746865204c697420507260608201527f6f746f636f6c204e6574776f726b222c2022696d6167655f64617461223a2022608082015250565b600061184f60a0836113dd565b915061185a82611781565b60a082019050919050565b600081519050919050565b600081905092915050565b600061188682611865565b6118908185611870565b93506118a0818560208601611252565b80840191505092915050565b7f222c2261747472696275746573223a205b7b22646973706c61795f747970652260008201527f3a202264617465222c202274726169745f74797065223a20224578706972617460208201527f696f6e2044617465222c202276616c7565223a20000000000000000000000000604082015250565b600061192e6054836113dd565b9150611939826118ac565b605482019050919050565b600061194f82611236565b61195981856113dd565b9350611969818560208601611252565b80840191505092915050565b7f7d2c207b22646973706c61795f74797065223a20226e756d626572222c20227460008201527f726169745f74797065223a20224d696c6c69726571756573747320506572205360208201527f65636f6e64222c202276616c7565223a20000000000000000000000000000000604082015250565b60006119f76051836113dd565b9150611a0282611975565b605182019050919050565b7f7d5d7d0000000000000000000000000000000000000000000000000000000000600082015250565b6000611a436003836113dd565b9150611a4e82611a0d565b600382019050919050565b6000611a6482611842565b9150611a70828661187b565b9150611a7b82611921565b9150611a878285611944565b9150611a92826119ea565b9150611a9e8284611944565b9150611aa982611a36565b9150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000611aec601d836113dd565b9150611af782611ab6565b601d82019050919050565b6000611b0d82611adf565b9150611b198284611944565b915081905092915050565b7f596f75206d75737420706179206d6f7265207468616e20300000000000000000600082015250565b6000611b5a601883611241565b9150611b6582611b24565b602082019050919050565b60006020820190508181036000830152611b8981611b4d565b9050919050565b7f54686520657870697265734174206d75737420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b6000611bec602383611241565b9150611bf782611b90565b604082019050919050565b60006020820190508181036000830152611c1b81611bdf565b9050919050565b6000611c2d8261101b565b9150611c388361101b565b9250828203905081811115611c5057611c4f61171e565b5b92915050565b7f596f752063616e6e6f7420707572636861736520616e2065787069726174696f60008201527f6e2074696d652074686174206973206d6f7265207468616e20746865206d617860208201527f45787069726174696f6e5365636f6e647320696e207468652066757475726500604082015250565b6000611cd8605f83611241565b9150611ce382611c56565b606082019050919050565b60006020820190508181036000830152611d0781611ccb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611d488261101b565b9150611d538361101b565b925082611d6357611d62611d0e565b5b828206905092915050565b7f45787069726174696f6e2074696d65206d7573742062652073657420746f206d60008201527f69646e69676874206f6e20616e7920676976656e206461790000000000000000602082015250565b6000611dca603883611241565b9150611dd582611d6e565b604082019050919050565b60006020820190508181036000830152611df981611dbd565b9050919050565b6000611e0b8261101b565b9150611e168361101b565b9250828202611e248161101b565b91508282048414831517611e3b57611e3a61171e565b5b5092915050565b6000611e4d8261101b565b9150611e588361101b565b925082611e6857611e67611d0e565b5b828204905092915050565b7f5468652072657175657374735065724b696c6f7365636f6e64206d757374206260008201527f652067726561746572207468616e203000000000000000000000000000000000602082015250565b6000611ecf603083611241565b9150611eda82611e73565b604082019050919050565b60006020820190508181036000830152611efe81611ec2565b9050919050565b7f45787069726174696f6e2074696d6520697320696e2074686520706173740000600082015250565b6000611f3b601e83611241565b9150611f4682611f05565b602082019050919050565b60006020820190508181036000830152611f6a81611f2e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200c3edb0edc8d55e571ce44dcf89d235c3b554fa83e110aee4f5975b91cda045a64736f6c63430008180033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c806398bdf6f5116100ad578063ba49dcdd11610071578063ba49dcdd14610346578063ce39469614610364578063d9548e5314610394578063ea736df1146103c4578063fb24b22e146103e257610121565b806398bdf6f51461027a5780639bac5f7a14610298578063ab1bbeca146102c8578063b94a2102146102f8578063ba45b2ba1461031657610121565b80633b1a72cc116100f45780633b1a72cc146101ae5780634659470d146101de5780634a5f3acd146101fc57806372384aea1461021a5780638b49038d1461024a57610121565b8063056bcfeb146101265780631f2757131461014457806326894764146101745780633488ab1314610192575b600080fd5b61012e610400565b60405161013b9190611034565b60405180910390f35b61015e6004803603810190610159919061108a565b610413565b60405161016b91906110c6565b60405180910390f35b61017c610443565b6040516101899190611034565b60405180910390f35b6101ac60048036038101906101a79190611146565b610456565b005b6101c860048036038101906101c3919061108a565b61062d565b6040516101d591906111ee565b60405180910390f35b6101e6610660565b6040516101f39190611034565b60405180910390f35b610204610673565b6040516102119190611034565b60405180910390f35b610234600480360381019061022f9190611209565b610686565b60405161024191906111ee565b60405180910390f35b610264600480360381019061025f9190611209565b6106b4565b6040516102719190611034565b60405180910390f35b6102826106da565b60405161028f9190611034565b60405180910390f35b6102b260048036038101906102ad9190611209565b6106ed565b6040516102bf91906112c6565b60405180910390f35b6102e260048036038101906102dd9190611209565b6107b6565b6040516102ef9190611326565b60405180910390f35b610300610800565b60405161030d9190611382565b60405180910390f35b610330600480360381019061032b919061139d565b610833565b60405161033d9190611034565b60405180910390f35b61034e6109b0565b60405161035b9190611034565b60405180910390f35b61037e6004803603810190610379919061139d565b6109c3565b60405161038b9190611034565b60405180910390f35b6103ae60048036038101906103a99190611209565b610b40565b6040516103bb91906111ee565b60405180910390f35b6103cc610b6c565b6040516103d99190611034565b60405180910390f35b6103ea610c1f565b6040516103f79190611034565b60405180910390f35b600061040a610c32565b60090154905090565b6000816040516020016104269190611455565b604051602081830303815290604052805190602001209050919050565b600061044d610c32565b60060154905090565b6000610489878760405160200161046e92919061149c565b60405160208183030381529060405280519060200120610413565b90508481146104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c490611560565b60405180910390fd5b6000600186868686604051600081526020016040526040516104f2949392919061158f565b6020604051602081039080840390855afa158015610514573d6000803e3d6000fd5b505050602060405103519050610528610c32565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b09061166c565b60405180910390fd5b6105c1610c32565b600801600087815260200190815260200160002060009054906101000a900460ff1615610623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061a906116fe565b60405180910390fd5b5050505050505050565b6000610637610c32565b600801600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061066a610c32565b60020154905090565b600061067d610c32565b60050154905090565b600080610691610b6c565b905061069b610c32565b6009015483826106ab919061174d565b10915050919050565b60006106be610c32565b600b016000838152602001908152602001600020549050919050565b60006106e4610c32565b60030154905090565b606060006040518061048001604052806104568152602001611fa161045691399050600061078b8261073d610720610c32565b600701600088815260200190815260200160002060010154610c41565b610765610748610c32565b600701600089815260200190815260200160002060000154610c41565b60405160200161077793929190611a59565b604051602081830303815290604052610d0f565b90508060405160200161079e9190611b02565b60405160208183030381529060405292505050919050565b6107be611001565b6107c6610c32565b6007016000838152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050919050565b600061080a610c32565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000808311610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90611b70565b60405180910390fd5b4282116108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090611c02565b60405180910390fd5b6108c1610c32565b600a015442836108d19190611c22565b10610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890611cee565b60405180910390fd5b600062015180836109229190611d3d565b14610962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095990611de0565b60405180910390fd5b600042836109709190611c22565b905060006103e861097f610c32565b600201548361098e9190611e00565b6109989190611e42565b856109a39190611e42565b9050809250505092915050565b60006109ba610c32565b600a0154905090565b6000808311610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe90611ee5565b60405180910390fd5b610a0f610c32565b600a015442610a1e919061174d565b8210610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5690611cee565b60405180910390fd5b428211610aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9890611f51565b60405180910390fd5b60006201518083610ab29190611d3d565b14610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae990611de0565b60405180910390fd5b60004283610b009190611c22565b905060006103e8610b0f610c32565b600201548387610b1f9190611e00565b610b299190611e00565b610b339190611e42565b9050809250505092915050565b600042610b4b610c32565b60070160008481526020019081526020016000206001015411159050919050565b60008060006201518060016201518042610b869190611e42565b610b90919061174d565b610b9a9190611e00565b9050600062015180610baa610c32565b600a0154610bb89190611e42565b905060005b81811015610c1557610bcd610c32565b600b0160006201518083610be19190611e00565b85610bec919061174d565b81526020019081526020016000205484610c06919061174d565b93508080600101915050610bbd565b5082935050505090565b6000610c29610c32565b60040154905090565b6000610c3c610e81565b905090565b606060006001610c5084610eae565b01905060008167ffffffffffffffff811115610c6f57610c6e611f71565b5b6040519080825280601f01601f191660200182016040528015610ca15781602001600182028036833780820191505090505b509050600082602001820190505b600115610d04578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581610cf857610cf7611d0e565b5b04945060008503610caf575b819350505050919050565b60606000825103610d3157604051806020016040528060008152509050610e7c565b60006040518060600160405280604081526020016123f76040913990506000600360028551610d60919061174d565b610d6a9190611e42565b6004610d769190611e00565b67ffffffffffffffff811115610d8f57610d8e611f71565b5b6040519080825280601f01601f191660200182016040528015610dc15781602001600182028036833780820191505090505b50905060018201602082018586518701602081018051600082525b82841015610e37576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865360018601955050610ddc565b80825260038a510660018114610e545760028114610e6757610e6f565b603d6001870353603d6002870353610e6f565b603d60018703535b5050505050505080925050505b919050565b6000807fabadc12421bfd5fb851c0e35f5644a00ae1d8c897839e46c1876e0db52058c9090508091505090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610f0c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381610f0257610f01611d0e565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310610f49576d04ee2d6d415b85acef81000000008381610f3f57610f3e611d0e565b5b0492506020810190505b662386f26fc100008310610f7857662386f26fc100008381610f6e57610f6d611d0e565b5b0492506010810190505b6305f5e1008310610fa1576305f5e1008381610f9757610f96611d0e565b5b0492506008810190505b6127108310610fc6576127108381610fbc57610fbb611d0e565b5b0492506004810190505b60648310610fe95760648381610fdf57610fde611d0e565b5b0492506002810190505b600a8310610ff8576001810190505b80915050919050565b604051806040016040528060008152602001600081525090565b6000819050919050565b61102e8161101b565b82525050565b60006020820190506110496000830184611025565b92915050565b600080fd5b6000819050919050565b61106781611054565b811461107257600080fd5b50565b6000813590506110848161105e565b92915050565b6000602082840312156110a05761109f61104f565b5b60006110ae84828501611075565b91505092915050565b6110c081611054565b82525050565b60006020820190506110db60008301846110b7565b92915050565b6110ea8161101b565b81146110f557600080fd5b50565b600081359050611107816110e1565b92915050565b600060ff82169050919050565b6111238161110d565b811461112e57600080fd5b50565b6000813590506111408161111a565b92915050565b60008060008060008060c087890312156111635761116261104f565b5b600061117189828a016110f8565b965050602061118289828a016110f8565b955050604061119389828a01611075565b94505060606111a489828a01611131565b93505060806111b589828a01611075565b92505060a06111c689828a01611075565b9150509295509295509295565b60008115159050919050565b6111e8816111d3565b82525050565b600060208201905061120360008301846111df565b92915050565b60006020828403121561121f5761121e61104f565b5b600061122d848285016110f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611270578082015181840152602081019050611255565b60008484015250505050565b6000601f19601f8301169050919050565b600061129882611236565b6112a28185611241565b93506112b2818560208601611252565b6112bb8161127c565b840191505092915050565b600060208201905081810360008301526112e0818461128d565b905092915050565b6112f18161101b565b82525050565b60408201600082015161130d60008501826112e8565b50602082015161132060208501826112e8565b50505050565b600060408201905061133b60008301846112f7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061136c82611341565b9050919050565b61137c81611361565b82525050565b60006020820190506113976000830184611373565b92915050565b600080604083850312156113b4576113b361104f565b5b60006113c2858286016110f8565b92505060206113d3858286016110f8565b9150509250929050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061141e601c836113dd565b9150611429826113e8565b601c82019050919050565b6000819050919050565b61144f61144a82611054565b611434565b82525050565b600061146082611411565b915061146c828461143e565b60208201915081905092915050565b6000819050919050565b6114966114918261101b565b61147b565b82525050565b60006114a88285611485565b6020820191506114b88284611485565b6020820191508190509392505050565b7f546865206d736748617368206973206e6f7420612068617368206f662074686560008201527f20657870697265734174202b2072657175657374735065724b696c6f7365636f60208201527f6e642e20204578706c61696e20796f757273656c662100000000000000000000604082015250565b600061154a605683611241565b9150611555826114c8565b606082019050919050565b600060208201905081810360008301526115798161153d565b9050919050565b6115898161110d565b82525050565b60006080820190506115a460008301876110b7565b6115b16020830186611580565b6115be60408301856110b7565b6115cb60608301846110b7565b95945050505050565b7f5468697320667265654d696e7420776173206e6f74207369676e65642062792060008201527f667265654d696e745369676e65722e2020486f7720656d626172617373696e6760208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b6000611656604183611241565b9150611661826115d4565b606082019050919050565b6000602082019050818103600083015261168581611649565b9050919050565b7f5468697320667265654d696e742068617320616c7265616479206265656e207260008201527f656465656d65642e2020486f7720656d626172617373696e672e000000000000602082015250565b60006116e8603a83611241565b91506116f38261168c565b604082019050919050565b60006020820190508181036000830152611717816116db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006117588261101b565b91506117638361101b565b925082820190508082111561177b5761177a61171e565b5b92915050565b7f7b226e616d65223a20224c69742050726f746f636f6c2052617465204c696d6960008201527f7420496e637265617365222c20226465736372697074696f6e223a202254686960208201527f73204e465420656e7469746c65732074686520686f6c64657220746f2061207260408201527f617465206c696d697420696e637265617365206f6e20746865204c697420507260608201527f6f746f636f6c204e6574776f726b222c2022696d6167655f64617461223a2022608082015250565b600061184f60a0836113dd565b915061185a82611781565b60a082019050919050565b600081519050919050565b600081905092915050565b600061188682611865565b6118908185611870565b93506118a0818560208601611252565b80840191505092915050565b7f222c2261747472696275746573223a205b7b22646973706c61795f747970652260008201527f3a202264617465222c202274726169745f74797065223a20224578706972617460208201527f696f6e2044617465222c202276616c7565223a20000000000000000000000000604082015250565b600061192e6054836113dd565b9150611939826118ac565b605482019050919050565b600061194f82611236565b61195981856113dd565b9350611969818560208601611252565b80840191505092915050565b7f7d2c207b22646973706c61795f74797065223a20226e756d626572222c20227460008201527f726169745f74797065223a20224d696c6c69726571756573747320506572205360208201527f65636f6e64222c202276616c7565223a20000000000000000000000000000000604082015250565b60006119f76051836113dd565b9150611a0282611975565b605182019050919050565b7f7d5d7d0000000000000000000000000000000000000000000000000000000000600082015250565b6000611a436003836113dd565b9150611a4e82611a0d565b600382019050919050565b6000611a6482611842565b9150611a70828661187b565b9150611a7b82611921565b9150611a878285611944565b9150611a92826119ea565b9150611a9e8284611944565b9150611aa982611a36565b9150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000611aec601d836113dd565b9150611af782611ab6565b601d82019050919050565b6000611b0d82611adf565b9150611b198284611944565b915081905092915050565b7f596f75206d75737420706179206d6f7265207468616e20300000000000000000600082015250565b6000611b5a601883611241565b9150611b6582611b24565b602082019050919050565b60006020820190508181036000830152611b8981611b4d565b9050919050565b7f54686520657870697265734174206d75737420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b6000611bec602383611241565b9150611bf782611b90565b604082019050919050565b60006020820190508181036000830152611c1b81611bdf565b9050919050565b6000611c2d8261101b565b9150611c388361101b565b9250828203905081811115611c5057611c4f61171e565b5b92915050565b7f596f752063616e6e6f7420707572636861736520616e2065787069726174696f60008201527f6e2074696d652074686174206973206d6f7265207468616e20746865206d617860208201527f45787069726174696f6e5365636f6e647320696e207468652066757475726500604082015250565b6000611cd8605f83611241565b9150611ce382611c56565b606082019050919050565b60006020820190508181036000830152611d0781611ccb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611d488261101b565b9150611d538361101b565b925082611d6357611d62611d0e565b5b828206905092915050565b7f45787069726174696f6e2074696d65206d7573742062652073657420746f206d60008201527f69646e69676874206f6e20616e7920676976656e206461790000000000000000602082015250565b6000611dca603883611241565b9150611dd582611d6e565b604082019050919050565b60006020820190508181036000830152611df981611dbd565b9050919050565b6000611e0b8261101b565b9150611e168361101b565b9250828202611e248161101b565b91508282048414831517611e3b57611e3a61171e565b5b5092915050565b6000611e4d8261101b565b9150611e588361101b565b925082611e6857611e67611d0e565b5b828204905092915050565b7f5468652072657175657374735065724b696c6f7365636f6e64206d757374206260008201527f652067726561746572207468616e203000000000000000000000000000000000602082015250565b6000611ecf603083611241565b9150611eda82611e73565b604082019050919050565b60006020820190508181036000830152611efe81611ec2565b9050919050565b7f45787069726174696f6e2074696d6520697320696e2074686520706173740000600082015250565b6000611f3b601e83611241565b9150611f4682611f05565b602082019050919050565b60006020820190508181036000830152611f6a81611f2e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130383027206865696768743d2731303830272066696c6c3d276e6f6e652720786d6c6e733a763d2768747470733a2f2f76656374612e696f2f6e616e6f273e3c7061746820643d274d3336332e303736203339322e323237732d2e3937372031382e3532342d33362e3837342037382e393437632d34312e3537362037302e3031382d34352e343831203135312e3937382d332e303137203232302e342038392e353231203134342e323435203333322e343831203134312e3532203432322e3535362e3038392033342e3833322d35342e3730372034342e3831362d3131372e3437392033322e3932342d3138312e323438203020302d32382e3831392d3133332e3134342d3132372e3233372d3231372e30393920312e35353320312e33303820352e3336392031392e31323220362e3130312032362e37323220322e3234312032332e3335342e3034352034372e3833382d372e3738372037302e3036322d352e3734362031362e33332d31332e3731312033302e3436372d32372e3137382034312e33363820302d332e3831312d2e3935342d31302e3633352d2e3937362d31322e3931382d2e3634342d34362e3530382d31382e3635392d38392e3538322d34382e3031312d3132352e3734332d32352e3634372d33312e3535322d36302e3831322d35332e3038392d39372e38342d36382e3933322e39333120332e31393120322e3636322031362e34313920322e3930362031392e30333320312e3930382032312e39353820322e3236332035322e3731332d2e3632312037342e363439732d372e3833322033332e3837382d31342e3535342035342e343431632d31302e3138342033312e3137352d32342e30352035342e3238352d34312e3632312038322e3030342d332e323420352e3039362d31322e3931332031392e3037382d31382e3038322032362e313436203020302d382e3839372d35362e3139312d34302e3636372d38372e393231682d2e3032327a272066696c6c3d2723303030272f3e3c7061746820643d274d3536322e352032372e32386c3431302e323739203233362e3837346331332e39323320382e3033392032322e352032322e3839352032322e352033382e393731763437332e373563302031362e3037362d382e3537372033302e3933322d32322e352033382e3937314c3536322e3520313035322e3732632d31332e39323320382e30342d33312e30373720382e30342d343520304c3130372e323231203831352e383436632d31332e3932332d382e3033392d32322e352d32322e3839352d32322e352d33382e393731762d3437332e37356134352034352030203020312032322e352d33382e3937314c3531372e352032372e323861343520343520302030203120343520307a27207374726f6b653d272330303027207374726f6b652d77696474683d2732342e3735272f3e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200c3edb0edc8d55e571ce44dcf89d235c3b554fa83e110aee4f5975b91cda045a64736f6c63430008180033