Address Details
contract

0x91641365AF61D0962d5E7fcD9Ce24e03f3b9C16b

Contract Name
CyberBoxNFTBox
Creator
0x8b2f36–66963a at 0x2a1dbb–92ddcc
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
16468395
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
CyberBoxNFTBox




Optimization enabled
false
Compiler version
v0.8.3+commit.8d00100c




EVM Version
istanbul




Verified at
2022-11-30T14:11:13.991327Z

contracts/CyberBoxNFTBox.sol

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity 0.8.3;
pragma experimental ABIEncoderV2;

import {ERC1155Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol";
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

import "hardhat/console.sol";

contract CyberBoxNFTBox is ERC1155Upgradeable {

    address public linkedCollection;
    address public linkedNFT;

    address public boxOwner;

    string public boxName;
    string public boxDescription;
    string public boxAboutAutor;
    string public boxImage;
    string public boxCoverImage;

    uint256 public boxNFTPrice;
    uint256 public boxRoyalty;

    bool public hasPreSale;
    uint256 public boxPreSaleStartDate;
    uint256 public boxPreSaleEndtDate;
    uint256 public boxPreSalePrice;
    address[] public boxPreSaleAddresses;

    uint256 public boxPubSaleStartDate;
    uint256 public boxPubSaleEndtDate;
    uint256 public boxPubSalePrice;

    uint256 public create_fee_co2;

    uint256 public legendary_count;
    uint256 public epic_count;
    uint256 public rare_count;
    uint256 public common_count;
    uint256 public total_nft_count;

    string[] public legendary_images;
    string[] public epic_images;
    string[] public rare_images;
    string[] public common_images;

    struct Image_range {
        uint256 start_index;
        uint256 end_index;
        string image;
    }
    Image_range[] public nftImages;

    address private manager; // developer address
    modifier onlyManager() {
        require(msg.sender == manager, "auction: wrong manager contract");
        _;
    }
    function changeManager(address _newManager) public{
        manager  = _newManager;
    }

    function changeBoxOwner(address msgSender, address _newOwner) public {
        require(msgSender == boxOwner, "auction: wrong manager contract");
        boxOwner  = _newOwner;
    }

    constructor() public {
    }

    function initialize(
    ) public initializer {
        __ERC1155_init("");
        manager = msg.sender;
    }

    /*
    common fee: 0.1 tco2
    rare fee: 1 tco2
    epic fee: 10 tco2
    legendary fee: 100 tco2
     */
    function setFeeAndNFTCounts(
        uint256 _fee_co2,
        uint256 _legendary_count,
        string[] memory _legandery_images,
        uint256 _epic_count,
        string[] memory _epic_images,
        uint256 _rare_count,
        string[] memory _rare_images,
        uint256 _common_count,
        string[] memory _common_images
    ) public {
        // uint256 max_co2 = (_common_count / 10) + _rare_count + (_epic_count * 10) + (_legendary_count * 100);
        // require(
        //         _fee_co2 >= max_co2,
        //         "CyberBox Fee is less than limitation."
        // );
        create_fee_co2 = _fee_co2;
        legendary_count = _legendary_count;
        epic_count = _epic_count;
        rare_count = _rare_count;
        common_count = _common_count;
        total_nft_count = legendary_count + epic_count + rare_count + common_count;
        console.log("changed");

        legendary_images = _legandery_images;
        epic_images = _epic_images;
        rare_images = _rare_images;
        common_images = _common_images;

        uint256 start_index = 0;
        setTypeImage(start_index, legendary_count, legendary_images, 0);
        start_index = start_index + legendary_count;
        setTypeImage(start_index, epic_count, epic_images, 1);
        start_index = start_index + epic_count;
        setTypeImage(start_index, rare_count, rare_images, 2);
        start_index = start_index + rare_count;
        setTypeImage(start_index, common_count, common_images, 3);
    }


    function getBoxNFTCount() public view returns(uint256){
        return total_nft_count;
    }

    function setTypeImage(uint256 startIndex, uint256 imageCount, string[] memory images, uint256 nftType) private {
        if(imageCount > 0){
            uint256 start_index = startIndex;
            uint256 part_count = uint256(imageCount / images.length);
            for(uint256 i=0;i<images.length;i++){
                uint256 st_id = start_index;
                uint256 ed_id = st_id + part_count;
                Image_range memory range = Image_range(st_id , ed_id, images[i]);
                nftImages.push(range);
                start_index = start_index + part_count;
            }
            nftImages[nftImages.length-1].end_index = startIndex + imageCount;
        }
    }

    function getBoxNFTImages() public view returns (Image_range[] memory){
        return nftImages;
    }

    function getNFTImage(uint256 index) public returns (string memory) {
        string memory image;
        for(uint256 i=0;i<nftImages.length;i++){
            Image_range memory range = nftImages[i];
            if(index >= range.start_index && index <= range.end_index){
                image = range.image;
            }
        }
        return image;
    }

    function setCyberBoxTitle(
        string memory _name,
        string memory _description,
        string memory _aboutAutor,
        string memory _image,
        string memory _coverImage,
        uint256 nftPrice,
        uint256 royalty
    ) public {
        boxName = _name;
        boxDescription = _description;
        boxAboutAutor = _aboutAutor;
        boxImage = _image;
        boxCoverImage = _coverImage;
        boxNFTPrice = nftPrice;
        boxRoyalty = royalty;
    }

    function setPreSaleInfo(
        uint256 _preSale_st_date,
        uint256 _preSale_ed_date,
        uint256 _preSale_price,
        address[] memory _preSale_addresses
    ) public {
        hasPreSale = true;
        boxPreSaleStartDate = _preSale_st_date;
        boxPreSaleEndtDate = _preSale_ed_date;
        boxPreSalePrice = _preSale_price;
        boxPreSaleAddresses = _preSale_addresses;
    }

    function setSaleInfo(
        uint256 _sale_st_date,
        uint256 _sele_ed_date,
        uint256 _sale_price
    ) public {
        boxPubSaleStartDate = _sale_st_date;
        boxPubSaleEndtDate = _sele_ed_date;
        boxPubSalePrice = _sale_price;
    }

    function setBoxOwner(address _owner) public {boxOwner = _owner;}
    function setLinkedCollection(address _collection) external {linkedCollection = _collection;}
    function getLinkedCollection() public view returns (address) {return linkedCollection;}
    function setLinkedNFT(address _nft) public{linkedNFT = _nft;}
    function getLinkedNFT() public view returns(address) {return linkedNFT;}
    function getBoxOwner() public view returns(address) {return boxOwner;}
    function getNFTPrice() public view returns(uint256) {return boxNFTPrice;}
    function changeNFTPrice(uint256 price) public {boxNFTPrice = price;}
    function getBoxRoyalty() public view returns(uint256) {return boxRoyalty;}
    function changeBoxRoyalty(uint256 _royalty) public {boxRoyalty = _royalty;}
}
        

/_openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

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

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}
          

/_openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)

pragma solidity ^0.8.2;

import "../../utils/AddressUpgradeable.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]
 * ```
 * 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.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
 * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() {
 *     _disableInitializers();
 * }
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     * @custom:oz-retyped-from bool
     */
    uint8 private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Triggered when the contract has been initialized or reinitialized.
     */
    event Initialized(uint8 version);

    /**
     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
     * `onlyInitializing` functions can be used to initialize parent contracts.
     *
     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
     * constructor.
     *
     * Emits an {Initialized} event.
     */
    modifier initializer() {
        bool isTopLevelCall = !_initializing;
        require(
            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
            "Initializable: contract is already initialized"
        );
        _initialized = 1;
        if (isTopLevelCall) {
            _initializing = true;
        }
        _;
        if (isTopLevelCall) {
            _initializing = false;
            emit Initialized(1);
        }
    }

    /**
     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
     * used to initialize parent contracts.
     *
     * A reinitializer may be used after the original initialization step. This is essential to configure modules that
     * are added through upgrades and that require initialization.
     *
     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
     * cannot be nested. If one is invoked in the context of another, execution will revert.
     *
     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
     * a contract, executing them in the right order is up to the developer or operator.
     *
     * WARNING: setting the version to 255 will prevent any future reinitialization.
     *
     * Emits an {Initialized} event.
     */
    modifier reinitializer(uint8 version) {
        require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
        _initialized = version;
        _initializing = true;
        _;
        _initializing = false;
        emit Initialized(version);
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} and {reinitializer} modifiers, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    /**
     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
     * through proxies.
     *
     * Emits an {Initialized} event the first time it is successfully executed.
     */
    function _disableInitializers() internal virtual {
        require(!_initializing, "Initializable: contract is initializing");
        if (_initialized < type(uint8).max) {
            _initialized = type(uint8).max;
            emit Initialized(type(uint8).max);
        }
    }

    /**
     * @dev Internal function that returns the initialized version. Returns `_initialized`
     */
    function _getInitializedVersion() internal view returns (uint8) {
        return _initialized;
    }

    /**
     * @dev Internal function that returns the initialized version. Returns `_initializing`
     */
    function _isInitializing() internal view returns (bool) {
        return _initializing;
    }
}
          

/_openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155Upgradeable.sol";
import "./IERC1155ReceiverUpgradeable.sol";
import "./extensions/IERC1155MetadataURIUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/ContextUpgradeable.sol";
import "../../utils/introspection/ERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable {
    using AddressUpgradeable for address;

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

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

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

    /**
     * @dev See {_setURI}.
     */
    function __ERC1155_init(string memory uri_) internal onlyInitializing {
        __ERC1155_init_unchained(uri_);
    }

    function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing {
        _setURI(uri_);
    }

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[47] private __gap;
}
          

/_openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165Upgradeable.sol";

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

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

/_openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165Upgradeable.sol";

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

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

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

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

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

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

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

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

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

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

/_openzeppelin/contracts-upgradeable/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155Upgradeable.sol";

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

/_openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}
          

/_openzeppelin/contracts-upgradeable/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;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}
          

/_openzeppelin/contracts-upgradeable/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;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}
          

/_openzeppelin/contracts-upgradeable/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);
}
          

/hardhat/console.sol

// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
	}

	function logUint(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint256 p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
	}

	function log(uint256 p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
	}

	function log(uint256 p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
	}

	function log(uint256 p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
	}

	function log(string memory p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint256 p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"TransferBatch","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256[]","name":"ids","internalType":"uint256[]","indexed":false},{"type":"uint256[]","name":"values","internalType":"uint256[]","indexed":false}],"anonymous":false},{"type":"event","name":"TransferSingle","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"URI","inputs":[{"type":"string","name":"value","internalType":"string","indexed":false},{"type":"uint256","name":"id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"balanceOfBatch","inputs":[{"type":"address[]","name":"accounts","internalType":"address[]"},{"type":"uint256[]","name":"ids","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"boxAboutAutor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"boxCoverImage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"boxDescription","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"boxImage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"boxNFTPrice","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"boxName","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"boxOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"boxPreSaleAddresses","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"boxPreSaleEndtDate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"boxPreSalePrice","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"boxPreSaleStartDate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"boxPubSaleEndtDate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"boxPubSalePrice","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"boxPubSaleStartDate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"boxRoyalty","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeBoxOwner","inputs":[{"type":"address","name":"msgSender","internalType":"address"},{"type":"address","name":"_newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeBoxRoyalty","inputs":[{"type":"uint256","name":"_royalty","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeManager","inputs":[{"type":"address","name":"_newManager","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeNFTPrice","inputs":[{"type":"uint256","name":"price","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"common_count","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"common_images","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"create_fee_co2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"epic_count","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"epic_images","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBoxNFTCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct CyberBoxNFTBox.Image_range[]","components":[{"type":"uint256","name":"start_index","internalType":"uint256"},{"type":"uint256","name":"end_index","internalType":"uint256"},{"type":"string","name":"image","internalType":"string"}]}],"name":"getBoxNFTImages","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getBoxOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBoxRoyalty","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLinkedCollection","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLinkedNFT","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getNFTImage","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNFTPrice","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasPreSale","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"legendary_count","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"legendary_images","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"linkedCollection","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"linkedNFT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"start_index","internalType":"uint256"},{"type":"uint256","name":"end_index","internalType":"uint256"},{"type":"string","name":"image","internalType":"string"}],"name":"nftImages","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"rare_count","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"rare_images","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeBatchTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256[]","name":"ids","internalType":"uint256[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBoxOwner","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCyberBoxTitle","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_description","internalType":"string"},{"type":"string","name":"_aboutAutor","internalType":"string"},{"type":"string","name":"_image","internalType":"string"},{"type":"string","name":"_coverImage","internalType":"string"},{"type":"uint256","name":"nftPrice","internalType":"uint256"},{"type":"uint256","name":"royalty","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeAndNFTCounts","inputs":[{"type":"uint256","name":"_fee_co2","internalType":"uint256"},{"type":"uint256","name":"_legendary_count","internalType":"uint256"},{"type":"string[]","name":"_legandery_images","internalType":"string[]"},{"type":"uint256","name":"_epic_count","internalType":"uint256"},{"type":"string[]","name":"_epic_images","internalType":"string[]"},{"type":"uint256","name":"_rare_count","internalType":"uint256"},{"type":"string[]","name":"_rare_images","internalType":"string[]"},{"type":"uint256","name":"_common_count","internalType":"uint256"},{"type":"string[]","name":"_common_images","internalType":"string[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLinkedCollection","inputs":[{"type":"address","name":"_collection","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLinkedNFT","inputs":[{"type":"address","name":"_nft","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPreSaleInfo","inputs":[{"type":"uint256","name":"_preSale_st_date","internalType":"uint256"},{"type":"uint256","name":"_preSale_ed_date","internalType":"uint256"},{"type":"uint256","name":"_preSale_price","internalType":"uint256"},{"type":"address[]","name":"_preSale_addresses","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSaleInfo","inputs":[{"type":"uint256","name":"_sale_st_date","internalType":"uint256"},{"type":"uint256","name":"_sele_ed_date","internalType":"uint256"},{"type":"uint256","name":"_sale_price","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"total_nft_count","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"uri","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50615048806100206000396000f3fe608060405234801561001057600080fd5b50600436106103825760003560e01c8063880510e7116101de578063b6fdf7d31161010f578063e985e9c5116100ad578063f3034ece1161007c578063f3034ece14610a55578063f415187b14610a85578063fb107a4f14610aa3578063fde9dbcb14610ac157610382565b8063e985e9c5146109cf578063ecc27df9146109ff578063edc4400a14610a1d578063f242432a14610a3957610382565b8063d17e2064116100e9578063d17e206414610959578063d71f3c2714610975578063d736cbc214610993578063e227a243146109b157610382565b8063b6fdf7d3146108ed578063bfe396981461090b578063cdda41701461093b57610382565b8063a22cb4651161017c578063ab1ef54211610156578063ab1ef54214610875578063b2011d2814610893578063b2b59a22146108b1578063b3642574146108cf57610382565b8063a22cb46514610821578063a3fbbaae1461083d578063a6a32bd91461085957610382565b8063909ef2d7116101b8578063909ef2d7146107ad57806396a2e9a4146107c95780639a530419146107e55780639dc538dd1461080357610382565b8063880510e7146107415780638ac7dd7c1461075f5780638d14106e1461078f57610382565b8063433ea889116102b85780636a91bfff116102565780637c673a37116102305780637c673a37146106dd5780638129fc1c146106fb57806384391ea61461070557806386e0e8c21461072357610382565b80636a91bfff1461068557806374913fb9146106a157806377234d7b146106bf57610382565b80634e1273f4116102925780634e1273f4146105ff5780634f5a016e1461062f578063589277c71461064d578063650f6e511461066957610382565b8063433ea8891461059357806343c50b0f146105c557806349432260146105e157610382565b80631a72744811610325578063289b7de7116102ff578063289b7de71461051d5780632eb2c2d61461053b57806333532ae114610557578063354f8bec1461057557610382565b80631a727448146104c5578063237728ee146104e157806327c845d3146104ff57610382565b806305e497e81161036157806305e497e8146104175780630e89341c146104475780630f408dab1461047757806316d6ffaf1461049557610382565b8062fdd58e1461038757806301ffc9a7146103b757806302c3bfc2146103e7575b600080fd5b6103a1600480360381019061039c9190613ad0565b610adf565b6040516103ae9190614612565b60405180910390f35b6103d160048036038101906103cc9190613b78565b610ba9565b6040516103de919061443a565b60405180910390f35b61040160048036038101906103fc9190613ce0565b610c8b565b60405161040e9190614470565b60405180910390f35b610431600480360381019061042c9190613ce0565b610d37565b60405161043e91906142e2565b60405180910390f35b610461600480360381019061045c9190613ce0565b610d76565b60405161046e9190614470565b60405180910390f35b61047f610e0a565b60405161048c9190614470565b60405180910390f35b6104af60048036038101906104aa9190613ce0565b610e98565b6040516104bc9190614470565b60405180910390f35b6104df60048036038101906104da9190613e7e565b610f44565b005b6104e9610f91565b6040516104f69190614612565b60405180910390f35b610507610f97565b6040516105149190614470565b60405180910390f35b610525611025565b6040516105329190614612565b60405180910390f35b61055560048036038101906105509190613946565b61102b565b005b61055f6110cc565b60405161056c9190614612565b60405180910390f35b61057d6110d2565b60405161058a9190614612565b60405180910390f35b6105ad60048036038101906105a89190613ce0565b6110d8565b6040516105bc93929190614656565b60405180910390f35b6105df60048036038101906105da9190613d09565b61119a565b005b6105e9611645565b6040516105f69190614612565b60405180910390f35b61061960048036038101906106149190613b0c565b61164b565b60405161062691906143e1565b60405180910390f35b6106376117fc565b60405161064491906142e2565b60405180910390f35b61066760048036038101906106629190613ce0565b611826565b005b610683600480360381019061067e9190613bca565b611830565b005b61069f600480360381019061069a9190613e2f565b6118ba565b005b6106a96118d4565b6040516106b69190614612565b60405180910390f35b6106c76118da565b6040516106d491906142e2565b60405180910390f35b6106e5611900565b6040516106f29190614612565b60405180910390f35b610703611906565b005b61070d611a95565b60405161071a91906143bf565b60405180910390f35b61072b611b9a565b6040516107389190614470565b60405180910390f35b610749611c28565b60405161075691906142e2565b60405180910390f35b61077960048036038101906107749190613ce0565b611c4e565b6040516107869190614470565b60405180910390f35b610797611cfa565b6040516107a49190614612565b60405180910390f35b6107c760048036038101906107c291906138e1565b611d04565b005b6107e360048036038101906107de91906138e1565b611d48565b005b6107ed611d8c565b6040516107fa9190614470565b60405180910390f35b61080b611e1a565b60405161081891906142e2565b60405180910390f35b61083b60048036038101906108369190613a94565b611e44565b005b610857600480360381019061085291906138e1565b611e5a565b005b610873600480360381019061086e919061390a565b611e9e565b005b61087d611f73565b60405161088a91906142e2565b60405180910390f35b61089b611f99565b6040516108a89190614612565b60405180910390f35b6108b9611f9f565b6040516108c69190614612565b60405180910390f35b6108d7611fa5565b6040516108e4919061443a565b60405180910390f35b6108f5611fb8565b60405161090291906142e2565b60405180910390f35b61092560048036038101906109209190613ce0565b611fe2565b6040516109329190614470565b60405180910390f35b610943612135565b6040516109509190614612565b60405180910390f35b610973600480360381019061096e91906138e1565b61213f565b005b61097d612183565b60405161098a9190614612565b60405180910390f35b61099b612189565b6040516109a89190614470565b60405180910390f35b6109b9612217565b6040516109c69190614612565b60405180910390f35b6109e960048036038101906109e4919061390a565b61221d565b6040516109f6919061443a565b60405180910390f35b610a076122b1565b604051610a149190614612565b60405180910390f35b610a376004803603810190610a329190613ce0565b6122b7565b005b610a536004803603810190610a4e9190613a05565b6122c1565b005b610a6f6004803603810190610a6a9190613ce0565b612362565b604051610a7c9190614470565b60405180910390f35b610a8d61240e565b604051610a9a9190614612565b60405180910390f35b610aab612414565b604051610ab89190614612565b60405180910390f35b610ac961241e565b604051610ad69190614612565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b47906144d2565b60405180910390fd5b6065600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c7457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c845750610c8382612424565b5b9050919050565b60b28181548110610c9b57600080fd5b906000526020600020016000915090508054610cb6906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce2906149ea565b8015610d2f5780601f10610d0457610100808354040283529160200191610d2f565b820191906000526020600020905b815481529060010190602001808311610d1257829003601f168201915b505050505081565b60a58181548110610d4757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060678054610d85906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610db1906149ea565b8015610dfe5780601f10610dd357610100808354040283529160200191610dfe565b820191906000526020600020905b815481529060010190602001808311610de157829003601f168201915b50505050509050919050565b609c8054610e17906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610e43906149ea565b8015610e905780601f10610e6557610100808354040283529160200191610e90565b820191906000526020600020905b815481529060010190602001808311610e7357829003601f168201915b505050505081565b60b08181548110610ea857600080fd5b906000526020600020016000915090508054610ec3906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610eef906149ea565b8015610f3c5780601f10610f1157610100808354040283529160200191610f3c565b820191906000526020600020905b815481529060010190602001808311610f1f57829003601f168201915b505050505081565b600160a160006101000a81548160ff0219169083151502179055508360a2819055508260a3819055508160a4819055508060a59080519060200190610f8a929190613404565b5050505050565b60a85481565b609d8054610fa4906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd0906149ea565b801561101d5780601f10610ff25761010080835404028352916020019161101d565b820191906000526020600020905b81548152906001019060200180831161100057829003601f168201915b505050505081565b60ad5481565b61103361248e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061107957506110788561107361248e565b61221d565b5b6110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af906144f2565b60405180910390fd5b6110c58585858585612496565b5050505050565b60a05481565b60a45481565b60b381815481106110e857600080fd5b9060005260206000209060030201600091509050806000015490806001015490806002018054611117906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611143906149ea565b80156111905780601f1061116557610100808354040283529160200191611190565b820191906000526020600020905b81548152906001019060200180831161117357829003601f168201915b5050505050905083565b8860a9819055508760aa819055508560ab819055508360ac819055508160ad8190555060ad5460ac5460ab5460aa546111d3919061485a565b6111dd919061485a565b6111e7919061485a565b60ae8190555061122b6040518060400160405280600781526020017f6368616e67656400000000000000000000000000000000000000000000000000815250612807565b8660af908051906020019061124192919061348e565b508460b0908051906020019061125892919061348e565b508260b1908051906020019061126f92919061348e565b508060b2908051906020019061128692919061348e565b5060006113698160aa5460af805480602002602001604051908101604052809291908181526020016000905b8282101561135e5783829060005260206000200180546112d1906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546112fd906149ea565b801561134a5780601f1061131f5761010080835404028352916020019161134a565b820191906000526020600020905b81548152906001019060200180831161132d57829003601f168201915b5050505050815260200190600101906112b2565b5050505060006128a0565b60aa5481611377919061485a565b90506114598160ab5460b0805480602002602001604051908101604052809291908181526020016000905b8282101561144e5783829060005260206000200180546113c1906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546113ed906149ea565b801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b5050505050815260200190600101906113a2565b5050505060016128a0565b60ab5481611467919061485a565b90506115498160ac5460b1805480602002602001604051908101604052809291908181526020016000905b8282101561153e5783829060005260206000200180546114b1906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546114dd906149ea565b801561152a5780601f106114ff5761010080835404028352916020019161152a565b820191906000526020600020905b81548152906001019060200180831161150d57829003601f168201915b505050505081526020019060010190611492565b5050505060026128a0565b60ac5481611557919061485a565b90506116398160ad5460b2805480602002602001604051908101604052809291908181526020016000905b8282101561162e5783829060005260206000200180546115a1906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd906149ea565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b505050505081526020019060010190611582565b5050505060036128a0565b50505050505050505050565b60a25481565b60608151835114611691576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611688906145b2565b60405180910390fd5b6000835167ffffffffffffffff8111156116d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117025781602001602082028036833780820191505090505b50905060005b84518110156117f15761179b85828151811061174d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015185838151811061178e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610adf565b8282815181106117d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050806117ea90614a4d565b9050611708565b508091505092915050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060a08190555050565b86609a90805190602001906118469291906134ee565b5085609b908051906020019061185d9291906134ee565b5084609c90805190602001906118749291906134ee565b5083609d908051906020019061188b9291906134ee565b5082609e90805190602001906118a29291906134ee565b5081609f819055508060a08190555050505050505050565b8260a6819055508160a7819055508060a881905550505050565b60a75481565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60ae5481565b60008060019054906101000a900460ff161590508080156119375750600160008054906101000a900460ff1660ff16105b80611964575061194630612a38565b1580156119635750600160008054906101000a900460ff1660ff16145b5b6119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a90614532565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156119e0576001600060016101000a81548160ff0219169083151502179055505b6119f860405180602001604052806000815250612a5b565b3360b460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508015611a925760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051611a899190614455565b60405180910390a15b50565b606060b3805480602002602001604051908101604052809291908181526020016000905b82821015611b9157838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282018054611b00906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2c906149ea565b8015611b795780601f10611b4e57610100808354040283529160200191611b79565b820191906000526020600020905b815481529060010190602001808311611b5c57829003601f168201915b50505050508152505081526020019060010190611ab9565b50505050905090565b609b8054611ba7906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd3906149ea565b8015611c205780601f10611bf557610100808354040283529160200191611c20565b820191906000526020600020905b815481529060010190602001808311611c0357829003601f168201915b505050505081565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60af8181548110611c5e57600080fd5b906000526020600020016000915090508054611c79906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca5906149ea565b8015611cf25780601f10611cc757610100808354040283529160200191611cf2565b820191906000526020600020905b815481529060010190602001808311611cd557829003601f168201915b505050505081565b600060a054905090565b80609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b609a8054611d99906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc5906149ea565b8015611e125780601f10611de757610100808354040283529160200191611e12565b820191906000526020600020905b815481529060010190602001808311611df557829003601f168201915b505050505081565b6000609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e56611e4f61248e565b8383612ab6565b5050565b8060b460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f25906144b2565b60405180910390fd5b80609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60a35481565b60ab5481565b60a160009054906101000a900460ff1681565b6000609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60608060005b60b38054905081101561212b57600060b38281548110612031577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201805461206e906149ea565b80601f016020809104026020016040519081016040528092919081815260200182805461209a906149ea565b80156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b50505050508152505090508060000151851015801561210a575080602001518511155b1561211757806040015192505b50808061212390614a4d565b915050611fe8565b5080915050919050565b600060ae54905090565b80609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60a65481565b609e8054612196906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546121c2906149ea565b801561220f5780601f106121e45761010080835404028352916020019161220f565b820191906000526020600020905b8154815290600101906020018083116121f257829003601f168201915b505050505081565b60ac5481565b6000606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60a95481565b80609f8190555050565b6122c961248e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061230f575061230e8561230961248e565b61221d565b5b61234e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612345906144f2565b60405180910390fd5b61235b8585858585612c23565b5050505050565b60b1818154811061237257600080fd5b90600052602060002001600091509050805461238d906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546123b9906149ea565b80156124065780601f106123db57610100808354040283529160200191612406565b820191906000526020600020905b8154815290600101906020018083116123e957829003601f168201915b505050505081565b60aa5481565b6000609f54905090565b609f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b81518351146124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d1906145d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561254a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254190614512565b60405180910390fd5b600061255461248e565b9050612564818787878787612ec2565b60005b84518110156127645760008582815181106125ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106125f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006065600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268990614552565b60405180910390fd5b8181036065600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816065600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612749919061485a565b925050819055505050508061275d90614a4d565b9050612567565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516127db929190614403565b60405180910390a46127f1818787878787612eca565b6127ff818787878787612ed2565b505050505050565b61289d8160405160240161281b9190614470565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130b9565b50565b6000831115612a3257600084905060008351856128bd91906148b0565b905060005b84518110156129c2576000839050600083826128de919061485a565b905060006040518060600160405280848152602001838152602001898681518110612932577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815250905060b38190806001815401808255809150506001900390600052602060002090600302016000909190919091506000820151816000015560208201518160010155604082015181600201908051906020019061299b9291906134ee565b50505084866129aa919061485a565b955050505080806129ba90614a4d565b9150506128c2565b5084866129cf919061485a565b60b3600160b3805490506129e391906148e1565b81548110612a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016001018190555050505b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa190614572565b60405180910390fd5b612ab3816130e2565b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c90614592565b60405180910390fd5b80606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c16919061443a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a90614512565b60405180910390fd5b6000612c9d61248e565b90506000612caa8561313d565b90506000612cb78561313d565b9050612cc7838989858589612ec2565b60006065600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5690614552565b60405180910390fd5b8581036065600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856065600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e16919061485a565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612e9392919061462d565b60405180910390a4612ea9848a8a86868a612eca565b612eb7848a8a8a8a8a613203565b505050505050505050565b505050505050565b505050505050565b612ef18473ffffffffffffffffffffffffffffffffffffffff16612a38565b156130b1578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612f379594939291906142fd565b602060405180830381600087803b158015612f5157600080fd5b505af1925050508015612f8257506040513d601f19601f82011682018060405250810190612f7f9190613ba1565b60015b61302857612f8e614b52565b806308c379a01415612feb5750612fa3614f20565b80612fae5750612fed565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe29190614470565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301f906145f2565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690614492565b60405180910390fd5b505b505050505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b600060019054906101000a900460ff16613131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312890614572565b60405180910390fd5b61313a816133ea565b50565b60606000600167ffffffffffffffff811115613182577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156131b05781602001602082028036833780820191505090505b50905082816000815181106131ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b6132228473ffffffffffffffffffffffffffffffffffffffff16612a38565b156133e2578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613268959493929190614365565b602060405180830381600087803b15801561328257600080fd5b505af19250505080156132b357506040513d601f19601f820116820180604052508101906132b09190613ba1565b60015b613359576132bf614b52565b806308c379a0141561331c57506132d4614f20565b806132df575061331e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133139190614470565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613350906145f2565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146133e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d790614492565b60405180910390fd5b505b505050505050565b80606790805190602001906134009291906134ee565b5050565b82805482825590600052602060002090810192821561347d579160200282015b8281111561347c5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613424565b5b50905061348a9190613574565b5090565b8280548282559060005260206000209081019282156134dd579160200282015b828111156134dc5782518290805190602001906134cc9291906134ee565b50916020019190600101906134ae565b5b5090506134ea9190613591565b5090565b8280546134fa906149ea565b90600052602060002090601f01602090048101928261351c5760008555613563565b82601f1061353557805160ff1916838001178555613563565b82800160010185558215613563579182015b82811115613562578251825591602001919060010190613547565b5b5090506135709190613574565b5090565b5b8082111561358d576000816000905550600101613575565b5090565b5b808211156135b157600081816135a891906135b5565b50600101613592565b5090565b5080546135c1906149ea565b6000825580601f106135d357506135f2565b601f0160209004906000526020600020908101906135f19190613574565b5b50565b6000613608613603846146b9565b614694565b9050808382526020820190508285602086028201111561362757600080fd5b60005b85811015613657578161363d88826137a6565b84526020840193506020830192505060018101905061362a565b5050509392505050565b600061367461366f846146e5565b614694565b9050808382526020820190508260005b858110156136b4578135850161369a88826138a2565b845260208401935060208301925050600181019050613684565b5050509392505050565b60006136d16136cc84614711565b614694565b905080838252602082019050828560208602820111156136f057600080fd5b60005b85811015613720578161370688826138cc565b8452602084019350602083019250506001810190506136f3565b5050509392505050565b600061373d6137388461473d565b614694565b90508281526020810184848401111561375557600080fd5b6137608482856149a8565b509392505050565b600061377b6137768461476e565b614694565b90508281526020810184848401111561379357600080fd5b61379e8482856149a8565b509392505050565b6000813590506137b581614fb6565b92915050565b600082601f8301126137cc57600080fd5b81356137dc8482602086016135f5565b91505092915050565b600082601f8301126137f657600080fd5b8135613806848260208601613661565b91505092915050565b600082601f83011261382057600080fd5b81356138308482602086016136be565b91505092915050565b60008135905061384881614fcd565b92915050565b60008135905061385d81614fe4565b92915050565b60008151905061387281614fe4565b92915050565b600082601f83011261388957600080fd5b813561389984826020860161372a565b91505092915050565b600082601f8301126138b357600080fd5b81356138c3848260208601613768565b91505092915050565b6000813590506138db81614ffb565b92915050565b6000602082840312156138f357600080fd5b6000613901848285016137a6565b91505092915050565b6000806040838503121561391d57600080fd5b600061392b858286016137a6565b925050602061393c858286016137a6565b9150509250929050565b600080600080600060a0868803121561395e57600080fd5b600061396c888289016137a6565b955050602061397d888289016137a6565b945050604086013567ffffffffffffffff81111561399a57600080fd5b6139a68882890161380f565b935050606086013567ffffffffffffffff8111156139c357600080fd5b6139cf8882890161380f565b925050608086013567ffffffffffffffff8111156139ec57600080fd5b6139f888828901613878565b9150509295509295909350565b600080600080600060a08688031215613a1d57600080fd5b6000613a2b888289016137a6565b9550506020613a3c888289016137a6565b9450506040613a4d888289016138cc565b9350506060613a5e888289016138cc565b925050608086013567ffffffffffffffff811115613a7b57600080fd5b613a8788828901613878565b9150509295509295909350565b60008060408385031215613aa757600080fd5b6000613ab5858286016137a6565b9250506020613ac685828601613839565b9150509250929050565b60008060408385031215613ae357600080fd5b6000613af1858286016137a6565b9250506020613b02858286016138cc565b9150509250929050565b60008060408385031215613b1f57600080fd5b600083013567ffffffffffffffff811115613b3957600080fd5b613b45858286016137bb565b925050602083013567ffffffffffffffff811115613b6257600080fd5b613b6e8582860161380f565b9150509250929050565b600060208284031215613b8a57600080fd5b6000613b988482850161384e565b91505092915050565b600060208284031215613bb357600080fd5b6000613bc184828501613863565b91505092915050565b600080600080600080600060e0888a031215613be557600080fd5b600088013567ffffffffffffffff811115613bff57600080fd5b613c0b8a828b016138a2565b975050602088013567ffffffffffffffff811115613c2857600080fd5b613c348a828b016138a2565b965050604088013567ffffffffffffffff811115613c5157600080fd5b613c5d8a828b016138a2565b955050606088013567ffffffffffffffff811115613c7a57600080fd5b613c868a828b016138a2565b945050608088013567ffffffffffffffff811115613ca357600080fd5b613caf8a828b016138a2565b93505060a0613cc08a828b016138cc565b92505060c0613cd18a828b016138cc565b91505092959891949750929550565b600060208284031215613cf257600080fd5b6000613d00848285016138cc565b91505092915050565b60008060008060008060008060006101208a8c031215613d2857600080fd5b6000613d368c828d016138cc565b9950506020613d478c828d016138cc565b98505060408a013567ffffffffffffffff811115613d6457600080fd5b613d708c828d016137e5565b9750506060613d818c828d016138cc565b96505060808a013567ffffffffffffffff811115613d9e57600080fd5b613daa8c828d016137e5565b95505060a0613dbb8c828d016138cc565b94505060c08a013567ffffffffffffffff811115613dd857600080fd5b613de48c828d016137e5565b93505060e0613df58c828d016138cc565b9250506101008a013567ffffffffffffffff811115613e1357600080fd5b613e1f8c828d016137e5565b9150509295985092959850929598565b600080600060608486031215613e4457600080fd5b6000613e52868287016138cc565b9350506020613e63868287016138cc565b9250506040613e74868287016138cc565b9150509250925092565b60008060008060808587031215613e9457600080fd5b6000613ea2878288016138cc565b9450506020613eb3878288016138cc565b9350506040613ec4878288016138cc565b925050606085013567ffffffffffffffff811115613ee157600080fd5b613eed878288016137bb565b91505092959194509250565b6000613f058383614274565b905092915050565b6000613f1983836142c4565b60208301905092915050565b613f2e81614915565b82525050565b6000613f3f826147bf565b613f498185614805565b935083602082028501613f5b8561479f565b8060005b85811015613f975784840389528151613f788582613ef9565b9450613f83836147eb565b925060208a01995050600181019050613f5f565b50829750879550505050505092915050565b6000613fb4826147ca565b613fbe8185614816565b9350613fc9836147af565b8060005b83811015613ffa578151613fe18882613f0d565b9750613fec836147f8565b925050600181019050613fcd565b5085935050505092915050565b61401081614927565b82525050565b6000614021826147d5565b61402b8185614827565b935061403b8185602086016149b7565b61404481614b74565b840191505092915050565b61405881614996565b82525050565b6000614069826147e0565b6140738185614838565b93506140838185602086016149b7565b61408c81614b74565b840191505092915050565b60006140a2826147e0565b6140ac8185614849565b93506140bc8185602086016149b7565b6140c581614b74565b840191505092915050565b60006140dd602883614849565b91506140e882614b92565b604082019050919050565b6000614100601f83614849565b915061410b82614be1565b602082019050919050565b6000614123602a83614849565b915061412e82614c0a565b604082019050919050565b6000614146602e83614849565b915061415182614c59565b604082019050919050565b6000614169602583614849565b915061417482614ca8565b604082019050919050565b600061418c602e83614849565b915061419782614cf7565b604082019050919050565b60006141af602a83614849565b91506141ba82614d46565b604082019050919050565b60006141d2602b83614849565b91506141dd82614d95565b604082019050919050565b60006141f5602983614849565b915061420082614de4565b604082019050919050565b6000614218602983614849565b915061422382614e33565b604082019050919050565b600061423b602883614849565b915061424682614e82565b604082019050919050565b600061425e603483614849565b915061426982614ed1565b604082019050919050565b600060608301600083015161428c60008601826142c4565b50602083015161429f60208601826142c4565b50604083015184820360408601526142b7828261405e565b9150508091505092915050565b6142cd8161497f565b82525050565b6142dc8161497f565b82525050565b60006020820190506142f76000830184613f25565b92915050565b600060a0820190506143126000830188613f25565b61431f6020830187613f25565b81810360408301526143318186613fa9565b905081810360608301526143458185613fa9565b905081810360808301526143598184614016565b90509695505050505050565b600060a08201905061437a6000830188613f25565b6143876020830187613f25565b61439460408301866142d3565b6143a160608301856142d3565b81810360808301526143b38184614016565b90509695505050505050565b600060208201905081810360008301526143d98184613f34565b905092915050565b600060208201905081810360008301526143fb8184613fa9565b905092915050565b6000604082019050818103600083015261441d8185613fa9565b905081810360208301526144318184613fa9565b90509392505050565b600060208201905061444f6000830184614007565b92915050565b600060208201905061446a600083018461404f565b92915050565b6000602082019050818103600083015261448a8184614097565b905092915050565b600060208201905081810360008301526144ab816140d0565b9050919050565b600060208201905081810360008301526144cb816140f3565b9050919050565b600060208201905081810360008301526144eb81614116565b9050919050565b6000602082019050818103600083015261450b81614139565b9050919050565b6000602082019050818103600083015261452b8161415c565b9050919050565b6000602082019050818103600083015261454b8161417f565b9050919050565b6000602082019050818103600083015261456b816141a2565b9050919050565b6000602082019050818103600083015261458b816141c5565b9050919050565b600060208201905081810360008301526145ab816141e8565b9050919050565b600060208201905081810360008301526145cb8161420b565b9050919050565b600060208201905081810360008301526145eb8161422e565b9050919050565b6000602082019050818103600083015261460b81614251565b9050919050565b600060208201905061462760008301846142d3565b92915050565b600060408201905061464260008301856142d3565b61464f60208301846142d3565b9392505050565b600060608201905061466b60008301866142d3565b61467860208301856142d3565b818103604083015261468a8184614097565b9050949350505050565b600061469e6146af565b90506146aa8282614a1c565b919050565b6000604051905090565b600067ffffffffffffffff8211156146d4576146d3614b23565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614700576146ff614b23565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561472c5761472b614b23565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561475857614757614b23565b5b61476182614b74565b9050602081019050919050565b600067ffffffffffffffff82111561478957614788614b23565b5b61479282614b74565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006148658261497f565b91506148708361497f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148a5576148a4614a96565b5b828201905092915050565b60006148bb8261497f565b91506148c68361497f565b9250826148d6576148d5614ac5565b5b828204905092915050565b60006148ec8261497f565b91506148f78361497f565b92508282101561490a57614909614a96565b5b828203905092915050565b60006149208261495f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006149a182614989565b9050919050565b82818337600083830152505050565b60005b838110156149d55780820151818401526020810190506149ba565b838111156149e4576000848401525b50505050565b60006002820490506001821680614a0257607f821691505b60208210811415614a1657614a15614af4565b5b50919050565b614a2582614b74565b810181811067ffffffffffffffff82111715614a4457614a43614b23565b5b80604052505050565b6000614a588261497f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a8b57614a8a614a96565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614b715760046000803e614b6e600051614b85565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f61756374696f6e3a2077726f6e67206d616e6167657220636f6e747261637400600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d1015614f3057614fb3565b614f386146af565b60043d036004823e80513d602482011167ffffffffffffffff82111715614f60575050614fb3565b808201805167ffffffffffffffff811115614f7e5750505050614fb3565b80602083010160043d038501811115614f9b575050505050614fb3565b614faa82602001850186614a1c565b82955050505050505b90565b614fbf81614915565b8114614fca57600080fd5b50565b614fd681614927565b8114614fe157600080fd5b50565b614fed81614933565b8114614ff857600080fd5b50565b6150048161497f565b811461500f57600080fd5b5056fea264697066735822122087253c1b82164baa67f776acca989c13317bd5be6d69f495f656e63a9a3bb3e564736f6c63430008030033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106103825760003560e01c8063880510e7116101de578063b6fdf7d31161010f578063e985e9c5116100ad578063f3034ece1161007c578063f3034ece14610a55578063f415187b14610a85578063fb107a4f14610aa3578063fde9dbcb14610ac157610382565b8063e985e9c5146109cf578063ecc27df9146109ff578063edc4400a14610a1d578063f242432a14610a3957610382565b8063d17e2064116100e9578063d17e206414610959578063d71f3c2714610975578063d736cbc214610993578063e227a243146109b157610382565b8063b6fdf7d3146108ed578063bfe396981461090b578063cdda41701461093b57610382565b8063a22cb4651161017c578063ab1ef54211610156578063ab1ef54214610875578063b2011d2814610893578063b2b59a22146108b1578063b3642574146108cf57610382565b8063a22cb46514610821578063a3fbbaae1461083d578063a6a32bd91461085957610382565b8063909ef2d7116101b8578063909ef2d7146107ad57806396a2e9a4146107c95780639a530419146107e55780639dc538dd1461080357610382565b8063880510e7146107415780638ac7dd7c1461075f5780638d14106e1461078f57610382565b8063433ea889116102b85780636a91bfff116102565780637c673a37116102305780637c673a37146106dd5780638129fc1c146106fb57806384391ea61461070557806386e0e8c21461072357610382565b80636a91bfff1461068557806374913fb9146106a157806377234d7b146106bf57610382565b80634e1273f4116102925780634e1273f4146105ff5780634f5a016e1461062f578063589277c71461064d578063650f6e511461066957610382565b8063433ea8891461059357806343c50b0f146105c557806349432260146105e157610382565b80631a72744811610325578063289b7de7116102ff578063289b7de71461051d5780632eb2c2d61461053b57806333532ae114610557578063354f8bec1461057557610382565b80631a727448146104c5578063237728ee146104e157806327c845d3146104ff57610382565b806305e497e81161036157806305e497e8146104175780630e89341c146104475780630f408dab1461047757806316d6ffaf1461049557610382565b8062fdd58e1461038757806301ffc9a7146103b757806302c3bfc2146103e7575b600080fd5b6103a1600480360381019061039c9190613ad0565b610adf565b6040516103ae9190614612565b60405180910390f35b6103d160048036038101906103cc9190613b78565b610ba9565b6040516103de919061443a565b60405180910390f35b61040160048036038101906103fc9190613ce0565b610c8b565b60405161040e9190614470565b60405180910390f35b610431600480360381019061042c9190613ce0565b610d37565b60405161043e91906142e2565b60405180910390f35b610461600480360381019061045c9190613ce0565b610d76565b60405161046e9190614470565b60405180910390f35b61047f610e0a565b60405161048c9190614470565b60405180910390f35b6104af60048036038101906104aa9190613ce0565b610e98565b6040516104bc9190614470565b60405180910390f35b6104df60048036038101906104da9190613e7e565b610f44565b005b6104e9610f91565b6040516104f69190614612565b60405180910390f35b610507610f97565b6040516105149190614470565b60405180910390f35b610525611025565b6040516105329190614612565b60405180910390f35b61055560048036038101906105509190613946565b61102b565b005b61055f6110cc565b60405161056c9190614612565b60405180910390f35b61057d6110d2565b60405161058a9190614612565b60405180910390f35b6105ad60048036038101906105a89190613ce0565b6110d8565b6040516105bc93929190614656565b60405180910390f35b6105df60048036038101906105da9190613d09565b61119a565b005b6105e9611645565b6040516105f69190614612565b60405180910390f35b61061960048036038101906106149190613b0c565b61164b565b60405161062691906143e1565b60405180910390f35b6106376117fc565b60405161064491906142e2565b60405180910390f35b61066760048036038101906106629190613ce0565b611826565b005b610683600480360381019061067e9190613bca565b611830565b005b61069f600480360381019061069a9190613e2f565b6118ba565b005b6106a96118d4565b6040516106b69190614612565b60405180910390f35b6106c76118da565b6040516106d491906142e2565b60405180910390f35b6106e5611900565b6040516106f29190614612565b60405180910390f35b610703611906565b005b61070d611a95565b60405161071a91906143bf565b60405180910390f35b61072b611b9a565b6040516107389190614470565b60405180910390f35b610749611c28565b60405161075691906142e2565b60405180910390f35b61077960048036038101906107749190613ce0565b611c4e565b6040516107869190614470565b60405180910390f35b610797611cfa565b6040516107a49190614612565b60405180910390f35b6107c760048036038101906107c291906138e1565b611d04565b005b6107e360048036038101906107de91906138e1565b611d48565b005b6107ed611d8c565b6040516107fa9190614470565b60405180910390f35b61080b611e1a565b60405161081891906142e2565b60405180910390f35b61083b60048036038101906108369190613a94565b611e44565b005b610857600480360381019061085291906138e1565b611e5a565b005b610873600480360381019061086e919061390a565b611e9e565b005b61087d611f73565b60405161088a91906142e2565b60405180910390f35b61089b611f99565b6040516108a89190614612565b60405180910390f35b6108b9611f9f565b6040516108c69190614612565b60405180910390f35b6108d7611fa5565b6040516108e4919061443a565b60405180910390f35b6108f5611fb8565b60405161090291906142e2565b60405180910390f35b61092560048036038101906109209190613ce0565b611fe2565b6040516109329190614470565b60405180910390f35b610943612135565b6040516109509190614612565b60405180910390f35b610973600480360381019061096e91906138e1565b61213f565b005b61097d612183565b60405161098a9190614612565b60405180910390f35b61099b612189565b6040516109a89190614470565b60405180910390f35b6109b9612217565b6040516109c69190614612565b60405180910390f35b6109e960048036038101906109e4919061390a565b61221d565b6040516109f6919061443a565b60405180910390f35b610a076122b1565b604051610a149190614612565b60405180910390f35b610a376004803603810190610a329190613ce0565b6122b7565b005b610a536004803603810190610a4e9190613a05565b6122c1565b005b610a6f6004803603810190610a6a9190613ce0565b612362565b604051610a7c9190614470565b60405180910390f35b610a8d61240e565b604051610a9a9190614612565b60405180910390f35b610aab612414565b604051610ab89190614612565b60405180910390f35b610ac961241e565b604051610ad69190614612565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b47906144d2565b60405180910390fd5b6065600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c7457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c845750610c8382612424565b5b9050919050565b60b28181548110610c9b57600080fd5b906000526020600020016000915090508054610cb6906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce2906149ea565b8015610d2f5780601f10610d0457610100808354040283529160200191610d2f565b820191906000526020600020905b815481529060010190602001808311610d1257829003601f168201915b505050505081565b60a58181548110610d4757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060678054610d85906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610db1906149ea565b8015610dfe5780601f10610dd357610100808354040283529160200191610dfe565b820191906000526020600020905b815481529060010190602001808311610de157829003601f168201915b50505050509050919050565b609c8054610e17906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610e43906149ea565b8015610e905780601f10610e6557610100808354040283529160200191610e90565b820191906000526020600020905b815481529060010190602001808311610e7357829003601f168201915b505050505081565b60b08181548110610ea857600080fd5b906000526020600020016000915090508054610ec3906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610eef906149ea565b8015610f3c5780601f10610f1157610100808354040283529160200191610f3c565b820191906000526020600020905b815481529060010190602001808311610f1f57829003601f168201915b505050505081565b600160a160006101000a81548160ff0219169083151502179055508360a2819055508260a3819055508160a4819055508060a59080519060200190610f8a929190613404565b5050505050565b60a85481565b609d8054610fa4906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd0906149ea565b801561101d5780601f10610ff25761010080835404028352916020019161101d565b820191906000526020600020905b81548152906001019060200180831161100057829003601f168201915b505050505081565b60ad5481565b61103361248e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061107957506110788561107361248e565b61221d565b5b6110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af906144f2565b60405180910390fd5b6110c58585858585612496565b5050505050565b60a05481565b60a45481565b60b381815481106110e857600080fd5b9060005260206000209060030201600091509050806000015490806001015490806002018054611117906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611143906149ea565b80156111905780601f1061116557610100808354040283529160200191611190565b820191906000526020600020905b81548152906001019060200180831161117357829003601f168201915b5050505050905083565b8860a9819055508760aa819055508560ab819055508360ac819055508160ad8190555060ad5460ac5460ab5460aa546111d3919061485a565b6111dd919061485a565b6111e7919061485a565b60ae8190555061122b6040518060400160405280600781526020017f6368616e67656400000000000000000000000000000000000000000000000000815250612807565b8660af908051906020019061124192919061348e565b508460b0908051906020019061125892919061348e565b508260b1908051906020019061126f92919061348e565b508060b2908051906020019061128692919061348e565b5060006113698160aa5460af805480602002602001604051908101604052809291908181526020016000905b8282101561135e5783829060005260206000200180546112d1906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546112fd906149ea565b801561134a5780601f1061131f5761010080835404028352916020019161134a565b820191906000526020600020905b81548152906001019060200180831161132d57829003601f168201915b5050505050815260200190600101906112b2565b5050505060006128a0565b60aa5481611377919061485a565b90506114598160ab5460b0805480602002602001604051908101604052809291908181526020016000905b8282101561144e5783829060005260206000200180546113c1906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546113ed906149ea565b801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b5050505050815260200190600101906113a2565b5050505060016128a0565b60ab5481611467919061485a565b90506115498160ac5460b1805480602002602001604051908101604052809291908181526020016000905b8282101561153e5783829060005260206000200180546114b1906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546114dd906149ea565b801561152a5780601f106114ff5761010080835404028352916020019161152a565b820191906000526020600020905b81548152906001019060200180831161150d57829003601f168201915b505050505081526020019060010190611492565b5050505060026128a0565b60ac5481611557919061485a565b90506116398160ad5460b2805480602002602001604051908101604052809291908181526020016000905b8282101561162e5783829060005260206000200180546115a1906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546115cd906149ea565b801561161a5780601f106115ef5761010080835404028352916020019161161a565b820191906000526020600020905b8154815290600101906020018083116115fd57829003601f168201915b505050505081526020019060010190611582565b5050505060036128a0565b50505050505050505050565b60a25481565b60608151835114611691576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611688906145b2565b60405180910390fd5b6000835167ffffffffffffffff8111156116d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117025781602001602082028036833780820191505090505b50905060005b84518110156117f15761179b85828151811061174d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015185838151811061178e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610adf565b8282815181106117d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050806117ea90614a4d565b9050611708565b508091505092915050565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060a08190555050565b86609a90805190602001906118469291906134ee565b5085609b908051906020019061185d9291906134ee565b5084609c90805190602001906118749291906134ee565b5083609d908051906020019061188b9291906134ee565b5082609e90805190602001906118a29291906134ee565b5081609f819055508060a08190555050505050505050565b8260a6819055508160a7819055508060a881905550505050565b60a75481565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60ae5481565b60008060019054906101000a900460ff161590508080156119375750600160008054906101000a900460ff1660ff16105b80611964575061194630612a38565b1580156119635750600160008054906101000a900460ff1660ff16145b5b6119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a90614532565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156119e0576001600060016101000a81548160ff0219169083151502179055505b6119f860405180602001604052806000815250612a5b565b3360b460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508015611a925760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051611a899190614455565b60405180910390a15b50565b606060b3805480602002602001604051908101604052809291908181526020016000905b82821015611b9157838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282018054611b00906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611b2c906149ea565b8015611b795780601f10611b4e57610100808354040283529160200191611b79565b820191906000526020600020905b815481529060010190602001808311611b5c57829003601f168201915b50505050508152505081526020019060010190611ab9565b50505050905090565b609b8054611ba7906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd3906149ea565b8015611c205780601f10611bf557610100808354040283529160200191611c20565b820191906000526020600020905b815481529060010190602001808311611c0357829003601f168201915b505050505081565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60af8181548110611c5e57600080fd5b906000526020600020016000915090508054611c79906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca5906149ea565b8015611cf25780601f10611cc757610100808354040283529160200191611cf2565b820191906000526020600020905b815481529060010190602001808311611cd557829003601f168201915b505050505081565b600060a054905090565b80609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b609a8054611d99906149ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc5906149ea565b8015611e125780601f10611de757610100808354040283529160200191611e12565b820191906000526020600020905b815481529060010190602001808311611df557829003601f168201915b505050505081565b6000609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e56611e4f61248e565b8383612ab6565b5050565b8060b460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f25906144b2565b60405180910390fd5b80609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60a35481565b60ab5481565b60a160009054906101000a900460ff1681565b6000609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60608060005b60b38054905081101561212b57600060b38281548110612031577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201805461206e906149ea565b80601f016020809104026020016040519081016040528092919081815260200182805461209a906149ea565b80156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b50505050508152505090508060000151851015801561210a575080602001518511155b1561211757806040015192505b50808061212390614a4d565b915050611fe8565b5080915050919050565b600060ae54905090565b80609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60a65481565b609e8054612196906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546121c2906149ea565b801561220f5780601f106121e45761010080835404028352916020019161220f565b820191906000526020600020905b8154815290600101906020018083116121f257829003601f168201915b505050505081565b60ac5481565b6000606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60a95481565b80609f8190555050565b6122c961248e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061230f575061230e8561230961248e565b61221d565b5b61234e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612345906144f2565b60405180910390fd5b61235b8585858585612c23565b5050505050565b60b1818154811061237257600080fd5b90600052602060002001600091509050805461238d906149ea565b80601f01602080910402602001604051908101604052809291908181526020018280546123b9906149ea565b80156124065780601f106123db57610100808354040283529160200191612406565b820191906000526020600020905b8154815290600101906020018083116123e957829003601f168201915b505050505081565b60aa5481565b6000609f54905090565b609f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b81518351146124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d1906145d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561254a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254190614512565b60405180910390fd5b600061255461248e565b9050612564818787878787612ec2565b60005b84518110156127645760008582815181106125ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106125f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006065600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268990614552565b60405180910390fd5b8181036065600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816065600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612749919061485a565b925050819055505050508061275d90614a4d565b9050612567565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516127db929190614403565b60405180910390a46127f1818787878787612eca565b6127ff818787878787612ed2565b505050505050565b61289d8160405160240161281b9190614470565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130b9565b50565b6000831115612a3257600084905060008351856128bd91906148b0565b905060005b84518110156129c2576000839050600083826128de919061485a565b905060006040518060600160405280848152602001838152602001898681518110612932577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815250905060b38190806001815401808255809150506001900390600052602060002090600302016000909190919091506000820151816000015560208201518160010155604082015181600201908051906020019061299b9291906134ee565b50505084866129aa919061485a565b955050505080806129ba90614a4d565b9150506128c2565b5084866129cf919061485a565b60b3600160b3805490506129e391906148e1565b81548110612a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016001018190555050505b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa190614572565b60405180910390fd5b612ab3816130e2565b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c90614592565b60405180910390fd5b80606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c16919061443a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a90614512565b60405180910390fd5b6000612c9d61248e565b90506000612caa8561313d565b90506000612cb78561313d565b9050612cc7838989858589612ec2565b60006065600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5690614552565b60405180910390fd5b8581036065600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856065600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e16919061485a565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612e9392919061462d565b60405180910390a4612ea9848a8a86868a612eca565b612eb7848a8a8a8a8a613203565b505050505050505050565b505050505050565b505050505050565b612ef18473ffffffffffffffffffffffffffffffffffffffff16612a38565b156130b1578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612f379594939291906142fd565b602060405180830381600087803b158015612f5157600080fd5b505af1925050508015612f8257506040513d601f19601f82011682018060405250810190612f7f9190613ba1565b60015b61302857612f8e614b52565b806308c379a01415612feb5750612fa3614f20565b80612fae5750612fed565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe29190614470565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301f906145f2565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690614492565b60405180910390fd5b505b505050505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b600060019054906101000a900460ff16613131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312890614572565b60405180910390fd5b61313a816133ea565b50565b60606000600167ffffffffffffffff811115613182577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156131b05781602001602082028036833780820191505090505b50905082816000815181106131ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b6132228473ffffffffffffffffffffffffffffffffffffffff16612a38565b156133e2578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613268959493929190614365565b602060405180830381600087803b15801561328257600080fd5b505af19250505080156132b357506040513d601f19601f820116820180604052508101906132b09190613ba1565b60015b613359576132bf614b52565b806308c379a0141561331c57506132d4614f20565b806132df575061331e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133139190614470565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613350906145f2565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146133e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d790614492565b60405180910390fd5b505b505050505050565b80606790805190602001906134009291906134ee565b5050565b82805482825590600052602060002090810192821561347d579160200282015b8281111561347c5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613424565b5b50905061348a9190613574565b5090565b8280548282559060005260206000209081019282156134dd579160200282015b828111156134dc5782518290805190602001906134cc9291906134ee565b50916020019190600101906134ae565b5b5090506134ea9190613591565b5090565b8280546134fa906149ea565b90600052602060002090601f01602090048101928261351c5760008555613563565b82601f1061353557805160ff1916838001178555613563565b82800160010185558215613563579182015b82811115613562578251825591602001919060010190613547565b5b5090506135709190613574565b5090565b5b8082111561358d576000816000905550600101613575565b5090565b5b808211156135b157600081816135a891906135b5565b50600101613592565b5090565b5080546135c1906149ea565b6000825580601f106135d357506135f2565b601f0160209004906000526020600020908101906135f19190613574565b5b50565b6000613608613603846146b9565b614694565b9050808382526020820190508285602086028201111561362757600080fd5b60005b85811015613657578161363d88826137a6565b84526020840193506020830192505060018101905061362a565b5050509392505050565b600061367461366f846146e5565b614694565b9050808382526020820190508260005b858110156136b4578135850161369a88826138a2565b845260208401935060208301925050600181019050613684565b5050509392505050565b60006136d16136cc84614711565b614694565b905080838252602082019050828560208602820111156136f057600080fd5b60005b85811015613720578161370688826138cc565b8452602084019350602083019250506001810190506136f3565b5050509392505050565b600061373d6137388461473d565b614694565b90508281526020810184848401111561375557600080fd5b6137608482856149a8565b509392505050565b600061377b6137768461476e565b614694565b90508281526020810184848401111561379357600080fd5b61379e8482856149a8565b509392505050565b6000813590506137b581614fb6565b92915050565b600082601f8301126137cc57600080fd5b81356137dc8482602086016135f5565b91505092915050565b600082601f8301126137f657600080fd5b8135613806848260208601613661565b91505092915050565b600082601f83011261382057600080fd5b81356138308482602086016136be565b91505092915050565b60008135905061384881614fcd565b92915050565b60008135905061385d81614fe4565b92915050565b60008151905061387281614fe4565b92915050565b600082601f83011261388957600080fd5b813561389984826020860161372a565b91505092915050565b600082601f8301126138b357600080fd5b81356138c3848260208601613768565b91505092915050565b6000813590506138db81614ffb565b92915050565b6000602082840312156138f357600080fd5b6000613901848285016137a6565b91505092915050565b6000806040838503121561391d57600080fd5b600061392b858286016137a6565b925050602061393c858286016137a6565b9150509250929050565b600080600080600060a0868803121561395e57600080fd5b600061396c888289016137a6565b955050602061397d888289016137a6565b945050604086013567ffffffffffffffff81111561399a57600080fd5b6139a68882890161380f565b935050606086013567ffffffffffffffff8111156139c357600080fd5b6139cf8882890161380f565b925050608086013567ffffffffffffffff8111156139ec57600080fd5b6139f888828901613878565b9150509295509295909350565b600080600080600060a08688031215613a1d57600080fd5b6000613a2b888289016137a6565b9550506020613a3c888289016137a6565b9450506040613a4d888289016138cc565b9350506060613a5e888289016138cc565b925050608086013567ffffffffffffffff811115613a7b57600080fd5b613a8788828901613878565b9150509295509295909350565b60008060408385031215613aa757600080fd5b6000613ab5858286016137a6565b9250506020613ac685828601613839565b9150509250929050565b60008060408385031215613ae357600080fd5b6000613af1858286016137a6565b9250506020613b02858286016138cc565b9150509250929050565b60008060408385031215613b1f57600080fd5b600083013567ffffffffffffffff811115613b3957600080fd5b613b45858286016137bb565b925050602083013567ffffffffffffffff811115613b6257600080fd5b613b6e8582860161380f565b9150509250929050565b600060208284031215613b8a57600080fd5b6000613b988482850161384e565b91505092915050565b600060208284031215613bb357600080fd5b6000613bc184828501613863565b91505092915050565b600080600080600080600060e0888a031215613be557600080fd5b600088013567ffffffffffffffff811115613bff57600080fd5b613c0b8a828b016138a2565b975050602088013567ffffffffffffffff811115613c2857600080fd5b613c348a828b016138a2565b965050604088013567ffffffffffffffff811115613c5157600080fd5b613c5d8a828b016138a2565b955050606088013567ffffffffffffffff811115613c7a57600080fd5b613c868a828b016138a2565b945050608088013567ffffffffffffffff811115613ca357600080fd5b613caf8a828b016138a2565b93505060a0613cc08a828b016138cc565b92505060c0613cd18a828b016138cc565b91505092959891949750929550565b600060208284031215613cf257600080fd5b6000613d00848285016138cc565b91505092915050565b60008060008060008060008060006101208a8c031215613d2857600080fd5b6000613d368c828d016138cc565b9950506020613d478c828d016138cc565b98505060408a013567ffffffffffffffff811115613d6457600080fd5b613d708c828d016137e5565b9750506060613d818c828d016138cc565b96505060808a013567ffffffffffffffff811115613d9e57600080fd5b613daa8c828d016137e5565b95505060a0613dbb8c828d016138cc565b94505060c08a013567ffffffffffffffff811115613dd857600080fd5b613de48c828d016137e5565b93505060e0613df58c828d016138cc565b9250506101008a013567ffffffffffffffff811115613e1357600080fd5b613e1f8c828d016137e5565b9150509295985092959850929598565b600080600060608486031215613e4457600080fd5b6000613e52868287016138cc565b9350506020613e63868287016138cc565b9250506040613e74868287016138cc565b9150509250925092565b60008060008060808587031215613e9457600080fd5b6000613ea2878288016138cc565b9450506020613eb3878288016138cc565b9350506040613ec4878288016138cc565b925050606085013567ffffffffffffffff811115613ee157600080fd5b613eed878288016137bb565b91505092959194509250565b6000613f058383614274565b905092915050565b6000613f1983836142c4565b60208301905092915050565b613f2e81614915565b82525050565b6000613f3f826147bf565b613f498185614805565b935083602082028501613f5b8561479f565b8060005b85811015613f975784840389528151613f788582613ef9565b9450613f83836147eb565b925060208a01995050600181019050613f5f565b50829750879550505050505092915050565b6000613fb4826147ca565b613fbe8185614816565b9350613fc9836147af565b8060005b83811015613ffa578151613fe18882613f0d565b9750613fec836147f8565b925050600181019050613fcd565b5085935050505092915050565b61401081614927565b82525050565b6000614021826147d5565b61402b8185614827565b935061403b8185602086016149b7565b61404481614b74565b840191505092915050565b61405881614996565b82525050565b6000614069826147e0565b6140738185614838565b93506140838185602086016149b7565b61408c81614b74565b840191505092915050565b60006140a2826147e0565b6140ac8185614849565b93506140bc8185602086016149b7565b6140c581614b74565b840191505092915050565b60006140dd602883614849565b91506140e882614b92565b604082019050919050565b6000614100601f83614849565b915061410b82614be1565b602082019050919050565b6000614123602a83614849565b915061412e82614c0a565b604082019050919050565b6000614146602e83614849565b915061415182614c59565b604082019050919050565b6000614169602583614849565b915061417482614ca8565b604082019050919050565b600061418c602e83614849565b915061419782614cf7565b604082019050919050565b60006141af602a83614849565b91506141ba82614d46565b604082019050919050565b60006141d2602b83614849565b91506141dd82614d95565b604082019050919050565b60006141f5602983614849565b915061420082614de4565b604082019050919050565b6000614218602983614849565b915061422382614e33565b604082019050919050565b600061423b602883614849565b915061424682614e82565b604082019050919050565b600061425e603483614849565b915061426982614ed1565b604082019050919050565b600060608301600083015161428c60008601826142c4565b50602083015161429f60208601826142c4565b50604083015184820360408601526142b7828261405e565b9150508091505092915050565b6142cd8161497f565b82525050565b6142dc8161497f565b82525050565b60006020820190506142f76000830184613f25565b92915050565b600060a0820190506143126000830188613f25565b61431f6020830187613f25565b81810360408301526143318186613fa9565b905081810360608301526143458185613fa9565b905081810360808301526143598184614016565b90509695505050505050565b600060a08201905061437a6000830188613f25565b6143876020830187613f25565b61439460408301866142d3565b6143a160608301856142d3565b81810360808301526143b38184614016565b90509695505050505050565b600060208201905081810360008301526143d98184613f34565b905092915050565b600060208201905081810360008301526143fb8184613fa9565b905092915050565b6000604082019050818103600083015261441d8185613fa9565b905081810360208301526144318184613fa9565b90509392505050565b600060208201905061444f6000830184614007565b92915050565b600060208201905061446a600083018461404f565b92915050565b6000602082019050818103600083015261448a8184614097565b905092915050565b600060208201905081810360008301526144ab816140d0565b9050919050565b600060208201905081810360008301526144cb816140f3565b9050919050565b600060208201905081810360008301526144eb81614116565b9050919050565b6000602082019050818103600083015261450b81614139565b9050919050565b6000602082019050818103600083015261452b8161415c565b9050919050565b6000602082019050818103600083015261454b8161417f565b9050919050565b6000602082019050818103600083015261456b816141a2565b9050919050565b6000602082019050818103600083015261458b816141c5565b9050919050565b600060208201905081810360008301526145ab816141e8565b9050919050565b600060208201905081810360008301526145cb8161420b565b9050919050565b600060208201905081810360008301526145eb8161422e565b9050919050565b6000602082019050818103600083015261460b81614251565b9050919050565b600060208201905061462760008301846142d3565b92915050565b600060408201905061464260008301856142d3565b61464f60208301846142d3565b9392505050565b600060608201905061466b60008301866142d3565b61467860208301856142d3565b818103604083015261468a8184614097565b9050949350505050565b600061469e6146af565b90506146aa8282614a1c565b919050565b6000604051905090565b600067ffffffffffffffff8211156146d4576146d3614b23565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614700576146ff614b23565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561472c5761472b614b23565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561475857614757614b23565b5b61476182614b74565b9050602081019050919050565b600067ffffffffffffffff82111561478957614788614b23565b5b61479282614b74565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006148658261497f565b91506148708361497f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148a5576148a4614a96565b5b828201905092915050565b60006148bb8261497f565b91506148c68361497f565b9250826148d6576148d5614ac5565b5b828204905092915050565b60006148ec8261497f565b91506148f78361497f565b92508282101561490a57614909614a96565b5b828203905092915050565b60006149208261495f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006149a182614989565b9050919050565b82818337600083830152505050565b60005b838110156149d55780820151818401526020810190506149ba565b838111156149e4576000848401525b50505050565b60006002820490506001821680614a0257607f821691505b60208210811415614a1657614a15614af4565b5b50919050565b614a2582614b74565b810181811067ffffffffffffffff82111715614a4457614a43614b23565b5b80604052505050565b6000614a588261497f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a8b57614a8a614a96565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614b715760046000803e614b6e600051614b85565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f61756374696f6e3a2077726f6e67206d616e6167657220636f6e747261637400600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600060443d1015614f3057614fb3565b614f386146af565b60043d036004823e80513d602482011167ffffffffffffffff82111715614f60575050614fb3565b808201805167ffffffffffffffff811115614f7e5750505050614fb3565b80602083010160043d038501811115614f9b575050505050614fb3565b614faa82602001850186614a1c565b82955050505050505b90565b614fbf81614915565b8114614fca57600080fd5b50565b614fd681614927565b8114614fe157600080fd5b50565b614fed81614933565b8114614ff857600080fd5b50565b6150048161497f565b811461500f57600080fd5b5056fea264697066735822122087253c1b82164baa67f776acca989c13317bd5be6d69f495f656e63a9a3bb3e564736f6c63430008030033