ETH Price: $3,302.46 (-3.17%)
Gas: 10 Gwei

Token

Adventurers Of Ether (KOE)
 

Overview

Max Total Supply

719 KOE

Holders

122

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 KOE
0x6945cc7275105016be7dc50a05d98da2d902ebd7
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AdventurersOfEther

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 20 : Adventurers721.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.11;

import "../interfaces/ITreasury.sol";
import "./adventurer/PublicSale.sol";
import "./adventurer/PreSale.sol";
import "./adventurer/Reveal.sol";
import "./adventurer/WhiteList.sol";

/**
 * @notice Adventurers Token
 */
contract AdventurersOfEther is PublicSale, WhiteList, PreSale, Reveal {
    ITreasury public treasury;

    constructor() {}

    function mintBatch(address[] memory _to, uint256[] memory _amount)
        external onlyOwner returns (uint oldIndex, uint newIndex)
    {
        return _mintBatch(_to, _amount);
    }

    function burn(uint256[] calldata _tokens) external onlyOwner {
        _burn(_tokens);
    }

    function setTreasury(ITreasury _value) external onlyOwner {
        treasury = _value;
    }

    /**
     * @notice poll payment to treasury
     */
    function transferToTreasury() external {
        require(address(treasury) != address(0), "zero treasury address");
        treasury.primarySale{value: address(this).balance}();
    }
}

File 2 of 20 : ITreasury.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.11;

import "hardhat/console.sol";

interface ITreasury {
    /**
     * @notice primary sale (invoked by nft contract on mint)
     */
    function primarySale() external payable;

    /**
     * @notice secondary sale (invoked by ERC-2981)
     */
    receive() external payable;
}

File 3 of 20 : PublicSale.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.11;

import "./ERC721.sol";

/**
 * @notice Public sale stage of Adventurers Token workflow
 */
abstract contract PublicSale is ERC721 {
    struct PublicSaleConfig {
        uint128 price;
        uint32 tokensPerTransaction;
    }

    PublicSaleConfig public publicSaleConfig = PublicSaleConfig({
        price: 0.145 ether,
        tokensPerTransaction: 0 // 10 + extra 1 for <
    });
    constructor() {}

    function mintPublic(uint _count) external payable returns (uint oldIndex, uint newIndex) {
        PublicSaleConfig memory _cfg = publicSaleConfig;
        require(_cfg.tokensPerTransaction > 0, "publicsale: disabled");
        require(msg.value == _cfg.price * _count, "publicsale: payment amount");
        require(_count < _cfg.tokensPerTransaction, "publicsale: invalid count");
        
        return _mint(msg.sender, _count);
    }

    function setPublicSaleConfig(uint128 _price, uint32 _tokensPerTransaction) external onlyOwner {
        if (_tokensPerTransaction > 0) {
            _tokensPerTransaction += 1;
        }
        publicSaleConfig = PublicSaleConfig({
            price: _price,
            tokensPerTransaction: _tokensPerTransaction
        });
    }
}

File 4 of 20 : PreSale.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.11;

import "./ERC721.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";

/**
 * @notice Presale (Crystal exchange) stage of Adventurers Token workflow
 */
abstract contract PreSale is ERC721 {
    using ERC165Checker for address;

    struct PresaleConfig {
        uint128 price;
        uint32 tokensPerCrystal;
    }

    /* state */
    address public crystal;
    PresaleConfig public presaleConfig = PresaleConfig({
        price: 0.095 ether,
        tokensPerCrystal: 4 // 3 + extra 1 for <
    });

    constructor() {}

    function mintCrystalHolders(uint _count, uint _id) external payable returns (uint oldIndex, uint newIndex) {
        require(crystal != address(0), "presale: disabled");
        PresaleConfig memory _cfg = presaleConfig;
        require(msg.value == _cfg.price * _count, "presale: invalid payment amount");
        require(_count > 0 && _count < _cfg.tokensPerCrystal, "presale: invalid count");
        IERC1155(crystal).safeTransferFrom(msg.sender, address(this), _id, 1, "");
        return _mint(msg.sender, _count);
    }
    
    function setPresaleConfig(uint128 _price, uint32 _tokensPerCrystal) external onlyOwner {
        presaleConfig = PresaleConfig({
            price: _price,
            tokensPerCrystal: _tokensPerCrystal + 1
        });
    }

    function setCrystal(address _value) external onlyOwner {
        require(_value == address(0) 
            || _value.supportsInterface(type(IERC1155).interfaceId),
            "presale: 0 or valid IERC1155");
        crystal = _value;
        if (_value != address(0)) {
            IERC1155(_value).setApprovalForAll(owner(), true); // we want to regift crystals
        }
    }
}

File 5 of 20 : Reveal.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.11;

import "./ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

/**
 * @notice EIP-721 reveal logic
 */
abstract contract Reveal is ERC721 {
    struct RevealGroup {
        uint64 startIndex;
        uint64 lastIndex;
    }
    /* state */
    uint[] private groupHashes;
    RevealGroup[] public revealGroups;
    string public unrevealedBaseUri = "";

    constructor() {}

    function revealHash(uint _tokenIndex) public view returns (uint) {
        for (uint _groupIndex = 0; _groupIndex < revealGroups.length; _groupIndex++) {
            RevealGroup memory _revealGroup = revealGroups[_groupIndex];
            if (_tokenIndex > _revealGroup.startIndex && _tokenIndex < _revealGroup.lastIndex) {
                return groupHashes[_groupIndex];
            }
        }
        return 0;
    }

    /**
     * @dev IERC721Metadata Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint _tokenId) external virtual override(IERC721Metadata) view returns (string memory) {
        require(exists(_tokenId), "erc721: nonexistent token");
        uint _groupHash = revealHash(_tokenId);
        if (_groupHash > 0) {
            return string(abi.encodePacked(
                _groupURI(_groupHash),
                Strings.toString(_tokenId),
                ".json"
            ));
        }
        return string(abi.encodePacked(
            unrevealedBaseUri,
            Strings.toString(_tokenId),
            ".json"
        ));
    }

    function _groupURI(uint _groupId) internal pure returns (string memory) {
        string memory _uri = "ipfs://f01701220";
        bytes32 value = bytes32(_groupId);
        bytes memory alphabet = "0123456789abcdef";
        bytes memory str = new bytes(64);
        for (uint i = 0; i < 32; i++) {
            bytes1 ix1 = value[i] >> 4;
            str[i*2] = alphabet[uint8(ix1)];
            bytes1 ix2 = value[i] & 0x0f;
            str[1+i*2] = alphabet[uint8(ix2)];
        }
        return string(abi.encodePacked(_uri, string(str), "/"));
    }

    function setRevealHash(uint _groupIndex, uint _revealHash) external onlyOwner {
        groupHashes[_groupIndex] = _revealHash;
    }

    function setUnrevealedBaseUri(string memory _unrevealedBaseUri) external onlyOwner {
        unrevealedBaseUri = _unrevealedBaseUri;
    }

    function reveal(uint16 _tokensCount, uint _revealHash) external onlyOwner {
        uint _groupIndex = revealGroups.length;
        RevealGroup memory _prev;
        if (_groupIndex > 0) {
            _prev = revealGroups[_groupIndex - 1];
        } else {
            _prev = RevealGroup({
                startIndex: 0,
                lastIndex: 1
            });
        }
        revealGroups.push(RevealGroup({
            startIndex: _prev.lastIndex - 1,
            lastIndex: _prev.lastIndex + _tokensCount
        }));
        groupHashes.push(_revealHash);
    }

    function undoReveal() external onlyOwner() {
        revealGroups.pop();
        groupHashes.pop();
    }
}

File 6 of 20 : WhiteList.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.11;

import "./ERC721.sol";
import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";

/**
 * @notice Whitelist stage of Adventurers Token workflow
 */
abstract contract WhiteList is ERC721, EIP712 {
    string public constant EIP712_VERSION = "1.0.0";

    /* state */
    address public signer;
    mapping(address /* minter */ => /* minted */ uint) public whitelistMinters;

    constructor() EIP712(NAME, EIP712_VERSION) {
        signer = msg.sender;
    }

    /* eip-712 */
    bytes32 private constant PASS_TYPEHASH = keccak256("MintPass(address wallet,uint256 count)");

    /* change eip-712 signer address, set 0 to disable WL */
    function setSigner(address _value) external onlyOwner {
        signer = _value;
    }

    function mintSelected(uint _count, uint _signatureCount, bytes memory _signature)
        external returns (uint from, uint to)
    {
        require(signer != address(0), "eip-712: whitelist mint disabled");

        bytes32 _digest = _hashTypedDataV4(
            keccak256(abi.encode(PASS_TYPEHASH, msg.sender, _signatureCount))
        );
        require(ECDSA.recover(_digest, _signature) == signer, "eip-712: invalid signature");
        uint _maxCount = _signatureCount + 1 - whitelistMinters[msg.sender];
        require(_count < _maxCount, "eip-712: invalid count");
        whitelistMinters[msg.sender] += _count;

        return _mint(msg.sender, _count);
    }
}

File 7 of 20 : 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(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", 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(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", 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(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

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

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

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

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", 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, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", 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, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", 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(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", 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, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", 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, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", 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, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

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

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

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

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", 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, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", 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, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", 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, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

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

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

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

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", 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, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", 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, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", 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(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", 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, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

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

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

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

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", 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, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

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

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

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

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", 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, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", 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, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

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

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

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

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", 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, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

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

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

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

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", 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, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", 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, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

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

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

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

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", 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, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

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

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

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

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", 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, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", 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));
	}

}

File 8 of 20 : ERC721.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.11;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/interfaces/IERC165.sol";

/**
 * @notice EIP-721 implementation of Adventurers Token
 */
abstract contract ERC721 is IERC721Enumerable, IERC721Metadata, Ownable {
    string public constant NAME = "Adventurers Of Ether";
    string public constant SYMBOL = "KOE";
    uint private constant MAX_SUPPLY = 6001; // +1 extra 1 for <

    /* state */
    uint256 public maxSupply = 3000;
    uint private minted; // count of minted tokens
    uint private burned;
    mapping(address /* minter */ => /* minted tokes count */ uint) public minters;

    address[MAX_SUPPLY] private owners;

    mapping(address /* owner */ => /* tokens count */ uint) private balances;
    mapping(uint /* token */ => /* operator */ address) private operatorApprovals;
    mapping(address /* owner */ => mapping(address /* operator */ => bool)) private forallApprovals;

    constructor() {}

    function setMaxSupply(uint256 _maxSupply) external onlyOwner {
        require(_maxSupply < MAX_SUPPLY, "max supply exceeded");
        maxSupply = _maxSupply;
    }

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() public view returns (uint256) {
        return minted - burned;
    }

    function _mint(address _to, uint256 _amount)
        internal returns (uint _oldIndex, uint _newIndex)
    {
        uint256 _minted = minted;
        require(_minted + _amount - 1 < maxSupply, "tokens are over");

        for (uint256 i = 0; i < _amount; i++){
            _minted++;
            owners[_minted] = _to;
            emit Transfer(address(0), _to, _minted);
        }

        minters[_to] += _amount;
        balances[_to] += _amount;
        minted = _minted;
        return (_minted - _amount, _minted);
    }

    function _mintBatch(address[] memory _to, uint[] memory _amounts)
        internal returns (uint _oldIndex, uint _newIndex)
    {
        require(_to.length == _amounts.length, "array lengths mismatch");
        uint256 _minted = minted;
        uint _total = 0;
        for (uint i = 0; i < _to.length; i++) {
            uint _amount = _amounts[i];
            address _addr = _to[i];

            _total += _amount;
            //minters[_addr] += _amount;
            balances[_addr] += _amount;
            for (uint256 j = 0; j < _amount; j++){
                _minted++;
                owners[_minted] = _addr;
                emit Transfer(address(0), _addr, _minted);
            }
        }

        require(_minted + _total < maxSupply, "tokens are over");
        minted = _minted;
        return (_minted - _total, _minted);
    }

    function _burn(uint256[] calldata _tokens) internal {
        uint _burned;
        for (uint i = 0; i < _tokens.length; i++) {
            uint _tokenId = _tokens[i];
            address _owner = owners[_tokenId];
            if (_owner != address(0)) {
                _burned ++;
                balances[_owner] -= 1;
                owners[_tokenId] = address(0);
                emit Transfer(_owner, address(0), _tokenId);
            }
        }
        burned += _burned;
    }

    function exists(uint256 _tokenId) public view returns (bool) {
        return ((minted + 1) > _tokenId) && (_tokenId > 0) && owners[_tokenId] != address(0);
    }
    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        uint _ix = 0;
        for (uint _tokenId = 1; _tokenId < minted; _tokenId += 1) {
            if (owners[_tokenId] == _owner) {
                if (_ix == _index) {
                    return _tokenId;
                } else {
                    _ix += 1;
                }
            }
        }
        return 0;
    }

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

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address _owner) public view returns (uint256 _balance) {
        _balance = balances[_owner];
    }

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 _tokenId) public view returns (address _owner) {
        require(exists(_tokenId), "erc-721: nonexistent token");
        _owner = owners[_tokenId];
    }

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

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

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public {
        _transfer(_from, _to, _tokenId, "");
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory
    ) internal {
        address _owner = ownerOf(_tokenId);
        require(msg.sender == _owner
            || getApproved(_tokenId) == msg.sender
            || isApprovedForAll(_owner, msg.sender),
            "erc-721: not owner nor approved");
        require(_owner == _from, "erc-721: not owner");
        require(_to != address(0), "zero address");
        operatorApprovals[_tokenId] = address(0);

        owners[_tokenId] = _to;
        balances[_from] -= 1;
        balances[_to] += 1;

        emit Transfer(_from, _to, _tokenId);
    }

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address _to, uint256 _tokenId) external {
        address _owner = ownerOf(_tokenId);
        require(exists(_tokenId), "erc-721: nonexistent token");
        require(_owner != _to, "erc-721: approve to caller");
        require(
            msg.sender == _owner || isApprovedForAll(_owner, msg.sender),
            "erc-721: not owner nor approved"
        );
        operatorApprovals[_tokenId] = _to;
        emit Approval(_owner, _to, _tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 _tokenId) public view returns (address _operator) {
        require(exists(_tokenId), "erc-721: nonexistent token");
        _operator = operatorApprovals[_tokenId];
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address _operator, bool _approved) external {
        require(msg.sender != _operator, "erc-721: approve to caller");
        forallApprovals[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

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

    /**
     * @dev IERC721Metadata Returns the token collection name.
     */
    function name() external pure returns (string memory) {
        return NAME;
    }

    /**
     * @dev IERC721Metadata Returns the token collection symbol.
     */
    function symbol() external pure returns (string memory) {
        return SYMBOL;
    }
}

File 9 of 20 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

File 10 of 20 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 11 of 20 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 12 of 20 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;

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

File 13 of 20 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 14 of 20 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 15 of 20 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 16 of 20 : ERC165Checker.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Library used to query support of an interface declared via {IERC165}.
 *
 * Note that these functions return the actual result of the query: they do not
 * `revert` if an interface is not supported. It is up to the caller to decide
 * what to do in these cases.
 */
library ERC165Checker {
    // As per the EIP-165 spec, no interface should ever match 0xffffffff
    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;

    /**
     * @dev Returns true if `account` supports the {IERC165} interface,
     */
    function supportsERC165(address account) internal view returns (bool) {
        // Any contract that implements ERC165 must explicitly indicate support of
        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
        return
            _supportsERC165Interface(account, type(IERC165).interfaceId) &&
            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);
    }

    /**
     * @dev Returns true if `account` supports the interface defined by
     * `interfaceId`. Support for {IERC165} itself is queried automatically.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
        // query support of both ERC165 as per the spec and support of _interfaceId
        return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);
    }

    /**
     * @dev Returns a boolean array where each value corresponds to the
     * interfaces passed in and whether they're supported or not. This allows
     * you to batch check interfaces for a contract where your expectation
     * is that some interfaces may not be supported.
     *
     * See {IERC165-supportsInterface}.
     *
     * _Available since v3.4._
     */
    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)
        internal
        view
        returns (bool[] memory)
    {
        // an array of booleans corresponding to interfaceIds and whether they're supported or not
        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);

        // query support of ERC165 itself
        if (supportsERC165(account)) {
            // query support of each interface in interfaceIds
            for (uint256 i = 0; i < interfaceIds.length; i++) {
                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);
            }
        }

        return interfaceIdsSupported;
    }

    /**
     * @dev Returns true if `account` supports all the interfaces defined in
     * `interfaceIds`. Support for {IERC165} itself is queried automatically.
     *
     * Batch-querying can lead to gas savings by skipping repeated checks for
     * {IERC165} support.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
        // query support of ERC165 itself
        if (!supportsERC165(account)) {
            return false;
        }

        // query support of each interface in _interfaceIds
        for (uint256 i = 0; i < interfaceIds.length; i++) {
            if (!_supportsERC165Interface(account, interfaceIds[i])) {
                return false;
            }
        }

        // all interfaces supported
        return true;
    }

    /**
     * @notice Query if a contract implements an interface, does not check ERC165 support
     * @param account The address of the contract to query for support of an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @return true if the contract at account indicates support of the interface with
     * identifier interfaceId, false otherwise
     * @dev Assumes that account contains a contract that supports ERC165, otherwise
     * the behavior of this method is undefined. This precondition can be checked
     * with {supportsERC165}.
     * Interface identification is specified in ERC-165.
     */
    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {
        bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);
        (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);
        if (result.length < 32) return false;
        return success && abi.decode(result, (bool));
    }
}

File 17 of 20 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.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 IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

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

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

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

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

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

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

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

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

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

File 18 of 20 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 19 of 20 : draft-EIP712.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;

import "./ECDSA.sol";

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

File 20 of 20 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EIP712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"_balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokens","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crystal","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"_operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"mintBatch","outputs":[{"internalType":"uint256","name":"oldIndex","type":"uint256"},{"internalType":"uint256","name":"newIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"mintCrystalHolders","outputs":[{"internalType":"uint256","name":"oldIndex","type":"uint256"},{"internalType":"uint256","name":"newIndex","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintPublic","outputs":[{"internalType":"uint256","name":"oldIndex","type":"uint256"},{"internalType":"uint256","name":"newIndex","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_signatureCount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mintSelected","outputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleConfig","outputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint32","name":"tokensPerCrystal","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleConfig","outputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint32","name":"tokensPerTransaction","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_tokensCount","type":"uint16"},{"internalType":"uint256","name":"_revealHash","type":"uint256"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"revealGroups","outputs":[{"internalType":"uint64","name":"startIndex","type":"uint64"},{"internalType":"uint64","name":"lastIndex","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenIndex","type":"uint256"}],"name":"revealHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_value","type":"address"}],"name":"setCrystal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_price","type":"uint128"},{"internalType":"uint32","name":"_tokensPerCrystal","type":"uint32"}],"name":"setPresaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_price","type":"uint128"},{"internalType":"uint32","name":"_tokensPerTransaction","type":"uint32"}],"name":"setPublicSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_groupIndex","type":"uint256"},{"internalType":"uint256","name":"_revealHash","type":"uint256"}],"name":"setRevealHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_value","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITreasury","name":"_value","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_unrevealedBaseUri","type":"string"}],"name":"setUnrevealedBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"contract ITreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"undoReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedBaseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

610bb860015567020324bb546e8000610140819052600061016081905261177980546001600160a01b0319908116909317905567015181ff25a980006101805260046101a05261177d805490921670040000000000000000015181ff25a98000179091556101e060408190526101c082905262000081916117809190620001fd565b503480156200008f57600080fd5b506040518060400160405280601481526020017f416476656e747572657273204f66204574686572000000000000000000000000815250604051806040016040528060058152602001640312e302e360dc1b815250620000fe620000f8620001a960201b60201c565b620001ad565b815160208084019190912082518383012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c00190528051940193909320919290916080523060c05261012052505061177a80546001600160a01b0319163317905550620002e09050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200020b90620002a3565b90600052602060002090601f0160209004810192826200022f57600085556200027a565b82601f106200024a57805160ff19168380011785556200027a565b828001600101855582156200027a579182015b828111156200027a5782518255916020019190600101906200025d565b50620002889291506200028c565b5090565b5b808211156200028857600081556001016200028d565b600181811c90821680620002b857607f821691505b60208210811415620002da57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051613c18620003306000396000612ce401526000612d3301526000612d0e01526000612c6701526000612c9101526000612cbb0152613c186000f3fe6080604052600436106103295760003560e01c80638da5cb5b116101a5578063d408234b116100ec578063eccec5a811610095578063f2fde38b1161006f578063f2fde38b146109f5578063f46eccc414610a15578063f76f8d7814610a42578063fd88fa6914610a7157600080fd5b8063eccec5a814610979578063efd0cbf9146109c2578063f0f44260146109d557600080fd5b8063db398744116100c6578063db398744146108fa578063e985e9c51461091a578063eab628421461096457600080fd5b8063d408234b146108af578063d5abeb01146108c4578063d6e5f5b8146108da57600080fd5b8063a3fd2c441161014e578063b88d4fde11610128578063b88d4fde1461084f578063c2eaa5391461086f578063c87b56dd1461088f57600080fd5b8063a3fd2c44146107c8578063aa767a8c1461081c578063b80f55c91461082f57600080fd5b8063971a90911161017f578063971a90911461073e578063a22cb4651461075f578063a3f4df7e1461077f57600080fd5b80638da5cb5b146106d457806393055614146106f257806395d89b411461071257600080fd5b806342842e0e116102745780636c19e7831161021d57806370a08231116101f757806370a0823114610633578063715018a61461066a5780637c88e3d91461067f5780637d5dea17146106b457600080fd5b80636c19e783146105de5780636f8b44b0146105fe5780636ff861621461061e57600080fd5b80634f6ccce71161024e5780634f6ccce71461057f57806361d027b31461059d5780636352211e146105be57600080fd5b806342842e0e146104f15780634aa23021146105315780634f558e791461055f57600080fd5b806318160ddd116102d6578063238ac933116102b0578063238ac933146104d057806323b872dd146104f15780632f745c591461051157600080fd5b806318160ddd1461047b578063199d0819146104905780631eb92fed146104b057600080fd5b806306fdde031161030757806306fdde03146103d2578063081812fc14610421578063095ea7b31461045957600080fd5b806301ffc9a71461032e57806304b1b2c21461036357806306c2e4e4146103a4575b600080fd5b34801561033a57600080fd5b5061034e6103493660046132a4565b610aa1565b60405190151581526020015b60405180910390f35b34801561036f57600080fd5b5061038361037e3660046132ce565b610b59565b6040805167ffffffffffffffff93841681529290911660208301520161035a565b3480156103b057600080fd5b506103c46103bf3660046132ce565b610b95565b60405190815260200161035a565b3480156103de57600080fd5b5060408051808201909152601481527f416476656e747572657273204f6620457468657200000000000000000000000060208201525b60405161035a9190613313565b34801561042d57600080fd5b5061044161043c3660046132ce565b610c5c565b6040516001600160a01b03909116815260200161035a565b34801561046557600080fd5b5061047961047436600461335b565b610cd5565b005b34801561048757600080fd5b506103c4610e7d565b34801561049c57600080fd5b506104796104ab366004613387565b610e94565b3480156104bc57600080fd5b506104796104cb3660046133a9565b610f01565b3480156104dc57600080fd5b5061177a54610441906001600160a01b031681565b3480156104fd57600080fd5b5061047961050c3660046133f7565b610faf565b34801561051d57600080fd5b506103c461052c36600461335b565b610fcf565b34801561053d57600080fd5b506103c461054c366004613438565b61177b6020526000908152604090205481565b34801561056b57600080fd5b5061034e61057a3660046132ce565b61104a565b34801561058b57600080fd5b506103c461059a3660046132ce565b90565b3480156105a957600080fd5b5061178154610441906001600160a01b031681565b3480156105ca57600080fd5b506104416105d93660046132ce565b611099565b3480156105ea57600080fd5b506104796105f9366004613438565b611115565b34801561060a57600080fd5b506104796106193660046132ce565b611180565b34801561062a57600080fd5b5061047961121e565b34801561063f57600080fd5b506103c461064e366004613438565b6001600160a01b03166000908152611776602052604090205490565b34801561067657600080fd5b506104796112e3565b34801561068b57600080fd5b5061069f61069a36600461352b565b611337565b6040805192835260208301919091520161035a565b3480156106c057600080fd5b5061069f6106cf366004613665565b611398565b3480156106e057600080fd5b506000546001600160a01b0316610441565b3480156106fe57600080fd5b5061047961070d366004613438565b611579565b34801561071e57600080fd5b506040805180820190915260038152624b4f4560e81b6020820152610414565b34801561074a57600080fd5b5061177c54610441906001600160a01b031681565b34801561076b57600080fd5b5061047961077a3660046136c3565b6116e1565b34801561078b57600080fd5b506104146040518060400160405280601481526020017f416476656e747572657273204f6620457468657200000000000000000000000081525081565b3480156107d457600080fd5b50611779546107f8906001600160801b03811690600160801b900463ffffffff1682565b604080516001600160801b03909316835263ffffffff90911660208301520161035a565b61069f61082a366004613387565b6117a7565b34801561083b57600080fd5b5061047961084a3660046136f1565b6119a0565b34801561085b57600080fd5b5061047961086a366004613766565b6119f6565b34801561087b57600080fd5b5061047961088a3660046137d2565b611a08565b34801561089b57600080fd5b506104146108aa3660046132ce565b611bbd565b3480156108bb57600080fd5b50610479611c7e565b3480156108d057600080fd5b506103c460015481565b3480156108e657600080fd5b506104796108f53660046137f7565b611d2d565b34801561090657600080fd5b506104796109153660046133a9565b611d89565b34801561092657600080fd5b5061034e610935366004613840565b6001600160a01b0391821660009081526117786020908152604080832093909416825291909152205460ff1690565b34801561097057600080fd5b50610414611e3b565b34801561098557600080fd5b506104146040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b61069f6109d03660046132ce565b611eca565b3480156109e157600080fd5b506104796109f0366004613438565b61201a565b348015610a0157600080fd5b50610479610a10366004613438565b612085565b348015610a2157600080fd5b506103c4610a30366004613438565b60046020526000908152604090205481565b348015610a4e57600080fd5b50610414604051806040016040528060038152602001624b4f4560e81b81525081565b348015610a7d57600080fd5b5061177d546107f8906001600160801b03811690600160801b900463ffffffff1682565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b0457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b3857506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610b5357506001600160e01b031982166301ffc9a760e01b145b92915050565b61177f8181548110610b6a57600080fd5b60009182526020909120015467ffffffffffffffff8082169250680100000000000000009091041682565b6000805b61177f54811015610c5357600061177f8281548110610bba57610bba61386e565b60009182526020918290206040805180820190915291015467ffffffffffffffff808216808452680100000000000000009092041692820192909252915084118015610c135750806020015167ffffffffffffffff1684105b15610c405761177e8281548110610c2c57610c2c61386e565b906000526020600020015492505050919050565b5080610c4b8161389a565b915050610b99565b50600092915050565b6000610c678261104a565b610cb85760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e00000000000060448201526064015b60405180910390fd5b50600090815261177760205260409020546001600160a01b031690565b6000610ce082611099565b9050610ceb8261104a565b610d375760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e0000000000006044820152606401610caf565b826001600160a01b0316816001600160a01b03161415610d995760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a20617070726f766520746f2063616c6c65720000000000006044820152606401610caf565b336001600160a01b0382161480610dd457506001600160a01b03811660009081526117786020908152604080832033845290915290205460ff165b610e205760405162461bcd60e51b815260206004820152601f60248201527f6572632d3732313a206e6f74206f776e6572206e6f7220617070726f766564006044820152606401610caf565b6000828152611777602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000600354600254610e8f91906138b5565b905090565b6000546001600160a01b03163314610edc5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b8061177e8381548110610ef157610ef161386e565b6000918252602090912001555050565b6000546001600160a01b03163314610f495760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b63ffffffff811615610f6357610f606001826138cc565b90505b604080518082019091526001600160801b0390921680835263ffffffff90911660209092018290526117798054600160801b9093026001600160a01b0319909316909117919091179055565b610fca83838360405180602001604052806000815250612152565b505050565b60008060015b60025481101561103f57846001600160a01b03166005826117718110610ffd57610ffd61386e565b01546001600160a01b0316141561102d578382141561101f579150610b539050565b61102a6001836138f4565b91505b6110386001826138f4565b9050610fd5565b506000949350505050565b600081600254600161105c91906138f4565b1180156110695750600082115b8015610b535750600060058361177181106110865761108661386e565b01546001600160a01b0316141592915050565b60006110a48261104a565b6110f05760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e0000000000006044820152606401610caf565b60058261177181106111045761110461386e565b01546001600160a01b031692915050565b6000546001600160a01b0316331461115d5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111c85760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177181106112195760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610caf565b600155565b611781546001600160a01b03166112775760405162461bcd60e51b815260206004820152601560248201527f7a65726f207472656173757279206164647265737300000000000000000000006044820152606401610caf565b61178160009054906101000a90046001600160a01b03166001600160a01b031663a639ad79476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156112c857600080fd5b505af11580156112dc573d6000803e3d6000fd5b5050505050565b6000546001600160a01b0316331461132b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b611335600061239d565b565b6000805481906001600160a01b031633146113825760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61138c84846123ed565b915091505b9250929050565b61177a5460009081906001600160a01b03166113f65760405162461bcd60e51b815260206004820181905260248201527f6569702d3731323a2077686974656c697374206d696e742064697361626c65646044820152606401610caf565b604080517f64a830c71be714ed4ca944cf759cc2c89f283e211e10da9c9b9142b13722422b602082015233918101919091526060810185905260009061145490608001604051602081830303815290604052805190602001206125e3565b61177a549091506001600160a01b031661146e828661264c565b6001600160a01b0316146114c45760405162461bcd60e51b815260206004820152601a60248201527f6569702d3731323a20696e76616c6964207369676e61747572650000000000006044820152606401610caf565b33600090815261177b60205260408120546114e08760016138f4565b6114ea91906138b5565b905080871061153b5760405162461bcd60e51b815260206004820152601660248201527f6569702d3731323a20696e76616c696420636f756e74000000000000000000006044820152606401610caf565b33600090815261177b60205260408120805489929061155b9084906138f4565b9091555061156b90503388612670565b935093505050935093915050565b6000546001600160a01b031633146115c15760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6001600160a01b038116158061160557506116056001600160a01b0382167fd9b67a26000000000000000000000000000000000000000000000000000000006127e1565b6116515760405162461bcd60e51b815260206004820152601c60248201527f70726573616c653a2030206f722076616c6964204945524331313535000000006044820152606401610caf565b61177c80546001600160a01b0319166001600160a01b038316908117909155156116de57806001600160a01b031663a22cb4656116966000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b1580156112c857600080fd5b50565b336001600160a01b038316141561173a5760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a20617070726f766520746f2063616c6c65720000000000006044820152606401610caf565b336000818152611778602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61177c5460009081906001600160a01b03166118055760405162461bcd60e51b815260206004820152601160248201527f70726573616c653a2064697361626c65640000000000000000000000000000006044820152606401610caf565b6040805180820190915261177d546001600160801b038116808352600160801b90910463ffffffff16602083015261183e90869061390c565b341461188c5760405162461bcd60e51b815260206004820152601f60248201527f70726573616c653a20696e76616c6964207061796d656e7420616d6f756e74006044820152606401610caf565b6000851180156118a55750806020015163ffffffff1685105b6118f15760405162461bcd60e51b815260206004820152601660248201527f70726573616c653a20696e76616c696420636f756e74000000000000000000006044820152606401610caf565b61177c546040517ff242432a000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526001606482015260a06084820152600060a48201526001600160a01b039091169063f242432a9060c401600060405180830381600087803b15801561197257600080fd5b505af1158015611986573d6000803e3d6000fd5b505050506119943386612670565b92509250509250929050565b6000546001600160a01b031633146119e85760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6119f28282612804565b5050565b611a0284848484612152565b50505050565b6000546001600160a01b03163314611a505760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177f5460408051808201909152600080825260208201528115611ace5761177f611a7c6001846138b5565b81548110611a8c57611a8c61386e565b60009182526020918290206040805180820190915291015467ffffffffffffffff80821683526801000000000000000090910416918101919091529050611ae5565b506040805180820190915260008152600160208201525b61177f604051806040016040528060018460200151611b04919061392b565b67ffffffffffffffff1681526020018661ffff168460200151611b279190613954565b67ffffffffffffffff908116909152825460018181018555600094855260208086208551930180549190950151841668010000000000000000026fffffffffffffffffffffffffffffffff1990911692909316919091179190911790915561177e805491820181559091527f7fe79683751d9389eb55419939a813586ee3a6ec5f91165868f6441cbaaf9b1c0192909255505050565b6060611bc88261104a565b611c145760405162461bcd60e51b815260206004820152601960248201527f6572633732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610caf565b6000611c1f83610b95565b90508015611c6157611c3081612929565b611c3984612b38565b604051602001611c4a929190613993565b604051602081830303815290604052915050919050565b611780611c6d84612b38565b604051602001611c4a929190613a0d565b6000546001600160a01b03163314611cc65760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177f805480611cd857611cd8613ac8565b600082815260209020810160001990810180546fffffffffffffffffffffffffffffffff1916905501905561177e805480611d1557611d15613ac8565b60019003818190600052602060002001600090559055565b6000546001600160a01b03163314611d755760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b80516119f29061178090602084019061320b565b6000546001600160a01b03163314611dd15760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6040518060400160405280836001600160801b03168152602001826001611df891906138cc565b63ffffffff908116909152815161177d8054602090940151909216600160801b026001600160a01b03199093166001600160801b03909116179190911790555050565b6117808054611e49906139d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e75906139d2565b8015611ec25780601f10611e9757610100808354040283529160200191611ec2565b820191906000526020600020905b815481529060010190602001808311611ea557829003601f168201915b505050505081565b60408051808201909152611779546001600160801b0381168252600160801b900463ffffffff16602082018190526000918291611f495760405162461bcd60e51b815260206004820152601460248201527f7075626c696373616c653a2064697361626c65640000000000000000000000006044820152606401610caf565b8051611f5f9085906001600160801b031661390c565b3414611fad5760405162461bcd60e51b815260206004820152601a60248201527f7075626c696373616c653a207061796d656e7420616d6f756e740000000000006044820152606401610caf565b806020015163ffffffff1684106120065760405162461bcd60e51b815260206004820152601960248201527f7075626c696373616c653a20696e76616c696420636f756e74000000000000006044820152606401610caf565b6120103385612670565b9250925050915091565b6000546001600160a01b031633146120625760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61178180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120cd5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6001600160a01b0381166121495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610caf565b6116de8161239d565b600061215d83611099565b9050336001600160a01b038216148061218657503361217b84610c5c565b6001600160a01b0316145b806121b557506001600160a01b03811660009081526117786020908152604080832033845290915290205460ff165b6122015760405162461bcd60e51b815260206004820152601f60248201527f6572632d3732313a206e6f74206f776e6572206e6f7220617070726f766564006044820152606401610caf565b846001600160a01b0316816001600160a01b0316146122625760405162461bcd60e51b815260206004820152601260248201527f6572632d3732313a206e6f74206f776e657200000000000000000000000000006044820152606401610caf565b6001600160a01b0384166122b85760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610caf565b60008381526117776020526040902080546001600160a01b03191690558360058461177181106122ea576122ea61386e565b0180546001600160a01b0319166001600160a01b0392831617905585166000908152611776602052604081208054600192906123279084906138b5565b90915550506001600160a01b0384166000908152611776602052604081208054600192906123569084906138f4565b909155505060405183906001600160a01b0380871691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008082518451146124415760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e67746873206d69736d61746368000000000000000000006044820152606401610caf565b6002546000805b865181101561256d5760008682815181106124655761246561386e565b6020026020010151905060008883815181106124835761248361386e565b60200260200101519050818461249991906138f4565b6001600160a01b038216600090815261177660205260408120805492965084929091906124c79084906138f4565b90915550600090505b8281101561255757856124e28161389a565b9650508160058761177181106124fa576124fa61386e565b0180546001600160a01b0319166001600160a01b0392831617905560405187918416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061254f8161389a565b9150506124d0565b50505080806125659061389a565b915050612448565b5060015461257b82846138f4565b106125c85760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e7320617265206f76657200000000000000000000000000000000006044820152606401610caf565b60028290556125d781836138b5565b96919550909350505050565b6000610b536125f0612c5a565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061265b8585612d81565b9150915061266881612dee565b509392505050565b600080600060025490506001546001858361268b91906138f4565b61269591906138b5565b106126e25760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e7320617265206f76657200000000000000000000000000000000006044820152606401610caf565b60005b8481101561276c57816126f78161389a565b92505085600583611771811061270f5761270f61386e565b0180546001600160a01b0319166001600160a01b0392831617905560405183918816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4806127648161389a565b9150506126e5565b506001600160a01b038516600090815260046020526040812080548692906127959084906138f4565b90915550506001600160a01b03851660009081526117766020526040812080548692906127c39084906138f4565b909155505060028190556127d784826138b5565b9590945092505050565b60006127ec83612fa9565b80156127fd57506127fd8383612fdc565b9392505050565b6000805b8281101561290c5760008484838181106128245761282461386e565b905060200201359050600060058261177181106128435761284361386e565b01546001600160a01b0316905080156128f757836128608161389a565b6001600160a01b0383166000908152611776602052604081208054929750600193509161288e9084906138b5565b909155506000905060058361177181106128aa576128aa61386e565b0180546001600160a01b0319166001600160a01b039283161790556040518391600091908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45b505080806129049061389a565b915050612808565b50806003600082825461291f91906138f4565b9091555050505050565b60408051808201825260108082527f697066733a2f2f66303137303132323000000000000000000000000000000000602080840191909152835180850185529182527f3031323334353637383961626364656600000000000000000000000000000000908201528251838152606081810185529385929160009160208201818036833701905050905060005b6020811015612b0a57600060048583602081106129d4576129d461386e565b1a60f81b6001600160f81b031916901c9050838160f81c60ff16815181106129fe576129fe61386e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683612a3184600261390c565b81518110612a4157612a4161386e565b60200101906001600160f81b031916908160001a9053506000858360208110612a6c57612a6c61386e565b1a60f81b600f60f81b169050848160f81c60ff1681518110612a9057612a9061386e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001684612ac385600261390c565b612ace9060016138f4565b81518110612ade57612ade61386e565b60200101906001600160f81b031916908160001a90535050508080612b029061389a565b9150506129b5565b508381604051602001612b1e929190613ade565b604051602081830303815290604052945050505050919050565b606081612b7857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612ba25780612b8c8161389a565b9150612b9b9050600a83613b4b565b9150612b7c565b60008167ffffffffffffffff811115612bbd57612bbd613455565b6040519080825280601f01601f191660200182016040528015612be7576020820181803683370190505b5090505b8415612c5257612bfc6001836138b5565b9150612c09600a86613b5f565b612c149060306138f4565b60f81b818381518110612c2957612c2961386e565b60200101906001600160f81b031916908160001a905350612c4b600a86613b4b565b9450612beb565b949350505050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015612cb357507f000000000000000000000000000000000000000000000000000000000000000046145b15612cdd57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600080825160411415612db85760208301516040840151606085015160001a612dac878285856130da565b94509450505050611391565b825160401415612de25760208301516040840151612dd78683836131c7565b935093505050611391565b50600090506002611391565b6000816004811115612e0257612e02613b73565b1415612e0b5750565b6001816004811115612e1f57612e1f613b73565b1415612e6d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610caf565b6002816004811115612e8157612e81613b73565b1415612ecf5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610caf565b6003816004811115612ee357612ee3613b73565b1415612f3c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610caf565b6004816004811115612f5057612f50613b73565b14156116de5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610caf565b6000612fbc826301ffc9a760e01b612fdc565b8015610b535750612fd5826001600160e01b0319612fdc565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b179052905160009190829081906001600160a01b0387169061753090613058908690613b89565b6000604051808303818686fa925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506020815110156130b45760009350505050610b53565b8180156130d05750808060200190518101906130d09190613ba5565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561311157506000905060036131be565b8460ff16601b1415801561312957508460ff16601c14155b1561313a57506000905060046131be565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561318e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131b7576000600192509250506131be565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816131fd60ff86901c601b6138f4565b905061156b878288856130da565b828054613217906139d2565b90600052602060002090601f016020900481019282613239576000855561327f565b82601f1061325257805160ff191683800117855561327f565b8280016001018555821561327f579182015b8281111561327f578251825591602001919060010190613264565b5061328b92915061328f565b5090565b5b8082111561328b5760008155600101613290565b6000602082840312156132b657600080fd5b81356001600160e01b0319811681146127fd57600080fd5b6000602082840312156132e057600080fd5b5035919050565b60005b838110156133025781810151838201526020016132ea565b83811115611a025750506000910152565b60208152600082518060208401526133328160408501602087016132e7565b601f01601f19169190910160400192915050565b6001600160a01b03811681146116de57600080fd5b6000806040838503121561336e57600080fd5b823561337981613346565b946020939093013593505050565b6000806040838503121561339a57600080fd5b50508035926020909101359150565b600080604083850312156133bc57600080fd5b82356001600160801b03811681146133d357600080fd5b9150602083013563ffffffff811681146133ec57600080fd5b809150509250929050565b60008060006060848603121561340c57600080fd5b833561341781613346565b9250602084013561342781613346565b929592945050506040919091013590565b60006020828403121561344a57600080fd5b81356127fd81613346565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561349457613494613455565b604052919050565b600067ffffffffffffffff8211156134b6576134b6613455565b5060051b60200190565b600082601f8301126134d157600080fd5b813560206134e66134e18361349c565b61346b565b82815260059290921b8401810191818101908684111561350557600080fd5b8286015b848110156135205780358352918301918301613509565b509695505050505050565b6000806040838503121561353e57600080fd5b823567ffffffffffffffff8082111561355657600080fd5b818501915085601f83011261356a57600080fd5b8135602061357a6134e18361349c565b82815260059290921b8401810191818101908984111561359957600080fd5b948201945b838610156135c05785356135b181613346565b8252948201949082019061359e565b965050860135925050808211156135d657600080fd5b506135e3858286016134c0565b9150509250929050565b600067ffffffffffffffff83111561360757613607613455565b61361a601f8401601f191660200161346b565b905082815283838301111561362e57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261365657600080fd5b6127fd838335602085016135ed565b60008060006060848603121561367a57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561369f57600080fd5b6136ab86828701613645565b9150509250925092565b80151581146116de57600080fd5b600080604083850312156136d657600080fd5b82356136e181613346565b915060208301356133ec816136b5565b6000806020838503121561370457600080fd5b823567ffffffffffffffff8082111561371c57600080fd5b818501915085601f83011261373057600080fd5b81358181111561373f57600080fd5b8660208260051b850101111561375457600080fd5b60209290920196919550909350505050565b6000806000806080858703121561377c57600080fd5b843561378781613346565b9350602085013561379781613346565b925060408501359150606085013567ffffffffffffffff8111156137ba57600080fd5b6137c687828801613645565b91505092959194509250565b600080604083850312156137e557600080fd5b823561ffff8116811461337957600080fd5b60006020828403121561380957600080fd5b813567ffffffffffffffff81111561382057600080fd5b8201601f8101841361383157600080fd5b612c52848235602084016135ed565b6000806040838503121561385357600080fd5b823561385e81613346565b915060208301356133ec81613346565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156138ae576138ae613884565b5060010190565b6000828210156138c7576138c7613884565b500390565b600063ffffffff8083168185168083038211156138eb576138eb613884565b01949350505050565b6000821982111561390757613907613884565b500190565b600081600019048311821515161561392657613926613884565b500290565b600067ffffffffffffffff8381169083168181101561394c5761394c613884565b039392505050565b600067ffffffffffffffff8083168185168083038211156138eb576138eb613884565b600081516139898185602086016132e7565b9290920192915050565b600083516139a58184602088016132e7565b8351908301906139b98183602088016132e7565b64173539b7b760d91b9101908152600501949350505050565b600181811c908216806139e657607f821691505b60208210811415613a0757634e487b7160e01b600052602260045260246000fd5b50919050565b600080845481600182811c915080831680613a2957607f831692505b6020808410821415613a4957634e487b7160e01b86526022600452602486fd5b818015613a5d5760018114613a6e57613a9b565b60ff19861689528489019650613a9b565b60008b81526020902060005b86811015613a935781548b820152908501908301613a7a565b505084890196505b505050505050613abf613aae8286613977565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052603160045260246000fd5b60008351613af08184602088016132e7565b835190830190613b048183602088016132e7565b7f2f000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613b5a57613b5a613b35565b500490565b600082613b6e57613b6e613b35565b500690565b634e487b7160e01b600052602160045260246000fd5b60008251613b9b8184602087016132e7565b9190910192915050565b600060208284031215613bb757600080fd5b81516127fd816136b556fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122030b5c2c5291e057fb89b67a2441651a65d1f8770a0eccbfdd6ec87d0c2a5c15664736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106103295760003560e01c80638da5cb5b116101a5578063d408234b116100ec578063eccec5a811610095578063f2fde38b1161006f578063f2fde38b146109f5578063f46eccc414610a15578063f76f8d7814610a42578063fd88fa6914610a7157600080fd5b8063eccec5a814610979578063efd0cbf9146109c2578063f0f44260146109d557600080fd5b8063db398744116100c6578063db398744146108fa578063e985e9c51461091a578063eab628421461096457600080fd5b8063d408234b146108af578063d5abeb01146108c4578063d6e5f5b8146108da57600080fd5b8063a3fd2c441161014e578063b88d4fde11610128578063b88d4fde1461084f578063c2eaa5391461086f578063c87b56dd1461088f57600080fd5b8063a3fd2c44146107c8578063aa767a8c1461081c578063b80f55c91461082f57600080fd5b8063971a90911161017f578063971a90911461073e578063a22cb4651461075f578063a3f4df7e1461077f57600080fd5b80638da5cb5b146106d457806393055614146106f257806395d89b411461071257600080fd5b806342842e0e116102745780636c19e7831161021d57806370a08231116101f757806370a0823114610633578063715018a61461066a5780637c88e3d91461067f5780637d5dea17146106b457600080fd5b80636c19e783146105de5780636f8b44b0146105fe5780636ff861621461061e57600080fd5b80634f6ccce71161024e5780634f6ccce71461057f57806361d027b31461059d5780636352211e146105be57600080fd5b806342842e0e146104f15780634aa23021146105315780634f558e791461055f57600080fd5b806318160ddd116102d6578063238ac933116102b0578063238ac933146104d057806323b872dd146104f15780632f745c591461051157600080fd5b806318160ddd1461047b578063199d0819146104905780631eb92fed146104b057600080fd5b806306fdde031161030757806306fdde03146103d2578063081812fc14610421578063095ea7b31461045957600080fd5b806301ffc9a71461032e57806304b1b2c21461036357806306c2e4e4146103a4575b600080fd5b34801561033a57600080fd5b5061034e6103493660046132a4565b610aa1565b60405190151581526020015b60405180910390f35b34801561036f57600080fd5b5061038361037e3660046132ce565b610b59565b6040805167ffffffffffffffff93841681529290911660208301520161035a565b3480156103b057600080fd5b506103c46103bf3660046132ce565b610b95565b60405190815260200161035a565b3480156103de57600080fd5b5060408051808201909152601481527f416476656e747572657273204f6620457468657200000000000000000000000060208201525b60405161035a9190613313565b34801561042d57600080fd5b5061044161043c3660046132ce565b610c5c565b6040516001600160a01b03909116815260200161035a565b34801561046557600080fd5b5061047961047436600461335b565b610cd5565b005b34801561048757600080fd5b506103c4610e7d565b34801561049c57600080fd5b506104796104ab366004613387565b610e94565b3480156104bc57600080fd5b506104796104cb3660046133a9565b610f01565b3480156104dc57600080fd5b5061177a54610441906001600160a01b031681565b3480156104fd57600080fd5b5061047961050c3660046133f7565b610faf565b34801561051d57600080fd5b506103c461052c36600461335b565b610fcf565b34801561053d57600080fd5b506103c461054c366004613438565b61177b6020526000908152604090205481565b34801561056b57600080fd5b5061034e61057a3660046132ce565b61104a565b34801561058b57600080fd5b506103c461059a3660046132ce565b90565b3480156105a957600080fd5b5061178154610441906001600160a01b031681565b3480156105ca57600080fd5b506104416105d93660046132ce565b611099565b3480156105ea57600080fd5b506104796105f9366004613438565b611115565b34801561060a57600080fd5b506104796106193660046132ce565b611180565b34801561062a57600080fd5b5061047961121e565b34801561063f57600080fd5b506103c461064e366004613438565b6001600160a01b03166000908152611776602052604090205490565b34801561067657600080fd5b506104796112e3565b34801561068b57600080fd5b5061069f61069a36600461352b565b611337565b6040805192835260208301919091520161035a565b3480156106c057600080fd5b5061069f6106cf366004613665565b611398565b3480156106e057600080fd5b506000546001600160a01b0316610441565b3480156106fe57600080fd5b5061047961070d366004613438565b611579565b34801561071e57600080fd5b506040805180820190915260038152624b4f4560e81b6020820152610414565b34801561074a57600080fd5b5061177c54610441906001600160a01b031681565b34801561076b57600080fd5b5061047961077a3660046136c3565b6116e1565b34801561078b57600080fd5b506104146040518060400160405280601481526020017f416476656e747572657273204f6620457468657200000000000000000000000081525081565b3480156107d457600080fd5b50611779546107f8906001600160801b03811690600160801b900463ffffffff1682565b604080516001600160801b03909316835263ffffffff90911660208301520161035a565b61069f61082a366004613387565b6117a7565b34801561083b57600080fd5b5061047961084a3660046136f1565b6119a0565b34801561085b57600080fd5b5061047961086a366004613766565b6119f6565b34801561087b57600080fd5b5061047961088a3660046137d2565b611a08565b34801561089b57600080fd5b506104146108aa3660046132ce565b611bbd565b3480156108bb57600080fd5b50610479611c7e565b3480156108d057600080fd5b506103c460015481565b3480156108e657600080fd5b506104796108f53660046137f7565b611d2d565b34801561090657600080fd5b506104796109153660046133a9565b611d89565b34801561092657600080fd5b5061034e610935366004613840565b6001600160a01b0391821660009081526117786020908152604080832093909416825291909152205460ff1690565b34801561097057600080fd5b50610414611e3b565b34801561098557600080fd5b506104146040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b61069f6109d03660046132ce565b611eca565b3480156109e157600080fd5b506104796109f0366004613438565b61201a565b348015610a0157600080fd5b50610479610a10366004613438565b612085565b348015610a2157600080fd5b506103c4610a30366004613438565b60046020526000908152604090205481565b348015610a4e57600080fd5b50610414604051806040016040528060038152602001624b4f4560e81b81525081565b348015610a7d57600080fd5b5061177d546107f8906001600160801b03811690600160801b900463ffffffff1682565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b0457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b3857506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610b5357506001600160e01b031982166301ffc9a760e01b145b92915050565b61177f8181548110610b6a57600080fd5b60009182526020909120015467ffffffffffffffff8082169250680100000000000000009091041682565b6000805b61177f54811015610c5357600061177f8281548110610bba57610bba61386e565b60009182526020918290206040805180820190915291015467ffffffffffffffff808216808452680100000000000000009092041692820192909252915084118015610c135750806020015167ffffffffffffffff1684105b15610c405761177e8281548110610c2c57610c2c61386e565b906000526020600020015492505050919050565b5080610c4b8161389a565b915050610b99565b50600092915050565b6000610c678261104a565b610cb85760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e00000000000060448201526064015b60405180910390fd5b50600090815261177760205260409020546001600160a01b031690565b6000610ce082611099565b9050610ceb8261104a565b610d375760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e0000000000006044820152606401610caf565b826001600160a01b0316816001600160a01b03161415610d995760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a20617070726f766520746f2063616c6c65720000000000006044820152606401610caf565b336001600160a01b0382161480610dd457506001600160a01b03811660009081526117786020908152604080832033845290915290205460ff165b610e205760405162461bcd60e51b815260206004820152601f60248201527f6572632d3732313a206e6f74206f776e6572206e6f7220617070726f766564006044820152606401610caf565b6000828152611777602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000600354600254610e8f91906138b5565b905090565b6000546001600160a01b03163314610edc5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b8061177e8381548110610ef157610ef161386e565b6000918252602090912001555050565b6000546001600160a01b03163314610f495760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b63ffffffff811615610f6357610f606001826138cc565b90505b604080518082019091526001600160801b0390921680835263ffffffff90911660209092018290526117798054600160801b9093026001600160a01b0319909316909117919091179055565b610fca83838360405180602001604052806000815250612152565b505050565b60008060015b60025481101561103f57846001600160a01b03166005826117718110610ffd57610ffd61386e565b01546001600160a01b0316141561102d578382141561101f579150610b539050565b61102a6001836138f4565b91505b6110386001826138f4565b9050610fd5565b506000949350505050565b600081600254600161105c91906138f4565b1180156110695750600082115b8015610b535750600060058361177181106110865761108661386e565b01546001600160a01b0316141592915050565b60006110a48261104a565b6110f05760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e0000000000006044820152606401610caf565b60058261177181106111045761110461386e565b01546001600160a01b031692915050565b6000546001600160a01b0316331461115d5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111c85760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177181106112195760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610caf565b600155565b611781546001600160a01b03166112775760405162461bcd60e51b815260206004820152601560248201527f7a65726f207472656173757279206164647265737300000000000000000000006044820152606401610caf565b61178160009054906101000a90046001600160a01b03166001600160a01b031663a639ad79476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156112c857600080fd5b505af11580156112dc573d6000803e3d6000fd5b5050505050565b6000546001600160a01b0316331461132b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b611335600061239d565b565b6000805481906001600160a01b031633146113825760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61138c84846123ed565b915091505b9250929050565b61177a5460009081906001600160a01b03166113f65760405162461bcd60e51b815260206004820181905260248201527f6569702d3731323a2077686974656c697374206d696e742064697361626c65646044820152606401610caf565b604080517f64a830c71be714ed4ca944cf759cc2c89f283e211e10da9c9b9142b13722422b602082015233918101919091526060810185905260009061145490608001604051602081830303815290604052805190602001206125e3565b61177a549091506001600160a01b031661146e828661264c565b6001600160a01b0316146114c45760405162461bcd60e51b815260206004820152601a60248201527f6569702d3731323a20696e76616c6964207369676e61747572650000000000006044820152606401610caf565b33600090815261177b60205260408120546114e08760016138f4565b6114ea91906138b5565b905080871061153b5760405162461bcd60e51b815260206004820152601660248201527f6569702d3731323a20696e76616c696420636f756e74000000000000000000006044820152606401610caf565b33600090815261177b60205260408120805489929061155b9084906138f4565b9091555061156b90503388612670565b935093505050935093915050565b6000546001600160a01b031633146115c15760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6001600160a01b038116158061160557506116056001600160a01b0382167fd9b67a26000000000000000000000000000000000000000000000000000000006127e1565b6116515760405162461bcd60e51b815260206004820152601c60248201527f70726573616c653a2030206f722076616c6964204945524331313535000000006044820152606401610caf565b61177c80546001600160a01b0319166001600160a01b038316908117909155156116de57806001600160a01b031663a22cb4656116966000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b1580156112c857600080fd5b50565b336001600160a01b038316141561173a5760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a20617070726f766520746f2063616c6c65720000000000006044820152606401610caf565b336000818152611778602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61177c5460009081906001600160a01b03166118055760405162461bcd60e51b815260206004820152601160248201527f70726573616c653a2064697361626c65640000000000000000000000000000006044820152606401610caf565b6040805180820190915261177d546001600160801b038116808352600160801b90910463ffffffff16602083015261183e90869061390c565b341461188c5760405162461bcd60e51b815260206004820152601f60248201527f70726573616c653a20696e76616c6964207061796d656e7420616d6f756e74006044820152606401610caf565b6000851180156118a55750806020015163ffffffff1685105b6118f15760405162461bcd60e51b815260206004820152601660248201527f70726573616c653a20696e76616c696420636f756e74000000000000000000006044820152606401610caf565b61177c546040517ff242432a000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526001606482015260a06084820152600060a48201526001600160a01b039091169063f242432a9060c401600060405180830381600087803b15801561197257600080fd5b505af1158015611986573d6000803e3d6000fd5b505050506119943386612670565b92509250509250929050565b6000546001600160a01b031633146119e85760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6119f28282612804565b5050565b611a0284848484612152565b50505050565b6000546001600160a01b03163314611a505760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177f5460408051808201909152600080825260208201528115611ace5761177f611a7c6001846138b5565b81548110611a8c57611a8c61386e565b60009182526020918290206040805180820190915291015467ffffffffffffffff80821683526801000000000000000090910416918101919091529050611ae5565b506040805180820190915260008152600160208201525b61177f604051806040016040528060018460200151611b04919061392b565b67ffffffffffffffff1681526020018661ffff168460200151611b279190613954565b67ffffffffffffffff908116909152825460018181018555600094855260208086208551930180549190950151841668010000000000000000026fffffffffffffffffffffffffffffffff1990911692909316919091179190911790915561177e805491820181559091527f7fe79683751d9389eb55419939a813586ee3a6ec5f91165868f6441cbaaf9b1c0192909255505050565b6060611bc88261104a565b611c145760405162461bcd60e51b815260206004820152601960248201527f6572633732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610caf565b6000611c1f83610b95565b90508015611c6157611c3081612929565b611c3984612b38565b604051602001611c4a929190613993565b604051602081830303815290604052915050919050565b611780611c6d84612b38565b604051602001611c4a929190613a0d565b6000546001600160a01b03163314611cc65760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177f805480611cd857611cd8613ac8565b600082815260209020810160001990810180546fffffffffffffffffffffffffffffffff1916905501905561177e805480611d1557611d15613ac8565b60019003818190600052602060002001600090559055565b6000546001600160a01b03163314611d755760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b80516119f29061178090602084019061320b565b6000546001600160a01b03163314611dd15760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6040518060400160405280836001600160801b03168152602001826001611df891906138cc565b63ffffffff908116909152815161177d8054602090940151909216600160801b026001600160a01b03199093166001600160801b03909116179190911790555050565b6117808054611e49906139d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e75906139d2565b8015611ec25780601f10611e9757610100808354040283529160200191611ec2565b820191906000526020600020905b815481529060010190602001808311611ea557829003601f168201915b505050505081565b60408051808201909152611779546001600160801b0381168252600160801b900463ffffffff16602082018190526000918291611f495760405162461bcd60e51b815260206004820152601460248201527f7075626c696373616c653a2064697361626c65640000000000000000000000006044820152606401610caf565b8051611f5f9085906001600160801b031661390c565b3414611fad5760405162461bcd60e51b815260206004820152601a60248201527f7075626c696373616c653a207061796d656e7420616d6f756e740000000000006044820152606401610caf565b806020015163ffffffff1684106120065760405162461bcd60e51b815260206004820152601960248201527f7075626c696373616c653a20696e76616c696420636f756e74000000000000006044820152606401610caf565b6120103385612670565b9250925050915091565b6000546001600160a01b031633146120625760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61178180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120cd5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6001600160a01b0381166121495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610caf565b6116de8161239d565b600061215d83611099565b9050336001600160a01b038216148061218657503361217b84610c5c565b6001600160a01b0316145b806121b557506001600160a01b03811660009081526117786020908152604080832033845290915290205460ff165b6122015760405162461bcd60e51b815260206004820152601f60248201527f6572632d3732313a206e6f74206f776e6572206e6f7220617070726f766564006044820152606401610caf565b846001600160a01b0316816001600160a01b0316146122625760405162461bcd60e51b815260206004820152601260248201527f6572632d3732313a206e6f74206f776e657200000000000000000000000000006044820152606401610caf565b6001600160a01b0384166122b85760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610caf565b60008381526117776020526040902080546001600160a01b03191690558360058461177181106122ea576122ea61386e565b0180546001600160a01b0319166001600160a01b0392831617905585166000908152611776602052604081208054600192906123279084906138b5565b90915550506001600160a01b0384166000908152611776602052604081208054600192906123569084906138f4565b909155505060405183906001600160a01b0380871691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008082518451146124415760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e67746873206d69736d61746368000000000000000000006044820152606401610caf565b6002546000805b865181101561256d5760008682815181106124655761246561386e565b6020026020010151905060008883815181106124835761248361386e565b60200260200101519050818461249991906138f4565b6001600160a01b038216600090815261177660205260408120805492965084929091906124c79084906138f4565b90915550600090505b8281101561255757856124e28161389a565b9650508160058761177181106124fa576124fa61386e565b0180546001600160a01b0319166001600160a01b0392831617905560405187918416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061254f8161389a565b9150506124d0565b50505080806125659061389a565b915050612448565b5060015461257b82846138f4565b106125c85760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e7320617265206f76657200000000000000000000000000000000006044820152606401610caf565b60028290556125d781836138b5565b96919550909350505050565b6000610b536125f0612c5a565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061265b8585612d81565b9150915061266881612dee565b509392505050565b600080600060025490506001546001858361268b91906138f4565b61269591906138b5565b106126e25760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e7320617265206f76657200000000000000000000000000000000006044820152606401610caf565b60005b8481101561276c57816126f78161389a565b92505085600583611771811061270f5761270f61386e565b0180546001600160a01b0319166001600160a01b0392831617905560405183918816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4806127648161389a565b9150506126e5565b506001600160a01b038516600090815260046020526040812080548692906127959084906138f4565b90915550506001600160a01b03851660009081526117766020526040812080548692906127c39084906138f4565b909155505060028190556127d784826138b5565b9590945092505050565b60006127ec83612fa9565b80156127fd57506127fd8383612fdc565b9392505050565b6000805b8281101561290c5760008484838181106128245761282461386e565b905060200201359050600060058261177181106128435761284361386e565b01546001600160a01b0316905080156128f757836128608161389a565b6001600160a01b0383166000908152611776602052604081208054929750600193509161288e9084906138b5565b909155506000905060058361177181106128aa576128aa61386e565b0180546001600160a01b0319166001600160a01b039283161790556040518391600091908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45b505080806129049061389a565b915050612808565b50806003600082825461291f91906138f4565b9091555050505050565b60408051808201825260108082527f697066733a2f2f66303137303132323000000000000000000000000000000000602080840191909152835180850185529182527f3031323334353637383961626364656600000000000000000000000000000000908201528251838152606081810185529385929160009160208201818036833701905050905060005b6020811015612b0a57600060048583602081106129d4576129d461386e565b1a60f81b6001600160f81b031916901c9050838160f81c60ff16815181106129fe576129fe61386e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683612a3184600261390c565b81518110612a4157612a4161386e565b60200101906001600160f81b031916908160001a9053506000858360208110612a6c57612a6c61386e565b1a60f81b600f60f81b169050848160f81c60ff1681518110612a9057612a9061386e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001684612ac385600261390c565b612ace9060016138f4565b81518110612ade57612ade61386e565b60200101906001600160f81b031916908160001a90535050508080612b029061389a565b9150506129b5565b508381604051602001612b1e929190613ade565b604051602081830303815290604052945050505050919050565b606081612b7857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612ba25780612b8c8161389a565b9150612b9b9050600a83613b4b565b9150612b7c565b60008167ffffffffffffffff811115612bbd57612bbd613455565b6040519080825280601f01601f191660200182016040528015612be7576020820181803683370190505b5090505b8415612c5257612bfc6001836138b5565b9150612c09600a86613b5f565b612c149060306138f4565b60f81b818381518110612c2957612c2961386e565b60200101906001600160f81b031916908160001a905350612c4b600a86613b4b565b9450612beb565b949350505050565b6000306001600160a01b037f00000000000000000000000000139fdd8f2bb8b4376aab2435c44981ec34e7e016148015612cb357507f000000000000000000000000000000000000000000000000000000000000000146145b15612cdd57507f65eab696f8bba8a5dd96aab5035144830aa175b4a165bcd3132c048a1864cb8290565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f210e8c19e84b01767842872981056328a7f24ee00c97f14a515075965321b604828401527f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c60608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600080825160411415612db85760208301516040840151606085015160001a612dac878285856130da565b94509450505050611391565b825160401415612de25760208301516040840151612dd78683836131c7565b935093505050611391565b50600090506002611391565b6000816004811115612e0257612e02613b73565b1415612e0b5750565b6001816004811115612e1f57612e1f613b73565b1415612e6d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610caf565b6002816004811115612e8157612e81613b73565b1415612ecf5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610caf565b6003816004811115612ee357612ee3613b73565b1415612f3c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610caf565b6004816004811115612f5057612f50613b73565b14156116de5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610caf565b6000612fbc826301ffc9a760e01b612fdc565b8015610b535750612fd5826001600160e01b0319612fdc565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b179052905160009190829081906001600160a01b0387169061753090613058908690613b89565b6000604051808303818686fa925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506020815110156130b45760009350505050610b53565b8180156130d05750808060200190518101906130d09190613ba5565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561311157506000905060036131be565b8460ff16601b1415801561312957508460ff16601c14155b1561313a57506000905060046131be565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561318e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131b7576000600192509250506131be565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816131fd60ff86901c601b6138f4565b905061156b878288856130da565b828054613217906139d2565b90600052602060002090601f016020900481019282613239576000855561327f565b82601f1061325257805160ff191683800117855561327f565b8280016001018555821561327f579182015b8281111561327f578251825591602001919060010190613264565b5061328b92915061328f565b5090565b5b8082111561328b5760008155600101613290565b6000602082840312156132b657600080fd5b81356001600160e01b0319811681146127fd57600080fd5b6000602082840312156132e057600080fd5b5035919050565b60005b838110156133025781810151838201526020016132ea565b83811115611a025750506000910152565b60208152600082518060208401526133328160408501602087016132e7565b601f01601f19169190910160400192915050565b6001600160a01b03811681146116de57600080fd5b6000806040838503121561336e57600080fd5b823561337981613346565b946020939093013593505050565b6000806040838503121561339a57600080fd5b50508035926020909101359150565b600080604083850312156133bc57600080fd5b82356001600160801b03811681146133d357600080fd5b9150602083013563ffffffff811681146133ec57600080fd5b809150509250929050565b60008060006060848603121561340c57600080fd5b833561341781613346565b9250602084013561342781613346565b929592945050506040919091013590565b60006020828403121561344a57600080fd5b81356127fd81613346565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561349457613494613455565b604052919050565b600067ffffffffffffffff8211156134b6576134b6613455565b5060051b60200190565b600082601f8301126134d157600080fd5b813560206134e66134e18361349c565b61346b565b82815260059290921b8401810191818101908684111561350557600080fd5b8286015b848110156135205780358352918301918301613509565b509695505050505050565b6000806040838503121561353e57600080fd5b823567ffffffffffffffff8082111561355657600080fd5b818501915085601f83011261356a57600080fd5b8135602061357a6134e18361349c565b82815260059290921b8401810191818101908984111561359957600080fd5b948201945b838610156135c05785356135b181613346565b8252948201949082019061359e565b965050860135925050808211156135d657600080fd5b506135e3858286016134c0565b9150509250929050565b600067ffffffffffffffff83111561360757613607613455565b61361a601f8401601f191660200161346b565b905082815283838301111561362e57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261365657600080fd5b6127fd838335602085016135ed565b60008060006060848603121561367a57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561369f57600080fd5b6136ab86828701613645565b9150509250925092565b80151581146116de57600080fd5b600080604083850312156136d657600080fd5b82356136e181613346565b915060208301356133ec816136b5565b6000806020838503121561370457600080fd5b823567ffffffffffffffff8082111561371c57600080fd5b818501915085601f83011261373057600080fd5b81358181111561373f57600080fd5b8660208260051b850101111561375457600080fd5b60209290920196919550909350505050565b6000806000806080858703121561377c57600080fd5b843561378781613346565b9350602085013561379781613346565b925060408501359150606085013567ffffffffffffffff8111156137ba57600080fd5b6137c687828801613645565b91505092959194509250565b600080604083850312156137e557600080fd5b823561ffff8116811461337957600080fd5b60006020828403121561380957600080fd5b813567ffffffffffffffff81111561382057600080fd5b8201601f8101841361383157600080fd5b612c52848235602084016135ed565b6000806040838503121561385357600080fd5b823561385e81613346565b915060208301356133ec81613346565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156138ae576138ae613884565b5060010190565b6000828210156138c7576138c7613884565b500390565b600063ffffffff8083168185168083038211156138eb576138eb613884565b01949350505050565b6000821982111561390757613907613884565b500190565b600081600019048311821515161561392657613926613884565b500290565b600067ffffffffffffffff8381169083168181101561394c5761394c613884565b039392505050565b600067ffffffffffffffff8083168185168083038211156138eb576138eb613884565b600081516139898185602086016132e7565b9290920192915050565b600083516139a58184602088016132e7565b8351908301906139b98183602088016132e7565b64173539b7b760d91b9101908152600501949350505050565b600181811c908216806139e657607f821691505b60208210811415613a0757634e487b7160e01b600052602260045260246000fd5b50919050565b600080845481600182811c915080831680613a2957607f831692505b6020808410821415613a4957634e487b7160e01b86526022600452602486fd5b818015613a5d5760018114613a6e57613a9b565b60ff19861689528489019650613a9b565b60008b81526020902060005b86811015613a935781548b820152908501908301613a7a565b505084890196505b505050505050613abf613aae8286613977565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052603160045260246000fd5b60008351613af08184602088016132e7565b835190830190613b048183602088016132e7565b7f2f000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613b5a57613b5a613b35565b500490565b600082613b6e57613b6e613b35565b500690565b634e487b7160e01b600052602160045260246000fd5b60008251613b9b8184602087016132e7565b9190910192915050565b600060208284031215613bb757600080fd5b81516127fd816136b556fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122030b5c2c5291e057fb89b67a2441651a65d1f8770a0eccbfdd6ec87d0c2a5c15664736f6c634300080b0033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.