Contract Overview
Balance:
0 MATIC
My Name Tag:
Not Available
TokenTracker:
[ Download CSV Export ]
Latest 2 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x4fe0ad00a83641c7a0cb0a2c8935f8a7df3f39aa4e0a421c5305324f48c6bb51 | 33680447 | 72 days 8 hrs ago | 0xfd83b8877178ea2f765a67976de355c994f78686 | 0xfefca141b8c627973239307128d1559527e6fabb | 1 MATIC | ||
0xed73bdbda36e89bb45635675e90dfc03cd045c8a0ff964c54f539a2f72130dbb | 33638420 | 73 days 9 hrs ago | 0xfd83b8877178ea2f765a67976de355c994f78686 | 0xfefca141b8c627973239307128d1559527e6fabb | 1 MATIC |
[ Download CSV Export ]
Contract Name:
Domains
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-03-27 */ /** *Submitted for verification at polygonscan.com on 2023-02-12 */ // SPDX-License-Identifier: UNLICENSED // File: hardhat/console.sol pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File: @openzeppelin/contracts/utils/Base64.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // File: libraries/StringUtils.sol // Source: // https://github.com/ensdomains/ens-contracts/blob/master/contracts/ethregistrar/StringUtils.sol pragma solidity >=0.8.4; library StringUtils { /** * @dev Returns the length of a given string * * @param s The string to measure the length of * @return The length of the input string */ function strlen(string memory s) internal pure returns (uint) { uint len; uint i = 0; uint bytelength = bytes(s).length; for(len = 0; i < bytelength; len++) { bytes1 b = bytes(s)[i]; if(b < 0x80) { i += 1; } else if (b < 0xE0) { i += 2; } else if (b < 0xF0) { i += 3; } else if (b < 0xF8) { i += 4; } else if (b < 0xFC) { i += 5; } else { i += 6; } } return len; } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: Domanis.sol pragma solidity ^0.8.10; // We first import some OpenZeppelin Contracts. // We import another help function // We inherit the contract we imported. This means we'll have access // to the inherited contract's methods. contract Domains is ERC721URIStorage { // Magic given to us by OpenZeppelin to help us keep track of tokenIds. using Counters for Counters.Counter; Counters.Counter private _tokenIds; string public tld; // We'll be storing our NFT images on chain as SVGs string svgPartOne = '<svg width="270" height="270" viewBox="0 0 270 270" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#F5F5F5" d="M0 0h270v270H0z"/><g clip-path="url(#a)"><g filter="url(#b)" shape-rendering="crispEdges"><path d="M0 0h270v270H0V0Z" fill="url(#c)"/><path d="M.5.5h269v269H.5V.5Z" stroke="#000"/></g><ellipse cx="48.5" cy="71" rx="8.5" ry="8" fill="#BCE1F7"/><ellipse cx="48.5" cy="47" rx="8.5" ry="8" fill="#FAD39A"/><ellipse cx="74.5" cy="47" rx="8.5" ry="8" fill="#FAABAB" fill-opacity=".92"/><ellipse cx="74.5" cy="71" rx="8.5" ry="8" fill="#fff"/></g><defs><linearGradient id="c" x1="0" y1="0" x2="270" y2="270" gradientUnits="userSpaceOnUse"><stop stop-color="#5E98EE" stop-opacity=".56"/><stop offset="1" stop-color="#00AAEB" stop-opacity=".99"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h270v270H0z"/></clipPath><filter id="b" x="-4" y="0" width="278" height="278" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset dy="4"/><feGaussianBlur stdDeviation="2"/><feComposite in2="hardAlpha" operator="out"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/><feBlend in2="BackgroundImageFix" result="effect1_dropShadow_0_1"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset dy="4"/><feGaussianBlur stdDeviation="2"/><feComposite in2="hardAlpha" operator="out"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/><feBlend in2="effect1_dropShadow_0_1" result="effect2_dropShadow_0_1"/><feBlend in="SourceGraphic" in2="effect2_dropShadow_0_1" result="shape"/></filter></defs><text x="32.5" y="231" font-size="16" fill="#fff" filter="url(#A)" font-family="Plus Jakarta Sans,DejaVu Sans,Noto Color Emoji,Apple Color Emoji,sans-serif" font-weight="bold">'; string svgPartTwo = '</text></svg>'; mapping(string => address) public domains; mapping(string => string) public records; // Add this at the top of your contract next to the other mappings mapping (uint => string) public names; // Custom error messages error Unauthorized(); error AlreadyRegistered(); error InvalidName(string name); address payable public owner; constructor(string memory _tld) ERC721 ("Ninja Name Service", "NNS") payable { owner = payable(msg.sender); tld = _tld; console.log("%s name service deployed", _tld); } function register(string calldata name) public payable { if (domains[name] != address(0)) revert AlreadyRegistered(); if (!valid(name)) revert InvalidName(name); uint256 _price = price(name); require(msg.value >= _price, "Not enough Matic paid"); // Combine the name passed into the function with the TLD string memory _name = string(abi.encodePacked(name, ".", tld)); // Create the SVG (image) for the NFT with the name string memory finalSvg = string(abi.encodePacked(svgPartOne, _name, svgPartTwo)); uint256 newRecordId = _tokenIds.current(); uint256 length = StringUtils.strlen(name); string memory strLen = Strings.toString(length); console.log("Registering %s.%s on the contract with tokenID %d", name, tld, newRecordId); // Create the JSON metadata of our NFT. We do this by combining strings and encoding as base64 string memory json = Base64.encode( abi.encodePacked( '{"name": "', _name, '", "description": "A domain on the Test name service", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(finalSvg)), '","length":"', strLen, '"}' ) ); string memory finalTokenUri = string( abi.encodePacked("data:application/json;base64,", json)); console.log("\n--------------------------------------------------------"); console.log("Final tokenURI", finalTokenUri); console.log("--------------------------------------------------------\n"); _safeMint(msg.sender, newRecordId); _setTokenURI(newRecordId, finalTokenUri); domains[name] = msg.sender; names[newRecordId] = name; _tokenIds.increment(); } // We still need the price, getAddress, setRecord and getRecord functions, they just don't change // This function will give us the price of a domain based on length function price(string calldata name) public pure returns(uint) { uint len = StringUtils.strlen(name); require(len > 0); if (len == 3) { return 50 * 10**18; // 5 MATIC = 5 000 000 000 000 000 000 (18 decimals). We're going with 0.5 Matic cause the faucets don't give a lot } else if (len == 4) { return 25 * 10**18; // To charge smaller amounts, reduce the decimals. This is 0.3 } else { return 1 * 10**18; } } // Add this anywhere in your contract body function getAllNames() public view returns (string[] memory) { console.log("Getting all names from contract"); string[] memory allNames = new string[](_tokenIds.current()); for (uint i = 0; i < _tokenIds.current(); i++) { allNames[i] = names[i]; console.log("Name for token %d is %s", i, allNames[i]); } return allNames; } // This will set a domain name lenght limit to 10 function valid(string calldata name) public pure returns(bool) { return StringUtils.strlen(name) >= 3 && StringUtils.strlen(name) <= 20; } // This will give us the domain owners' address function getAddress(string calldata name) public view returns (address) { return domains[name]; } function setRecord(string calldata name, string calldata record) public { if (msg.sender != domains[name]) revert Unauthorized(); records[name] = record; } function getRecord(string calldata name) public view returns(string memory) { return records[name]; } modifier onlyOwner() { require(isOwner()); _; } function isOwner() public view returns (bool) { return msg.sender == owner; } function withdraw() public onlyOwner { uint amount = address(this).balance; (bool success, ) = msg.sender.call{value: amount}(""); require(success, "Failed to withdraw Matic"); } }
[{"inputs":[{"internalType":"string","name":"_tld","type":"string"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"AlreadyRegistered","type":"error"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"InvalidName","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"domains","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllNames","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"getRecord","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"names","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"records","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"record","type":"string"}],"name":"setRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tld","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"name","type":"string"}],"name":"valid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052604051806107e001604052806107a48152602001620052b26107a491396009908051906020019062000038929190620002c8565b506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250600a908051906020019062000086929190620002c8565b5060405162005a5638038062005a568339818101604052810190620000ac919062000515565b6040518060400160405280601281526020017f4e696e6a61204e616d65205365727669636500000000000000000000000000008152506040518060400160405280600381526020017f4e4e530000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000130929190620002c8565b50806001908051906020019062000149929190620002c8565b50505033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060089080519060200190620001a5929190620002c8565b50620001f26040518060400160405280601881526020017f2573206e616d652073657276696365206465706c6f796564000000000000000081525082620001f960201b62001b291760201c565b5062000663565b6200029b828260405160240162000212929190620005c3565b6040516020818303038152906040527f4b5c4277000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200029f60201b60201c565b5050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b828054620002d6906200062d565b90600052602060002090601f016020900481019282620002fa576000855562000346565b82601f106200031557805160ff191683800117855562000346565b8280016001018555821562000346579182015b828111156200034557825182559160200191906001019062000328565b5b50905062000355919062000359565b5090565b5b80821115620003745760008160009055506001016200035a565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003e18262000396565b810181811067ffffffffffffffff82111715620004035762000402620003a7565b5b80604052505050565b60006200041862000378565b9050620004268282620003d6565b919050565b600067ffffffffffffffff821115620004495762000448620003a7565b5b620004548262000396565b9050602081019050919050565b60005b838110156200048157808201518184015260208101905062000464565b8381111562000491576000848401525b50505050565b6000620004ae620004a8846200042b565b6200040c565b905082815260208101848484011115620004cd57620004cc62000391565b5b620004da84828562000461565b509392505050565b600082601f830112620004fa57620004f96200038c565b5b81516200050c84826020860162000497565b91505092915050565b6000602082840312156200052e576200052d62000382565b5b600082015167ffffffffffffffff8111156200054f576200054e62000387565b5b6200055d84828501620004e2565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006200058f8262000566565b6200059b818562000571565b9350620005ad81856020860162000461565b620005b88162000396565b840191505092915050565b60006040820190508181036000830152620005df818562000582565b90508181036020830152620005f5818462000582565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200064657607f821691505b602082108114156200065d576200065c620005fe565b5b50919050565b614c3f80620006736000396000f3fe60806040526004361061019c5760003560e01c806370a08231116100ec578063bf40fac11161008a578063e985e9c511610064578063e985e9c514610624578063f2c298be14610661578063fb825e5f1461067d578063fe2c6198146106a85761019c565b8063bf40fac114610581578063c1880a98146105be578063c87b56dd146105e75761019c565b806395d89b41116100c657806395d89b41146104c75780639791c097146104f2578063a22cb4651461052f578063b88d4fde146105585761019c565b806370a08231146104345780638da5cb5b146104715780638f32d59b1461049c5761019c565b8063264492351161015957806342842e0e1161013357806342842e0e146103545780634622ab031461037d578063541e771d146103ba5780636352211e146103f75761019c565b806326449235146102d55780632d551432146103125780633ccfd60b1461033d5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806311dd88451461026f57806323b872dd146102ac575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190613272565b6106e5565b6040516101d591906132ba565b60405180910390f35b3480156101ea57600080fd5b506101f36107c7565b604051610200919061336e565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b91906133c6565b610859565b60405161023d9190613434565b60405180910390f35b34801561025257600080fd5b5061026d6004803603810190610268919061347b565b61089f565b005b34801561027b57600080fd5b5061029660048036038101906102919190613520565b6109b7565b6040516102a3919061336e565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce919061356d565b610a6a565b005b3480156102e157600080fd5b506102fc60048036038101906102f791906136f0565b610aca565b6040516103099190613434565b60405180910390f35b34801561031e57600080fd5b50610327610b13565b604051610334919061336e565b60405180910390f35b34801561034957600080fd5b50610352610ba1565b005b34801561036057600080fd5b5061037b6004803603810190610376919061356d565b610c67565b005b34801561038957600080fd5b506103a4600480360381019061039f91906133c6565b610c87565b6040516103b1919061336e565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc91906136f0565b610d27565b6040516103ee919061336e565b60405180910390f35b34801561040357600080fd5b5061041e600480360381019061041991906133c6565b610ddd565b60405161042b9190613434565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190613739565b610e64565b6040516104689190613775565b60405180910390f35b34801561047d57600080fd5b50610486610f1c565b60405161049391906137b1565b60405180910390f35b3480156104a857600080fd5b506104b1610f42565b6040516104be91906132ba565b60405180910390f35b3480156104d357600080fd5b506104dc610f9a565b6040516104e9919061336e565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190613520565b61102c565b60405161052691906132ba565b60405180910390f35b34801561053b57600080fd5b50610556600480360381019061055191906137f8565b6110e0565b005b34801561056457600080fd5b5061057f600480360381019061057a91906138d9565b6110f6565b005b34801561058d57600080fd5b506105a860048036038101906105a39190613520565b611158565b6040516105b59190613434565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e0919061395c565b6111a3565b005b3480156105f357600080fd5b5061060e600480360381019061060991906133c6565b61127e565b60405161061b919061336e565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906139dd565b611391565b60405161065891906132ba565b60405180910390f35b61067b60048036038101906106769190613520565b611425565b005b34801561068957600080fd5b506106926118a3565b60405161069f9190613b29565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613520565b611a81565b6040516106dc9190613775565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c057506107bf82611bc5565b5b9050919050565b6060600080546107d690613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461080290613b7a565b801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b600061086482611c2f565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108aa82610ddd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561091b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091290613c1e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093a611c7a565b73ffffffffffffffffffffffffffffffffffffffff161480610969575061096881610963611c7a565b611391565b5b6109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f90613cb0565b60405180910390fd5b6109b28383611c82565b505050565b6060600c83836040516109cb929190613d00565b908152602001604051809103902080546109e490613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1090613b7a565b8015610a5d5780601f10610a3257610100808354040283529160200191610a5d565b820191906000526020600020905b815481529060010190602001808311610a4057829003601f168201915b5050505050905092915050565b610a7b610a75611c7a565b82611d3b565b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab190613d8b565b60405180910390fd5b610ac5838383611dd0565b505050565b600b818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60088054610b2090613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4c90613b7a565b8015610b995780601f10610b6e57610100808354040283529160200191610b99565b820191906000526020600020905b815481529060010190602001808311610b7c57829003601f168201915b505050505081565b610ba9610f42565b610bb257600080fd5b600047905060003373ffffffffffffffffffffffffffffffffffffffff1682604051610bdd90613ddc565b60006040518083038185875af1925050503d8060008114610c1a576040519150601f19603f3d011682016040523d82523d6000602084013e610c1f565b606091505b5050905080610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90613e3d565b60405180910390fd5b5050565b610c82838383604051806020016040528060008152506110f6565b505050565b600d6020528060005260406000206000915090508054610ca690613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd290613b7a565b8015610d1f5780601f10610cf457610100808354040283529160200191610d1f565b820191906000526020600020905b815481529060010190602001808311610d0257829003601f168201915b505050505081565b600c818051602081018201805184825260208301602085012081835280955050505050506000915090508054610d5c90613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890613b7a565b8015610dd55780601f10610daa57610100808354040283529160200191610dd5565b820191906000526020600020905b815481529060010190602001808311610db857829003601f168201915b505050505081565b600080610de9836120ca565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290613ea9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc90613f3b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060018054610fa990613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd590613b7a565b80156110225780601f10610ff757610100808354040283529160200191611022565b820191906000526020600020905b81548152906001019060200180831161100557829003601f168201915b5050505050905090565b6000600361107d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612107565b101580156110d8575060146110d584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612107565b11155b905092915050565b6110f26110eb611c7a565b83836122bc565b5050565b611107611101611c7a565b83611d3b565b611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90613d8b565b60405180910390fd5b61115284848484612429565b50505050565b6000600b838360405161116c929190613d00565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b600b84846040516111b5929190613d00565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611248576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181600c868660405161125c929190613d00565b908152602001604051809103902091906112779291906130dd565b5050505050565b606061128982611c2f565b60006006600084815260200190815260200160002080546112a990613b7a565b80601f01602080910402602001604051908101604052809291908181526020018280546112d590613b7a565b80156113225780601f106112f757610100808354040283529160200191611322565b820191906000526020600020905b81548152906001019060200180831161130557829003601f168201915b505050505090506000611333612485565b905060008151141561134957819250505061138c565b60008251111561137e578082604051602001611366929190613f8c565b6040516020818303038152906040529250505061138c565b6113878461249c565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff16600b838360405161144f929190613d00565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114cb576040517f3a81d6fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114d5828261102c565b6115185781816040517f7f19f48d00000000000000000000000000000000000000000000000000000000815260040161150f929190613fdd565b60405180910390fd5b60006115248383611a81565b905080341015611569576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115609061404d565b60405180910390fd5b6000838360086040516020016115819392919061414d565b60405160208183030381529060405290506000600982600a6040516020016115ab9392919061417e565b604051602081830303815290604052905060006115c86007612504565b9050600061161987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612107565b9050600061162682612512565b905061171a604051806060016040528060318152602001614b606031913989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506008805461169690613b7a565b80601f01602080910402602001604051908101604052809291908181526020018280546116c290613b7a565b801561170f5780601f106116e45761010080835404028352916020019161170f565b820191906000526020600020905b8154815290600101906020018083116116f257829003601f168201915b5050505050866125ea565b6000611750866117298761268c565b8460405160200161173c9392919061432b565b60405160208183030381529060405261268c565b905060008160405160200161176591906143d4565b6040516020818303038152906040529050611797604051806060016040528060398152602001614b27603991396127f0565b6117d66040518060400160405280600e81526020017f46696e616c20746f6b656e55524900000000000000000000000000000000000081525082611b29565b6117f7604051806060016040528060398152602001614b91603991396127f0565b6118013386612889565b61180b85826128a7565b33600b8b8b60405161181e929190613d00565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508989600d6000888152602001908152602001600020919061188c9291906130dd565b50611897600761291b565b50505050505050505050565b60606118e36040518060400160405280601f81526020017f47657474696e6720616c6c206e616d65732066726f6d20636f6e7472616374008152506127f0565b60006118ef6007612504565b67ffffffffffffffff811115611908576119076135c5565b5b60405190808252806020026020018201604052801561193b57816020015b60608152602001906001900390816119265790505b50905060005b61194b6007612504565b811015611a7957600d6000828152602001908152602001600020805461197090613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461199c90613b7a565b80156119e95780601f106119be576101008083540402835291602001916119e9565b820191906000526020600020905b8154815290600101906020018083116119cc57829003601f168201915b5050505050828281518110611a0157611a006143f6565b5b6020026020010181905250611a666040518060400160405280601781526020017f4e616d6520666f7220746f6b656e20256420697320257300000000000000000081525082848481518110611a5957611a586143f6565b5b6020026020010151612931565b8080611a7190614454565b915050611941565b508091505090565b600080611ad184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612107565b905060008111611ae057600080fd5b6003811415611afb576802b5e3af16b1880000915050611b23565b6004811415611b165768015af1d78b58c40000915050611b23565b670de0b6b3a76400009150505b92915050565b611bc18282604051602401611b3f92919061449d565b6040516020818303038152906040527f4b5c4277000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d0565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c38816129f9565b611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90613ea9565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cf583610ddd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611d4783610ddd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d895750611d888185611391565b5b80611dc757508373ffffffffffffffffffffffffffffffffffffffff16611daf84610859565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611df082610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d90614546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ead906145d8565b60405180910390fd5b611ec38383836001612a3a565b8273ffffffffffffffffffffffffffffffffffffffff16611ee382610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3090614546565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120c58383836001612b60565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060008084519050600092505b808210156122b1576000858381518110612133576121326143f6565b5b602001015160f81c60f81b9050608060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610156121825760018361217b91906145f8565b925061229d565b60e060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610156121c4576002836121bd91906145f8565b925061229c565b60f060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015612206576003836121ff91906145f8565b925061229b565b60f8801b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610156122475760048361224091906145f8565b925061229a565b60fc60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610156122895760058361228291906145f8565b9250612299565b60068361229691906145f8565b92505b5b5b5b5b5082806122a990614454565b935050612116565b829350505050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561232b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123229061469a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161241c91906132ba565b60405180910390a3505050565b612434848484611dd0565b61244084848484612b66565b61247f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124769061472c565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606124a782611c2f565b60006124b1612485565b905060008151116124d157604051806020016040528060008152506124fc565b806124db84612512565b6040516020016124ec929190613f8c565b6040516020818303038152906040525b915050919050565b600081600001549050919050565b60606000600161252184612cee565b01905060008167ffffffffffffffff8111156125405761253f6135c5565b5b6040519080825280601f01601f1916602001820160405280156125725781602001600182028036833780820191505090505b509050600082602001820190505b6001156125df578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816125c9576125c861474c565b5b04945060008514156125da576125df565b612580565b819350505050919050565b61268684848484604051602401612604949392919061477b565b6040516020818303038152906040527f8eafb02b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d0565b50505050565b60606000825114156126af576040518060200160405280600081525090506127eb565b6000604051806060016040528060408152602001614bca60409139905060006003600285516126de91906145f8565b6126e891906147d5565b60046126f49190614806565b67ffffffffffffffff81111561270d5761270c6135c5565b5b6040519080825280601f01601f19166020018201604052801561273f5781602001600182028036833780820191505090505b509050600182016020820185865187015b808210156127ab576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612750565b50506003865106600181146127c757600281146127da576127e2565b603d6001830353603d60028303536127e2565b603d60018303535b50505080925050505b919050565b61288681604051602401612804919061336e565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d0565b50565b6128a3828260405180602001604052806000815250612e41565b5050565b6128b0826129f9565b6128ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e6906148d2565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612916929190613163565b505050565b6001816000016000828254019250508190555050565b6129cb838383604051602401612949939291906148f2565b6040516020818303038152906040527f5970e089000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129d0565b505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612a1b836120ca565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115612b5a57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612ace5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac69190614937565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b595780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b5191906145f8565b925050819055505b5b50505050565b50505050565b6000612b878473ffffffffffffffffffffffffffffffffffffffff16612e9c565b15612ce1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bb0611c7a565b8786866040518563ffffffff1660e01b8152600401612bd294939291906149c0565b6020604051808303816000875af1925050508015612c0e57506040513d601f19601f82011682018060405250810190612c0b9190614a21565b60015b612c91573d8060008114612c3e576040519150601f19603f3d011682016040523d82523d6000602084013e612c43565b606091505b50600081511415612c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c809061472c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ce6565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612d4c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612d4257612d4161474c565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612d89576d04ee2d6d415b85acef81000000008381612d7f57612d7e61474c565b5b0492506020810190505b662386f26fc100008310612db857662386f26fc100008381612dae57612dad61474c565b5b0492506010810190505b6305f5e1008310612de1576305f5e1008381612dd757612dd661474c565b5b0492506008810190505b6127108310612e06576127108381612dfc57612dfb61474c565b5b0492506004810190505b60648310612e295760648381612e1f57612e1e61474c565b5b0492506002810190505b600a8310612e38576001810190505b80915050919050565b612e4b8383612ebf565b612e586000848484612b66565b612e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e9061472c565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2690614a9a565b60405180910390fd5b612f38816129f9565b15612f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6f90614b06565b60405180910390fd5b612f86600083836001612a3a565b612f8f816129f9565b15612fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc690614b06565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130d9600083836001612b60565b5050565b8280546130e990613b7a565b90600052602060002090601f01602090048101928261310b5760008555613152565b82601f1061312457803560ff1916838001178555613152565b82800160010185558215613152579182015b82811115613151578235825591602001919060010190613136565b5b50905061315f91906131e9565b5090565b82805461316f90613b7a565b90600052602060002090601f01602090048101928261319157600085556131d8565b82601f106131aa57805160ff19168380011785556131d8565b828001600101855582156131d8579182015b828111156131d75782518255916020019190600101906131bc565b5b5090506131e591906131e9565b5090565b5b808211156132025760008160009055506001016131ea565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61324f8161321a565b811461325a57600080fd5b50565b60008135905061326c81613246565b92915050565b60006020828403121561328857613287613210565b5b60006132968482850161325d565b91505092915050565b60008115159050919050565b6132b48161329f565b82525050565b60006020820190506132cf60008301846132ab565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561330f5780820151818401526020810190506132f4565b8381111561331e576000848401525b50505050565b6000601f19601f8301169050919050565b6000613340826132d5565b61334a81856132e0565b935061335a8185602086016132f1565b61336381613324565b840191505092915050565b600060208201905081810360008301526133888184613335565b905092915050565b6000819050919050565b6133a381613390565b81146133ae57600080fd5b50565b6000813590506133c08161339a565b92915050565b6000602082840312156133dc576133db613210565b5b60006133ea848285016133b1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061341e826133f3565b9050919050565b61342e81613413565b82525050565b60006020820190506134496000830184613425565b92915050565b61345881613413565b811461346357600080fd5b50565b6000813590506134758161344f565b92915050565b6000806040838503121561349257613491613210565b5b60006134a085828601613466565b92505060206134b1858286016133b1565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126134e0576134df6134bb565b5b8235905067ffffffffffffffff8111156134fd576134fc6134c0565b5b602083019150836001820283011115613519576135186134c5565b5b9250929050565b6000806020838503121561353757613536613210565b5b600083013567ffffffffffffffff81111561355557613554613215565b5b613561858286016134ca565b92509250509250929050565b60008060006060848603121561358657613585613210565b5b600061359486828701613466565b93505060206135a586828701613466565b92505060406135b6868287016133b1565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135fd82613324565b810181811067ffffffffffffffff8211171561361c5761361b6135c5565b5b80604052505050565b600061362f613206565b905061363b82826135f4565b919050565b600067ffffffffffffffff82111561365b5761365a6135c5565b5b61366482613324565b9050602081019050919050565b82818337600083830152505050565b600061369361368e84613640565b613625565b9050828152602081018484840111156136af576136ae6135c0565b5b6136ba848285613671565b509392505050565b600082601f8301126136d7576136d66134bb565b5b81356136e7848260208601613680565b91505092915050565b60006020828403121561370657613705613210565b5b600082013567ffffffffffffffff81111561372457613723613215565b5b613730848285016136c2565b91505092915050565b60006020828403121561374f5761374e613210565b5b600061375d84828501613466565b91505092915050565b61376f81613390565b82525050565b600060208201905061378a6000830184613766565b92915050565b600061379b826133f3565b9050919050565b6137ab81613790565b82525050565b60006020820190506137c660008301846137a2565b92915050565b6137d58161329f565b81146137e057600080fd5b50565b6000813590506137f2816137cc565b92915050565b6000806040838503121561380f5761380e613210565b5b600061381d85828601613466565b925050602061382e858286016137e3565b9150509250929050565b600067ffffffffffffffff821115613853576138526135c5565b5b61385c82613324565b9050602081019050919050565b600061387c61387784613838565b613625565b905082815260208101848484011115613898576138976135c0565b5b6138a3848285613671565b509392505050565b600082601f8301126138c0576138bf6134bb565b5b81356138d0848260208601613869565b91505092915050565b600080600080608085870312156138f3576138f2613210565b5b600061390187828801613466565b945050602061391287828801613466565b9350506040613923878288016133b1565b925050606085013567ffffffffffffffff81111561394457613943613215565b5b613950878288016138ab565b91505092959194509250565b6000806000806040858703121561397657613975613210565b5b600085013567ffffffffffffffff81111561399457613993613215565b5b6139a0878288016134ca565b9450945050602085013567ffffffffffffffff8111156139c3576139c2613215565b5b6139cf878288016134ca565b925092505092959194509250565b600080604083850312156139f4576139f3613210565b5b6000613a0285828601613466565b9250506020613a1385828601613466565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000613a65826132d5565b613a6f8185613a49565b9350613a7f8185602086016132f1565b613a8881613324565b840191505092915050565b6000613a9f8383613a5a565b905092915050565b6000602082019050919050565b6000613abf82613a1d565b613ac98185613a28565b935083602082028501613adb85613a39565b8060005b85811015613b175784840389528151613af88582613a93565b9450613b0383613aa7565b925060208a01995050600181019050613adf565b50829750879550505050505092915050565b60006020820190508181036000830152613b438184613ab4565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b9257607f821691505b60208210811415613ba657613ba5613b4b565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c086021836132e0565b9150613c1382613bac565b604082019050919050565b60006020820190508181036000830152613c3781613bfb565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613c9a603d836132e0565b9150613ca582613c3e565b604082019050919050565b60006020820190508181036000830152613cc981613c8d565b9050919050565b600081905092915050565b6000613ce78385613cd0565b9350613cf4838584613671565b82840190509392505050565b6000613d0d828486613cdb565b91508190509392505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613d75602d836132e0565b9150613d8082613d19565b604082019050919050565b60006020820190508181036000830152613da481613d68565b9050919050565b600081905092915050565b50565b6000613dc6600083613dab565b9150613dd182613db6565b600082019050919050565b6000613de782613db9565b9150819050919050565b7f4661696c656420746f207769746864726177204d617469630000000000000000600082015250565b6000613e276018836132e0565b9150613e3282613df1565b602082019050919050565b60006020820190508181036000830152613e5681613e1a565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613e936018836132e0565b9150613e9e82613e5d565b602082019050919050565b60006020820190508181036000830152613ec281613e86565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613f256029836132e0565b9150613f3082613ec9565b604082019050919050565b60006020820190508181036000830152613f5481613f18565b9050919050565b6000613f66826132d5565b613f708185613cd0565b9350613f808185602086016132f1565b80840191505092915050565b6000613f988285613f5b565b9150613fa48284613f5b565b91508190509392505050565b6000613fbc83856132e0565b9350613fc9838584613671565b613fd283613324565b840190509392505050565b60006020820190508181036000830152613ff8818486613fb0565b90509392505050565b7f4e6f7420656e6f756768204d6174696320706169640000000000000000000000600082015250565b60006140376015836132e0565b915061404282614001565b602082019050919050565b600060208201905081810360008301526140668161402a565b9050919050565b7f2e00000000000000000000000000000000000000000000000000000000000000600082015250565b60006140a3600183613cd0565b91506140ae8261406d565b600182019050919050565b60008190508160005260206000209050919050565b600081546140db81613b7a565b6140e58186613cd0565b94506001821660008114614100576001811461411157614144565b60ff19831686528186019350614144565b61411a856140b9565b60005b8381101561413c5781548189015260018201915060208101905061411d565b838801955050505b50505092915050565b600061415a828587613cdb565b915061416582614096565b915061417182846140ce565b9150819050949350505050565b600061418a82866140ce565b91506141968285613f5b565b91506141a282846140ce565b9150819050949350505050565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b60006141e5600a83613cd0565b91506141f0826141af565b600a82019050919050565b7f222c20226465736372697074696f6e223a20224120646f6d61696e206f6e207460008201527f68652054657374206e616d652073657276696365222c2022696d616765223a2060208201527f22646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000604082015250565b600061427d605b83613cd0565b9150614288826141fb565b605b82019050919050565b7f222c226c656e677468223a220000000000000000000000000000000000000000600082015250565b60006142c9600c83613cd0565b91506142d482614293565b600c82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614315600283613cd0565b9150614320826142df565b600282019050919050565b6000614336826141d8565b91506143428286613f5b565b915061434d82614270565b91506143598285613f5b565b9150614364826142bc565b91506143708284613f5b565b915061437b82614308565b9150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006143be601d83613cd0565b91506143c982614388565b601d82019050919050565b60006143df826143b1565b91506143eb8284613f5b565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061445f82613390565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561449257614491614425565b5b600182019050919050565b600060408201905081810360008301526144b78185613335565b905081810360208301526144cb8184613335565b90509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006145306025836132e0565b915061453b826144d4565b604082019050919050565b6000602082019050818103600083015261455f81614523565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145c26024836132e0565b91506145cd82614566565b604082019050919050565b600060208201905081810360008301526145f1816145b5565b9050919050565b600061460382613390565b915061460e83613390565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561464357614642614425565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006146846019836132e0565b915061468f8261464e565b602082019050919050565b600060208201905081810360008301526146b381614677565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147166032836132e0565b9150614721826146ba565b604082019050919050565b6000602082019050818103600083015261474581614709565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060808201905081810360008301526147958187613335565b905081810360208301526147a98186613335565b905081810360408301526147bd8185613335565b90506147cc6060830184613766565b95945050505050565b60006147e082613390565b91506147eb83613390565b9250826147fb576147fa61474c565b5b828204905092915050565b600061481182613390565b915061481c83613390565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561485557614854614425565b5b828202905092915050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006148bc602e836132e0565b91506148c782614860565b604082019050919050565b600060208201905081810360008301526148eb816148af565b9050919050565b6000606082019050818103600083015261490c8186613335565b905061491b6020830185613766565b818103604083015261492d8184613335565b9050949350505050565b600061494282613390565b915061494d83613390565b9250828210156149605761495f614425565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b60006149928261496b565b61499c8185614976565b93506149ac8185602086016132f1565b6149b581613324565b840191505092915050565b60006080820190506149d56000830187613425565b6149e26020830186613425565b6149ef6040830185613766565b8181036060830152614a018184614987565b905095945050505050565b600081519050614a1b81613246565b92915050565b600060208284031215614a3757614a36613210565b5b6000614a4584828501614a0c565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a846020836132e0565b9150614a8f82614a4e565b602082019050919050565b60006020820190508181036000830152614ab381614a77565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614af0601c836132e0565b9150614afb82614aba565b602082019050919050565b60006020820190508181036000830152614b1f81614ae3565b905091905056fe0a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5265676973746572696e672025732e2573206f6e2074686520636f6e7472616374207769746820746f6b656e49442025642d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122070a06c248494999635c52c47732788adea6ce0d2303ec300eb45ab1382fa9f7764736f6c634300080a00333c7376672077696474683d2232373022206865696768743d22323730222076696577426f783d223020302032373020323730222066696c6c3d226e6f6e652220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c706174682066696c6c3d22234635463546352220643d224d302030683237307632373048307a222f3e3c6720636c69702d706174683d2275726c28236129223e3c672066696c7465723d2275726c28236229222073686170652d72656e646572696e673d2263726973704564676573223e3c7061746820643d224d3020306832373076323730483056305a222066696c6c3d2275726c28236329222f3e3c7061746820643d224d2e352e356832363976323639482e35562e355a22207374726f6b653d2223303030222f3e3c2f673e3c656c6c697073652063783d2234382e35222063793d223731222072783d22382e35222072793d2238222066696c6c3d2223424345314637222f3e3c656c6c697073652063783d2234382e35222063793d223437222072783d22382e35222072793d2238222066696c6c3d2223464144333941222f3e3c656c6c697073652063783d2237342e35222063793d223437222072783d22382e35222072793d2238222066696c6c3d2223464141424142222066696c6c2d6f7061636974793d222e3932222f3e3c656c6c697073652063783d2237342e35222063793d223731222072783d22382e35222072793d2238222066696c6c3d2223666666222f3e3c2f673e3c646566733e3c6c696e6561724772616469656e742069643d2263222078313d2230222079313d2230222078323d22323730222079323d2232373022206772616469656e74556e6974733d227573657253706163654f6e557365223e3c73746f702073746f702d636f6c6f723d2223354539384545222073746f702d6f7061636974793d222e3536222f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d2223303041414542222073746f702d6f7061636974793d222e3939222f3e3c2f6c696e6561724772616469656e743e3c636c6970506174682069643d2261223e3c706174682066696c6c3d22236666662220643d224d302030683237307632373048307a222f3e3c2f636c6970506174683e3c66696c7465722069643d22622220783d222d342220793d2230222077696474683d2232373822206865696768743d22323738222066696c746572556e6974733d227573657253706163654f6e5573652220636f6c6f722d696e746572706f6c6174696f6e2d66696c746572733d2273524742223e3c6665466c6f6f6420666c6f6f642d6f7061636974793d22302220726573756c743d224261636b67726f756e64496d616765466978222f3e3c6665436f6c6f724d617472697820696e3d22536f75726365416c706861222076616c7565733d2230203020302030203020302030203020302030203020302030203020302030203020302031323720302220726573756c743d2268617264416c706861222f3e3c66654f66667365742064793d2234222f3e3c6665476175737369616e426c757220737464446576696174696f6e3d2232222f3e3c6665436f6d706f7369746520696e323d2268617264416c70686122206f70657261746f723d226f7574222f3e3c6665436f6c6f724d61747269782076616c7565733d22302030203020302030203020302030203020302030203020302030203020302030203020302e32352030222f3e3c6665426c656e6420696e323d224261636b67726f756e64496d6167654669782220726573756c743d22656666656374315f64726f70536861646f775f305f31222f3e3c6665436f6c6f724d617472697820696e3d22536f75726365416c706861222076616c7565733d2230203020302030203020302030203020302030203020302030203020302030203020302031323720302220726573756c743d2268617264416c706861222f3e3c66654f66667365742064793d2234222f3e3c6665476175737369616e426c757220737464446576696174696f6e3d2232222f3e3c6665436f6d706f7369746520696e323d2268617264416c70686122206f70657261746f723d226f7574222f3e3c6665436f6c6f724d61747269782076616c7565733d22302030203020302030203020302030203020302030203020302030203020302030203020302e32352030222f3e3c6665426c656e6420696e323d22656666656374315f64726f70536861646f775f305f312220726573756c743d22656666656374325f64726f70536861646f775f305f31222f3e3c6665426c656e6420696e3d22536f75726365477261706869632220696e323d22656666656374325f64726f70536861646f775f305f312220726573756c743d227368617065222f3e3c2f66696c7465723e3c2f646566733e3c7465787420783d2233322e352220793d223233312220666f6e742d73697a653d223136222066696c6c3d2223666666222066696c7465723d2275726c282341292220666f6e742d66616d696c793d22506c7573204a616b617274612053616e732c44656a6156752053616e732c4e6f746f20436f6c6f7220456d6f6a692c4170706c6520436f6c6f7220456d6f6a692c73616e732d73657269662220666f6e742d7765696768743d22626f6c64223e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000008666f6f7462616c6c000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000008666f6f7462616c6c000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tld (string): football
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [2] : 666f6f7462616c6c000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
125625:6653:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107562:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108490:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110002:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109520:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;131814:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110702:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;127929:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;125823:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132080:194;;;;;;;;;;;;;:::i;:::-;;111108:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;128090:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;127975:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108200:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107931:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;128254:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;131991:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108659:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;131326:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110245:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111364:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;131529:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;131640:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;123928:624;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110471:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;128475:1729;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;130905:360;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;130382:463;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107562:305;107664:4;107716:25;107701:40;;;:11;:40;;;;:105;;;;107773:33;107758:48;;;:11;:48;;;;107701:105;:158;;;;107823:36;107847:11;107823:23;:36::i;:::-;107701:158;107681:178;;107562:305;;;:::o;108490:100::-;108544:13;108577:5;108570:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108490:100;:::o;110002:171::-;110078:7;110098:23;110113:7;110098:14;:23::i;:::-;110141:15;:24;110157:7;110141:24;;;;;;;;;;;;;;;;;;;;;110134:31;;110002:171;;;:::o;109520:416::-;109601:13;109617:23;109632:7;109617:14;:23::i;:::-;109601:39;;109665:5;109659:11;;:2;:11;;;;109651:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;109759:5;109743:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;109768:37;109785:5;109792:12;:10;:12::i;:::-;109768:16;:37::i;:::-;109743:62;109721:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;109907:21;109916:2;109920:7;109907:8;:21::i;:::-;109590:346;109520:416;;:::o;131814:109::-;131875:13;131904:7;131912:4;;131904:13;;;;;;;:::i;:::-;;;;;;;;;;;;;131897:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;131814:109;;;;:::o;110702:335::-;110897:41;110916:12;:10;:12::i;:::-;110930:7;110897:18;:41::i;:::-;110889:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;111001:28;111011:4;111017:2;111021:7;111001:9;:28::i;:::-;110702:335;;;:::o;127929:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;125823:17::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;132080:194::-;131963:9;:7;:9::i;:::-;131955:18;;;;;;132122:11:::1;132136:21;132122:35;;132167:12;132185:10;:15;;132208:6;132185:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;132166:53;;;132232:7;132224:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;132117:157;;132080:194::o:0;111108:185::-;111246:39;111263:4;111269:2;111273:7;111246:39;;;;;;;;;;;;:16;:39::i;:::-;111108:185;;;:::o;128090:37::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;127975:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;108200:223::-;108272:7;108292:13;108308:17;108317:7;108308:8;:17::i;:::-;108292:33;;108361:1;108344:19;;:5;:19;;;;108336:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;108410:5;108403:12;;;108200:223;;;:::o;107931:207::-;108003:7;108048:1;108031:19;;:5;:19;;;;108023:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;108114:9;:16;108124:5;108114:16;;;;;;;;;;;;;;;;108107:23;;107931:207;;;:::o;128254:28::-;;;;;;;;;;;;;:::o;131991:83::-;132031:4;132063:5;;;;;;;;;;;132049:19;;:10;:19;;;132042:26;;131991:83;:::o;108659:104::-;108715:13;108748:7;108741:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108659:104;:::o;131326:146::-;131383:4;131431:1;131403:24;131422:4;;131403:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:24::i;:::-;:29;;:63;;;;;131464:2;131436:24;131455:4;;131436:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:24::i;:::-;:30;;131403:63;131396:70;;131326:146;;;;:::o;110245:155::-;110340:52;110359:12;:10;:12::i;:::-;110373:8;110383;110340:18;:52::i;:::-;110245:155;;:::o;111364:322::-;111538:41;111557:12;:10;:12::i;:::-;111571:7;111538:18;:41::i;:::-;111530:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;111640:38;111654:4;111660:2;111664:7;111673:4;111640:13;:38::i;:::-;111364:322;;;;:::o;131529:105::-;131592:7;131615;131623:4;;131615:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;131608:20;;131529:105;;;;:::o;131640:168::-;131737:7;131745:4;;131737:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;131723:27;;:10;:27;;;131719:54;;131759:14;;;;;;;;;;;;;;131719:54;131796:6;;131780:7;131788:4;;131780:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;131640:168;;;;:::o;123928:624::-;124001:13;124027:23;124042:7;124027:14;:23::i;:::-;124063;124089:10;:19;124100:7;124089:19;;;;;;;;;;;124063:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124119:18;124140:10;:8;:10::i;:::-;124119:31;;124248:1;124232:4;124226:18;:23;124222:72;;;124273:9;124266:16;;;;;;124222:72;124424:1;124404:9;124398:23;:27;124394:108;;;124473:4;124479:9;124456:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;124442:48;;;;;;124394:108;124521:23;124536:7;124521:14;:23::i;:::-;124514:30;;;;123928:624;;;;:::o;110471:164::-;110568:4;110592:18;:25;110611:5;110592:25;;;;;;;;;;;;;;;:35;110618:8;110592:35;;;;;;;;;;;;;;;;;;;;;;;;;110585:42;;110471:164;;;;:::o;128475:1729::-;128566:1;128541:27;;:7;128549:4;;128541:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:27;;;128537:59;;128577:19;;;;;;;;;;;;;;128537:59;128608:11;128614:4;;128608:5;:11::i;:::-;128603:42;;128640:4;;128628:17;;;;;;;;;;;;:::i;:::-;;;;;;;;128603:42;128654:14;128671:11;128677:4;;128671:5;:11::i;:::-;128654:28;;128710:6;128697:9;:19;;128689:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;128819:19;128865:4;;128876:3;128848:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;128819:62;;128945:22;128994:10;129006:5;129013:10;128977:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;128945:80;;129032:19;129054;:9;:17;:19::i;:::-;129032:41;;129080:14;129097:24;129116:4;;129097:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:24::i;:::-;129080:41;;129128:20;129151:24;129168:6;129151:16;:24::i;:::-;129128:47;;129184:88;;;;;;;;;;;;;;;;;;129249:4;;129184:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;129255:3;129184:88;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;129260:11;129184;:88::i;:::-;129381:18;129402:295;129474:5;129594:30;129614:8;129594:13;:30::i;:::-;129660:6;129424:266;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;129402:13;:295::i;:::-;129381:316;;129706:27;129794:4;129744:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;129706:94;;129809:73;;;;;;;;;;;;;;;;;;:11;:73::i;:::-;129889:44;;;;;;;;;;;;;;;;;;129919:13;129889:11;:44::i;:::-;129940:73;;;;;;;;;;;;;;;;;;:11;:73::i;:::-;130022:34;130032:10;130044:11;130022:9;:34::i;:::-;130063:40;130076:11;130089:13;130063:12;:40::i;:::-;130126:10;130110:7;130118:4;;130110:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;130166:4;;130145:5;:18;130151:11;130145:18;;;;;;;;;;;:25;;;;;;;:::i;:::-;;130177:21;:9;:19;:21::i;:::-;128530:1674;;;;;;;;128475:1729;;:::o;130905:360::-;130949:15;130973:46;;;;;;;;;;;;;;;;;;:11;:46::i;:::-;131026:24;131066:19;:9;:17;:19::i;:::-;131053:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;131026:60;;131098:6;131093:143;131114:19;:9;:17;:19::i;:::-;131110:1;:23;131093:143;;;131161:5;:8;131167:1;131161:8;;;;;;;;;;;131147:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;131156:1;131147:11;;;;;;;;:::i;:::-;;;;;;;:22;;;;131176:54;;;;;;;;;;;;;;;;;;131215:1;131218:8;131227:1;131218:11;;;;;;;;:::i;:::-;;;;;;;;131176;:54::i;:::-;131135:3;;;;;:::i;:::-;;;;131093:143;;;;131251:8;131244:15;;;130905:360;:::o;130382:463::-;130439:4;130452:8;130463:24;130482:4;;130463:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:24::i;:::-;130452:35;;130508:1;130502:3;:7;130494:16;;;;;;130528:1;130521:3;:8;130517:323;;;130547:11;130540:18;;;;;130517:323;130699:1;130692:3;:8;130688:152;;;130718:11;130711:18;;;;;130688:152;130822:10;130815:17;;;130382:463;;;;;:::o;6397:143::-;6465:70;6527:2;6531;6481:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6465:15;:70::i;:::-;6397:143;;:::o;100074:157::-;100159:4;100198:25;100183:40;;;:11;:40;;;;100176:47;;100074:157;;;:::o;119821:135::-;119903:16;119911:7;119903;:16::i;:::-;119895:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;119821:135;:::o;87596:98::-;87649:7;87676:10;87669:17;;87596:98;:::o;119100:174::-;119202:2;119175:15;:24;119191:7;119175:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;119258:7;119254:2;119220:46;;119229:23;119244:7;119229:14;:23::i;:::-;119220:46;;;;;;;;;;;;119100:174;;:::o;113719:264::-;113812:4;113829:13;113845:23;113860:7;113845:14;:23::i;:::-;113829:39;;113898:5;113887:16;;:7;:16;;;:52;;;;113907:32;113924:5;113931:7;113907:16;:32::i;:::-;113887:52;:87;;;;113967:7;113943:31;;:20;113955:7;113943:11;:20::i;:::-;:31;;;113887:87;113879:96;;;113719:264;;;;:::o;117718:1263::-;117877:4;117850:31;;:23;117865:7;117850:14;:23::i;:::-;:31;;;117842:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;117956:1;117942:16;;:2;:16;;;;117934:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;118012:42;118033:4;118039:2;118043:7;118052:1;118012:20;:42::i;:::-;118184:4;118157:31;;:23;118172:7;118157:14;:23::i;:::-;:31;;;118149:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;118302:15;:24;118318:7;118302:24;;;;;;;;;;;;118295:31;;;;;;;;;;;118797:1;118778:9;:15;118788:4;118778:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;118830:1;118813:9;:13;118823:2;118813:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;118872:2;118853:7;:16;118861:7;118853:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;118911:7;118907:2;118892:27;;118901:4;118892:27;;;;;;;;;;;;118932:41;118952:4;118958:2;118962:7;118971:1;118932:19;:41::i;:::-;117718:1263;;;:::o;112994:117::-;113060:7;113087;:16;113095:7;113087:16;;;;;;;;;;;;;;;;;;;;;113080:23;;112994:117;;;:::o;69619:629::-;69675:4;69692:8;69711:6;69732:15;69756:1;69750:15;69732:33;;69786:1;69780:7;;69776:444;69793:10;69789:1;:14;69776:444;;;69827:8;69844:1;69847;69838:11;;;;;;;;:::i;:::-;;;;;;;;;;69827:22;;69871:4;69867:8;;:1;:8;;;;69864:345;;;69901:1;69896:6;;;;;:::i;:::-;;;69864:345;;;69932:4;69928:8;;:1;:8;;;;69924:285;;;69962:1;69957:6;;;;;:::i;:::-;;;69924:285;;;69993:4;69989:8;;:1;:8;;;;69985:224;;;70023:1;70018:6;;;;;:::i;:::-;;;69985:224;;;70054:4;70050:8;;:1;:8;;;;70046:163;;;70084:1;70079:6;;;;;:::i;:::-;;;70046:163;;;70115:4;70111:8;;:1;:8;;;;70107:102;;;70145:1;70140:6;;;;;:::i;:::-;;;70107:102;;;70192:1;70187:6;;;;;:::i;:::-;;;70107:102;70046:163;69985:224;69924:285;69864:345;69812:408;69805:5;;;;;:::i;:::-;;;;69776:444;;;70237:3;70230:10;;;;;69619:629;;;:::o;119417:315::-;119572:8;119563:17;;:5;:17;;;;119555:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;119659:8;119621:18;:25;119640:5;119621:25;;;;;;;;;;;;;;;:35;119647:8;119621:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;119705:8;119683:41;;119698:5;119683:41;;;119715:8;119683:41;;;;;;:::i;:::-;;;;;;;;119417:315;;;:::o;112567:313::-;112723:28;112733:4;112739:2;112743:7;112723:9;:28::i;:::-;112770:47;112793:4;112799:2;112803:7;112812:4;112770:22;:47::i;:::-;112762:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;112567:313;;;;:::o;109364:94::-;109415:13;109441:9;;;;;;;;;;;;;;109364:94;:::o;108834:281::-;108907:13;108933:23;108948:7;108933:14;:23::i;:::-;108969:21;108993:10;:8;:10::i;:::-;108969:34;;109045:1;109027:7;109021:21;:25;:86;;;;;;;;;;;;;;;;;109073:7;109082:18;:7;:16;:18::i;:::-;109056:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;109021:86;109014:93;;;108834:281;;;:::o;71125:114::-;71190:7;71217;:14;;;71210:21;;71125:114;;;:::o;85023:716::-;85079:13;85130:14;85167:1;85147:17;85158:5;85147:10;:17::i;:::-;:21;85130:38;;85183:20;85217:6;85206:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85183:41;;85239:11;85368:6;85364:2;85360:15;85352:6;85348:28;85341:35;;85405:288;85412:4;85405:288;;;85437:5;;;;;;;;85579:8;85574:2;85567:5;85563:14;85558:30;85553:3;85545:44;85635:2;85626:11;;;;;;:::i;:::-;;;;;85669:1;85660:5;:10;85656:21;;;85672:5;;85656:21;85405:288;;;85714:6;85707:13;;;;;85023:716;;;:::o;33910:196::-;34008:93;34085:2;34089;34093;34097;34024:76;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34008:15;:93::i;:::-;33910:196;;;;:::o;66133:3097::-;66191:13;66443:1;66428:4;:11;:16;66424:31;;;66446:9;;;;;;;;;;;;;;;;66424:31;66508:19;66530:6;;;;;;;;;;;;;;;;;66508:28;;66947:20;67006:1;67001;66987:4;:11;:15;;;;:::i;:::-;66986:21;;;;:::i;:::-;66981:1;:27;;;;:::i;:::-;66970:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66947:62;;67189:1;67182:5;67178:13;67293:2;67285:6;67281:15;67404:4;67456;67450:11;67444:4;67440:22;67366:1432;67490:6;67481:7;67478:19;67366:1432;;;67596:1;67587:7;67583:15;67572:26;;67635:7;67629:14;68288:4;68280:5;68276:2;68272:14;68268:25;68258:8;68254:40;68248:47;68237:9;68229:67;68342:1;68331:9;68327:17;68314:30;;68434:4;68426:5;68422:2;68418:14;68414:25;68404:8;68400:40;68394:47;68383:9;68375:67;68488:1;68477:9;68473:17;68460:30;;68579:4;68571:5;68568:1;68564:13;68560:24;68550:8;68546:39;68540:46;68529:9;68521:66;68633:1;68622:9;68618:17;68605:30;;68716:4;68709:5;68705:16;68695:8;68691:31;68685:38;68674:9;68666:58;68770:1;68759:9;68755:17;68742:30;;67517:1281;67366:1432;;;67370:107;;68960:1;68953:4;68947:11;68943:19;68981:1;68976:123;;;;69118:1;69113:73;;;;68936:250;;68976:123;69029:4;69025:1;69014:9;69010:17;69002:32;69079:4;69075:1;69064:9;69060:17;69052:32;68976:123;;69113:73;69166:4;69162:1;69151:9;69147:17;69139:32;68936:250;;67075:2122;;69216:6;69209:13;;;;66133:3097;;;;:::o;5362:114::-;5412:59;5467:2;5428:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5412:15;:59::i;:::-;5362:114;:::o;114325:110::-;114401:26;114411:2;114415:7;114401:26;;;;;;;;;;;;:9;:26::i;:::-;114325:110;;:::o;124708:217::-;124808:16;124816:7;124808;:16::i;:::-;124800:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;124908:9;124886:10;:19;124897:7;124886:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;124708:217;;:::o;71247:127::-;71354:1;71336:7;:14;;;:19;;;;;;;;;;;71247:127;:::o;10654:167::-;10734:82;10804:2;10808;10812;10750:65;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10734:15;:82::i;:::-;10654:167;;;:::o;297:295::-;362:21;386:7;:14;362:38;;405:22;248:42;405:40;;498:2;489:7;485:16;581:1;578;563:13;549:12;533:14;526:5;515:68;459:129;;;;297:295;:::o;113424:128::-;113489:4;113542:1;113513:31;;:17;113522:7;113513:8;:17::i;:::-;:31;;;;113506:38;;113424:128;;;:::o;122105:410::-;122295:1;122283:9;:13;122279:229;;;122333:1;122317:18;;:4;:18;;;122313:87;;122375:9;122356;:15;122366:4;122356:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;122313:87;122432:1;122418:16;;:2;:16;;;122414:83;;122472:9;122455;:13;122465:2;122455:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;122414:83;122279:229;122105:410;;;;:::o;123237:158::-;;;;;:::o;120520:853::-;120674:4;120695:15;:2;:13;;;:15::i;:::-;120691:675;;;120747:2;120731:36;;;120768:12;:10;:12::i;:::-;120782:4;120788:7;120797:4;120731:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;120727:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120989:1;120972:6;:13;:18;120968:328;;;121015:60;;;;;;;;;;:::i;:::-;;;;;;;;120968:328;121246:6;121240:13;121231:6;121227:2;121223:15;121216:38;120727:584;120863:41;;;120853:51;;;:6;:51;;;;120846:58;;;;;120691:675;121350:4;121343:11;;120520:853;;;;;;;:::o;81889:922::-;81942:7;81962:14;81979:1;81962:18;;82029:6;82020:5;:15;82016:102;;82065:6;82056:15;;;;;;:::i;:::-;;;;;82100:2;82090:12;;;;82016:102;82145:6;82136:5;:15;82132:102;;82181:6;82172:15;;;;;;:::i;:::-;;;;;82216:2;82206:12;;;;82132:102;82261:6;82252:5;:15;82248:102;;82297:6;82288:15;;;;;;:::i;:::-;;;;;82332:2;82322:12;;;;82248:102;82377:5;82368;:14;82364:99;;82412:5;82403:14;;;;;;:::i;:::-;;;;;82446:1;82436:11;;;;82364:99;82490:5;82481;:14;82477:99;;82525:5;82516:14;;;;;;:::i;:::-;;;;;82559:1;82549:11;;;;82477:99;82603:5;82594;:14;82590:99;;82638:5;82629:14;;;;;;:::i;:::-;;;;;82672:1;82662:11;;;;82590:99;82716:5;82707;:14;82703:66;;82752:1;82742:11;;;;82703:66;82797:6;82790:13;;;81889:922;;;:::o;114662:319::-;114791:18;114797:2;114801:7;114791:5;:18::i;:::-;114842:53;114873:1;114877:2;114881:7;114890:4;114842:22;:53::i;:::-;114820:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;114662:319;;;:::o;89043:326::-;89103:4;89360:1;89338:7;:19;;;:23;89331:30;;89043:326;;;:::o;115317:942::-;115411:1;115397:16;;:2;:16;;;;115389:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;115470:16;115478:7;115470;:16::i;:::-;115469:17;115461:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;115532:48;115561:1;115565:2;115569:7;115578:1;115532:20;:48::i;:::-;115679:16;115687:7;115679;:16::i;:::-;115678:17;115670:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;116094:1;116077:9;:13;116087:2;116077:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;116138:2;116119:7;:16;116127:7;116119:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;116183:7;116179:2;116158:33;;116175:1;116158:33;;;;;;;;;;;;116204:47;116232:1;116236:2;116240:7;116249:1;116204:19;:47::i;:::-;115317:942;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:117;5293:1;5290;5283:12;5321:553;5379:8;5389:6;5439:3;5432:4;5424:6;5420:17;5416:27;5406:122;;5447:79;;:::i;:::-;5406:122;5560:6;5547:20;5537:30;;5590:18;5582:6;5579:30;5576:117;;;5612:79;;:::i;:::-;5576:117;5726:4;5718:6;5714:17;5702:29;;5780:3;5772:4;5764:6;5760:17;5750:8;5746:32;5743:41;5740:128;;;5787:79;;:::i;:::-;5740:128;5321:553;;;;;:::o;5880:529::-;5951:6;5959;6008:2;5996:9;5987:7;5983:23;5979:32;5976:119;;;6014:79;;:::i;:::-;5976:119;6162:1;6151:9;6147:17;6134:31;6192:18;6184:6;6181:30;6178:117;;;6214:79;;:::i;:::-;6178:117;6327:65;6384:7;6375:6;6364:9;6360:22;6327:65;:::i;:::-;6309:83;;;;6105:297;5880:529;;;;;:::o;6415:619::-;6492:6;6500;6508;6557:2;6545:9;6536:7;6532:23;6528:32;6525:119;;;6563:79;;:::i;:::-;6525:119;6683:1;6708:53;6753:7;6744:6;6733:9;6729:22;6708:53;:::i;:::-;6698:63;;6654:117;6810:2;6836:53;6881:7;6872:6;6861:9;6857:22;6836:53;:::i;:::-;6826:63;;6781:118;6938:2;6964:53;7009:7;7000:6;6989:9;6985:22;6964:53;:::i;:::-;6954:63;;6909:118;6415:619;;;;;:::o;7040:117::-;7149:1;7146;7139:12;7163:180;7211:77;7208:1;7201:88;7308:4;7305:1;7298:15;7332:4;7329:1;7322:15;7349:281;7432:27;7454:4;7432:27;:::i;:::-;7424:6;7420:40;7562:6;7550:10;7547:22;7526:18;7514:10;7511:34;7508:62;7505:88;;;7573:18;;:::i;:::-;7505:88;7613:10;7609:2;7602:22;7392:238;7349:281;;:::o;7636:129::-;7670:6;7697:20;;:::i;:::-;7687:30;;7726:33;7754:4;7746:6;7726:33;:::i;:::-;7636:129;;;:::o;7771:308::-;7833:4;7923:18;7915:6;7912:30;7909:56;;;7945:18;;:::i;:::-;7909:56;7983:29;8005:6;7983:29;:::i;:::-;7975:37;;8067:4;8061;8057:15;8049:23;;7771:308;;;:::o;8085:154::-;8169:6;8164:3;8159;8146:30;8231:1;8222:6;8217:3;8213:16;8206:27;8085:154;;;:::o;8245:412::-;8323:5;8348:66;8364:49;8406:6;8364:49;:::i;:::-;8348:66;:::i;:::-;8339:75;;8437:6;8430:5;8423:21;8475:4;8468:5;8464:16;8513:3;8504:6;8499:3;8495:16;8492:25;8489:112;;;8520:79;;:::i;:::-;8489:112;8610:41;8644:6;8639:3;8634;8610:41;:::i;:::-;8329:328;8245:412;;;;;:::o;8677:340::-;8733:5;8782:3;8775:4;8767:6;8763:17;8759:27;8749:122;;8790:79;;:::i;:::-;8749:122;8907:6;8894:20;8932:79;9007:3;8999:6;8992:4;8984:6;8980:17;8932:79;:::i;:::-;8923:88;;8739:278;8677:340;;;;:::o;9023:509::-;9092:6;9141:2;9129:9;9120:7;9116:23;9112:32;9109:119;;;9147:79;;:::i;:::-;9109:119;9295:1;9284:9;9280:17;9267:31;9325:18;9317:6;9314:30;9311:117;;;9347:79;;:::i;:::-;9311:117;9452:63;9507:7;9498:6;9487:9;9483:22;9452:63;:::i;:::-;9442:73;;9238:287;9023:509;;;;:::o;9538:329::-;9597:6;9646:2;9634:9;9625:7;9621:23;9617:32;9614:119;;;9652:79;;:::i;:::-;9614:119;9772:1;9797:53;9842:7;9833:6;9822:9;9818:22;9797:53;:::i;:::-;9787:63;;9743:117;9538:329;;;;:::o;9873:118::-;9960:24;9978:5;9960:24;:::i;:::-;9955:3;9948:37;9873:118;;:::o;9997:222::-;10090:4;10128:2;10117:9;10113:18;10105:26;;10141:71;10209:1;10198:9;10194:17;10185:6;10141:71;:::i;:::-;9997:222;;;;:::o;10225:104::-;10270:7;10299:24;10317:5;10299:24;:::i;:::-;10288:35;;10225:104;;;:::o;10335:142::-;10438:32;10464:5;10438:32;:::i;:::-;10433:3;10426:45;10335:142;;:::o;10483:254::-;10592:4;10630:2;10619:9;10615:18;10607:26;;10643:87;10727:1;10716:9;10712:17;10703:6;10643:87;:::i;:::-;10483:254;;;;:::o;10743:116::-;10813:21;10828:5;10813:21;:::i;:::-;10806:5;10803:32;10793:60;;10849:1;10846;10839:12;10793:60;10743:116;:::o;10865:133::-;10908:5;10946:6;10933:20;10924:29;;10962:30;10986:5;10962:30;:::i;:::-;10865:133;;;;:::o;11004:468::-;11069:6;11077;11126:2;11114:9;11105:7;11101:23;11097:32;11094:119;;;11132:79;;:::i;:::-;11094:119;11252:1;11277:53;11322:7;11313:6;11302:9;11298:22;11277:53;:::i;:::-;11267:63;;11223:117;11379:2;11405:50;11447:7;11438:6;11427:9;11423:22;11405:50;:::i;:::-;11395:60;;11350:115;11004:468;;;;;:::o;11478:307::-;11539:4;11629:18;11621:6;11618:30;11615:56;;;11651:18;;:::i;:::-;11615:56;11689:29;11711:6;11689:29;:::i;:::-;11681:37;;11773:4;11767;11763:15;11755:23;;11478:307;;;:::o;11791:410::-;11868:5;11893:65;11909:48;11950:6;11909:48;:::i;:::-;11893:65;:::i;:::-;11884:74;;11981:6;11974:5;11967:21;12019:4;12012:5;12008:16;12057:3;12048:6;12043:3;12039:16;12036:25;12033:112;;;12064:79;;:::i;:::-;12033:112;12154:41;12188:6;12183:3;12178;12154:41;:::i;:::-;11874:327;11791:410;;;;;:::o;12220:338::-;12275:5;12324:3;12317:4;12309:6;12305:17;12301:27;12291:122;;12332:79;;:::i;:::-;12291:122;12449:6;12436:20;12474:78;12548:3;12540:6;12533:4;12525:6;12521:17;12474:78;:::i;:::-;12465:87;;12281:277;12220:338;;;;:::o;12564:943::-;12659:6;12667;12675;12683;12732:3;12720:9;12711:7;12707:23;12703:33;12700:120;;;12739:79;;:::i;:::-;12700:120;12859:1;12884:53;12929:7;12920:6;12909:9;12905:22;12884:53;:::i;:::-;12874:63;;12830:117;12986:2;13012:53;13057:7;13048:6;13037:9;13033:22;13012:53;:::i;:::-;13002:63;;12957:118;13114:2;13140:53;13185:7;13176:6;13165:9;13161:22;13140:53;:::i;:::-;13130:63;;13085:118;13270:2;13259:9;13255:18;13242:32;13301:18;13293:6;13290:30;13287:117;;;13323:79;;:::i;:::-;13287:117;13428:62;13482:7;13473:6;13462:9;13458:22;13428:62;:::i;:::-;13418:72;;13213:287;12564:943;;;;;;;:::o;13513:874::-;13605:6;13613;13621;13629;13678:2;13666:9;13657:7;13653:23;13649:32;13646:119;;;13684:79;;:::i;:::-;13646:119;13832:1;13821:9;13817:17;13804:31;13862:18;13854:6;13851:30;13848:117;;;13884:79;;:::i;:::-;13848:117;13997:65;14054:7;14045:6;14034:9;14030:22;13997:65;:::i;:::-;13979:83;;;;13775:297;14139:2;14128:9;14124:18;14111:32;14170:18;14162:6;14159:30;14156:117;;;14192:79;;:::i;:::-;14156:117;14305:65;14362:7;14353:6;14342:9;14338:22;14305:65;:::i;:::-;14287:83;;;;14082:298;13513:874;;;;;;;:::o;14393:474::-;14461:6;14469;14518:2;14506:9;14497:7;14493:23;14489:32;14486:119;;;14524:79;;:::i;:::-;14486:119;14644:1;14669:53;14714:7;14705:6;14694:9;14690:22;14669:53;:::i;:::-;14659:63;;14615:117;14771:2;14797:53;14842:7;14833:6;14822:9;14818:22;14797:53;:::i;:::-;14787:63;;14742:118;14393:474;;;;;:::o;14873:124::-;14950:6;14984:5;14978:12;14968:22;;14873:124;;;:::o;15003:194::-;15112:11;15146:6;15141:3;15134:19;15186:4;15181:3;15177:14;15162:29;;15003:194;;;;:::o;15203:142::-;15280:4;15303:3;15295:11;;15333:4;15328:3;15324:14;15316:22;;15203:142;;;:::o;15351:159::-;15425:11;15459:6;15454:3;15447:19;15499:4;15494:3;15490:14;15475:29;;15351:159;;;;:::o;15516:344::-;15594:3;15622:39;15655:5;15622:39;:::i;:::-;15677:61;15731:6;15726:3;15677:61;:::i;:::-;15670:68;;15747:52;15792:6;15787:3;15780:4;15773:5;15769:16;15747:52;:::i;:::-;15824:29;15846:6;15824:29;:::i;:::-;15819:3;15815:39;15808:46;;15598:262;15516:344;;;;:::o;15866:196::-;15955:10;15990:66;16052:3;16044:6;15990:66;:::i;:::-;15976:80;;15866:196;;;;:::o;16068:123::-;16148:4;16180;16175:3;16171:14;16163:22;;16068:123;;;:::o;16225:991::-;16364:3;16393:64;16451:5;16393:64;:::i;:::-;16473:96;16562:6;16557:3;16473:96;:::i;:::-;16466:103;;16595:3;16640:4;16632:6;16628:17;16623:3;16619:27;16670:66;16730:5;16670:66;:::i;:::-;16759:7;16790:1;16775:396;16800:6;16797:1;16794:13;16775:396;;;16871:9;16865:4;16861:20;16856:3;16849:33;16922:6;16916:13;16950:84;17029:4;17014:13;16950:84;:::i;:::-;16942:92;;17057:70;17120:6;17057:70;:::i;:::-;17047:80;;17156:4;17151:3;17147:14;17140:21;;16835:336;16822:1;16819;16815:9;16810:14;;16775:396;;;16779:14;17187:4;17180:11;;17207:3;17200:10;;16369:847;;;;;16225:991;;;;:::o;17222:413::-;17385:4;17423:2;17412:9;17408:18;17400:26;;17472:9;17466:4;17462:20;17458:1;17447:9;17443:17;17436:47;17500:128;17623:4;17614:6;17500:128;:::i;:::-;17492:136;;17222:413;;;;:::o;17641:180::-;17689:77;17686:1;17679:88;17786:4;17783:1;17776:15;17810:4;17807:1;17800:15;17827:320;17871:6;17908:1;17902:4;17898:12;17888:22;;17955:1;17949:4;17945:12;17976:18;17966:81;;18032:4;18024:6;18020:17;18010:27;;17966:81;18094:2;18086:6;18083:14;18063:18;18060:38;18057:84;;;18113:18;;:::i;:::-;18057:84;17878:269;17827:320;;;:::o;18153:220::-;18293:34;18289:1;18281:6;18277:14;18270:58;18362:3;18357:2;18349:6;18345:15;18338:28;18153:220;:::o;18379:366::-;18521:3;18542:67;18606:2;18601:3;18542:67;:::i;:::-;18535:74;;18618:93;18707:3;18618:93;:::i;:::-;18736:2;18731:3;18727:12;18720:19;;18379:366;;;:::o;18751:419::-;18917:4;18955:2;18944:9;18940:18;18932:26;;19004:9;18998:4;18994:20;18990:1;18979:9;18975:17;18968:47;19032:131;19158:4;19032:131;:::i;:::-;19024:139;;18751:419;;;:::o;19176:248::-;19316:34;19312:1;19304:6;19300:14;19293:58;19385:31;19380:2;19372:6;19368:15;19361:56;19176:248;:::o;19430:366::-;19572:3;19593:67;19657:2;19652:3;19593:67;:::i;:::-;19586:74;;19669:93;19758:3;19669:93;:::i;:::-;19787:2;19782:3;19778:12;19771:19;;19430:366;;;:::o;19802:419::-;19968:4;20006:2;19995:9;19991:18;19983:26;;20055:9;20049:4;20045:20;20041:1;20030:9;20026:17;20019:47;20083:131;20209:4;20083:131;:::i;:::-;20075:139;;19802:419;;;:::o;20227:148::-;20329:11;20366:3;20351:18;;20227:148;;;;:::o;20405:317::-;20521:3;20542:89;20624:6;20619:3;20542:89;:::i;:::-;20535:96;;20641:43;20677:6;20672:3;20665:5;20641:43;:::i;:::-;20709:6;20704:3;20700:16;20693:23;;20405:317;;;;;:::o;20728:295::-;20870:3;20892:105;20993:3;20984:6;20976;20892:105;:::i;:::-;20885:112;;21014:3;21007:10;;20728:295;;;;;:::o;21029:232::-;21169:34;21165:1;21157:6;21153:14;21146:58;21238:15;21233:2;21225:6;21221:15;21214:40;21029:232;:::o;21267:366::-;21409:3;21430:67;21494:2;21489:3;21430:67;:::i;:::-;21423:74;;21506:93;21595:3;21506:93;:::i;:::-;21624:2;21619:3;21615:12;21608:19;;21267:366;;;:::o;21639:419::-;21805:4;21843:2;21832:9;21828:18;21820:26;;21892:9;21886:4;21882:20;21878:1;21867:9;21863:17;21856:47;21920:131;22046:4;21920:131;:::i;:::-;21912:139;;21639:419;;;:::o;22064:147::-;22165:11;22202:3;22187:18;;22064:147;;;;:::o;22217:114::-;;:::o;22337:398::-;22496:3;22517:83;22598:1;22593:3;22517:83;:::i;:::-;22510:90;;22609:93;22698:3;22609:93;:::i;:::-;22727:1;22722:3;22718:11;22711:18;;22337:398;;;:::o;22741:379::-;22925:3;22947:147;23090:3;22947:147;:::i;:::-;22940:154;;23111:3;23104:10;;22741:379;;;:::o;23126:174::-;23266:26;23262:1;23254:6;23250:14;23243:50;23126:174;:::o;23306:366::-;23448:3;23469:67;23533:2;23528:3;23469:67;:::i;:::-;23462:74;;23545:93;23634:3;23545:93;:::i;:::-;23663:2;23658:3;23654:12;23647:19;;23306:366;;;:::o;23678:419::-;23844:4;23882:2;23871:9;23867:18;23859:26;;23931:9;23925:4;23921:20;23917:1;23906:9;23902:17;23895:47;23959:131;24085:4;23959:131;:::i;:::-;23951:139;;23678:419;;;:::o;24103:174::-;24243:26;24239:1;24231:6;24227:14;24220:50;24103:174;:::o;24283:366::-;24425:3;24446:67;24510:2;24505:3;24446:67;:::i;:::-;24439:74;;24522:93;24611:3;24522:93;:::i;:::-;24640:2;24635:3;24631:12;24624:19;;24283:366;;;:::o;24655:419::-;24821:4;24859:2;24848:9;24844:18;24836:26;;24908:9;24902:4;24898:20;24894:1;24883:9;24879:17;24872:47;24936:131;25062:4;24936:131;:::i;:::-;24928:139;;24655:419;;;:::o;25080:228::-;25220:34;25216:1;25208:6;25204:14;25197:58;25289:11;25284:2;25276:6;25272:15;25265:36;25080:228;:::o;25314:366::-;25456:3;25477:67;25541:2;25536:3;25477:67;:::i;:::-;25470:74;;25553:93;25642:3;25553:93;:::i;:::-;25671:2;25666:3;25662:12;25655:19;;25314:366;;;:::o;25686:419::-;25852:4;25890:2;25879:9;25875:18;25867:26;;25939:9;25933:4;25929:20;25925:1;25914:9;25910:17;25903:47;25967:131;26093:4;25967:131;:::i;:::-;25959:139;;25686:419;;;:::o;26111:377::-;26217:3;26245:39;26278:5;26245:39;:::i;:::-;26300:89;26382:6;26377:3;26300:89;:::i;:::-;26293:96;;26398:52;26443:6;26438:3;26431:4;26424:5;26420:16;26398:52;:::i;:::-;26475:6;26470:3;26466:16;26459:23;;26221:267;26111:377;;;;:::o;26494:435::-;26674:3;26696:95;26787:3;26778:6;26696:95;:::i;:::-;26689:102;;26808:95;26899:3;26890:6;26808:95;:::i;:::-;26801:102;;26920:3;26913:10;;26494:435;;;;;:::o;26959:304::-;27057:3;27078:71;27142:6;27137:3;27078:71;:::i;:::-;27071:78;;27159:43;27195:6;27190:3;27183:5;27159:43;:::i;:::-;27227:29;27249:6;27227:29;:::i;:::-;27222:3;27218:39;27211:46;;26959:304;;;;;:::o;27269:333::-;27392:4;27430:2;27419:9;27415:18;27407:26;;27479:9;27473:4;27469:20;27465:1;27454:9;27450:17;27443:47;27507:88;27590:4;27581:6;27573;27507:88;:::i;:::-;27499:96;;27269:333;;;;;:::o;27608:171::-;27748:23;27744:1;27736:6;27732:14;27725:47;27608:171;:::o;27785:366::-;27927:3;27948:67;28012:2;28007:3;27948:67;:::i;:::-;27941:74;;28024:93;28113:3;28024:93;:::i;:::-;28142:2;28137:3;28133:12;28126:19;;27785:366;;;:::o;28157:419::-;28323:4;28361:2;28350:9;28346:18;28338:26;;28410:9;28404:4;28400:20;28396:1;28385:9;28381:17;28374:47;28438:131;28564:4;28438:131;:::i;:::-;28430:139;;28157:419;;;:::o;28582:151::-;28722:3;28718:1;28710:6;28706:14;28699:27;28582:151;:::o;28739:400::-;28899:3;28920:84;29002:1;28997:3;28920:84;:::i;:::-;28913:91;;29013:93;29102:3;29013:93;:::i;:::-;29131:1;29126:3;29122:11;29115:18;;28739:400;;;:::o;29145:141::-;29194:4;29217:3;29209:11;;29240:3;29237:1;29230:14;29274:4;29271:1;29261:18;29253:26;;29145:141;;;:::o;29316:845::-;29419:3;29456:5;29450:12;29485:36;29511:9;29485:36;:::i;:::-;29537:89;29619:6;29614:3;29537:89;:::i;:::-;29530:96;;29657:1;29646:9;29642:17;29673:1;29668:137;;;;29819:1;29814:341;;;;29635:520;;29668:137;29752:4;29748:9;29737;29733:25;29728:3;29721:38;29788:6;29783:3;29779:16;29772:23;;29668:137;;29814:341;29881:38;29913:5;29881:38;:::i;:::-;29941:1;29955:154;29969:6;29966:1;29963:13;29955:154;;;30043:7;30037:14;30033:1;30028:3;30024:11;30017:35;30093:1;30084:7;30080:15;30069:26;;29991:4;29988:1;29984:12;29979:17;;29955:154;;;30138:6;30133:3;30129:16;30122:23;;29821:334;;29635:520;;29423:738;;29316:845;;;;:::o;30167:715::-;30455:3;30477:105;30578:3;30569:6;30561;30477:105;:::i;:::-;30470:112;;30599:148;30743:3;30599:148;:::i;:::-;30592:155;;30764:92;30852:3;30843:6;30764:92;:::i;:::-;30757:99;;30873:3;30866:10;;30167:715;;;;;;:::o;30888:583::-;31110:3;31132:92;31220:3;31211:6;31132:92;:::i;:::-;31125:99;;31241:95;31332:3;31323:6;31241:95;:::i;:::-;31234:102;;31353:92;31441:3;31432:6;31353:92;:::i;:::-;31346:99;;31462:3;31455:10;;30888:583;;;;;;:::o;31477:214::-;31617:66;31613:1;31605:6;31601:14;31594:90;31477:214;:::o;31697:402::-;31857:3;31878:85;31960:2;31955:3;31878:85;:::i;:::-;31871:92;;31972:93;32061:3;31972:93;:::i;:::-;32090:2;32085:3;32081:12;32074:19;;31697:402;;;:::o;32105:416::-;32245:66;32241:1;32233:6;32229:14;32222:90;32346:66;32341:2;32333:6;32329:15;32322:91;32447:66;32442:2;32434:6;32430:15;32423:91;32105:416;:::o;32527:402::-;32687:3;32708:85;32790:2;32785:3;32708:85;:::i;:::-;32701:92;;32802:93;32891:3;32802:93;:::i;:::-;32920:2;32915:3;32911:12;32904:19;;32527:402;;;:::o;32935:214::-;33075:66;33071:1;33063:6;33059:14;33052:90;32935:214;:::o;33155:402::-;33315:3;33336:85;33418:2;33413:3;33336:85;:::i;:::-;33329:92;;33430:93;33519:3;33430:93;:::i;:::-;33548:2;33543:3;33539:12;33532:19;;33155:402;;;:::o;33563:214::-;33703:66;33699:1;33691:6;33687:14;33680:90;33563:214;:::o;33783:400::-;33943:3;33964:84;34046:1;34041:3;33964:84;:::i;:::-;33957:91;;34057:93;34146:3;34057:93;:::i;:::-;34175:1;34170:3;34166:11;34159:18;;33783:400;;;:::o;34189:1659::-;34821:3;34843:148;34987:3;34843:148;:::i;:::-;34836:155;;35008:95;35099:3;35090:6;35008:95;:::i;:::-;35001:102;;35120:148;35264:3;35120:148;:::i;:::-;35113:155;;35285:95;35376:3;35367:6;35285:95;:::i;:::-;35278:102;;35397:148;35541:3;35397:148;:::i;:::-;35390:155;;35562:95;35653:3;35644:6;35562:95;:::i;:::-;35555:102;;35674:148;35818:3;35674:148;:::i;:::-;35667:155;;35839:3;35832:10;;34189:1659;;;;;;:::o;35854:179::-;35994:31;35990:1;35982:6;35978:14;35971:55;35854:179;:::o;36039:402::-;36199:3;36220:85;36302:2;36297:3;36220:85;:::i;:::-;36213:92;;36314:93;36403:3;36314:93;:::i;:::-;36432:2;36427:3;36423:12;36416:19;;36039:402;;;:::o;36447:541::-;36680:3;36702:148;36846:3;36702:148;:::i;:::-;36695:155;;36867:95;36958:3;36949:6;36867:95;:::i;:::-;36860:102;;36979:3;36972:10;;36447:541;;;;:::o;36994:180::-;37042:77;37039:1;37032:88;37139:4;37136:1;37129:15;37163:4;37160:1;37153:15;37180:180;37228:77;37225:1;37218:88;37325:4;37322:1;37315:15;37349:4;37346:1;37339:15;37366:233;37405:3;37428:24;37446:5;37428:24;:::i;:::-;37419:33;;37474:66;37467:5;37464:77;37461:103;;;37544:18;;:::i;:::-;37461:103;37591:1;37584:5;37580:13;37573:20;;37366:233;;;:::o;37605:514::-;37766:4;37804:2;37793:9;37789:18;37781:26;;37853:9;37847:4;37843:20;37839:1;37828:9;37824:17;37817:47;37881:78;37954:4;37945:6;37881:78;:::i;:::-;37873:86;;38006:9;38000:4;37996:20;37991:2;37980:9;37976:18;37969:48;38034:78;38107:4;38098:6;38034:78;:::i;:::-;38026:86;;37605:514;;;;;:::o;38125:224::-;38265:34;38261:1;38253:6;38249:14;38242:58;38334:7;38329:2;38321:6;38317:15;38310:32;38125:224;:::o;38355:366::-;38497:3;38518:67;38582:2;38577:3;38518:67;:::i;:::-;38511:74;;38594:93;38683:3;38594:93;:::i;:::-;38712:2;38707:3;38703:12;38696:19;;38355:366;;;:::o;38727:419::-;38893:4;38931:2;38920:9;38916:18;38908:26;;38980:9;38974:4;38970:20;38966:1;38955:9;38951:17;38944:47;39008:131;39134:4;39008:131;:::i;:::-;39000:139;;38727:419;;;:::o;39152:223::-;39292:34;39288:1;39280:6;39276:14;39269:58;39361:6;39356:2;39348:6;39344:15;39337:31;39152:223;:::o;39381:366::-;39523:3;39544:67;39608:2;39603:3;39544:67;:::i;:::-;39537:74;;39620:93;39709:3;39620:93;:::i;:::-;39738:2;39733:3;39729:12;39722:19;;39381:366;;;:::o;39753:419::-;39919:4;39957:2;39946:9;39942:18;39934:26;;40006:9;40000:4;39996:20;39992:1;39981:9;39977:17;39970:47;40034:131;40160:4;40034:131;:::i;:::-;40026:139;;39753:419;;;:::o;40178:305::-;40218:3;40237:20;40255:1;40237:20;:::i;:::-;40232:25;;40271:20;40289:1;40271:20;:::i;:::-;40266:25;;40425:1;40357:66;40353:74;40350:1;40347:81;40344:107;;;40431:18;;:::i;:::-;40344:107;40475:1;40472;40468:9;40461:16;;40178:305;;;;:::o;40489:175::-;40629:27;40625:1;40617:6;40613:14;40606:51;40489:175;:::o;40670:366::-;40812:3;40833:67;40897:2;40892:3;40833:67;:::i;:::-;40826:74;;40909:93;40998:3;40909:93;:::i;:::-;41027:2;41022:3;41018:12;41011:19;;40670:366;;;:::o;41042:419::-;41208:4;41246:2;41235:9;41231:18;41223:26;;41295:9;41289:4;41285:20;41281:1;41270:9;41266:17;41259:47;41323:131;41449:4;41323:131;:::i;:::-;41315:139;;41042:419;;;:::o;41467:237::-;41607:34;41603:1;41595:6;41591:14;41584:58;41676:20;41671:2;41663:6;41659:15;41652:45;41467:237;:::o;41710:366::-;41852:3;41873:67;41937:2;41932:3;41873:67;:::i;:::-;41866:74;;41949:93;42038:3;41949:93;:::i;:::-;42067:2;42062:3;42058:12;42051:19;;41710:366;;;:::o;42082:419::-;42248:4;42286:2;42275:9;42271:18;42263:26;;42335:9;42329:4;42325:20;42321:1;42310:9;42306:17;42299:47;42363:131;42489:4;42363:131;:::i;:::-;42355:139;;42082:419;;;:::o;42507:180::-;42555:77;42552:1;42545:88;42652:4;42649:1;42642:15;42676:4;42673:1;42666:15;42693:826;42930:4;42968:3;42957:9;42953:19;42945:27;;43018:9;43012:4;43008:20;43004:1;42993:9;42989:17;42982:47;43046:78;43119:4;43110:6;43046:78;:::i;:::-;43038:86;;43171:9;43165:4;43161:20;43156:2;43145:9;43141:18;43134:48;43199:78;43272:4;43263:6;43199:78;:::i;:::-;43191:86;;43324:9;43318:4;43314:20;43309:2;43298:9;43294:18;43287:48;43352:78;43425:4;43416:6;43352:78;:::i;:::-;43344:86;;43440:72;43508:2;43497:9;43493:18;43484:6;43440:72;:::i;:::-;42693:826;;;;;;;:::o;43525:185::-;43565:1;43582:20;43600:1;43582:20;:::i;:::-;43577:25;;43616:20;43634:1;43616:20;:::i;:::-;43611:25;;43655:1;43645:35;;43660:18;;:::i;:::-;43645:35;43702:1;43699;43695:9;43690:14;;43525:185;;;;:::o;43716:348::-;43756:7;43779:20;43797:1;43779:20;:::i;:::-;43774:25;;43813:20;43831:1;43813:20;:::i;:::-;43808:25;;44001:1;43933:66;43929:74;43926:1;43923:81;43918:1;43911:9;43904:17;43900:105;43897:131;;;44008:18;;:::i;:::-;43897:131;44056:1;44053;44049:9;44038:20;;43716:348;;;;:::o;44070:233::-;44210:34;44206:1;44198:6;44194:14;44187:58;44279:16;44274:2;44266:6;44262:15;44255:41;44070:233;:::o;44309:366::-;44451:3;44472:67;44536:2;44531:3;44472:67;:::i;:::-;44465:74;;44548:93;44637:3;44548:93;:::i;:::-;44666:2;44661:3;44657:12;44650:19;;44309:366;;;:::o;44681:419::-;44847:4;44885:2;44874:9;44870:18;44862:26;;44934:9;44928:4;44924:20;44920:1;44909:9;44905:17;44898:47;44962:131;45088:4;44962:131;:::i;:::-;44954:139;;44681:419;;;:::o;45106:624::-;45295:4;45333:2;45322:9;45318:18;45310:26;;45382:9;45376:4;45372:20;45368:1;45357:9;45353:17;45346:47;45410:78;45483:4;45474:6;45410:78;:::i;:::-;45402:86;;45498:72;45566:2;45555:9;45551:18;45542:6;45498:72;:::i;:::-;45617:9;45611:4;45607:20;45602:2;45591:9;45587:18;45580:48;45645:78;45718:4;45709:6;45645:78;:::i;:::-;45637:86;;45106:624;;;;;;:::o;45736:191::-;45776:4;45796:20;45814:1;45796:20;:::i;:::-;45791:25;;45830:20;45848:1;45830:20;:::i;:::-;45825:25;;45869:1;45866;45863:8;45860:34;;;45874:18;;:::i;:::-;45860:34;45919:1;45916;45912:9;45904:17;;45736:191;;;;:::o;45933:98::-;45984:6;46018:5;46012:12;46002:22;;45933:98;;;:::o;46037:168::-;46120:11;46154:6;46149:3;46142:19;46194:4;46189:3;46185:14;46170:29;;46037:168;;;;:::o;46211:360::-;46297:3;46325:38;46357:5;46325:38;:::i;:::-;46379:70;46442:6;46437:3;46379:70;:::i;:::-;46372:77;;46458:52;46503:6;46498:3;46491:4;46484:5;46480:16;46458:52;:::i;:::-;46535:29;46557:6;46535:29;:::i;:::-;46530:3;46526:39;46519:46;;46301:270;46211:360;;;;:::o;46577:640::-;46772:4;46810:3;46799:9;46795:19;46787:27;;46824:71;46892:1;46881:9;46877:17;46868:6;46824:71;:::i;:::-;46905:72;46973:2;46962:9;46958:18;46949:6;46905:72;:::i;:::-;46987;47055:2;47044:9;47040:18;47031:6;46987:72;:::i;:::-;47106:9;47100:4;47096:20;47091:2;47080:9;47076:18;47069:48;47134:76;47205:4;47196:6;47134:76;:::i;:::-;47126:84;;46577:640;;;;;;;:::o;47223:141::-;47279:5;47310:6;47304:13;47295:22;;47326:32;47352:5;47326:32;:::i;:::-;47223:141;;;;:::o;47370:349::-;47439:6;47488:2;47476:9;47467:7;47463:23;47459:32;47456:119;;;47494:79;;:::i;:::-;47456:119;47614:1;47639:63;47694:7;47685:6;47674:9;47670:22;47639:63;:::i;:::-;47629:73;;47585:127;47370:349;;;;:::o;47725:182::-;47865:34;47861:1;47853:6;47849:14;47842:58;47725:182;:::o;47913:366::-;48055:3;48076:67;48140:2;48135:3;48076:67;:::i;:::-;48069:74;;48152:93;48241:3;48152:93;:::i;:::-;48270:2;48265:3;48261:12;48254:19;;47913:366;;;:::o;48285:419::-;48451:4;48489:2;48478:9;48474:18;48466:26;;48538:9;48532:4;48528:20;48524:1;48513:9;48509:17;48502:47;48566:131;48692:4;48566:131;:::i;:::-;48558:139;;48285:419;;;:::o;48710:178::-;48850:30;48846:1;48838:6;48834:14;48827:54;48710:178;:::o;48894:366::-;49036:3;49057:67;49121:2;49116:3;49057:67;:::i;:::-;49050:74;;49133:93;49222:3;49133:93;:::i;:::-;49251:2;49246:3;49242:12;49235:19;;48894:366;;;:::o;49266:419::-;49432:4;49470:2;49459:9;49455:18;49447:26;;49519:9;49513:4;49509:20;49505:1;49494:9;49490:17;49483:47;49547:131;49673:4;49547:131;:::i;:::-;49539:139;;49266:419;;;:::o
Swarm Source
ipfs://70a06c248494999635c52c47732788adea6ce0d2303ec300eb45ab1382fa9f77
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|