Token Crobies

Overview CRC721

Total Supply:
454 CRB

Holders:
192 addresses
Balance
9 CRB
0x634a5dc4cda63ea8d0699d9387cdcfffc6408b84
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CrobiesV2

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-09-04
*/

// 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/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// 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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @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.7.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 = _owners[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 nor 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 nor 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 nor 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 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 _owners[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);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) 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);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @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.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/3_Ballot.sol



  pragma solidity 0.8.9;




  contract CrobiesV2 is ERC721Enumerable, Ownable {
    using Strings for uint256;

    string baseURI;
    string public baseExtension = ".json";
    uint256 constant public maxSupply = 2000;
    bool public paused = false;

    address public utiliContract;

    uint256 private totalMinted;

    uint256[maxSupply] internal availableIds;

    modifier onlyUtil() {
      require(msg.sender == utiliContract, "Only util contract");
      _;
    }

    constructor(
      string memory _initBaseURI,
      address _util,
      uint256 _currentId
    ) ERC721("Crobies", "CRB") {
      setBaseURI(_initBaseURI);
      utiliContract = _util;
      totalMinted = _currentId;
    }

    // internal
    function _baseURI() internal view virtual override returns (string memory) {
      return baseURI;
    }

    function mintTo(address _to) external onlyUtil returns(uint256) {
      require(totalMinted < maxSupply, "Minted out");
      uint256 newId = _getNewId(totalMinted);
      _safeMint(_to, newId);
      totalMinted += 1;
      return newId;
    }

    function burn(uint256 tokenId) external onlyUtil {
      _burn(tokenId);
    }

    function walletOfOwner(address _owner)
      public
      view
      returns (uint256[] memory)
    {
      uint256 ownerTokenCount = balanceOf(_owner);
      uint256[] memory tokenIds = new uint256[](ownerTokenCount);
      for (uint256 i; i < ownerTokenCount; i++) {
        tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
      }
      return tokenIds;
    }

    function tokenURI(uint256 tokenId)
      public
      view
      virtual
      override
      returns (string memory)
    {
      require(
        _exists(tokenId),
        "ERC721Metadata: URI query for nonexistent token"
      );
      
      string memory currentBaseURI = _baseURI();
      return bytes(currentBaseURI).length > 0
          ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
          : "";
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
      baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
      baseExtension = _newBaseExtension;
    }

    function pause(bool _state) public onlyOwner {
      paused = _state;
    }
  
    function withdrawAll() public onlyOwner {
      uint256 balance = address(this).balance;
      require(balance > 0, "Insufficent balance");
      _withdraw(msg.sender, balance);
      
    }

    function _withdraw(address _address, uint256 _amount) private {
      (bool success, ) = _address.call{ value: _amount }("");
      require(success, "Failed to withdraw Ether");
    }

    function setUtilAddress(address _utilAddress) external onlyOwner {
      utiliContract = _utilAddress;
    }

    function airdropNFTs(
      address[] memory _holders,
      uint256[] memory _ids
    ) external onlyOwner {
      require(_holders.length == _ids.length, "Input Data error");
      for (uint256 i = 0; i < _holders.length; i++) {
        _safeMint(_holders[i], _ids[i]);
      }
    }

    function _getNewId(uint256 _totalMinted) internal returns(uint256 value) {
      uint256 remaining = maxSupply - _totalMinted;
      uint256 rand = uint256(keccak256(abi.encodePacked(msg.sender, block.difficulty, block.timestamp, remaining))) % remaining;
      value = 0;
      // if array value exists, use, otherwise, use generated random value
      if (availableIds[rand] != 0)
          value = availableIds[rand];
      else
          value = rand;
      // store remaining - 1 in used ID to create mapping
      if (availableIds[remaining - 1] == 0)
          availableIds[rand] = remaining - 1;
      else
          availableIds[rand] = availableIds[remaining - 1];
      value = maxSupply - value;
    } 
  }

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"address","name":"_util","type":"address"},{"internalType":"uint256","name":"_currentId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_holders","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"airdropNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_utilAddress","type":"address"}],"name":"setUtilAddress","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"utiliContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000377565b506000600d60006101000a81548160ff0219169083151502179055503480156200007a57600080fd5b5060405162004bb438038062004bb48339818101604052810190620000a0919062000664565b6040518060400160405280600781526020017f43726f62696573000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f435242000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012492919062000377565b5080600190805190602001906200013d92919062000377565b5050506200016062000154620001c260201b60201c565b620001ca60201b60201c565b62000171836200029060201b60201c565b81600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e81905550505050620007c7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a0620002bc60201b60201c565b80600b9080519060200190620002b892919062000377565b5050565b620002cc620001c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002f26200034d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200034b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003429062000740565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003859062000791565b90600052602060002090601f016020900481019282620003a95760008555620003f5565b82601f10620003c457805160ff1916838001178555620003f5565b82800160010185558215620003f5579182015b82811115620003f4578251825591602001919060010190620003d7565b5b50905062000404919062000408565b5090565b5b808211156200042357600081600090555060010162000409565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004908262000445565b810181811067ffffffffffffffff82111715620004b257620004b162000456565b5b80604052505050565b6000620004c762000427565b9050620004d5828262000485565b919050565b600067ffffffffffffffff821115620004f857620004f762000456565b5b620005038262000445565b9050602081019050919050565b60005b838110156200053057808201518184015260208101905062000513565b8381111562000540576000848401525b50505050565b60006200055d6200055784620004da565b620004bb565b9050828152602081018484840111156200057c576200057b62000440565b5b6200058984828562000510565b509392505050565b600082601f830112620005a957620005a86200043b565b5b8151620005bb84826020860162000546565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005f182620005c4565b9050919050565b6200060381620005e4565b81146200060f57600080fd5b50565b6000815190506200062381620005f8565b92915050565b6000819050919050565b6200063e8162000629565b81146200064a57600080fd5b50565b6000815190506200065e8162000633565b92915050565b60008060006060848603121562000680576200067f62000431565b5b600084015167ffffffffffffffff811115620006a157620006a062000436565b5b620006af8682870162000591565b9350506020620006c28682870162000612565b9250506040620006d5868287016200064d565b9150509250925092565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000728602083620006df565b91506200073582620006f0565b602082019050919050565b600060208201905081810360008301526200075b8162000719565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007aa57607f821691505b60208210811415620007c157620007c062000762565b5b50919050565b6143dd80620007d76000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063b88d4fde116100a2578063da3ef23f11610071578063da3ef23f146105a5578063e213b5f6146105c1578063e985e9c5146105dd578063f2fde38b1461060d576101f0565b8063b88d4fde1461051d578063c668286214610539578063c87b56dd14610557578063d5abeb0114610587576101f0565b8063853828b6116100de578063853828b6146104bb5780638da5cb5b146104c557806395d89b41146104e3578063a22cb46514610501576101f0565b806370a0823114610435578063715018a614610465578063755edd171461046f5780638431f1a91461049f576101f0565b80632f745c59116101875780634f6ccce7116101565780634f6ccce71461039b57806355f804b3146103cb5780635c975abb146103e75780636352211e14610405576101f0565b80632f745c591461030357806342842e0e1461033357806342966c681461034f578063438b63001461036b576101f0565b8063095ea7b3116101c3578063095ea7b31461028f57806318160ddd146102ab57806323b872dd146102c957806328ed61fb146102e5576101f0565b806301ffc9a7146101f557806302329a291461022557806306fdde0314610241578063081812fc1461025f575b600080fd5b61020f600480360381019061020a9190612aa5565b610629565b60405161021c9190612aed565b60405180910390f35b61023f600480360381019061023a9190612b34565b6106a3565b005b6102496106c8565b6040516102569190612bfa565b60405180910390f35b61027960048036038101906102749190612c52565b61075a565b6040516102869190612cc0565b60405180910390f35b6102a960048036038101906102a49190612d07565b6107a0565b005b6102b36108b8565b6040516102c09190612d56565b60405180910390f35b6102e360048036038101906102de9190612d71565b6108c5565b005b6102ed610925565b6040516102fa9190612cc0565b60405180910390f35b61031d60048036038101906103189190612d07565b61094b565b60405161032a9190612d56565b60405180910390f35b61034d60048036038101906103489190612d71565b6109f0565b005b61036960048036038101906103649190612c52565b610a10565b005b61038560048036038101906103809190612dc4565b610aac565b6040516103929190612eaf565b60405180910390f35b6103b560048036038101906103b09190612c52565b610b5a565b6040516103c29190612d56565b60405180910390f35b6103e560048036038101906103e09190613006565b610bcb565b005b6103ef610bed565b6040516103fc9190612aed565b60405180910390f35b61041f600480360381019061041a9190612c52565b610c00565b60405161042c9190612cc0565b60405180910390f35b61044f600480360381019061044a9190612dc4565b610cb2565b60405161045c9190612d56565b60405180910390f35b61046d610d6a565b005b61048960048036038101906104849190612dc4565b610d7e565b6040516104969190612d56565b60405180910390f35b6104b960048036038101906104b49190612dc4565b610e92565b005b6104c3610ede565b005b6104cd610f3b565b6040516104da9190612cc0565b60405180910390f35b6104eb610f65565b6040516104f89190612bfa565b60405180910390f35b61051b6004803603810190610516919061304f565b610ff7565b005b61053760048036038101906105329190613130565b61100d565b005b61054161106f565b60405161054e9190612bfa565b60405180910390f35b610571600480360381019061056c9190612c52565b6110fd565b60405161057e9190612bfa565b60405180910390f35b61058f6111a7565b60405161059c9190612d56565b60405180910390f35b6105bf60048036038101906105ba9190613006565b6111ad565b005b6105db60048036038101906105d6919061333e565b6111cf565b005b6105f760048036038101906105f291906133b6565b61127d565b6040516106049190612aed565b60405180910390f35b61062760048036038101906106229190612dc4565b611311565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069c575061069b82611395565b5b9050919050565b6106ab611477565b80600d60006101000a81548160ff02191690831515021790555050565b6060600080546106d790613425565b80601f016020809104026020016040519081016040528092919081815260200182805461070390613425565b80156107505780601f1061072557610100808354040283529160200191610750565b820191906000526020600020905b81548152906001019060200180831161073357829003601f168201915b5050505050905090565b6000610765826114f5565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ab82610c00565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561081c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610813906134c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083b611540565b73ffffffffffffffffffffffffffffffffffffffff16148061086a575061086981610864611540565b61127d565b5b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a09061355b565b60405180910390fd5b6108b38383611548565b505050565b6000600880549050905090565b6108d66108d0611540565b82611601565b610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090c906135ed565b60405180910390fd5b610920838383611696565b505050565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061095683610cb2565b8210610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e9061367f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a0b8383836040518060200160405280600081525061100d565b505050565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a97906136eb565b60405180910390fd5b610aa9816118fd565b50565b60606000610ab983610cb2565b905060008167ffffffffffffffff811115610ad757610ad6612edb565b5b604051908082528060200260200182016040528015610b055781602001602082028036833780820191505090505b50905060005b82811015610b4f57610b1d858261094b565b828281518110610b3057610b2f61370b565b5b6020026020010181815250508080610b4790613769565b915050610b0b565b508092505050919050565b6000610b646108b8565b8210610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90613824565b60405180910390fd5b60088281548110610bb957610bb861370b565b5b90600052602060002001549050919050565b610bd3611477565b80600b9080519060200190610be9929190612996565b5050565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca090613890565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1a90613922565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d72611477565b610d7c6000611a1a565b565b6000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e07906136eb565b60405180910390fd5b6107d0600e5410610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d9061398e565b60405180910390fd5b6000610e63600e54611ae0565b9050610e6f8382611c22565b6001600e6000828254610e8291906139ae565b9250508190555080915050919050565b610e9a611477565b80600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ee6611477565b600047905060008111610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590613a50565b60405180910390fd5b610f383382611c40565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f7490613425565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa090613425565b8015610fed5780601f10610fc257610100808354040283529160200191610fed565b820191906000526020600020905b815481529060010190602001808311610fd057829003601f168201915b5050505050905090565b611009611002611540565b8383611cf1565b5050565b61101e611018611540565b83611601565b61105d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611054906135ed565b60405180910390fd5b61106984848484611e5e565b50505050565b600c805461107c90613425565b80601f01602080910402602001604051908101604052809291908181526020018280546110a890613425565b80156110f55780601f106110ca576101008083540402835291602001916110f5565b820191906000526020600020905b8154815290600101906020018083116110d857829003601f168201915b505050505081565b606061110882611eba565b611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613ae2565b60405180910390fd5b6000611151611f26565b90506000815111611171576040518060200160405280600081525061119f565b8061117b84611fb8565b600c60405160200161118f93929190613bd2565b6040516020818303038152906040525b915050919050565b6107d081565b6111b5611477565b80600c90805190602001906111cb929190612996565b5050565b6111d7611477565b805182511461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613c4f565b60405180910390fd5b60005b82518110156112785761126583828151811061123d5761123c61370b565b5b60200260200101518383815181106112585761125761370b565b5b6020026020010151611c22565b808061127090613769565b91505061121e565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611319611477565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090613ce1565b60405180910390fd5b61139281611a1a565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061146057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611470575061146f82612119565b5b9050919050565b61147f611540565b73ffffffffffffffffffffffffffffffffffffffff1661149d610f3b565b73ffffffffffffffffffffffffffffffffffffffff16146114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea90613d4d565b60405180910390fd5b565b6114fe81611eba565b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490613890565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115bb83610c00565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061160d83610c00565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061164f575061164e818561127d565b5b8061168d57508373ffffffffffffffffffffffffffffffffffffffff166116758461075a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116b682610c00565b73ffffffffffffffffffffffffffffffffffffffff161461170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170390613ddf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390613e71565b60405180910390fd5b611787838383612183565b611792600082611548565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e29190613e91565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183991906139ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118f8838383612297565b505050565b600061190882610c00565b905061191681600084612183565b611921600083611548565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119719190613e91565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a1681600084612297565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080826107d0611af19190613e91565b905060008133444285604051602001611b0d9493929190613f2e565b6040516020818303038152906040528051906020012060001c611b309190613fab565b9050600092506000600f826107d08110611b4d57611b4c61370b565b5b015414611b7257600f816107d08110611b6957611b6861370b565b5b01549250611b76565b8092505b6000600f600184611b879190613e91565b6107d08110611b9957611b9861370b565b5b01541415611bcd57600182611bae9190613e91565b600f826107d08110611bc357611bc261370b565b5b0181905550611c0b565b600f600183611bdc9190613e91565b6107d08110611bee57611bed61370b565b5b0154600f826107d08110611c0557611c0461370b565b5b01819055505b826107d0611c199190613e91565b92505050919050565b611c3c82826040518060200160405280600081525061229c565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c669061400d565b60006040518083038185875af1925050503d8060008114611ca3576040519150601f19603f3d011682016040523d82523d6000602084013e611ca8565b606091505b5050905080611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce39061406e565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d57906140da565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e519190612aed565b60405180910390a3505050565b611e69848484611696565b611e75848484846122f7565b611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab9061416c565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054611f3590613425565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6190613425565b8015611fae5780601f10611f8357610100808354040283529160200191611fae565b820191906000526020600020905b815481529060010190602001808311611f9157829003601f168201915b5050505050905090565b60606000821415612000576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612114565b600082905060005b6000821461203257808061201b90613769565b915050600a8261202b919061418c565b9150612008565b60008167ffffffffffffffff81111561204e5761204d612edb565b5b6040519080825280601f01601f1916602001820160405280156120805781602001600182028036833780820191505090505b5090505b6000851461210d576001826120999190613e91565b9150600a856120a89190613fab565b60306120b491906139ae565b60f81b8183815181106120ca576120c961370b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612106919061418c565b9450612084565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61218e83838361248e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121d1576121cc81612493565b612210565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461220f5761220e83826124dc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122535761224e81612649565b612292565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461229157612290828261271a565b5b5b505050565b505050565b6122a68383612799565b6122b360008484846122f7565b6122f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e99061416c565b60405180910390fd5b505050565b60006123188473ffffffffffffffffffffffffffffffffffffffff16612973565b15612481578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612341611540565b8786866040518563ffffffff1660e01b81526004016123639493929190614212565b602060405180830381600087803b15801561237d57600080fd5b505af19250505080156123ae57506040513d601f19601f820116820180604052508101906123ab9190614273565b60015b612431573d80600081146123de576040519150601f19603f3d011682016040523d82523d6000602084013e6123e3565b606091505b50600081511415612429576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124209061416c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612486565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124e984610cb2565b6124f39190613e91565b90506000600760008481526020019081526020016000205490508181146125d8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061265d9190613e91565b905060006009600084815260200190815260200160002054905060006008838154811061268d5761268c61370b565b5b9060005260206000200154905080600883815481106126af576126ae61370b565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126fe576126fd6142a0565b5b6001900381819060005260206000200160009055905550505050565b600061272583610cb2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612809576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128009061431b565b60405180910390fd5b61281281611eba565b15612852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284990614387565b60405180910390fd5b61285e60008383612183565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ae91906139ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461296f60008383612297565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546129a290613425565b90600052602060002090601f0160209004810192826129c45760008555612a0b565b82601f106129dd57805160ff1916838001178555612a0b565b82800160010185558215612a0b579182015b82811115612a0a5782518255916020019190600101906129ef565b5b509050612a189190612a1c565b5090565b5b80821115612a35576000816000905550600101612a1d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a8281612a4d565b8114612a8d57600080fd5b50565b600081359050612a9f81612a79565b92915050565b600060208284031215612abb57612aba612a43565b5b6000612ac984828501612a90565b91505092915050565b60008115159050919050565b612ae781612ad2565b82525050565b6000602082019050612b026000830184612ade565b92915050565b612b1181612ad2565b8114612b1c57600080fd5b50565b600081359050612b2e81612b08565b92915050565b600060208284031215612b4a57612b49612a43565b5b6000612b5884828501612b1f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b9b578082015181840152602081019050612b80565b83811115612baa576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bcc82612b61565b612bd68185612b6c565b9350612be6818560208601612b7d565b612bef81612bb0565b840191505092915050565b60006020820190508181036000830152612c148184612bc1565b905092915050565b6000819050919050565b612c2f81612c1c565b8114612c3a57600080fd5b50565b600081359050612c4c81612c26565b92915050565b600060208284031215612c6857612c67612a43565b5b6000612c7684828501612c3d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612caa82612c7f565b9050919050565b612cba81612c9f565b82525050565b6000602082019050612cd56000830184612cb1565b92915050565b612ce481612c9f565b8114612cef57600080fd5b50565b600081359050612d0181612cdb565b92915050565b60008060408385031215612d1e57612d1d612a43565b5b6000612d2c85828601612cf2565b9250506020612d3d85828601612c3d565b9150509250929050565b612d5081612c1c565b82525050565b6000602082019050612d6b6000830184612d47565b92915050565b600080600060608486031215612d8a57612d89612a43565b5b6000612d9886828701612cf2565b9350506020612da986828701612cf2565b9250506040612dba86828701612c3d565b9150509250925092565b600060208284031215612dda57612dd9612a43565b5b6000612de884828501612cf2565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e2681612c1c565b82525050565b6000612e388383612e1d565b60208301905092915050565b6000602082019050919050565b6000612e5c82612df1565b612e668185612dfc565b9350612e7183612e0d565b8060005b83811015612ea2578151612e898882612e2c565b9750612e9483612e44565b925050600181019050612e75565b5085935050505092915050565b60006020820190508181036000830152612ec98184612e51565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f1382612bb0565b810181811067ffffffffffffffff82111715612f3257612f31612edb565b5b80604052505050565b6000612f45612a39565b9050612f518282612f0a565b919050565b600067ffffffffffffffff821115612f7157612f70612edb565b5b612f7a82612bb0565b9050602081019050919050565b82818337600083830152505050565b6000612fa9612fa484612f56565b612f3b565b905082815260208101848484011115612fc557612fc4612ed6565b5b612fd0848285612f87565b509392505050565b600082601f830112612fed57612fec612ed1565b5b8135612ffd848260208601612f96565b91505092915050565b60006020828403121561301c5761301b612a43565b5b600082013567ffffffffffffffff81111561303a57613039612a48565b5b61304684828501612fd8565b91505092915050565b6000806040838503121561306657613065612a43565b5b600061307485828601612cf2565b925050602061308585828601612b1f565b9150509250929050565b600067ffffffffffffffff8211156130aa576130a9612edb565b5b6130b382612bb0565b9050602081019050919050565b60006130d36130ce8461308f565b612f3b565b9050828152602081018484840111156130ef576130ee612ed6565b5b6130fa848285612f87565b509392505050565b600082601f83011261311757613116612ed1565b5b81356131278482602086016130c0565b91505092915050565b6000806000806080858703121561314a57613149612a43565b5b600061315887828801612cf2565b945050602061316987828801612cf2565b935050604061317a87828801612c3d565b925050606085013567ffffffffffffffff81111561319b5761319a612a48565b5b6131a787828801613102565b91505092959194509250565b600067ffffffffffffffff8211156131ce576131cd612edb565b5b602082029050602081019050919050565b600080fd5b60006131f76131f2846131b3565b612f3b565b9050808382526020820190506020840283018581111561321a576132196131df565b5b835b81811015613243578061322f8882612cf2565b84526020840193505060208101905061321c565b5050509392505050565b600082601f83011261326257613261612ed1565b5b81356132728482602086016131e4565b91505092915050565b600067ffffffffffffffff82111561329657613295612edb565b5b602082029050602081019050919050565b60006132ba6132b58461327b565b612f3b565b905080838252602082019050602084028301858111156132dd576132dc6131df565b5b835b8181101561330657806132f28882612c3d565b8452602084019350506020810190506132df565b5050509392505050565b600082601f83011261332557613324612ed1565b5b81356133358482602086016132a7565b91505092915050565b6000806040838503121561335557613354612a43565b5b600083013567ffffffffffffffff81111561337357613372612a48565b5b61337f8582860161324d565b925050602083013567ffffffffffffffff8111156133a05761339f612a48565b5b6133ac85828601613310565b9150509250929050565b600080604083850312156133cd576133cc612a43565b5b60006133db85828601612cf2565b92505060206133ec85828601612cf2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061343d57607f821691505b60208210811415613451576134506133f6565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134b3602183612b6c565b91506134be82613457565b604082019050919050565b600060208201905081810360008301526134e2816134a6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613545603e83612b6c565b9150613550826134e9565b604082019050919050565b6000602082019050818103600083015261357481613538565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006135d7602e83612b6c565b91506135e28261357b565b604082019050919050565b60006020820190508181036000830152613606816135ca565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613669602b83612b6c565b91506136748261360d565b604082019050919050565b600060208201905081810360008301526136988161365c565b9050919050565b7f4f6e6c79207574696c20636f6e74726163740000000000000000000000000000600082015250565b60006136d5601283612b6c565b91506136e08261369f565b602082019050919050565b60006020820190508181036000830152613704816136c8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061377482612c1c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137a7576137a661373a565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061380e602c83612b6c565b9150613819826137b2565b604082019050919050565b6000602082019050818103600083015261383d81613801565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061387a601883612b6c565b915061388582613844565b602082019050919050565b600060208201905081810360008301526138a98161386d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061390c602983612b6c565b9150613917826138b0565b604082019050919050565b6000602082019050818103600083015261393b816138ff565b9050919050565b7f4d696e746564206f757400000000000000000000000000000000000000000000600082015250565b6000613978600a83612b6c565b915061398382613942565b602082019050919050565b600060208201905081810360008301526139a78161396b565b9050919050565b60006139b982612c1c565b91506139c483612c1c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139f9576139f861373a565b5b828201905092915050565b7f496e737566666963656e742062616c616e636500000000000000000000000000600082015250565b6000613a3a601383612b6c565b9150613a4582613a04565b602082019050919050565b60006020820190508181036000830152613a6981613a2d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613acc602f83612b6c565b9150613ad782613a70565b604082019050919050565b60006020820190508181036000830152613afb81613abf565b9050919050565b600081905092915050565b6000613b1882612b61565b613b228185613b02565b9350613b32818560208601612b7d565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613b6081613425565b613b6a8186613b02565b94506001821660008114613b855760018114613b9657613bc9565b60ff19831686528186019350613bc9565b613b9f85613b3e565b60005b83811015613bc157815481890152600182019150602081019050613ba2565b838801955050505b50505092915050565b6000613bde8286613b0d565b9150613bea8285613b0d565b9150613bf68284613b53565b9150819050949350505050565b7f496e7075742044617461206572726f7200000000000000000000000000000000600082015250565b6000613c39601083612b6c565b9150613c4482613c03565b602082019050919050565b60006020820190508181036000830152613c6881613c2c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ccb602683612b6c565b9150613cd682613c6f565b604082019050919050565b60006020820190508181036000830152613cfa81613cbe565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d37602083612b6c565b9150613d4282613d01565b602082019050919050565b60006020820190508181036000830152613d6681613d2a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dc9602583612b6c565b9150613dd482613d6d565b604082019050919050565b60006020820190508181036000830152613df881613dbc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e5b602483612b6c565b9150613e6682613dff565b604082019050919050565b60006020820190508181036000830152613e8a81613e4e565b9050919050565b6000613e9c82612c1c565b9150613ea783612c1c565b925082821015613eba57613eb961373a565b5b828203905092915050565b60008160601b9050919050565b6000613edd82613ec5565b9050919050565b6000613eef82613ed2565b9050919050565b613f07613f0282612c9f565b613ee4565b82525050565b6000819050919050565b613f28613f2382612c1c565b613f0d565b82525050565b6000613f3a8287613ef6565b601482019150613f4a8286613f17565b602082019150613f5a8285613f17565b602082019150613f6a8284613f17565b60208201915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fb682612c1c565b9150613fc183612c1c565b925082613fd157613fd0613f7c565b5b828206905092915050565b600081905092915050565b50565b6000613ff7600083613fdc565b915061400282613fe7565b600082019050919050565b600061401882613fea565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b6000614058601883612b6c565b915061406382614022565b602082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140c4601983612b6c565b91506140cf8261408e565b602082019050919050565b600060208201905081810360008301526140f3816140b7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614156603283612b6c565b9150614161826140fa565b604082019050919050565b6000602082019050818103600083015261418581614149565b9050919050565b600061419782612c1c565b91506141a283612c1c565b9250826141b2576141b1613f7c565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006141e4826141bd565b6141ee81856141c8565b93506141fe818560208601612b7d565b61420781612bb0565b840191505092915050565b60006080820190506142276000830187612cb1565b6142346020830186612cb1565b6142416040830185612d47565b818103606083015261425381846141d9565b905095945050505050565b60008151905061426d81612a79565b92915050565b60006020828403121561428957614288612a43565b5b60006142978482850161425e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614305602083612b6c565b9150614310826142cf565b602082019050919050565b60006020820190508181036000830152614334816142f8565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614371601c83612b6c565b915061437c8261433b565b602082019050919050565b600060208201905081810360008301526143a081614364565b905091905056fea2646970667358221220da6135ee2e5d088e5568b5f52c9c57268c0f55eb78d48aa6be7287a00ac9f71c64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e57742748f98ab8e08b565160d3a9a32bfef735200000000000000000000000000000000000000000000000000000000000003f6000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d55536458414e4633457941727864425247694e6d4d72556a4a3964715944395242546439586373344a72776a2f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063b88d4fde116100a2578063da3ef23f11610071578063da3ef23f146105a5578063e213b5f6146105c1578063e985e9c5146105dd578063f2fde38b1461060d576101f0565b8063b88d4fde1461051d578063c668286214610539578063c87b56dd14610557578063d5abeb0114610587576101f0565b8063853828b6116100de578063853828b6146104bb5780638da5cb5b146104c557806395d89b41146104e3578063a22cb46514610501576101f0565b806370a0823114610435578063715018a614610465578063755edd171461046f5780638431f1a91461049f576101f0565b80632f745c59116101875780634f6ccce7116101565780634f6ccce71461039b57806355f804b3146103cb5780635c975abb146103e75780636352211e14610405576101f0565b80632f745c591461030357806342842e0e1461033357806342966c681461034f578063438b63001461036b576101f0565b8063095ea7b3116101c3578063095ea7b31461028f57806318160ddd146102ab57806323b872dd146102c957806328ed61fb146102e5576101f0565b806301ffc9a7146101f557806302329a291461022557806306fdde0314610241578063081812fc1461025f575b600080fd5b61020f600480360381019061020a9190612aa5565b610629565b60405161021c9190612aed565b60405180910390f35b61023f600480360381019061023a9190612b34565b6106a3565b005b6102496106c8565b6040516102569190612bfa565b60405180910390f35b61027960048036038101906102749190612c52565b61075a565b6040516102869190612cc0565b60405180910390f35b6102a960048036038101906102a49190612d07565b6107a0565b005b6102b36108b8565b6040516102c09190612d56565b60405180910390f35b6102e360048036038101906102de9190612d71565b6108c5565b005b6102ed610925565b6040516102fa9190612cc0565b60405180910390f35b61031d60048036038101906103189190612d07565b61094b565b60405161032a9190612d56565b60405180910390f35b61034d60048036038101906103489190612d71565b6109f0565b005b61036960048036038101906103649190612c52565b610a10565b005b61038560048036038101906103809190612dc4565b610aac565b6040516103929190612eaf565b60405180910390f35b6103b560048036038101906103b09190612c52565b610b5a565b6040516103c29190612d56565b60405180910390f35b6103e560048036038101906103e09190613006565b610bcb565b005b6103ef610bed565b6040516103fc9190612aed565b60405180910390f35b61041f600480360381019061041a9190612c52565b610c00565b60405161042c9190612cc0565b60405180910390f35b61044f600480360381019061044a9190612dc4565b610cb2565b60405161045c9190612d56565b60405180910390f35b61046d610d6a565b005b61048960048036038101906104849190612dc4565b610d7e565b6040516104969190612d56565b60405180910390f35b6104b960048036038101906104b49190612dc4565b610e92565b005b6104c3610ede565b005b6104cd610f3b565b6040516104da9190612cc0565b60405180910390f35b6104eb610f65565b6040516104f89190612bfa565b60405180910390f35b61051b6004803603810190610516919061304f565b610ff7565b005b61053760048036038101906105329190613130565b61100d565b005b61054161106f565b60405161054e9190612bfa565b60405180910390f35b610571600480360381019061056c9190612c52565b6110fd565b60405161057e9190612bfa565b60405180910390f35b61058f6111a7565b60405161059c9190612d56565b60405180910390f35b6105bf60048036038101906105ba9190613006565b6111ad565b005b6105db60048036038101906105d6919061333e565b6111cf565b005b6105f760048036038101906105f291906133b6565b61127d565b6040516106049190612aed565b60405180910390f35b61062760048036038101906106229190612dc4565b611311565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069c575061069b82611395565b5b9050919050565b6106ab611477565b80600d60006101000a81548160ff02191690831515021790555050565b6060600080546106d790613425565b80601f016020809104026020016040519081016040528092919081815260200182805461070390613425565b80156107505780601f1061072557610100808354040283529160200191610750565b820191906000526020600020905b81548152906001019060200180831161073357829003601f168201915b5050505050905090565b6000610765826114f5565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ab82610c00565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561081c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610813906134c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083b611540565b73ffffffffffffffffffffffffffffffffffffffff16148061086a575061086981610864611540565b61127d565b5b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a09061355b565b60405180910390fd5b6108b38383611548565b505050565b6000600880549050905090565b6108d66108d0611540565b82611601565b610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090c906135ed565b60405180910390fd5b610920838383611696565b505050565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061095683610cb2565b8210610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e9061367f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a0b8383836040518060200160405280600081525061100d565b505050565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a97906136eb565b60405180910390fd5b610aa9816118fd565b50565b60606000610ab983610cb2565b905060008167ffffffffffffffff811115610ad757610ad6612edb565b5b604051908082528060200260200182016040528015610b055781602001602082028036833780820191505090505b50905060005b82811015610b4f57610b1d858261094b565b828281518110610b3057610b2f61370b565b5b6020026020010181815250508080610b4790613769565b915050610b0b565b508092505050919050565b6000610b646108b8565b8210610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90613824565b60405180910390fd5b60088281548110610bb957610bb861370b565b5b90600052602060002001549050919050565b610bd3611477565b80600b9080519060200190610be9929190612996565b5050565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca090613890565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1a90613922565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d72611477565b610d7c6000611a1a565b565b6000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e07906136eb565b60405180910390fd5b6107d0600e5410610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d9061398e565b60405180910390fd5b6000610e63600e54611ae0565b9050610e6f8382611c22565b6001600e6000828254610e8291906139ae565b9250508190555080915050919050565b610e9a611477565b80600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ee6611477565b600047905060008111610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590613a50565b60405180910390fd5b610f383382611c40565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f7490613425565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa090613425565b8015610fed5780601f10610fc257610100808354040283529160200191610fed565b820191906000526020600020905b815481529060010190602001808311610fd057829003601f168201915b5050505050905090565b611009611002611540565b8383611cf1565b5050565b61101e611018611540565b83611601565b61105d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611054906135ed565b60405180910390fd5b61106984848484611e5e565b50505050565b600c805461107c90613425565b80601f01602080910402602001604051908101604052809291908181526020018280546110a890613425565b80156110f55780601f106110ca576101008083540402835291602001916110f5565b820191906000526020600020905b8154815290600101906020018083116110d857829003601f168201915b505050505081565b606061110882611eba565b611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613ae2565b60405180910390fd5b6000611151611f26565b90506000815111611171576040518060200160405280600081525061119f565b8061117b84611fb8565b600c60405160200161118f93929190613bd2565b6040516020818303038152906040525b915050919050565b6107d081565b6111b5611477565b80600c90805190602001906111cb929190612996565b5050565b6111d7611477565b805182511461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613c4f565b60405180910390fd5b60005b82518110156112785761126583828151811061123d5761123c61370b565b5b60200260200101518383815181106112585761125761370b565b5b6020026020010151611c22565b808061127090613769565b91505061121e565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611319611477565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090613ce1565b60405180910390fd5b61139281611a1a565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061146057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611470575061146f82612119565b5b9050919050565b61147f611540565b73ffffffffffffffffffffffffffffffffffffffff1661149d610f3b565b73ffffffffffffffffffffffffffffffffffffffff16146114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea90613d4d565b60405180910390fd5b565b6114fe81611eba565b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490613890565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115bb83610c00565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061160d83610c00565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061164f575061164e818561127d565b5b8061168d57508373ffffffffffffffffffffffffffffffffffffffff166116758461075a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116b682610c00565b73ffffffffffffffffffffffffffffffffffffffff161461170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170390613ddf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390613e71565b60405180910390fd5b611787838383612183565b611792600082611548565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e29190613e91565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183991906139ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118f8838383612297565b505050565b600061190882610c00565b905061191681600084612183565b611921600083611548565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119719190613e91565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a1681600084612297565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080826107d0611af19190613e91565b905060008133444285604051602001611b0d9493929190613f2e565b6040516020818303038152906040528051906020012060001c611b309190613fab565b9050600092506000600f826107d08110611b4d57611b4c61370b565b5b015414611b7257600f816107d08110611b6957611b6861370b565b5b01549250611b76565b8092505b6000600f600184611b879190613e91565b6107d08110611b9957611b9861370b565b5b01541415611bcd57600182611bae9190613e91565b600f826107d08110611bc357611bc261370b565b5b0181905550611c0b565b600f600183611bdc9190613e91565b6107d08110611bee57611bed61370b565b5b0154600f826107d08110611c0557611c0461370b565b5b01819055505b826107d0611c199190613e91565b92505050919050565b611c3c82826040518060200160405280600081525061229c565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c669061400d565b60006040518083038185875af1925050503d8060008114611ca3576040519150601f19603f3d011682016040523d82523d6000602084013e611ca8565b606091505b5050905080611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce39061406e565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d57906140da565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e519190612aed565b60405180910390a3505050565b611e69848484611696565b611e75848484846122f7565b611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab9061416c565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054611f3590613425565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6190613425565b8015611fae5780601f10611f8357610100808354040283529160200191611fae565b820191906000526020600020905b815481529060010190602001808311611f9157829003601f168201915b5050505050905090565b60606000821415612000576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612114565b600082905060005b6000821461203257808061201b90613769565b915050600a8261202b919061418c565b9150612008565b60008167ffffffffffffffff81111561204e5761204d612edb565b5b6040519080825280601f01601f1916602001820160405280156120805781602001600182028036833780820191505090505b5090505b6000851461210d576001826120999190613e91565b9150600a856120a89190613fab565b60306120b491906139ae565b60f81b8183815181106120ca576120c961370b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612106919061418c565b9450612084565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61218e83838361248e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121d1576121cc81612493565b612210565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461220f5761220e83826124dc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122535761224e81612649565b612292565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461229157612290828261271a565b5b5b505050565b505050565b6122a68383612799565b6122b360008484846122f7565b6122f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e99061416c565b60405180910390fd5b505050565b60006123188473ffffffffffffffffffffffffffffffffffffffff16612973565b15612481578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612341611540565b8786866040518563ffffffff1660e01b81526004016123639493929190614212565b602060405180830381600087803b15801561237d57600080fd5b505af19250505080156123ae57506040513d601f19601f820116820180604052508101906123ab9190614273565b60015b612431573d80600081146123de576040519150601f19603f3d011682016040523d82523d6000602084013e6123e3565b606091505b50600081511415612429576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124209061416c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612486565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124e984610cb2565b6124f39190613e91565b90506000600760008481526020019081526020016000205490508181146125d8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061265d9190613e91565b905060006009600084815260200190815260200160002054905060006008838154811061268d5761268c61370b565b5b9060005260206000200154905080600883815481106126af576126ae61370b565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126fe576126fd6142a0565b5b6001900381819060005260206000200160009055905550505050565b600061272583610cb2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612809576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128009061431b565b60405180910390fd5b61281281611eba565b15612852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284990614387565b60405180910390fd5b61285e60008383612183565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ae91906139ae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461296f60008383612297565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546129a290613425565b90600052602060002090601f0160209004810192826129c45760008555612a0b565b82601f106129dd57805160ff1916838001178555612a0b565b82800160010185558215612a0b579182015b82811115612a0a5782518255916020019190600101906129ef565b5b509050612a189190612a1c565b5090565b5b80821115612a35576000816000905550600101612a1d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a8281612a4d565b8114612a8d57600080fd5b50565b600081359050612a9f81612a79565b92915050565b600060208284031215612abb57612aba612a43565b5b6000612ac984828501612a90565b91505092915050565b60008115159050919050565b612ae781612ad2565b82525050565b6000602082019050612b026000830184612ade565b92915050565b612b1181612ad2565b8114612b1c57600080fd5b50565b600081359050612b2e81612b08565b92915050565b600060208284031215612b4a57612b49612a43565b5b6000612b5884828501612b1f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b9b578082015181840152602081019050612b80565b83811115612baa576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bcc82612b61565b612bd68185612b6c565b9350612be6818560208601612b7d565b612bef81612bb0565b840191505092915050565b60006020820190508181036000830152612c148184612bc1565b905092915050565b6000819050919050565b612c2f81612c1c565b8114612c3a57600080fd5b50565b600081359050612c4c81612c26565b92915050565b600060208284031215612c6857612c67612a43565b5b6000612c7684828501612c3d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612caa82612c7f565b9050919050565b612cba81612c9f565b82525050565b6000602082019050612cd56000830184612cb1565b92915050565b612ce481612c9f565b8114612cef57600080fd5b50565b600081359050612d0181612cdb565b92915050565b60008060408385031215612d1e57612d1d612a43565b5b6000612d2c85828601612cf2565b9250506020612d3d85828601612c3d565b9150509250929050565b612d5081612c1c565b82525050565b6000602082019050612d6b6000830184612d47565b92915050565b600080600060608486031215612d8a57612d89612a43565b5b6000612d9886828701612cf2565b9350506020612da986828701612cf2565b9250506040612dba86828701612c3d565b9150509250925092565b600060208284031215612dda57612dd9612a43565b5b6000612de884828501612cf2565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e2681612c1c565b82525050565b6000612e388383612e1d565b60208301905092915050565b6000602082019050919050565b6000612e5c82612df1565b612e668185612dfc565b9350612e7183612e0d565b8060005b83811015612ea2578151612e898882612e2c565b9750612e9483612e44565b925050600181019050612e75565b5085935050505092915050565b60006020820190508181036000830152612ec98184612e51565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f1382612bb0565b810181811067ffffffffffffffff82111715612f3257612f31612edb565b5b80604052505050565b6000612f45612a39565b9050612f518282612f0a565b919050565b600067ffffffffffffffff821115612f7157612f70612edb565b5b612f7a82612bb0565b9050602081019050919050565b82818337600083830152505050565b6000612fa9612fa484612f56565b612f3b565b905082815260208101848484011115612fc557612fc4612ed6565b5b612fd0848285612f87565b509392505050565b600082601f830112612fed57612fec612ed1565b5b8135612ffd848260208601612f96565b91505092915050565b60006020828403121561301c5761301b612a43565b5b600082013567ffffffffffffffff81111561303a57613039612a48565b5b61304684828501612fd8565b91505092915050565b6000806040838503121561306657613065612a43565b5b600061307485828601612cf2565b925050602061308585828601612b1f565b9150509250929050565b600067ffffffffffffffff8211156130aa576130a9612edb565b5b6130b382612bb0565b9050602081019050919050565b60006130d36130ce8461308f565b612f3b565b9050828152602081018484840111156130ef576130ee612ed6565b5b6130fa848285612f87565b509392505050565b600082601f83011261311757613116612ed1565b5b81356131278482602086016130c0565b91505092915050565b6000806000806080858703121561314a57613149612a43565b5b600061315887828801612cf2565b945050602061316987828801612cf2565b935050604061317a87828801612c3d565b925050606085013567ffffffffffffffff81111561319b5761319a612a48565b5b6131a787828801613102565b91505092959194509250565b600067ffffffffffffffff8211156131ce576131cd612edb565b5b602082029050602081019050919050565b600080fd5b60006131f76131f2846131b3565b612f3b565b9050808382526020820190506020840283018581111561321a576132196131df565b5b835b81811015613243578061322f8882612cf2565b84526020840193505060208101905061321c565b5050509392505050565b600082601f83011261326257613261612ed1565b5b81356132728482602086016131e4565b91505092915050565b600067ffffffffffffffff82111561329657613295612edb565b5b602082029050602081019050919050565b60006132ba6132b58461327b565b612f3b565b905080838252602082019050602084028301858111156132dd576132dc6131df565b5b835b8181101561330657806132f28882612c3d565b8452602084019350506020810190506132df565b5050509392505050565b600082601f83011261332557613324612ed1565b5b81356133358482602086016132a7565b91505092915050565b6000806040838503121561335557613354612a43565b5b600083013567ffffffffffffffff81111561337357613372612a48565b5b61337f8582860161324d565b925050602083013567ffffffffffffffff8111156133a05761339f612a48565b5b6133ac85828601613310565b9150509250929050565b600080604083850312156133cd576133cc612a43565b5b60006133db85828601612cf2565b92505060206133ec85828601612cf2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061343d57607f821691505b60208210811415613451576134506133f6565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134b3602183612b6c565b91506134be82613457565b604082019050919050565b600060208201905081810360008301526134e2816134a6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613545603e83612b6c565b9150613550826134e9565b604082019050919050565b6000602082019050818103600083015261357481613538565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006135d7602e83612b6c565b91506135e28261357b565b604082019050919050565b60006020820190508181036000830152613606816135ca565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613669602b83612b6c565b91506136748261360d565b604082019050919050565b600060208201905081810360008301526136988161365c565b9050919050565b7f4f6e6c79207574696c20636f6e74726163740000000000000000000000000000600082015250565b60006136d5601283612b6c565b91506136e08261369f565b602082019050919050565b60006020820190508181036000830152613704816136c8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061377482612c1c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137a7576137a661373a565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061380e602c83612b6c565b9150613819826137b2565b604082019050919050565b6000602082019050818103600083015261383d81613801565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061387a601883612b6c565b915061388582613844565b602082019050919050565b600060208201905081810360008301526138a98161386d565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061390c602983612b6c565b9150613917826138b0565b604082019050919050565b6000602082019050818103600083015261393b816138ff565b9050919050565b7f4d696e746564206f757400000000000000000000000000000000000000000000600082015250565b6000613978600a83612b6c565b915061398382613942565b602082019050919050565b600060208201905081810360008301526139a78161396b565b9050919050565b60006139b982612c1c565b91506139c483612c1c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139f9576139f861373a565b5b828201905092915050565b7f496e737566666963656e742062616c616e636500000000000000000000000000600082015250565b6000613a3a601383612b6c565b9150613a4582613a04565b602082019050919050565b60006020820190508181036000830152613a6981613a2d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613acc602f83612b6c565b9150613ad782613a70565b604082019050919050565b60006020820190508181036000830152613afb81613abf565b9050919050565b600081905092915050565b6000613b1882612b61565b613b228185613b02565b9350613b32818560208601612b7d565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613b6081613425565b613b6a8186613b02565b94506001821660008114613b855760018114613b9657613bc9565b60ff19831686528186019350613bc9565b613b9f85613b3e565b60005b83811015613bc157815481890152600182019150602081019050613ba2565b838801955050505b50505092915050565b6000613bde8286613b0d565b9150613bea8285613b0d565b9150613bf68284613b53565b9150819050949350505050565b7f496e7075742044617461206572726f7200000000000000000000000000000000600082015250565b6000613c39601083612b6c565b9150613c4482613c03565b602082019050919050565b60006020820190508181036000830152613c6881613c2c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ccb602683612b6c565b9150613cd682613c6f565b604082019050919050565b60006020820190508181036000830152613cfa81613cbe565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d37602083612b6c565b9150613d4282613d01565b602082019050919050565b60006020820190508181036000830152613d6681613d2a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dc9602583612b6c565b9150613dd482613d6d565b604082019050919050565b60006020820190508181036000830152613df881613dbc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e5b602483612b6c565b9150613e6682613dff565b604082019050919050565b60006020820190508181036000830152613e8a81613e4e565b9050919050565b6000613e9c82612c1c565b9150613ea783612c1c565b925082821015613eba57613eb961373a565b5b828203905092915050565b60008160601b9050919050565b6000613edd82613ec5565b9050919050565b6000613eef82613ed2565b9050919050565b613f07613f0282612c9f565b613ee4565b82525050565b6000819050919050565b613f28613f2382612c1c565b613f0d565b82525050565b6000613f3a8287613ef6565b601482019150613f4a8286613f17565b602082019150613f5a8285613f17565b602082019150613f6a8284613f17565b60208201915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fb682612c1c565b9150613fc183612c1c565b925082613fd157613fd0613f7c565b5b828206905092915050565b600081905092915050565b50565b6000613ff7600083613fdc565b915061400282613fe7565b600082019050919050565b600061401882613fea565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b6000614058601883612b6c565b915061406382614022565b602082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140c4601983612b6c565b91506140cf8261408e565b602082019050919050565b600060208201905081810360008301526140f3816140b7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614156603283612b6c565b9150614161826140fa565b604082019050919050565b6000602082019050818103600083015261418581614149565b9050919050565b600061419782612c1c565b91506141a283612c1c565b9250826141b2576141b1613f7c565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006141e4826141bd565b6141ee81856141c8565b93506141fe818560208601612b7d565b61420781612bb0565b840191505092915050565b60006080820190506142276000830187612cb1565b6142346020830186612cb1565b6142416040830185612d47565b818103606083015261425381846141d9565b905095945050505050565b60008151905061426d81612a79565b92915050565b60006020828403121561428957614288612a43565b5b60006142978482850161425e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614305602083612b6c565b9150614310826142cf565b602082019050919050565b60006020820190508181036000830152614334816142f8565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614371601c83612b6c565b915061437c8261433b565b602082019050919050565b600060208201905081810360008301526143a081614364565b905091905056fea2646970667358221220da6135ee2e5d088e5568b5f52c9c57268c0f55eb78d48aa6be7287a00ac9f71c64736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e57742748f98ab8e08b565160d3a9a32bfef735200000000000000000000000000000000000000000000000000000000000003f6000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d55536458414e4633457941727864425247694e6d4d72556a4a3964715944395242546439586373344a72776a2f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://ipfs.io/ipfs/QmUSdXANF3EyArxdBRGiNmMrUjJ9dqYD9RBTd9Xcs4Jrwj/
Arg [1] : _util (address): 0xe57742748f98ab8e08b565160d3a9a32bfef7352
Arg [2] : _currentId (uint256): 1014

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 000000000000000000000000e57742748f98ab8e08b565160d3a9a32bfef7352
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003f6
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [4] : 68747470733a2f2f697066732e696f2f697066732f516d55536458414e463345
Arg [5] : 7941727864425247694e6d4d72556a4a3964715944395242546439586373344a
Arg [6] : 72776a2f00000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

111706:3914:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105483:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113983:77;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92217:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93730:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93247:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106123:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94430:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111942:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105791:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94837:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;112806:80;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;112894:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106313:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113739:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111907:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91928:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91659:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70746:103;;;:::i;:::-;;112548:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;114467:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114070:195;;;:::i;:::-;;70098:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92386:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93973:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95093:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111816:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113272:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;111860:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113849:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114585:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94199:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71004:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105483:224;105585:4;105624:35;105609:50;;;:11;:50;;;;:90;;;;105663:36;105687:11;105663:23;:36::i;:::-;105609:90;105602:97;;105483:224;;;:::o;113983:77::-;69984:13;:11;:13::i;:::-;114046:6:::1;114037;;:15;;;;;;;;;;;;;;;;;;113983:77:::0;:::o;92217:100::-;92271:13;92304:5;92297:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92217:100;:::o;93730:171::-;93806:7;93826:23;93841:7;93826:14;:23::i;:::-;93869:15;:24;93885:7;93869:24;;;;;;;;;;;;;;;;;;;;;93862:31;;93730:171;;;:::o;93247:417::-;93328:13;93344:23;93359:7;93344:14;:23::i;:::-;93328:39;;93392:5;93386:11;;:2;:11;;;;93378:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;93486:5;93470:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;93495:37;93512:5;93519:12;:10;:12::i;:::-;93495:16;:37::i;:::-;93470:62;93448:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;93635:21;93644:2;93648:7;93635:8;:21::i;:::-;93317:347;93247:417;;:::o;106123:113::-;106184:7;106211:10;:17;;;;106204:24;;106123:113;:::o;94430:336::-;94625:41;94644:12;:10;:12::i;:::-;94658:7;94625:18;:41::i;:::-;94617:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;94730:28;94740:4;94746:2;94750:7;94730:9;:28::i;:::-;94430:336;;;:::o;111942:28::-;;;;;;;;;;;;;:::o;105791:256::-;105888:7;105924:23;105941:5;105924:16;:23::i;:::-;105916:5;:31;105908:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;106013:12;:19;106026:5;106013:19;;;;;;;;;;;;;;;:26;106033:5;106013:26;;;;;;;;;;;;106006:33;;105791:256;;;;:::o;94837:185::-;94975:39;94992:4;94998:2;95002:7;94975:39;;;;;;;;;;;;:16;:39::i;:::-;94837:185;;;:::o;112806:80::-;112115:13;;;;;;;;;;;112101:27;;:10;:27;;;112093:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;112864:14:::1;112870:7;112864:5;:14::i;:::-;112806:80:::0;:::o;112894:370::-;112975:16;113007:23;113033:17;113043:6;113033:9;:17::i;:::-;113007:43;;113059:25;113101:15;113087:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113059:58;;113131:9;113126:107;113146:15;113142:1;:19;113126:107;;;113193:30;113213:6;113221:1;113193:19;:30::i;:::-;113179:8;113188:1;113179:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;113163:3;;;;;:::i;:::-;;;;113126:107;;;;113248:8;113241:15;;;;112894:370;;;:::o;106313:233::-;106388:7;106424:30;:28;:30::i;:::-;106416:5;:38;106408:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;106521:10;106532:5;106521:17;;;;;;;;:::i;:::-;;;;;;;;;;106514:24;;106313:233;;;:::o;113739:102::-;69984:13;:11;:13::i;:::-;113822:11:::1;113812:7;:21;;;;;;;;;;;;:::i;:::-;;113739:102:::0;:::o;111907:26::-;;;;;;;;;;;;;:::o;91928:222::-;92000:7;92020:13;92036:7;:16;92044:7;92036:16;;;;;;;;;;;;;;;;;;;;;92020:32;;92088:1;92071:19;;:5;:19;;;;92063:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;92137:5;92130:12;;;91928:222;;;:::o;91659:207::-;91731:7;91776:1;91759:19;;:5;:19;;;;91751:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;91842:9;:16;91852:5;91842:16;;;;;;;;;;;;;;;;91835:23;;91659:207;;;:::o;70746:103::-;69984:13;:11;:13::i;:::-;70811:30:::1;70838:1;70811:18;:30::i;:::-;70746:103::o:0;112548:250::-;112603:7;112115:13;;;;;;;;;;;112101:27;;:10;:27;;;112093:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;111896:4:::1;112629:11;;:23;112621:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;112676:13;112692:22;112702:11;;112692:9;:22::i;:::-;112676:38;;112723:21;112733:3;112738:5;112723:9;:21::i;:::-;112768:1;112753:11;;:16;;;;;;;:::i;:::-;;;;;;;;112785:5;112778:12;;;112548:250:::0;;;:::o;114467:110::-;69984:13;:11;:13::i;:::-;114557:12:::1;114541:13;;:28;;;;;;;;;;;;;;;;;;114467:110:::0;:::o;114070:195::-;69984:13;:11;:13::i;:::-;114119:15:::1;114137:21;114119:39;;114185:1;114175:7;:11;114167:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;114219:30;114229:10;114241:7;114219:9;:30::i;:::-;114110:155;114070:195::o:0;70098:87::-;70144:7;70171:6;;;;;;;;;;;70164:13;;70098:87;:::o;92386:104::-;92442:13;92475:7;92468:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92386:104;:::o;93973:155::-;94068:52;94087:12;:10;:12::i;:::-;94101:8;94111;94068:18;:52::i;:::-;93973:155;;:::o;95093:323::-;95267:41;95286:12;:10;:12::i;:::-;95300:7;95267:18;:41::i;:::-;95259:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;95370:38;95384:4;95390:2;95394:7;95403:4;95370:13;:38::i;:::-;95093:323;;;;:::o;111816:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;113272:459::-;113380:13;113427:16;113435:7;113427;:16::i;:::-;113409:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;113529:28;113560:10;:8;:10::i;:::-;113529:41;;113617:1;113592:14;113586:28;:32;:137;;;;;;;;;;;;;;;;;113656:14;113672:18;:7;:16;:18::i;:::-;113692:13;113639:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;113586:137;113579:144;;;113272:459;;;:::o;111860:40::-;111896:4;111860:40;:::o;113849:126::-;69984:13;:11;:13::i;:::-;113950:17:::1;113934:13;:33;;;;;;;;;;;;:::i;:::-;;113849:126:::0;:::o;114585:293::-;69984:13;:11;:13::i;:::-;114732:4:::1;:11;114713:8;:15;:30;114705:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;114778:9;114773:98;114797:8;:15;114793:1;:19;114773:98;;;114830:31;114840:8;114849:1;114840:11;;;;;;;;:::i;:::-;;;;;;;;114853:4;114858:1;114853:7;;;;;;;;:::i;:::-;;;;;;;;114830:9;:31::i;:::-;114814:3;;;;;:::i;:::-;;;;114773:98;;;;114585:293:::0;;:::o;94199:164::-;94296:4;94320:18;:25;94339:5;94320:25;;;;;;;;;;;;;;;:35;94346:8;94320:35;;;;;;;;;;;;;;;;;;;;;;;;;94313:42;;94199:164;;;;:::o;71004:201::-;69984:13;:11;:13::i;:::-;71113:1:::1;71093:22;;:8;:22;;;;71085:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;71169:28;71188:8;71169:18;:28::i;:::-;71004:201:::0;:::o;91290:305::-;91392:4;91444:25;91429:40;;;:11;:40;;;;:105;;;;91501:33;91486:48;;;:11;:48;;;;91429:105;:158;;;;91551:36;91575:11;91551:23;:36::i;:::-;91429:158;91409:178;;91290:305;;;:::o;70263:132::-;70338:12;:10;:12::i;:::-;70327:23;;:7;:5;:7::i;:::-;:23;;;70319:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70263:132::o;101705:135::-;101787:16;101795:7;101787;:16::i;:::-;101779:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;101705:135;:::o;68649:98::-;68702:7;68729:10;68722:17;;68649:98;:::o;100984:174::-;101086:2;101059:15;:24;101075:7;101059:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;101142:7;101138:2;101104:46;;101113:23;101128:7;101113:14;:23::i;:::-;101104:46;;;;;;;;;;;;100984:174;;:::o;97217:264::-;97310:4;97327:13;97343:23;97358:7;97343:14;:23::i;:::-;97327:39;;97396:5;97385:16;;:7;:16;;;:52;;;;97405:32;97422:5;97429:7;97405:16;:32::i;:::-;97385:52;:87;;;;97465:7;97441:31;;:20;97453:7;97441:11;:20::i;:::-;:31;;;97385:87;97377:96;;;97217:264;;;;:::o;100240:625::-;100399:4;100372:31;;:23;100387:7;100372:14;:23::i;:::-;:31;;;100364:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;100478:1;100464:16;;:2;:16;;;;100456:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;100534:39;100555:4;100561:2;100565:7;100534:20;:39::i;:::-;100638:29;100655:1;100659:7;100638:8;:29::i;:::-;100699:1;100680:9;:15;100690:4;100680:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;100728:1;100711:9;:13;100721:2;100711:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;100759:2;100740:7;:16;100748:7;100740:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;100798:7;100794:2;100779:27;;100788:4;100779:27;;;;;;;;;;;;100819:38;100839:4;100845:2;100849:7;100819:19;:38::i;:::-;100240:625;;;:::o;99483:420::-;99543:13;99559:23;99574:7;99559:14;:23::i;:::-;99543:39;;99595:48;99616:5;99631:1;99635:7;99595:20;:48::i;:::-;99684:29;99701:1;99705:7;99684:8;:29::i;:::-;99746:1;99726:9;:16;99736:5;99726:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;99765:7;:16;99773:7;99765:16;;;;;;;;;;;;99758:23;;;;;;;;;;;99827:7;99823:1;99799:36;;99808:5;99799:36;;;;;;;;;;;;99848:47;99868:5;99883:1;99887:7;99848:19;:47::i;:::-;99532:371;99483:420;:::o;71365:191::-;71439:16;71458:6;;;;;;;;;;;71439:25;;71484:8;71475:6;;:17;;;;;;;;;;;;;;;;;;71539:8;71508:40;;71529:8;71508:40;;;;;;;;;;;;71428:128;71365:191;:::o;114886:728::-;114944:13;114968:17;115000:12;111896:4;114988:24;;;;:::i;:::-;114968:44;;115021:12;115133:9;115071:10;115083:16;115101:15;115118:9;115054:74;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;115044:85;;;;;;115036:94;;:106;;;;:::i;:::-;115021:121;;115159:1;115151:9;;115271:1;115249:12;115262:4;115249:18;;;;;;;:::i;:::-;;;;:23;115245:103;;115293:12;115306:4;115293:18;;;;;;;:::i;:::-;;;;115285:26;;115245:103;;;115344:4;115336:12;;115245:103;115451:1;115420:12;115445:1;115433:9;:13;;;;:::i;:::-;115420:27;;;;;;;:::i;:::-;;;;:32;115416:156;;;115498:1;115486:9;:13;;;;:::i;:::-;115465:12;115478:4;115465:18;;;;;;;:::i;:::-;;;:34;;;;115416:156;;;115545:12;115570:1;115558:9;:13;;;;:::i;:::-;115545:27;;;;;;;:::i;:::-;;;;115524:12;115537:4;115524:18;;;;;;;:::i;:::-;;;:48;;;;115416:156;115601:5;111896:4;115589:17;;;;:::i;:::-;115581:25;;114959:655;;114886:728;;;:::o;97823:110::-;97899:26;97909:2;97913:7;97899:26;;;;;;;;;;;;:9;:26::i;:::-;97823:110;;:::o;114273:186::-;114345:12;114363:8;:13;;114385:7;114363:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114344:54;;;114415:7;114407:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;114335:124;114273:186;;:::o;101301:315::-;101456:8;101447:17;;:5;:17;;;;101439:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;101543:8;101505:18;:25;101524:5;101505:25;;;;;;;;;;;;;;;:35;101531:8;101505:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;101589:8;101567:41;;101582:5;101567:41;;;101599:8;101567:41;;;;;;:::i;:::-;;;;;;;;101301:315;;;:::o;96297:313::-;96453:28;96463:4;96469:2;96473:7;96453:9;:28::i;:::-;96500:47;96523:4;96529:2;96533:7;96542:4;96500:22;:47::i;:::-;96492:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;96297:313;;;;:::o;96923:127::-;96988:4;97040:1;97012:30;;:7;:16;97020:7;97012:16;;;;;;;;;;;;;;;;;;;;;:30;;;;97005:37;;96923:127;;;:::o;112434:106::-;112494:13;112525:7;112518:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112434:106;:::o;65903:723::-;65959:13;66189:1;66180:5;:10;66176:53;;;66207:10;;;;;;;;;;;;;;;;;;;;;66176:53;66239:12;66254:5;66239:20;;66270:14;66295:78;66310:1;66302:4;:9;66295:78;;66328:8;;;;;:::i;:::-;;;;66359:2;66351:10;;;;;:::i;:::-;;;66295:78;;;66383:19;66415:6;66405:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66383:39;;66433:154;66449:1;66440:5;:10;66433:154;;66477:1;66467:11;;;;;:::i;:::-;;;66544:2;66536:5;:10;;;;:::i;:::-;66523:2;:24;;;;:::i;:::-;66510:39;;66493:6;66500;66493:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;66573:2;66564:11;;;;;:::i;:::-;;;66433:154;;;66611:6;66597:21;;;;;65903:723;;;;:::o;82952:157::-;83037:4;83076:25;83061:40;;;:11;:40;;;;83054:47;;82952:157;;;:::o;107159:589::-;107303:45;107330:4;107336:2;107340:7;107303:26;:45::i;:::-;107381:1;107365:18;;:4;:18;;;107361:187;;;107400:40;107432:7;107400:31;:40::i;:::-;107361:187;;;107470:2;107462:10;;:4;:10;;;107458:90;;107489:47;107522:4;107528:7;107489:32;:47::i;:::-;107458:90;107361:187;107576:1;107562:16;;:2;:16;;;107558:183;;;107595:45;107632:7;107595:36;:45::i;:::-;107558:183;;;107668:4;107662:10;;:2;:10;;;107658:83;;107689:40;107717:2;107721:7;107689:27;:40::i;:::-;107658:83;107558:183;107159:589;;;:::o;104340:125::-;;;;:::o;98160:319::-;98289:18;98295:2;98299:7;98289:5;:18::i;:::-;98340:53;98371:1;98375:2;98379:7;98388:4;98340:22;:53::i;:::-;98318:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;98160:319;;;:::o;102404:853::-;102558:4;102579:15;:2;:13;;;:15::i;:::-;102575:675;;;102631:2;102615:36;;;102652:12;:10;:12::i;:::-;102666:4;102672:7;102681:4;102615:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;102611:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102873:1;102856:6;:13;:18;102852:328;;;102899:60;;;;;;;;;;:::i;:::-;;;;;;;;102852:328;103130:6;103124:13;103115:6;103111:2;103107:15;103100:38;102611:584;102747:41;;;102737:51;;;:6;:51;;;;102730:58;;;;;102575:675;103234:4;103227:11;;102404:853;;;;;;;:::o;103829:126::-;;;;:::o;108471:164::-;108575:10;:17;;;;108548:15;:24;108564:7;108548:24;;;;;;;;;;;:44;;;;108603:10;108619:7;108603:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108471:164;:::o;109262:988::-;109528:22;109578:1;109553:22;109570:4;109553:16;:22::i;:::-;:26;;;;:::i;:::-;109528:51;;109590:18;109611:17;:26;109629:7;109611:26;;;;;;;;;;;;109590:47;;109758:14;109744:10;:28;109740:328;;109789:19;109811:12;:18;109824:4;109811:18;;;;;;;;;;;;;;;:34;109830:14;109811:34;;;;;;;;;;;;109789:56;;109895:11;109862:12;:18;109875:4;109862:18;;;;;;;;;;;;;;;:30;109881:10;109862:30;;;;;;;;;;;:44;;;;110012:10;109979:17;:30;109997:11;109979:30;;;;;;;;;;;:43;;;;109774:294;109740:328;110164:17;:26;110182:7;110164:26;;;;;;;;;;;110157:33;;;110208:12;:18;110221:4;110208:18;;;;;;;;;;;;;;;:34;110227:14;110208:34;;;;;;;;;;;110201:41;;;109343:907;;109262:988;;:::o;110545:1079::-;110798:22;110843:1;110823:10;:17;;;;:21;;;;:::i;:::-;110798:46;;110855:18;110876:15;:24;110892:7;110876:24;;;;;;;;;;;;110855:45;;111227:19;111249:10;111260:14;111249:26;;;;;;;;:::i;:::-;;;;;;;;;;111227:48;;111313:11;111288:10;111299;111288:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;111424:10;111393:15;:28;111409:11;111393:28;;;;;;;;;;;:41;;;;111565:15;:24;111581:7;111565:24;;;;;;;;;;;111558:31;;;111600:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;110616:1008;;;110545:1079;:::o;108049:221::-;108134:14;108151:20;108168:2;108151:16;:20::i;:::-;108134:37;;108209:7;108182:12;:16;108195:2;108182:16;;;;;;;;;;;;;;;:24;108199:6;108182:24;;;;;;;;;;;:34;;;;108256:6;108227:17;:26;108245:7;108227:26;;;;;;;;;;;:35;;;;108123:147;108049:221;;:::o;98815:439::-;98909:1;98895:16;;:2;:16;;;;98887:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;98968:16;98976:7;98968;:16::i;:::-;98967:17;98959:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;99030:45;99059:1;99063:2;99067:7;99030:20;:45::i;:::-;99105:1;99088:9;:13;99098:2;99088:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;99136:2;99117:7;:16;99125:7;99117:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;99181:7;99177:2;99156:33;;99173:1;99156:33;;;;;;;;;;;;99202:44;99230:1;99234:2;99238:7;99202:19;:44::i;:::-;98815:439;;:::o;72796:326::-;72856:4;73113:1;73091:7;:19;;;:23;73084:30;;72796:326;;;:::o;-1:-1:-1:-;;;;;;;:::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:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:122::-;3654:24;3672:5;3654:24;:::i;:::-;3647:5;3644:35;3634:63;;3693:1;3690;3683:12;3634:63;3581:122;:::o;3709:139::-;3755:5;3793:6;3780:20;3771:29;;3809:33;3836:5;3809:33;:::i;:::-;3709:139;;;;:::o;3854:329::-;3913:6;3962:2;3950:9;3941:7;3937:23;3933:32;3930:119;;;3968:79;;:::i;:::-;3930:119;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;3854:329;;;;:::o;4189:126::-;4226:7;4266:42;4259:5;4255:54;4244:65;;4189:126;;;:::o;4321:96::-;4358:7;4387:24;4405:5;4387:24;:::i;:::-;4376:35;;4321:96;;;:::o;4423:118::-;4510:24;4528:5;4510:24;:::i;:::-;4505:3;4498:37;4423:118;;:::o;4547:222::-;4640:4;4678:2;4667:9;4663:18;4655:26;;4691:71;4759:1;4748:9;4744:17;4735:6;4691:71;:::i;:::-;4547:222;;;;:::o;4775:122::-;4848:24;4866:5;4848:24;:::i;:::-;4841:5;4838:35;4828:63;;4887:1;4884;4877:12;4828:63;4775:122;:::o;4903:139::-;4949:5;4987:6;4974:20;4965:29;;5003:33;5030:5;5003:33;:::i;:::-;4903:139;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:114::-;6907:6;6941:5;6935:12;6925:22;;6840:114;;;:::o;6960:184::-;7059:11;7093:6;7088:3;7081:19;7133:4;7128:3;7124:14;7109:29;;6960:184;;;;:::o;7150:132::-;7217:4;7240:3;7232:11;;7270:4;7265:3;7261:14;7253:22;;7150:132;;;:::o;7288:108::-;7365:24;7383:5;7365:24;:::i;:::-;7360:3;7353:37;7288:108;;:::o;7402:179::-;7471:10;7492:46;7534:3;7526:6;7492:46;:::i;:::-;7570:4;7565:3;7561:14;7547:28;;7402:179;;;;:::o;7587:113::-;7657:4;7689;7684:3;7680:14;7672:22;;7587:113;;;:::o;7736:732::-;7855:3;7884:54;7932:5;7884:54;:::i;:::-;7954:86;8033:6;8028:3;7954:86;:::i;:::-;7947:93;;8064:56;8114:5;8064:56;:::i;:::-;8143:7;8174:1;8159:284;8184:6;8181:1;8178:13;8159:284;;;8260:6;8254:13;8287:63;8346:3;8331:13;8287:63;:::i;:::-;8280:70;;8373:60;8426:6;8373:60;:::i;:::-;8363:70;;8219:224;8206:1;8203;8199:9;8194:14;;8159:284;;;8163:14;8459:3;8452:10;;7860:608;;;7736:732;;;;:::o;8474:373::-;8617:4;8655:2;8644:9;8640:18;8632:26;;8704:9;8698:4;8694:20;8690:1;8679:9;8675:17;8668:47;8732:108;8835:4;8826:6;8732:108;:::i;:::-;8724:116;;8474:373;;;;:::o;8853:117::-;8962:1;8959;8952:12;8976:117;9085:1;9082;9075:12;9099:180;9147:77;9144:1;9137:88;9244:4;9241:1;9234:15;9268:4;9265:1;9258:15;9285:281;9368:27;9390:4;9368:27;:::i;:::-;9360:6;9356:40;9498:6;9486:10;9483:22;9462:18;9450:10;9447:34;9444:62;9441:88;;;9509:18;;:::i;:::-;9441:88;9549:10;9545:2;9538:22;9328:238;9285:281;;:::o;9572:129::-;9606:6;9633:20;;:::i;:::-;9623:30;;9662:33;9690:4;9682:6;9662:33;:::i;:::-;9572:129;;;:::o;9707:308::-;9769:4;9859:18;9851:6;9848:30;9845:56;;;9881:18;;:::i;:::-;9845:56;9919:29;9941:6;9919:29;:::i;:::-;9911:37;;10003:4;9997;9993:15;9985:23;;9707:308;;;:::o;10021:154::-;10105:6;10100:3;10095;10082:30;10167:1;10158:6;10153:3;10149:16;10142:27;10021:154;;;:::o;10181:412::-;10259:5;10284:66;10300:49;10342:6;10300:49;:::i;:::-;10284:66;:::i;:::-;10275:75;;10373:6;10366:5;10359:21;10411:4;10404:5;10400:16;10449:3;10440:6;10435:3;10431:16;10428:25;10425:112;;;10456:79;;:::i;:::-;10425:112;10546:41;10580:6;10575:3;10570;10546:41;:::i;:::-;10265:328;10181:412;;;;;:::o;10613:340::-;10669:5;10718:3;10711:4;10703:6;10699:17;10695:27;10685:122;;10726:79;;:::i;:::-;10685:122;10843:6;10830:20;10868:79;10943:3;10935:6;10928:4;10920:6;10916:17;10868:79;:::i;:::-;10859:88;;10675:278;10613:340;;;;:::o;10959:509::-;11028:6;11077:2;11065:9;11056:7;11052:23;11048:32;11045:119;;;11083:79;;:::i;:::-;11045:119;11231:1;11220:9;11216:17;11203:31;11261:18;11253:6;11250:30;11247:117;;;11283:79;;:::i;:::-;11247:117;11388:63;11443:7;11434:6;11423:9;11419:22;11388:63;:::i;:::-;11378:73;;11174:287;10959:509;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:311::-;14060:4;14150:18;14142:6;14139:30;14136:56;;;14172:18;;:::i;:::-;14136:56;14222:4;14214:6;14210:17;14202:25;;14282:4;14276;14272:15;14264:23;;13983:311;;;:::o;14300:117::-;14409:1;14406;14399:12;14440:710;14536:5;14561:81;14577:64;14634:6;14577:64;:::i;:::-;14561:81;:::i;:::-;14552:90;;14662:5;14691:6;14684:5;14677:21;14725:4;14718:5;14714:16;14707:23;;14778:4;14770:6;14766:17;14758:6;14754:30;14807:3;14799:6;14796:15;14793:122;;;14826:79;;:::i;:::-;14793:122;14941:6;14924:220;14958:6;14953:3;14950:15;14924:220;;;15033:3;15062:37;15095:3;15083:10;15062:37;:::i;:::-;15057:3;15050:50;15129:4;15124:3;15120:14;15113:21;;15000:144;14984:4;14979:3;14975:14;14968:21;;14924:220;;;14928:21;14542:608;;14440:710;;;;;:::o;15173:370::-;15244:5;15293:3;15286:4;15278:6;15274:17;15270:27;15260:122;;15301:79;;:::i;:::-;15260:122;15418:6;15405:20;15443:94;15533:3;15525:6;15518:4;15510:6;15506:17;15443:94;:::i;:::-;15434:103;;15250:293;15173:370;;;;:::o;15549:311::-;15626:4;15716:18;15708:6;15705:30;15702:56;;;15738:18;;:::i;:::-;15702:56;15788:4;15780:6;15776:17;15768:25;;15848:4;15842;15838:15;15830:23;;15549:311;;;:::o;15883:710::-;15979:5;16004:81;16020:64;16077:6;16020:64;:::i;:::-;16004:81;:::i;:::-;15995:90;;16105:5;16134:6;16127:5;16120:21;16168:4;16161:5;16157:16;16150:23;;16221:4;16213:6;16209:17;16201:6;16197:30;16250:3;16242:6;16239:15;16236:122;;;16269:79;;:::i;:::-;16236:122;16384:6;16367:220;16401:6;16396:3;16393:15;16367:220;;;16476:3;16505:37;16538:3;16526:10;16505:37;:::i;:::-;16500:3;16493:50;16572:4;16567:3;16563:14;16556:21;;16443:144;16427:4;16422:3;16418:14;16411:21;;16367:220;;;16371:21;15985:608;;15883:710;;;;;:::o;16616:370::-;16687:5;16736:3;16729:4;16721:6;16717:17;16713:27;16703:122;;16744:79;;:::i;:::-;16703:122;16861:6;16848:20;16886:94;16976:3;16968:6;16961:4;16953:6;16949:17;16886:94;:::i;:::-;16877:103;;16693:293;16616:370;;;;:::o;16992:894::-;17110:6;17118;17167:2;17155:9;17146:7;17142:23;17138:32;17135:119;;;17173:79;;:::i;:::-;17135:119;17321:1;17310:9;17306:17;17293:31;17351:18;17343:6;17340:30;17337:117;;;17373:79;;:::i;:::-;17337:117;17478:78;17548:7;17539:6;17528:9;17524:22;17478:78;:::i;:::-;17468:88;;17264:302;17633:2;17622:9;17618:18;17605:32;17664:18;17656:6;17653:30;17650:117;;;17686:79;;:::i;:::-;17650:117;17791:78;17861:7;17852:6;17841:9;17837:22;17791:78;:::i;:::-;17781:88;;17576:303;16992:894;;;;;:::o;17892:474::-;17960:6;17968;18017:2;18005:9;17996:7;17992:23;17988:32;17985:119;;;18023:79;;:::i;:::-;17985:119;18143:1;18168:53;18213:7;18204:6;18193:9;18189:22;18168:53;:::i;:::-;18158:63;;18114:117;18270:2;18296:53;18341:7;18332:6;18321:9;18317:22;18296:53;:::i;:::-;18286:63;;18241:118;17892:474;;;;;:::o;18372:180::-;18420:77;18417:1;18410:88;18517:4;18514:1;18507:15;18541:4;18538:1;18531:15;18558:320;18602:6;18639:1;18633:4;18629:12;18619:22;;18686:1;18680:4;18676:12;18707:18;18697:81;;18763:4;18755:6;18751:17;18741:27;;18697:81;18825:2;18817:6;18814:14;18794:18;18791:38;18788:84;;;18844:18;;:::i;:::-;18788:84;18609:269;18558:320;;;:::o;18884:220::-;19024:34;19020:1;19012:6;19008:14;19001:58;19093:3;19088:2;19080:6;19076:15;19069:28;18884:220;:::o;19110:366::-;19252:3;19273:67;19337:2;19332:3;19273:67;:::i;:::-;19266:74;;19349:93;19438:3;19349:93;:::i;:::-;19467:2;19462:3;19458:12;19451:19;;19110:366;;;:::o;19482:419::-;19648:4;19686:2;19675:9;19671:18;19663:26;;19735:9;19729:4;19725:20;19721:1;19710:9;19706:17;19699:47;19763:131;19889:4;19763:131;:::i;:::-;19755:139;;19482:419;;;:::o;19907:249::-;20047:34;20043:1;20035:6;20031:14;20024:58;20116:32;20111:2;20103:6;20099:15;20092:57;19907:249;:::o;20162:366::-;20304:3;20325:67;20389:2;20384:3;20325:67;:::i;:::-;20318:74;;20401:93;20490:3;20401:93;:::i;:::-;20519:2;20514:3;20510:12;20503:19;;20162:366;;;:::o;20534:419::-;20700:4;20738:2;20727:9;20723:18;20715:26;;20787:9;20781:4;20777:20;20773:1;20762:9;20758:17;20751:47;20815:131;20941:4;20815:131;:::i;:::-;20807:139;;20534:419;;;:::o;20959:233::-;21099:34;21095:1;21087:6;21083:14;21076:58;21168:16;21163:2;21155:6;21151:15;21144:41;20959:233;:::o;21198:366::-;21340:3;21361:67;21425:2;21420:3;21361:67;:::i;:::-;21354:74;;21437:93;21526:3;21437:93;:::i;:::-;21555:2;21550:3;21546:12;21539:19;;21198:366;;;:::o;21570:419::-;21736:4;21774:2;21763:9;21759:18;21751:26;;21823:9;21817:4;21813:20;21809:1;21798:9;21794:17;21787:47;21851:131;21977:4;21851:131;:::i;:::-;21843:139;;21570:419;;;:::o;21995:230::-;22135:34;22131:1;22123:6;22119:14;22112:58;22204:13;22199:2;22191:6;22187:15;22180:38;21995:230;:::o;22231:366::-;22373:3;22394:67;22458:2;22453:3;22394:67;:::i;:::-;22387:74;;22470:93;22559:3;22470:93;:::i;:::-;22588:2;22583:3;22579:12;22572:19;;22231:366;;;:::o;22603:419::-;22769:4;22807:2;22796:9;22792:18;22784:26;;22856:9;22850:4;22846:20;22842:1;22831:9;22827:17;22820:47;22884:131;23010:4;22884:131;:::i;:::-;22876:139;;22603:419;;;:::o;23028:168::-;23168:20;23164:1;23156:6;23152:14;23145:44;23028:168;:::o;23202:366::-;23344:3;23365:67;23429:2;23424:3;23365:67;:::i;:::-;23358:74;;23441:93;23530:3;23441:93;:::i;:::-;23559:2;23554:3;23550:12;23543:19;;23202:366;;;:::o;23574:419::-;23740:4;23778:2;23767:9;23763:18;23755:26;;23827:9;23821:4;23817:20;23813:1;23802:9;23798:17;23791:47;23855:131;23981:4;23855:131;:::i;:::-;23847:139;;23574:419;;;:::o;23999:180::-;24047:77;24044:1;24037:88;24144:4;24141:1;24134:15;24168:4;24165:1;24158:15;24185:180;24233:77;24230:1;24223:88;24330:4;24327:1;24320:15;24354:4;24351:1;24344:15;24371:233;24410:3;24433:24;24451:5;24433:24;:::i;:::-;24424:33;;24479:66;24472:5;24469:77;24466:103;;;24549:18;;:::i;:::-;24466:103;24596:1;24589:5;24585:13;24578:20;;24371:233;;;:::o;24610:231::-;24750:34;24746:1;24738:6;24734:14;24727:58;24819:14;24814:2;24806:6;24802:15;24795:39;24610:231;:::o;24847:366::-;24989:3;25010:67;25074:2;25069:3;25010:67;:::i;:::-;25003:74;;25086:93;25175:3;25086:93;:::i;:::-;25204:2;25199:3;25195:12;25188:19;;24847:366;;;:::o;25219:419::-;25385:4;25423:2;25412:9;25408:18;25400:26;;25472:9;25466:4;25462:20;25458:1;25447:9;25443:17;25436:47;25500:131;25626:4;25500:131;:::i;:::-;25492:139;;25219:419;;;:::o;25644:174::-;25784:26;25780:1;25772:6;25768:14;25761:50;25644:174;:::o;25824:366::-;25966:3;25987:67;26051:2;26046:3;25987:67;:::i;:::-;25980:74;;26063:93;26152:3;26063:93;:::i;:::-;26181:2;26176:3;26172:12;26165:19;;25824:366;;;:::o;26196:419::-;26362:4;26400:2;26389:9;26385:18;26377:26;;26449:9;26443:4;26439:20;26435:1;26424:9;26420:17;26413:47;26477:131;26603:4;26477:131;:::i;:::-;26469:139;;26196:419;;;:::o;26621:228::-;26761:34;26757:1;26749:6;26745:14;26738:58;26830:11;26825:2;26817:6;26813:15;26806:36;26621:228;:::o;26855:366::-;26997:3;27018:67;27082:2;27077:3;27018:67;:::i;:::-;27011:74;;27094:93;27183:3;27094:93;:::i;:::-;27212:2;27207:3;27203:12;27196:19;;26855:366;;;:::o;27227:419::-;27393:4;27431:2;27420:9;27416:18;27408:26;;27480:9;27474:4;27470:20;27466:1;27455:9;27451:17;27444:47;27508:131;27634:4;27508:131;:::i;:::-;27500:139;;27227:419;;;:::o;27652:160::-;27792:12;27788:1;27780:6;27776:14;27769:36;27652:160;:::o;27818:366::-;27960:3;27981:67;28045:2;28040:3;27981:67;:::i;:::-;27974:74;;28057:93;28146:3;28057:93;:::i;:::-;28175:2;28170:3;28166:12;28159:19;;27818:366;;;:::o;28190:419::-;28356:4;28394:2;28383:9;28379:18;28371:26;;28443:9;28437:4;28433:20;28429:1;28418:9;28414:17;28407:47;28471:131;28597:4;28471:131;:::i;:::-;28463:139;;28190:419;;;:::o;28615:305::-;28655:3;28674:20;28692:1;28674:20;:::i;:::-;28669:25;;28708:20;28726:1;28708:20;:::i;:::-;28703:25;;28862:1;28794:66;28790:74;28787:1;28784:81;28781:107;;;28868:18;;:::i;:::-;28781:107;28912:1;28909;28905:9;28898:16;;28615:305;;;;:::o;28926:169::-;29066:21;29062:1;29054:6;29050:14;29043:45;28926:169;:::o;29101:366::-;29243:3;29264:67;29328:2;29323:3;29264:67;:::i;:::-;29257:74;;29340:93;29429:3;29340:93;:::i;:::-;29458:2;29453:3;29449:12;29442:19;;29101:366;;;:::o;29473:419::-;29639:4;29677:2;29666:9;29662:18;29654:26;;29726:9;29720:4;29716:20;29712:1;29701:9;29697:17;29690:47;29754:131;29880:4;29754:131;:::i;:::-;29746:139;;29473:419;;;:::o;29898:234::-;30038:34;30034:1;30026:6;30022:14;30015:58;30107:17;30102:2;30094:6;30090:15;30083:42;29898:234;:::o;30138:366::-;30280:3;30301:67;30365:2;30360:3;30301:67;:::i;:::-;30294:74;;30377:93;30466:3;30377:93;:::i;:::-;30495:2;30490:3;30486:12;30479:19;;30138:366;;;:::o;30510:419::-;30676:4;30714:2;30703:9;30699:18;30691:26;;30763:9;30757:4;30753:20;30749:1;30738:9;30734:17;30727:47;30791:131;30917:4;30791:131;:::i;:::-;30783:139;;30510:419;;;:::o;30935:148::-;31037:11;31074:3;31059:18;;30935:148;;;;:::o;31089:377::-;31195:3;31223:39;31256:5;31223:39;:::i;:::-;31278:89;31360:6;31355:3;31278:89;:::i;:::-;31271:96;;31376:52;31421:6;31416:3;31409:4;31402:5;31398:16;31376:52;:::i;:::-;31453:6;31448:3;31444:16;31437:23;;31199:267;31089:377;;;;:::o;31472:141::-;31521:4;31544:3;31536:11;;31567:3;31564:1;31557:14;31601:4;31598:1;31588:18;31580:26;;31472:141;;;:::o;31643:845::-;31746:3;31783:5;31777:12;31812:36;31838:9;31812:36;:::i;:::-;31864:89;31946:6;31941:3;31864:89;:::i;:::-;31857:96;;31984:1;31973:9;31969:17;32000:1;31995:137;;;;32146:1;32141:341;;;;31962:520;;31995:137;32079:4;32075:9;32064;32060:25;32055:3;32048:38;32115:6;32110:3;32106:16;32099:23;;31995:137;;32141:341;32208:38;32240:5;32208:38;:::i;:::-;32268:1;32282:154;32296:6;32293:1;32290:13;32282:154;;;32370:7;32364:14;32360:1;32355:3;32351:11;32344:35;32420:1;32411:7;32407:15;32396:26;;32318:4;32315:1;32311:12;32306:17;;32282:154;;;32465:6;32460:3;32456:16;32449:23;;32148:334;;31962:520;;31750:738;;31643:845;;;;:::o;32494:589::-;32719:3;32741:95;32832:3;32823:6;32741:95;:::i;:::-;32734:102;;32853:95;32944:3;32935:6;32853:95;:::i;:::-;32846:102;;32965:92;33053:3;33044:6;32965:92;:::i;:::-;32958:99;;33074:3;33067:10;;32494:589;;;;;;:::o;33089:166::-;33229:18;33225:1;33217:6;33213:14;33206:42;33089:166;:::o;33261:366::-;33403:3;33424:67;33488:2;33483:3;33424:67;:::i;:::-;33417:74;;33500:93;33589:3;33500:93;:::i;:::-;33618:2;33613:3;33609:12;33602:19;;33261:366;;;:::o;33633:419::-;33799:4;33837:2;33826:9;33822:18;33814:26;;33886:9;33880:4;33876:20;33872:1;33861:9;33857:17;33850:47;33914:131;34040:4;33914:131;:::i;:::-;33906:139;;33633:419;;;:::o;34058:225::-;34198:34;34194:1;34186:6;34182:14;34175:58;34267:8;34262:2;34254:6;34250:15;34243:33;34058:225;:::o;34289:366::-;34431:3;34452:67;34516:2;34511:3;34452:67;:::i;:::-;34445:74;;34528:93;34617:3;34528:93;:::i;:::-;34646:2;34641:3;34637:12;34630:19;;34289:366;;;:::o;34661:419::-;34827:4;34865:2;34854:9;34850:18;34842:26;;34914:9;34908:4;34904:20;34900:1;34889:9;34885:17;34878:47;34942:131;35068:4;34942:131;:::i;:::-;34934:139;;34661:419;;;:::o;35086:182::-;35226:34;35222:1;35214:6;35210:14;35203:58;35086:182;:::o;35274:366::-;35416:3;35437:67;35501:2;35496:3;35437:67;:::i;:::-;35430:74;;35513:93;35602:3;35513:93;:::i;:::-;35631:2;35626:3;35622:12;35615:19;;35274:366;;;:::o;35646:419::-;35812:4;35850:2;35839:9;35835:18;35827:26;;35899:9;35893:4;35889:20;35885:1;35874:9;35870:17;35863:47;35927:131;36053:4;35927:131;:::i;:::-;35919:139;;35646:419;;;:::o;36071:224::-;36211:34;36207:1;36199:6;36195:14;36188:58;36280:7;36275:2;36267:6;36263:15;36256:32;36071:224;:::o;36301:366::-;36443:3;36464:67;36528:2;36523:3;36464:67;:::i;:::-;36457:74;;36540:93;36629:3;36540:93;:::i;:::-;36658:2;36653:3;36649:12;36642:19;;36301:366;;;:::o;36673:419::-;36839:4;36877:2;36866:9;36862:18;36854:26;;36926:9;36920:4;36916:20;36912:1;36901:9;36897:17;36890:47;36954:131;37080:4;36954:131;:::i;:::-;36946:139;;36673:419;;;:::o;37098:223::-;37238:34;37234:1;37226:6;37222:14;37215:58;37307:6;37302:2;37294:6;37290:15;37283:31;37098:223;:::o;37327:366::-;37469:3;37490:67;37554:2;37549:3;37490:67;:::i;:::-;37483:74;;37566:93;37655:3;37566:93;:::i;:::-;37684:2;37679:3;37675:12;37668:19;;37327:366;;;:::o;37699:419::-;37865:4;37903:2;37892:9;37888:18;37880:26;;37952:9;37946:4;37942:20;37938:1;37927:9;37923:17;37916:47;37980:131;38106:4;37980:131;:::i;:::-;37972:139;;37699:419;;;:::o;38124:191::-;38164:4;38184:20;38202:1;38184:20;:::i;:::-;38179:25;;38218:20;38236:1;38218:20;:::i;:::-;38213:25;;38257:1;38254;38251:8;38248:34;;;38262:18;;:::i;:::-;38248:34;38307:1;38304;38300:9;38292:17;;38124:191;;;;:::o;38321:94::-;38354:8;38402:5;38398:2;38394:14;38373:35;;38321:94;;;:::o;38421:::-;38460:7;38489:20;38503:5;38489:20;:::i;:::-;38478:31;;38421:94;;;:::o;38521:100::-;38560:7;38589:26;38609:5;38589:26;:::i;:::-;38578:37;;38521:100;;;:::o;38627:157::-;38732:45;38752:24;38770:5;38752:24;:::i;:::-;38732:45;:::i;:::-;38727:3;38720:58;38627:157;;:::o;38790:79::-;38829:7;38858:5;38847:16;;38790:79;;;:::o;38875:157::-;38980:45;39000:24;39018:5;39000:24;:::i;:::-;38980:45;:::i;:::-;38975:3;38968:58;38875:157;;:::o;39038:679::-;39234:3;39249:75;39320:3;39311:6;39249:75;:::i;:::-;39349:2;39344:3;39340:12;39333:19;;39362:75;39433:3;39424:6;39362:75;:::i;:::-;39462:2;39457:3;39453:12;39446:19;;39475:75;39546:3;39537:6;39475:75;:::i;:::-;39575:2;39570:3;39566:12;39559:19;;39588:75;39659:3;39650:6;39588:75;:::i;:::-;39688:2;39683:3;39679:12;39672:19;;39708:3;39701:10;;39038:679;;;;;;;:::o;39723:180::-;39771:77;39768:1;39761:88;39868:4;39865:1;39858:15;39892:4;39889:1;39882:15;39909:176;39941:1;39958:20;39976:1;39958:20;:::i;:::-;39953:25;;39992:20;40010:1;39992:20;:::i;:::-;39987:25;;40031:1;40021:35;;40036:18;;:::i;:::-;40021:35;40077:1;40074;40070:9;40065:14;;39909:176;;;;:::o;40091:147::-;40192:11;40229:3;40214:18;;40091:147;;;;:::o;40244:114::-;;:::o;40364:398::-;40523:3;40544:83;40625:1;40620:3;40544:83;:::i;:::-;40537:90;;40636:93;40725:3;40636:93;:::i;:::-;40754:1;40749:3;40745:11;40738:18;;40364:398;;;:::o;40768:379::-;40952:3;40974:147;41117:3;40974:147;:::i;:::-;40967:154;;41138:3;41131:10;;40768:379;;;:::o;41153:174::-;41293:26;41289:1;41281:6;41277:14;41270:50;41153:174;:::o;41333:366::-;41475:3;41496:67;41560:2;41555:3;41496:67;:::i;:::-;41489:74;;41572:93;41661:3;41572:93;:::i;:::-;41690:2;41685:3;41681:12;41674:19;;41333:366;;;:::o;41705:419::-;41871:4;41909:2;41898:9;41894:18;41886:26;;41958:9;41952:4;41948:20;41944:1;41933:9;41929:17;41922:47;41986:131;42112:4;41986:131;:::i;:::-;41978:139;;41705:419;;;:::o;42130:175::-;42270:27;42266:1;42258:6;42254:14;42247:51;42130:175;:::o;42311:366::-;42453:3;42474:67;42538:2;42533:3;42474:67;:::i;:::-;42467:74;;42550:93;42639:3;42550:93;:::i;:::-;42668:2;42663:3;42659:12;42652:19;;42311:366;;;:::o;42683:419::-;42849:4;42887:2;42876:9;42872:18;42864:26;;42936:9;42930:4;42926:20;42922:1;42911:9;42907:17;42900:47;42964:131;43090:4;42964:131;:::i;:::-;42956:139;;42683:419;;;:::o;43108:237::-;43248:34;43244:1;43236:6;43232:14;43225:58;43317:20;43312:2;43304:6;43300:15;43293:45;43108:237;:::o;43351:366::-;43493:3;43514:67;43578:2;43573:3;43514:67;:::i;:::-;43507:74;;43590:93;43679:3;43590:93;:::i;:::-;43708:2;43703:3;43699:12;43692:19;;43351:366;;;:::o;43723:419::-;43889:4;43927:2;43916:9;43912:18;43904:26;;43976:9;43970:4;43966:20;43962:1;43951:9;43947:17;43940:47;44004:131;44130:4;44004:131;:::i;:::-;43996:139;;43723:419;;;:::o;44148:185::-;44188:1;44205:20;44223:1;44205:20;:::i;:::-;44200:25;;44239:20;44257:1;44239:20;:::i;:::-;44234:25;;44278:1;44268:35;;44283:18;;:::i;:::-;44268:35;44325:1;44322;44318:9;44313:14;;44148:185;;;;:::o;44339:98::-;44390:6;44424:5;44418:12;44408:22;;44339:98;;;:::o;44443:168::-;44526:11;44560:6;44555:3;44548:19;44600:4;44595:3;44591:14;44576:29;;44443:168;;;;:::o;44617:360::-;44703:3;44731:38;44763:5;44731:38;:::i;:::-;44785:70;44848:6;44843:3;44785:70;:::i;:::-;44778:77;;44864:52;44909:6;44904:3;44897:4;44890:5;44886:16;44864:52;:::i;:::-;44941:29;44963:6;44941:29;:::i;:::-;44936:3;44932:39;44925:46;;44707:270;44617:360;;;;:::o;44983:640::-;45178:4;45216:3;45205:9;45201:19;45193:27;;45230:71;45298:1;45287:9;45283:17;45274:6;45230:71;:::i;:::-;45311:72;45379:2;45368:9;45364:18;45355:6;45311:72;:::i;:::-;45393;45461:2;45450:9;45446:18;45437:6;45393:72;:::i;:::-;45512:9;45506:4;45502:20;45497:2;45486:9;45482:18;45475:48;45540:76;45611:4;45602:6;45540:76;:::i;:::-;45532:84;;44983:640;;;;;;;:::o;45629:141::-;45685:5;45716:6;45710:13;45701:22;;45732:32;45758:5;45732:32;:::i;:::-;45629:141;;;;:::o;45776:349::-;45845:6;45894:2;45882:9;45873:7;45869:23;45865:32;45862:119;;;45900:79;;:::i;:::-;45862:119;46020:1;46045:63;46100:7;46091:6;46080:9;46076:22;46045:63;:::i;:::-;46035:73;;45991:127;45776:349;;;;:::o;46131:180::-;46179:77;46176:1;46169:88;46276:4;46273:1;46266:15;46300:4;46297:1;46290:15;46317:182;46457:34;46453:1;46445:6;46441:14;46434:58;46317:182;:::o;46505:366::-;46647:3;46668:67;46732:2;46727:3;46668:67;:::i;:::-;46661:74;;46744:93;46833:3;46744:93;:::i;:::-;46862:2;46857:3;46853:12;46846:19;;46505:366;;;:::o;46877:419::-;47043:4;47081:2;47070:9;47066:18;47058:26;;47130:9;47124:4;47120:20;47116:1;47105:9;47101:17;47094:47;47158:131;47284:4;47158:131;:::i;:::-;47150:139;;46877:419;;;:::o;47302:178::-;47442:30;47438:1;47430:6;47426:14;47419:54;47302:178;:::o;47486:366::-;47628:3;47649:67;47713:2;47708:3;47649:67;:::i;:::-;47642:74;;47725:93;47814:3;47725:93;:::i;:::-;47843:2;47838:3;47834:12;47827:19;;47486:366;;;:::o;47858:419::-;48024:4;48062:2;48051:9;48047:18;48039:26;;48111:9;48105:4;48101:20;48097:1;48086:9;48082:17;48075:47;48139:131;48265:4;48139:131;:::i;:::-;48131:139;;47858:419;;;:::o

Swarm Source

ipfs://da6135ee2e5d088e5568b5f52c9c57268c0f55eb78d48aa6be7287a00ac9f71c
Loading