Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 404 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 28591616 | 39 days ago | IN | 0 ETH | 0.00000021 | ||||
| Set Approval For... | 26475568 | 88 days ago | IN | 0 ETH | 0 | ||||
| Set Approval For... | 25159313 | 118 days ago | IN | 0 ETH | 0 | ||||
| Set Approval For... | 25080549 | 120 days ago | IN | 0 ETH | 0 | ||||
| Set Approval For... | 24500894 | 133 days ago | IN | 0 ETH | 0.00000002 | ||||
| Set Approval For... | 22001119 | 191 days ago | IN | 0 ETH | 0.00000005 | ||||
| Set Approval For... | 21541954 | 202 days ago | IN | 0 ETH | 0.00000002 | ||||
| Set Approval For... | 21481666 | 203 days ago | IN | 0 ETH | 0.00000004 | ||||
| Set Approval For... | 21155568 | 211 days ago | IN | 0 ETH | 0.00000004 | ||||
| Set Approval For... | 21048365 | 213 days ago | IN | 0 ETH | 0.00000006 | ||||
| Set Approval For... | 20521890 | 226 days ago | IN | 0 ETH | 0 | ||||
| Set Approval For... | 20204284 | 233 days ago | IN | 0 ETH | 0.00000003 | ||||
| Set Approval For... | 19964476 | 239 days ago | IN | 0 ETH | 0 | ||||
| Safe Transfer Fr... | 18673312 | 268 days ago | IN | 0 ETH | 0.00000066 | ||||
| Set Approval For... | 18557364 | 271 days ago | IN | 0 ETH | 0.00000074 | ||||
| Set Approval For... | 17153092 | 304 days ago | IN | 0 ETH | 0 | ||||
| Set Approval For... | 16394129 | 321 days ago | IN | 0 ETH | 0.00000053 | ||||
| Set Approval For... | 15398243 | 344 days ago | IN | 0 ETH | 0.00000005 | ||||
| Set Approval For... | 15395850 | 344 days ago | IN | 0 ETH | 0.00000005 | ||||
| Set Approval For... | 15386788 | 344 days ago | IN | 0 ETH | 0.00000011 | ||||
| Set Approval For... | 15348635 | 345 days ago | IN | 0 ETH | 0.00000043 | ||||
| Set Approval For... | 13508972 | 388 days ago | IN | 0 ETH | 0.0000001 | ||||
| Set Approval For... | 13064636 | 398 days ago | IN | 0 ETH | 0.00000003 | ||||
| Safe Transfer Fr... | 8976914 | 493 days ago | IN | 0 ETH | 0.00000033 | ||||
| Safe Transfer Fr... | 8958672 | 493 days ago | IN | 0 ETH | 0.00000023 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 4742301 | 591 days ago | 3.597 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BLAST_MIYAKO
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at blastscan.io on 2024-05-21
*/
// File: contracts/IERC20.sol
pragma solidity ^0.8.11;
interface IERC20 {
function transfer(address recipient, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
// File: contracts/IBlast.sol
pragma solidity ^0.8.11;
enum YieldMode {
AUTOMATIC,
VOID,
CLAIMABLE
}
enum GasMode {
VOID,
CLAIMABLE
}
interface IBlast {
// configure
function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external;
function configure(YieldMode _yield, GasMode gasMode, address governor) external;
// base configuration options
function configureClaimableYield() external;
function configureClaimableYieldOnBehalf(address contractAddress) external;
function configureAutomaticYield() external;
function configureAutomaticYieldOnBehalf(address contractAddress) external;
function configureVoidYield() external;
function configureVoidYieldOnBehalf(address contractAddress) external;
function configureClaimableGas() external;
function configureClaimableGasOnBehalf(address contractAddress) external;
function configureVoidGas() external;
function configureVoidGasOnBehalf(address contractAddress) external;
function configureGovernor(address _governor) external;
function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;
// claim yield
function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256);
function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);
// claim gas
function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256);
function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256);
// read functions
function readClaimableYield(address contractAddress) external view returns (uint256);
function readYieldConfiguration(address contractAddress) external view returns (uint8);
function readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);
}
// File: contracts/IBlastPoints.sol
pragma solidity ^0.8.11;
interface IBlastPoints {
function configurePointsOperator(address operator) external;
function configurePointsOperatorOnBehalf(address contractAddress, address operator) external;
}
// File: hardhat/console.sol
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function log(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint256 p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
}
function log(uint256 p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
}
function log(uint256 p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
}
function log(uint256 p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
}
function log(string memory p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
}
function log(string memory p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
}
function log(bool p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
}
function log(address p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
}
function log(uint256 p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
}
function log(uint256 p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
}
function log(uint256 p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
}
function log(uint256 p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
}
function log(uint256 p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
}
function log(uint256 p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
}
function log(uint256 p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
}
function log(uint256 p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
}
function log(bool p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
}
function log(bool p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
}
function log(bool p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
}
function log(address p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
}
function log(address p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
}
function log(address p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
_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 pure {
_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 pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}
// File: erc721a/contracts/IERC721A.sol
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of ERC721A.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* The token does not exist.
*/
error OwnerQueryForNonexistentToken();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from`.
*/
error TransferFromIncorrectOwner();
/**
* Cannot safely transfer to a contract that does not implement the
* ERC721Receiver interface.
*/
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The token does not exist.
*/
error URIQueryForNonexistentToken();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
// =============================================================
// STRUCTS
// =============================================================
struct TokenOwnership {
// The address of the owner.
address addr;
// Stores the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
uint24 extraData;
}
// =============================================================
// TOKEN COUNTERS
// =============================================================
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() external view returns (uint256);
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
// =============================================================
// IERC721
// =============================================================
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables
* (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`,
* checking first that contract recipients are aware of the ERC721 protocol
* to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move
* this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external payable;
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @dev Transfers `tokenId` 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 payable;
/**
* @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 payable;
/**
* @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);
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @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);
// =============================================================
// IERC2309
// =============================================================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId`
* (inclusive) is transferred from `from` to `to`, as defined in the
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
*
* See {_mintERC2309} for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
// File: erc721a/contracts/ERC721A.sol
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of ERC721 token receiver.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @title ERC721A
*
* @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
* Non-Fungible Token Standard, including the Metadata extension.
* Optimized for lower gas during batch mints.
*
* Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
* starting from `_startTokenId()`.
*
* Assumptions:
*
* - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
* - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
struct TokenApprovalRef {
address value;
}
// =============================================================
// CONSTANTS
// =============================================================
// Mask of an entry in packed address data.
uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
// The bit position of `numberMinted` in packed address data.
uint256 private constant _BITPOS_NUMBER_MINTED = 64;
// The bit position of `numberBurned` in packed address data.
uint256 private constant _BITPOS_NUMBER_BURNED = 128;
// The bit position of `aux` in packed address data.
uint256 private constant _BITPOS_AUX = 192;
// Mask of all 256 bits in packed address data except the 64 bits for `aux`.
uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
// The bit position of `startTimestamp` in packed ownership.
uint256 private constant _BITPOS_START_TIMESTAMP = 160;
// The bit mask of the `burned` bit in packed ownership.
uint256 private constant _BITMASK_BURNED = 1 << 224;
// The bit position of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
// The bit mask of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
// The bit position of `extraData` in packed ownership.
uint256 private constant _BITPOS_EXTRA_DATA = 232;
// Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
// The mask of the lower 160 bits for addresses.
uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
// The maximum `quantity` that can be minted with {_mintERC2309}.
// This limit is to prevent overflows on the address data entries.
// For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
// is required to cause an overflow, which is unrealistic.
uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
// The `Transfer` event signature is given by:
// `keccak256(bytes("Transfer(address,address,uint256)"))`.
bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
// =============================================================
// STORAGE
// =============================================================
// The next token ID to be minted.
uint256 private _currentIndex;
// The number of tokens burned.
uint256 private _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned.
// See {_packedOwnershipOf} implementation for details.
//
// Bits Layout:
// - [0..159] `addr`
// - [160..223] `startTimestamp`
// - [224] `burned`
// - [225] `nextInitialized`
// - [232..255] `extraData`
mapping(uint256 => uint256) private _packedOwnerships;
// Mapping owner address to address data.
//
// Bits Layout:
// - [0..63] `balance`
// - [64..127] `numberMinted`
// - [128..191] `numberBurned`
// - [192..255] `aux`
mapping(address => uint256) private _packedAddressData;
// Mapping from token ID to approved address.
mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// =============================================================
// CONSTRUCTOR
// =============================================================
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
// =============================================================
// TOKEN COUNTING OPERATIONS
// =============================================================
/**
* @dev Returns the starting token ID.
* To change the starting token ID, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view virtual returns (uint256) {
return _currentIndex;
}
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() public view virtual override returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than `_currentIndex - _startTokenId()` times.
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* @dev Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view virtual returns (uint256) {
// Counter underflow is impossible as `_currentIndex` does not decrement,
// and it is initialized to `_startTokenId()`.
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @dev Returns the total number of tokens burned.
*/
function _totalBurned() internal view virtual returns (uint256) {
return _burnCounter;
}
// =============================================================
// ADDRESS DATA OPERATIONS
// =============================================================
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
}
/**
* Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal virtual {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
// Cast `aux` with assembly to avoid redundant masking.
assembly {
auxCasted := aux
}
packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
_packedAddressData[owner] = packed;
}
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
// The interface IDs are constants representing the first 4 bytes
// of the XOR of all function selectors in the interface.
// See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
// (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
return
interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @dev Returns the token collection name.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the token collection symbol.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
}
/**
* @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, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
// =============================================================
// OWNERSHIPS OPERATIONS
// =============================================================
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around over time.
*/
function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @dev Returns the unpacked `TokenOwnership` struct at `index`.
*/
function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
/**
* @dev Initializes the ownership slot minted at `index` for efficiency purposes.
*/
function _initializeOwnershipAt(uint256 index) internal virtual {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
/**
* Returns the packed ownership data of `tokenId`.
*/
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr)
if (curr < _currentIndex) {
uint256 packed = _packedOwnerships[curr];
// If not burned.
if (packed & _BITMASK_BURNED == 0) {
// Invariant:
// There will always be an initialized ownership slot
// (i.e. `ownership.addr != address(0) && ownership.burned == false`)
// before an unintialized ownership slot
// (i.e. `ownership.addr == address(0) && ownership.burned == false`)
// Hence, `curr` will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed will be zero.
while (packed == 0) {
packed = _packedOwnerships[--curr];
}
return packed;
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev Returns the unpacked `TokenOwnership` struct from `packed`.
*/
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
ownership.burned = packed & _BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
}
/**
* @dev Packs ownership data into a single uint256.
*/
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
/**
* @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
*/
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
// For branchless setting of the `nextInitialized` flag.
assembly {
// `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @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) public payable virtual override {
address owner = ownerOf(tokenId);
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId].value;
}
/**
* @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) public virtual override {
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @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. See {_mint}.
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex && // If within bounds,
_packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
}
/**
* @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
*/
function _isSenderApprovedOrOwner(
address approvedAddress,
address owner,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, _BITMASK_ADDRESS)
// `msgSender == owner || msgSender == approvedAddress`.
result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
}
}
/**
* @dev Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
assembly {
approvedAddressSlot := tokenApproval.slot
approvedAddress := sload(approvedAddressSlot)
}
}
// =============================================================
// TRANSFER OPERATIONS
// =============================================================
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token
* by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// We can directly increment and decrement the balances.
--_packedAddressData[from]; // Updates: `balance -= 1`.
++_packedAddressData[to]; // Updates: `balance += 1`.
// Updates:
// - `address` to the next owner.
// - `startTimestamp` to the timestamp of transfering.
// - `burned` to `false`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
to,
_BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token
* by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public payable virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @dev Hook that is called before a set of serially-ordered token IDs
* are about to be transferred. This includes minting.
* And also called before burning one token.
*
* `startTokenId` - the first token ID to be transferred.
* `quantity` - the amount to be transferred.
*
* 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, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token IDs
* have been transferred. This includes minting.
* And also called after one token has been burned.
*
* `startTokenId` - the first token ID to be transferred.
* `quantity` - the amount to be transferred.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* `from` - Previous owner of the given token ID.
* `to` - Target address that will receive the token.
* `tokenId` - Token ID to be transferred.
* `_data` - Optional data to send along with the call.
*
* Returns whether the call correctly returned the expected magic value.
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
// =============================================================
// MINT OPERATIONS
// =============================================================
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event for each mint.
*/
function _mint(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// `balance` and `numberMinted` have a maximum limit of 2**64.
// `tokenId` has a maximum limit of 2**256.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
uint256 toMasked;
uint256 end = startTokenId + quantity;
// Use assembly to loop and emit the `Transfer` event for gas savings.
// The duplicated `log4` removes an extra check and reduces stack juggling.
// The assembly, together with the surrounding Solidity code, have been
// delicately arranged to nudge the compiler into producing optimized opcodes.
assembly {
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
toMasked := and(to, _BITMASK_ADDRESS)
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
0, // `address(0)`.
toMasked, // `to`.
startTokenId // `tokenId`.
)
// The `iszero(eq(,))` check ensures that large values of `quantity`
// that overflows uint256 will make the loop run out of gas.
// The compiler will optimize the `iszero` away for performance.
for {
let tokenId := add(startTokenId, 1)
} iszero(eq(tokenId, end)) {
tokenId := add(tokenId, 1)
} {
// Emit the `Transfer` event. Similar to above.
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
}
}
if (toMasked == 0) revert MintToZeroAddress();
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* This function is intended for efficient minting only during contract creation.
*
* It emits only one {ConsecutiveTransfer} as defined in
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
* instead of a sequence of {Transfer} event(s).
*
* Calling this function outside of contract creation WILL make your contract
* non-compliant with the ERC721 standard.
* For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
* {ConsecutiveTransfer} event is only permissible during contract creation.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {ConsecutiveTransfer} event.
*/
function _mintERC2309(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are unrealistic due to the above check for `quantity` to be below the limit.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* See {_mint}.
*
* Emits a {Transfer} event for each mint.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal virtual {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (index < end);
// Reentrancy protection.
if (_currentIndex != end) revert();
}
}
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
// =============================================================
// BURN OPERATIONS
// =============================================================
/**
* @dev Equivalent to `_burn(tokenId, false)`.
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
address from = address(uint160(prevOwnershipPacked));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// Updates:
// - `balance -= 1`.
// - `numberBurned += 1`.
//
// We can directly decrement the balance, and increment the number burned.
// This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
_packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
// Updates:
// - `address` to the last owner.
// - `startTimestamp` to the timestamp of burning.
// - `burned` to `true`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
from,
(_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
// =============================================================
// EXTRA DATA OPERATIONS
// =============================================================
/**
* @dev Directly sets the extra data for the ownership data `index`.
*/
function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
uint256 packed = _packedOwnerships[index];
if (packed == 0) revert OwnershipNotInitializedForExtraData();
uint256 extraDataCasted;
// Cast `extraData` with assembly to avoid redundant masking.
assembly {
extraDataCasted := extraData
}
packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
/**
* @dev Called during each token transfer to set the 24bit `extraData` field.
* Intended to be overridden by the cosumer contract.
*
* `previousExtraData` - the value of `extraData` before transfer.
*
* 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, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
/**
* @dev Returns the next extra data for the packed ownership data.
* The returned result is shifted into position.
*/
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
}
// =============================================================
// OTHER OPERATIONS
// =============================================================
/**
* @dev Returns the message sender (defaults to `msg.sender`).
*
* If you are writing GSN compatible contracts, you need to override this function.
*/
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
/**
* @dev Converts a uint256 to its ASCII string decimal representation.
*/
function _toString(uint256 value) internal pure virtual returns (string memory str) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit), but
// we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
// We will need 1 word for the trailing zeros padding, 1 word for the length,
// and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
let m := add(mload(0x40), 0xa0)
// Update the free memory pointer to allocate.
mstore(0x40, m)
// Assign the `str` to the end.
str := sub(m, 0x20)
// Zeroize the slot after the string.
mstore(str, 0)
// Cache the end of the memory to calculate the length later.
let end := str
// We write the string from rightmost digit to leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// prettier-ignore
for { let temp := value } 1 {} {
str := sub(str, 1)
// Write the character to the pointer.
// The ASCII index of the '0' character is 48.
mstore8(str, add(48, mod(temp, 10)))
// Keep dividing `temp` until zero.
temp := div(temp, 10)
// prettier-ignore
if iszero(temp) { break }
}
let length := sub(end, str)
// Move the pointer 32 bytes leftwards to make room for the length.
str := sub(str, 0x20)
// Store the length.
mstore(str, length)
}
}
}
// File: erc721a/contracts/extensions/IERC721AQueryable.sol
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of ERC721AQueryable.
*/
interface IERC721AQueryable is IERC721A {
/**
* Invalid query range (`start` >= `stop`).
*/
error InvalidQueryRange();
/**
* @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
*
* If the `tokenId` is out of bounds:
*
* - `addr = address(0)`
* - `startTimestamp = 0`
* - `burned = false`
* - `extraData = 0`
*
* If the `tokenId` is burned:
*
* - `addr = <Address of owner before token was burned>`
* - `startTimestamp = <Timestamp when token was burned>`
* - `burned = true`
* - `extraData = <Extra data when token was burned>`
*
* Otherwise:
*
* - `addr = <Address of owner>`
* - `startTimestamp = <Timestamp of start of ownership>`
* - `burned = false`
* - `extraData = <Extra data at start of ownership>`
*/
function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);
/**
* @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
* See {ERC721AQueryable-explicitOwnershipOf}
*/
function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);
/**
* @dev Returns an array of token IDs owned by `owner`,
* in the range [`start`, `stop`)
* (i.e. `start <= tokenId < stop`).
*
* This function allows for tokens to be queried if the collection
* grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
*
* Requirements:
*
* - `start < stop`
*/
function tokensOfOwnerIn(
address owner,
uint256 start,
uint256 stop
) external view returns (uint256[] memory);
/**
* @dev Returns an array of token IDs owned by `owner`.
*
* This function scans the ownership mapping and is O(`totalSupply`) in complexity.
* It is meant to be called off-chain.
*
* See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
* multiple smaller scans if the collection is large enough to cause
* an out-of-gas error (10K collections should be fine).
*/
function tokensOfOwner(address owner) external view returns (uint256[] memory);
}
// File: erc721a/contracts/extensions/ERC721AQueryable.sol
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @title ERC721AQueryable.
*
* @dev ERC721A subclass with convenience query functions.
*/
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
/**
* @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
*
* If the `tokenId` is out of bounds:
*
* - `addr = address(0)`
* - `startTimestamp = 0`
* - `burned = false`
* - `extraData = 0`
*
* If the `tokenId` is burned:
*
* - `addr = <Address of owner before token was burned>`
* - `startTimestamp = <Timestamp when token was burned>`
* - `burned = true`
* - `extraData = <Extra data when token was burned>`
*
* Otherwise:
*
* - `addr = <Address of owner>`
* - `startTimestamp = <Timestamp of start of ownership>`
* - `burned = false`
* - `extraData = <Extra data at start of ownership>`
*/
function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
TokenOwnership memory ownership;
if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
return ownership;
}
ownership = _ownershipAt(tokenId);
if (ownership.burned) {
return ownership;
}
return _ownershipOf(tokenId);
}
/**
* @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
* See {ERC721AQueryable-explicitOwnershipOf}
*/
function explicitOwnershipsOf(uint256[] calldata tokenIds)
external
view
virtual
override
returns (TokenOwnership[] memory)
{
unchecked {
uint256 tokenIdsLength = tokenIds.length;
TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
for (uint256 i; i != tokenIdsLength; ++i) {
ownerships[i] = explicitOwnershipOf(tokenIds[i]);
}
return ownerships;
}
}
/**
* @dev Returns an array of token IDs owned by `owner`,
* in the range [`start`, `stop`)
* (i.e. `start <= tokenId < stop`).
*
* This function allows for tokens to be queried if the collection
* grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
*
* Requirements:
*
* - `start < stop`
*/
function tokensOfOwnerIn(
address owner,
uint256 start,
uint256 stop
) external view virtual override returns (uint256[] memory) {
unchecked {
if (start >= stop) revert InvalidQueryRange();
uint256 tokenIdsIdx;
uint256 stopLimit = _nextTokenId();
// Set `start = max(start, _startTokenId())`.
if (start < _startTokenId()) {
start = _startTokenId();
}
// Set `stop = min(stop, stopLimit)`.
if (stop > stopLimit) {
stop = stopLimit;
}
uint256 tokenIdsMaxLength = balanceOf(owner);
// Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
// to cater for cases where `balanceOf(owner)` is too big.
if (start < stop) {
uint256 rangeLength = stop - start;
if (rangeLength < tokenIdsMaxLength) {
tokenIdsMaxLength = rangeLength;
}
} else {
tokenIdsMaxLength = 0;
}
uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
if (tokenIdsMaxLength == 0) {
return tokenIds;
}
// We need to call `explicitOwnershipOf(start)`,
// because the slot at `start` may not be initialized.
TokenOwnership memory ownership = explicitOwnershipOf(start);
address currOwnershipAddr;
// If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
// `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
if (!ownership.burned) {
currOwnershipAddr = ownership.addr;
}
for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
ownership = _ownershipAt(i);
if (ownership.burned) {
continue;
}
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
tokenIds[tokenIdsIdx++] = i;
}
}
// Downsize the array to fit.
assembly {
mstore(tokenIds, tokenIdsIdx)
}
return tokenIds;
}
}
/**
* @dev Returns an array of token IDs owned by `owner`.
*
* This function scans the ownership mapping and is O(`totalSupply`) in complexity.
* It is meant to be called off-chain.
*
* See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
* multiple smaller scans if the collection is large enough to cause
* an out-of-gas error (10K collections should be fine).
*/
function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
unchecked {
uint256 tokenIdsIdx;
address currOwnershipAddr;
uint256 tokenIdsLength = balanceOf(owner);
uint256[] memory tokenIds = new uint256[](tokenIdsLength);
TokenOwnership memory ownership;
for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
ownership = _ownershipAt(i);
if (ownership.burned) {
continue;
}
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
tokenIds[tokenIdsIdx++] = i;
}
}
return tokenIds;
}
}
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The tree and the proofs can be generated using our
* https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
* You will find a quickstart guide in the readme.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
* OpenZeppelin's JavaScript library generates merkle trees that are safe
* against this attack out of the box.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
require(proofPos == proofLen, "MerkleProof: invalid multiproof");
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
require(proofPos == proofLen, "MerkleProof: invalid multiproof");
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File: @openzeppelin/contracts/access/IAccessControl.sol
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
// File: @openzeppelin/contracts/utils/math/SignedMath.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
// File: @openzeppelin/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv overflow");
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
}
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toString(int256 value) internal pure returns (string memory) {
return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return keccak256(bytes(a)) == keccak256(bytes(b));
}
}
// 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.9.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. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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/access/Ownable2Step.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides 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} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}
// File: @openzeppelin/contracts/security/Pausable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library 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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// 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://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/interfaces/IERC2981.sol
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(
uint256 tokenId,
uint256 salePrice
) external view returns (address receiver, uint256 royaltyAmount);
}
// 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/common/ERC2981.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
*
* Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
* specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
*
* Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
* fee is specified in basis points by default.
*
* IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
* https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
* voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
*
* _Available since v4.5._
*/
abstract contract ERC2981 is IERC2981, ERC165 {
struct RoyaltyInfo {
address receiver;
uint96 royaltyFraction;
}
RoyaltyInfo private _defaultRoyaltyInfo;
mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @inheritdoc IERC2981
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {
RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];
if (royalty.receiver == address(0)) {
royalty = _defaultRoyaltyInfo;
}
uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();
return (royalty.receiver, royaltyAmount);
}
/**
* @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
* fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
* override.
*/
function _feeDenominator() internal pure virtual returns (uint96) {
return 10000;
}
/**
* @dev Sets the royalty information that all ids in this contract will default to.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: invalid receiver");
_defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Removes default royalty information.
*/
function _deleteDefaultRoyalty() internal virtual {
delete _defaultRoyaltyInfo;
}
/**
* @dev Sets the royalty information for a specific token id, overriding the global default.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: Invalid parameters");
_tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Resets royalty information for the token id back to the global default.
*/
function _resetTokenRoyalty(uint256 tokenId) internal virtual {
delete _tokenRoyaltyInfo[tokenId];
}
}
// File: @openzeppelin/contracts/access/AccessControl.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(account),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* May emit a {RoleGranted} event.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _ownerOf(tokenId) != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId, 1);
// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
// Will not overflow unless all 2**256 token ids are minted to the same owner.
// Given that tokens are minted one by one, it is impossible in practice that
// this ever happens. Might change if we allow batch minting.
// The ERC fails to describe this case.
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
// Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
owner = ERC721.ownerOf(tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
unchecked {
// Cannot overflow, as that would require more tokens to be burned/transferred
// out than the owner initially received through minting and transferring in.
_balances[owner] -= 1;
}
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(address from, address to, uint256 tokenId) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
// Check that tokenId was not transferred by `_beforeTokenTransfer` hook
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
unchecked {
// `_balances[from]` cannot overflow for the same reason as described in `_burn`:
// `from`'s balance is the number of token held, which is at least one before the current
// transfer.
// `_balances[to]` could overflow in the conditions described in `_mint`. That would require
// all 2**256 token ids to be minted, which in practice is impossible.
_balances[from] -= 1;
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
* - When `from` is zero, the tokens will be minted for `to`.
* - When `to` is zero, ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}
/**
* @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
* - When `from` is zero, the tokens were minted for `to`.
* - When `to` is zero, ``from``'s tokens were burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
* being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
* that `ownerOf(tokenId)` is `a`.
*/
// solhint-disable-next-line func-name-mixedcase
function __unsafe_increaseBalance(address account, uint256 amount) internal {
_balances[account] += amount;
}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol
// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/extensions/ERC721Pausable.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC721 token with pausable token transfers, minting and burning.
*
* Useful for scenarios such as preventing trades until the end of an evaluation
* period, or having an emergency switch for freezing all token transfers in the
* event of a large bug.
*
* IMPORTANT: This contract does not include public pause and unpause functions. In
* addition to inheriting this contract, you must define both functions, invoking the
* {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate
* access control, e.g. using {AccessControl} or {Ownable}. Not doing so will
* make the contract unpausable.
*/
abstract contract ERC721Pausable is ERC721, Pausable {
/**
* @dev See {ERC721-_beforeTokenTransfer}.
*
* Requirements:
*
* - the contract must not be paused.
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual override {
super._beforeTokenTransfer(from, to, firstTokenId, batchSize);
require(!paused(), "ERC721Pausable: token transfer while paused");
}
}
// File: contracts/blast_miyako.sol
pragma solidity ^0.8.11;
/*
&#GP5YYJJJJ?JJJJJY5PB#&
#G55PPY??????777!!77!!!7?JYP#&
&GY??B #J?????77JB&~~7JPGP5G#
#PJ????G BJ??????7# J~^^~JB &BB&
&PJ??J5YJ?J55Y?????YY?7JG##B5!!~~^::J &@
#Y???JB &BGY?????YB &BPY?77!!!!~~^^:7&
#J?J??B #Y?J??P #577777!!!~~^:Y &
&JJJ??5 BJ?J??G &5????7777!!!~~^7 ##
55Y??J# BJ?J??G GJ??????77777!!!~? BY
#PG?J?Y &J?JJ?P &5??????????7777!!!B 5?B
B&5?J?5 @G?JJ?J &Y????????????777!7G 5~JP
& 5?J?5 Y?JJ?P @5?JJJ??????????77Y# 5~~J5
& ??Y& Y?JJ?B B??JJJJ?????????YB BJ!!!JP
: :J?B Y?J??B @5?JJJJJ?????JYG& BY?77!?JB
u&GP 5???? &J??????JJYPB& &G5JJ???JJ5
# #5YYJP @&YY55PGB#& &#BPYYYYJJJYYY#
###&& &#BGP555555YYYYYYB
######& &&&& @@&&&##BBGPPPPPPP5555555YY5#
&###BB& BBBB #GGGGGPPPPPPPPPPP5555555G&
&#BBB# BBB& BGGGGGGPPPPPPPPPP5555G#
&##B#& BBBB& &GGGGGGGGPPPPPPP55PB&
&### #BBB# #GGGGGGGPPPPPPGB&
&& ##BB# BGGGGGGGBB#&
&@@&&&&@@@*/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* .d8888b. 888 8888888b. *
*d88P Y88b 888 888 Y88b *
*888 888 888 888 888 *
*888 888 .d88b. .d8888b .d88b. 888 d88P 8888b. *
*888 888 d88""88b 88K d8P Y8b 8888888P" "88b *
*888 888 888 888 888 "Y8888b. 88888888 888 .d888888 *
*Y88b d88P 888 Y88..88P X88 Y8b. 888 888 888 *
* "Y8888P" 888 "Y88P" 88888P' "Y8888 888 "Y888888 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
//import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
//import "./TeamAccess.sol";
contract BLAST_MIYAKO is ERC721AQueryable ,ERC2981 ,AccessControl , Ownable2Step {
using Strings for uint256;
uint256 public maxSupply = 1200;
uint96 constant private DEFAULT_ROYALTYFEE = 250; // 2.5%
uint256 private prePrice = 0.0003 ether;//presale price.
uint256 private max_mint_per_wallet = 10;
enum SaleState { NON, NOT/*1*/, PRE/*2*/ , PUB /*3*/, FIN /*4*/} // Enum
SaleState public saleState = SaleState.NOT;
mapping(address => uint256) private _MintedAL;
string private baseTokenURI;
string constant private uriExt = ".json";
address internal constant SETTER_ADDRESS1 = address(0x91f6404daC4E86F69248ee437456730228Af816a);
address internal constant SETTER_ADDRESS2 = address(0x1d1b1e30a9d15dBA662f85119122e1D651090434);
// BlastPoints Testnet address: 0x2fc95838c71e76ec69ff817983BFf17c710F34E0
// BlastPoints Mainnet address: 0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800
address internal constant _BlastPointsAddress = address(0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800);
address internal constant _BLAST_ADDRESS = address(0x4300000000000000000000000000000000000002);
address private _preBlastMiyakoAddress = address(0xB5bA61E4D5c591AE55060eFa27908436278E8799);
address private BlastGoldAddress;
bytes32 private constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 private constant SETTER_ROLE = keccak256("SETTER_ROLE");
bytes32 private merkleRoot;
constructor() ERC721A("BLAST_MIYAKO", "BLSTMYK") {
_transferOwnership(SETTER_ADDRESS1);
_setDefaultRoyalty(SETTER_ADDRESS1, DEFAULT_ROYALTYFEE);
_setupRole(DEFAULT_ADMIN_ROLE, SETTER_ADDRESS2);
_setupRole(DEFAULT_ADMIN_ROLE, SETTER_ADDRESS1);
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
_setupRole(SETTER_ROLE, SETTER_ADDRESS2);
_setupRole(SETTER_ROLE, SETTER_ADDRESS1);
_setupRole(SETTER_ROLE, msg.sender);
_setupRole(MINTER_ROLE, SETTER_ADDRESS1);
_setupRole(MINTER_ROLE, SETTER_ADDRESS2);
IBlastPoints(_BlastPointsAddress).configurePointsOperator(SETTER_ADDRESS2);
IBlast(_BLAST_ADDRESS).configureClaimableGas();
IBlast(_BLAST_ADDRESS).configureGovernor(SETTER_ADDRESS2);
}
function getCurrentPrice() public view returns(uint256) {
return prePrice;
}
function setMaxSupply(uint256 _maxSupply) external virtual onlyRole(SETTER_ROLE) {
require(totalSupply() <= _maxSupply);
maxSupply = _maxSupply;
}
function setPricePreMaxMint(uint256 price ,uint256 _mint_per_wallet) external virtual onlyRole(SETTER_ROLE) {
prePrice = price;
max_mint_per_wallet = _mint_per_wallet;
}
function setBaseURI(string memory uri) external virtual onlyRole(SETTER_ROLE) {
baseTokenURI = uri;
}
function setMerkleRoot(bytes32 _merkleRoot) external virtual onlyRole(SETTER_ROLE) {
merkleRoot = _merkleRoot;
}
function _baseURI() internal view override
returns (string memory) {
return baseTokenURI;
}
//start from 1.djust for bueno.
function _startTokenId() internal view virtual override returns (uint256) {
return 1;
}
function preMint(uint256 _amount, bytes32[] calldata _merkleProof) external
payable {
require(saleState == SaleState.PRE);
uint256 supply = totalSupply();
uint256 cost = prePrice * _amount;
require(_amount > 0 && supply + _amount <= maxSupply, "Invalid mint amount!");
require(msg.value >= cost, "ETH value is not correct");
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
require(
MerkleProof.verify(_merkleProof, merkleRoot, leaf),
"Invalid Merkle Proof"
);
require(_MintedAL[msg.sender] + _amount <= max_mint_per_wallet, "Invalid mint amount!");
_safeMint(msg.sender, _amount);
_MintedAL[msg.sender] += _amount;
}
function publicMint(address _address ,uint256 _amount) external
payable {
require(saleState == SaleState.PUB);
uint256 supply = totalSupply();
uint256 cost = prePrice * _amount;
require(_amount > 0 && supply + _amount <= maxSupply , "Invalid mint amount!");
require(msg.value >= cost, "ETH value is not correct");
_address == address(0) ?
_safeMint(msg.sender, _amount):_safeMint(_address, _amount);
}
function ownerMint(address _transferAddress, uint256 _amount) external onlyRole(MINTER_ROLE) {
uint256 supply = totalSupply();
require(supply + _amount <= maxSupply);
_safeMint(_transferAddress, _amount);
}
function setNextSale() external virtual onlyRole(SETTER_ROLE) {
require(saleState < SaleState.FIN);
saleState = SaleState(uint256(saleState) + 1);
}
function setSaleState(uint256 _state) external virtual onlyRole(SETTER_ROLE) {
require(_state <= uint256(SaleState.FIN));
saleState = SaleState(uint256(_state));
}
function tokenURI(uint256 tokenId) public view virtual override(ERC721A,IERC721A) returns (string memory){
require( _exists(tokenId), "token does not exist" );
return string(abi.encodePacked(_baseURI(), tokenId.toString() ,uriExt));
}
function withdraw() external onlyRole(DEFAULT_ADMIN_ROLE) {
Address.sendValue(payable(owner()), address(this).balance);
}
function withdrawToken(address tokenAddress) external onlyRole(SETTER_ROLE) {
require(tokenAddress != address(0x0));
IERC20 token = IERC20(tokenAddress);
uint256 balance = token.balanceOf(address(this));
require(balance > 0, "No balance to withdraw");
require(token.transfer(msg.sender ,balance));
}
function distributeTokens() external onlyRole(SETTER_ROLE) {
IERC20 blastGoldToken = IERC20(BlastGoldAddress);
uint256 totalBalance = blastGoldToken.balanceOf(address(this));
require(totalBalance > 0, "No balance to withdraw");
uint256 _totalSupply = totalSupply();
uint256 tokenPerNFT = totalBalance / _totalSupply;
address[] memory holders = new address[](_totalSupply);
uint256[] memory holderBalances = new uint256[](_totalSupply);
uint256 holderCount = 0;
// NFTを所有するアドレスとそのバランスを記録
for (uint256 i = 0; i < _totalSupply; i++) {
address holder = ownerOf(i);
bool found = false;
for (uint256 j = 0; j < holderCount; j++) {
if (holders[j] == holder) {
holderBalances[j]++;
found = true;
break;
}
}
if (!found) {
holders[holderCount] = holder;
holderBalances[holderCount] = 1;
holderCount++;
}
}
// トークンを分配
for (uint256 i = 0; i < holderCount; i++) {
uint256 holderShare = holderBalances[i] * tokenPerNFT;
if (holderShare > 0) {
require(blastGoldToken.transfer(holders[i], holderShare), "Transfer failed");
}
}
}
function setRoyaltyFee(uint96 _fee ,address _royaltyAddress) external onlyRole(SETTER_ROLE) {
_setDefaultRoyalty(_royaltyAddress, _fee);
}
function setPreBlastMiyakoAddress(address preMiyako) external onlyRole(SETTER_ROLE) {
_preBlastMiyakoAddress = preMiyako;
}
function myBlastGas(bool _maxGas) external onlyRole(SETTER_ROLE){
if(_maxGas){
IBlast(_BLAST_ADDRESS).claimMaxGas(address(this), SETTER_ADDRESS2);
}else{
IBlast(_BLAST_ADDRESS).claimAllGas(address(this), SETTER_ADDRESS2);
}
}
function supportsInterface(bytes4 interfaceId) public view virtual override (IERC721A,ERC721A,ERC2981,AccessControl) returns (bool) {
return
ERC721A.supportsInterface(interfaceId) ||
AccessControl.supportsInterface(interfaceId) ||
ERC2981.supportsInterface(interfaceId);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bool","name":"_maxGas","type":"bool"}],"name":"myBlastGas","outputs":[],"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":"address","name":"_transferAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum BLAST_MIYAKO.SaleState","name":"","type":"uint8"}],"stateMutability":"view","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setNextSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"preMiyako","type":"address"}],"name":"setPreBlastMiyakoAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"_mint_per_wallet","type":"uint256"}],"name":"setPricePreMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_fee","type":"uint96"},{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setSaleState","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526104b0600d55660110d9316ec000600e55600a600f556001601060006101000a81548160ff021916908360048111156200004357620000426200094a565b5b021790555073b5ba61e4d5c591ae55060efa27908436278e8799601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000aa57600080fd5b506040518060400160405280600c81526020017f424c4153545f4d4959414b4f00000000000000000000000000000000000000008152506040518060400160405280600781526020017f424c53544d594b00000000000000000000000000000000000000000000000000815250816002908162000128919062000bf3565b5080600390816200013a919062000bf3565b506200014b6200051a60201b60201c565b600081905550505062000173620001676200052360201b60201c565b6200052b60201b60201c565b620001987391f6404dac4e86f69248ee437456730228af816a6200052b60201b60201c565b620001bf7391f6404dac4e86f69248ee437456730228af816a60fa6200056460201b60201c565b620001e86000801b731d1b1e30a9d15dba662f85119122e1d6510904346200070760201b60201c565b620002116000801b7391f6404dac4e86f69248ee437456730228af816a6200070760201b60201c565b620002266000801b336200070760201b60201c565b6200026c7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda731d1b1e30a9d15dba662f85119122e1d6510904346200070760201b60201c565b620002b27f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda7391f6404dac4e86f69248ee437456730228af816a6200070760201b60201c565b620002e47f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda336200070760201b60201c565b6200032a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a67391f6404dac4e86f69248ee437456730228af816a6200070760201b60201c565b620003707f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6731d1b1e30a9d15dba662f85119122e1d6510904346200070760201b60201c565b732536fe9ab3f511540f2f9e2ec2a805005c3dd80073ffffffffffffffffffffffffffffffffffffffff166336b91f2b731d1b1e30a9d15dba662f85119122e1d6510904346040518263ffffffff1660e01b8152600401620003d3919062000d1f565b600060405180830381600087803b158015620003ee57600080fd5b505af115801562000403573d6000803e3d6000fd5b5050505073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200046457600080fd5b505af115801562000479573d6000803e3d6000fd5b5050505073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663eb864698731d1b1e30a9d15dba662f85119122e1d6510904346040518263ffffffff1660e01b8152600401620004e0919062000d1f565b600060405180830381600087803b158015620004fb57600080fd5b505af115801562000510573d6000803e3d6000fd5b5050505062000e57565b60006001905090565b600033905090565b600c60006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905562000561816200071d60201b60201c565b50565b62000574620007e360201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620005d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005cc9062000dc3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200063e9062000e35565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b620007198282620007ed60201b60201c565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612710905090565b620007ff8282620008df60201b60201c565b620008db576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620008806200052360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009fb57607f821691505b60208210810362000a115762000a10620009b3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a3c565b62000a87868362000a3c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000ad462000ace62000ac88462000a9f565b62000aa9565b62000a9f565b9050919050565b6000819050919050565b62000af08362000ab3565b62000b0862000aff8262000adb565b84845462000a49565b825550505050565b600090565b62000b1f62000b10565b62000b2c81848462000ae5565b505050565b5b8181101562000b545762000b4860008262000b15565b60018101905062000b32565b5050565b601f82111562000ba35762000b6d8162000a17565b62000b788462000a2c565b8101602085101562000b88578190505b62000ba062000b978562000a2c565b83018262000b31565b50505b505050565b600082821c905092915050565b600062000bc86000198460080262000ba8565b1980831691505092915050565b600062000be3838362000bb5565b9150826002028217905092915050565b62000bfe8262000979565b67ffffffffffffffff81111562000c1a5762000c1962000984565b5b62000c268254620009e2565b62000c3382828562000b58565b600060209050601f83116001811462000c6b576000841562000c56578287015190505b62000c62858262000bd5565b86555062000cd2565b601f19841662000c7b8662000a17565b60005b8281101562000ca55784890151825560018201915060208501945060208101905062000c7e565b8683101562000cc5578489015162000cc1601f89168262000bb5565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000d078262000cda565b9050919050565b62000d198162000cfa565b82525050565b600060208201905062000d36600083018462000d0e565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000dab602a8362000d3c565b915062000db88262000d4d565b604082019050919050565b6000602082019050818103600083015262000dde8162000d9c565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000e1d60198362000d3c565b915062000e2a8262000de5565b602082019050919050565b6000602082019050818103600083015262000e508162000e0e565b9050919050565b615f0a8062000e676000396000f3fe6080604052600436106102935760003560e01c8063715018a61161015a578063a22cb465116100c1578063d547741f1161007a578063d547741f146109a7578063d5abeb01146109d0578063e30c3978146109fb578063e985e9c514610a26578063eb91d37e14610a63578063f2fde38b14610a8e57610293565b8063a22cb465146108a3578063b88d4fde146108cc578063c1e0eb90146108e8578063c23dc68f14610911578063c87b56dd1461094e578063ce6df2b91461098b57610293565b80638da5cb5b116101135780638da5cb5b1461079157806391d14854146107bc57806395d89b41146107f957806399a2557a146108245780639ab1b48414610861578063a217fddf1461087857610293565b8063715018a6146106bd57806378230864146106d457806379ba5097146106eb5780637cb64759146107025780638462151c1461072b578063894760691461076857610293565b806332781e7f116101fe5780635a546223116101b75780635a546223146105965780635bbb2177146105b2578063603f4d52146105ef5780636352211e1461061a5780636f8b44b01461065757806370a082311461068057610293565b806332781e7f146104bf57806336568abe146104e85780633ccfd60b1461051157806342842e0e14610528578063484b973c1461054457806355f804b31461056d57610293565b80631beafb1d116102505780631beafb1d146103ad57806323b872dd146103d6578063248a9ca3146103f25780632a55205a1461042f5780632e91fe7f1461046d5780632f2ff15d1461049657610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063084c40881461033d578063095ea7b31461036657806318160ddd14610382575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba919061431d565b610ab7565b6040516102cc9190614365565b60405180910390f35b3480156102e157600080fd5b506102ea610ae9565b6040516102f79190614410565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190614468565b610b7b565b60405161033491906144d6565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190614468565b610bfa565b005b610380600480360381019061037b919061451d565b610c83565b005b34801561038e57600080fd5b50610397610dc7565b6040516103a4919061456c565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190614587565b610dde565b005b6103f060048036038101906103eb91906145c7565b610e1b565b005b3480156103fe57600080fd5b5061041960048036038101906104149190614650565b61113d565b604051610426919061468c565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190614587565b61115d565b6040516104649291906146a7565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f91906146fc565b611347565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190614729565b6114cf565b005b3480156104cb57600080fd5b506104e660048036038101906104e191906147ad565b6114f0565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190614729565b611529565b005b34801561051d57600080fd5b506105266115ac565b005b610542600480360381019061053d91906145c7565b6115cd565b005b34801561055057600080fd5b5061056b6004803603810190610566919061451d565b6115ed565b005b34801561057957600080fd5b50610594600480360381019061058f9190614922565b61164d565b005b6105b060048036038101906105ab91906149cb565b61168b565b005b3480156105be57600080fd5b506105d960048036038101906105d49190614a81565b611937565b6040516105e69190614c31565b60405180910390f35b3480156105fb57600080fd5b506106046119fa565b6040516106119190614cca565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190614468565b611a0d565b60405161064e91906144d6565b60405180910390f35b34801561066357600080fd5b5061067e60048036038101906106799190614468565b611a1f565b005b34801561068c57600080fd5b506106a760048036038101906106a29190614ce5565b611a68565b6040516106b4919061456c565b60405180910390f35b3480156106c957600080fd5b506106d2611b20565b005b3480156106e057600080fd5b506106e9611b34565b005b3480156106f757600080fd5b50610700611c09565b005b34801561070e57600080fd5b5061072960048036038101906107249190614650565b611c96565b005b34801561073757600080fd5b50610752600480360381019061074d9190614ce5565b611ccb565b60405161075f9190614dd0565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a9190614ce5565b611e0e565b005b34801561079d57600080fd5b506107a6611fc4565b6040516107b391906144d6565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de9190614729565b611fee565b6040516107f09190614365565b60405180910390f35b34801561080557600080fd5b5061080e612059565b60405161081b9190614410565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190614df2565b6120eb565b6040516108589190614dd0565b60405180910390f35b34801561086d57600080fd5b506108766122f7565b005b34801561088457600080fd5b5061088d612748565b60405161089a919061468c565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190614e45565b61274f565b005b6108e660048036038101906108e19190614f26565b61285a565b005b3480156108f457600080fd5b5061090f600480360381019061090a9190614ce5565b6128cd565b005b34801561091d57600080fd5b5061093860048036038101906109339190614468565b61293c565b6040516109459190614ffe565b60405180910390f35b34801561095a57600080fd5b5061097560048036038101906109709190614468565b6129a6565b6040516109829190614410565b60405180910390f35b6109a560048036038101906109a0919061451d565b612a5f565b005b3480156109b357600080fd5b506109ce60048036038101906109c99190614729565b612bb0565b005b3480156109dc57600080fd5b506109e5612bd1565b6040516109f2919061456c565b60405180910390f35b348015610a0757600080fd5b50610a10612bd7565b604051610a1d91906144d6565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190615019565b612c01565b604051610a5a9190614365565b60405180910390f35b348015610a6f57600080fd5b50610a78612c95565b604051610a85919061456c565b60405180910390f35b348015610a9a57600080fd5b50610ab56004803603810190610ab09190614ce5565b612c9f565b005b6000610ac282612d4c565b80610ad25750610ad182612dde565b5b80610ae25750610ae182612e58565b5b9050919050565b606060028054610af890615088565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2490615088565b8015610b715780601f10610b4657610100808354040283529160200191610b71565b820191906000526020600020905b815481529060010190602001808311610b5457829003601f168201915b5050505050905090565b6000610b8682612ed2565b610bbc576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda610c2481612f31565b600480811115610c3757610c36614c53565b5b821115610c4357600080fd5b816004811115610c5657610c55614c53565b5b601060006101000a81548160ff02191690836004811115610c7a57610c79614c53565b5b02179055505050565b6000610c8e82611a0d565b90508073ffffffffffffffffffffffffffffffffffffffff16610caf612f45565b73ffffffffffffffffffffffffffffffffffffffff1614610d1257610cdb81610cd6612f45565b612c01565b610d11576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610dd1612f4d565b6001546000540303905090565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda610e0881612f31565b82600e8190555081600f81905550505050565b6000610e2682612f56565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e8d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e9984613022565b91509150610eaf8187610eaa612f45565b613049565b610efb57610ec486610ebf612f45565b612c01565b610efa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f61576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f6e868686600161308d565b8015610f7957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061104785611023888887613093565b7c0200000000000000000000000000000000000000000000000000000000176130bb565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110cd57600060018501905060006004600083815260200190815260200160002054036110cb5760005481146110ca578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461113586868660016130e6565b505050505050565b6000600a6000838152602001908152602001600020600101549050919050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112f25760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112fc6130ec565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661132891906150e8565b6113329190615159565b90508160000151819350935050509250929050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda61137181612f31565b81156114235773430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663662aa11d30731d1b1e30a9d15dba662f85119122e1d6510904346040518363ffffffff1660e01b81526004016113da92919061518a565b6020604051808303816000875af11580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d91906151c8565b506114cb565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663954fa5ee30731d1b1e30a9d15dba662f85119122e1d6510904346040518363ffffffff1660e01b815260040161148692919061518a565b6020604051808303816000875af11580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c991906151c8565b505b5050565b6114d88261113d565b6114e181612f31565b6114eb83836130f6565b505050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda61151a81612f31565b61152482846131d7565b505050565b61153161336c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461159e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159590615267565b60405180910390fd5b6115a88282613374565b5050565b6000801b6115b981612f31565b6115ca6115c4611fc4565b47613456565b50565b6115e88383836040518060200160405280600081525061285a565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661161781612f31565b6000611621610dc7565b9050600d5483826116329190615287565b111561163d57600080fd5b611647848461354a565b50505050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda61167781612f31565b81601290816116869190615467565b505050565b6002600481111561169f5761169e614c53565b5b601060009054906101000a900460ff1660048111156116c1576116c0614c53565b5b146116cb57600080fd5b60006116d5610dc7565b9050600084600e546116e791906150e8565b90506000851180156117065750600d5485836117039190615287565b11155b611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90615585565b60405180910390fd5b80341015611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f906155f1565b60405180910390fd5b60003360405160200161179b9190615659565b604051602081830303815290604052805190602001209050611801858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155483613568565b611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611837906156c0565b60405180910390fd5b600f5486601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461188e9190615287565b11156118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c690615585565b60405180910390fd5b6118d9338761354a565b85601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119289190615287565b92505081905550505050505050565b6060600083839050905060008167ffffffffffffffff81111561195d5761195c6147f7565b5b60405190808252806020026020018201604052801561199657816020015b611983614262565b81526020019060019003908161197b5790505b50905060005b8281146119ee576119c58686838181106119b9576119b86156e0565b5b9050602002013561293c565b8282815181106119d8576119d76156e0565b5b602002602001018190525080600101905061199c565b50809250505092915050565b601060009054906101000a900460ff1681565b6000611a1882612f56565b9050919050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda611a4981612f31565b81611a52610dc7565b1115611a5d57600080fd5b81600d819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611acf576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b2861357f565b611b3260006135fd565b565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda611b5e81612f31565b600480811115611b7157611b70614c53565b5b601060009054906101000a900460ff166004811115611b9357611b92614c53565b5b10611b9d57600080fd5b6001601060009054906101000a900460ff166004811115611bc157611bc0614c53565b5b611bcb9190615287565b6004811115611bdd57611bdc614c53565b5b601060006101000a81548160ff02191690836004811115611c0157611c00614c53565b5b021790555050565b6000611c1361336c565b90508073ffffffffffffffffffffffffffffffffffffffff16611c34612bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8190615781565b60405180910390fd5b611c93816135fd565b50565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda611cc081612f31565b816015819055505050565b60606000806000611cdb85611a68565b905060008167ffffffffffffffff811115611cf957611cf86147f7565b5b604051908082528060200260200182016040528015611d275781602001602082028036833780820191505090505b509050611d32614262565b6000611d3c612f4d565b90505b838614611e0057611d4f8161362e565b91508160400151611df557600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d9a57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611df45780838780600101985081518110611de757611de66156e0565b5b6020026020010181815250505b5b806001019050611d3f565b508195505050505050919050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda611e3881612f31565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e7157600080fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611eb191906144d6565b602060405180830381865afa158015611ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef291906151c8565b905060008111611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e906157ed565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611f729291906146a7565b6020604051808303816000875af1158015611f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb59190615822565b611fbe57600080fd5b50505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606003805461206890615088565b80601f016020809104026020016040519081016040528092919081815260200182805461209490615088565b80156120e15780601f106120b6576101008083540402835291602001916120e1565b820191906000526020600020905b8154815290600101906020018083116120c457829003601f168201915b5050505050905090565b6060818310612126576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612131613659565b905061213b612f4d565b85101561214d5761214a612f4d565b94505b80841115612159578093505b600061216487611a68565b905084861015612187576000868603905081811015612181578091505b5061218c565b600090505b60008167ffffffffffffffff8111156121a8576121a76147f7565b5b6040519080825280602002602001820160405280156121d65781602001602082028036833780820191505090505b509050600082036121ed57809450505050506122f0565b60006121f88861293c565b90506000816040015161220d57816000015190505b60008990505b8881141580156122235750848714155b156122e2576122318161362e565b925082604001516122d757600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461227c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122d657808488806001019950815181106122c9576122c86156e0565b5b6020026020010181815250505b5b806001019050612213565b508583528296505050505050505b9392505050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda61232181612f31565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161238391906144d6565b602060405180830381865afa1580156123a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c491906151c8565b905060008111612409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612400906157ed565b60405180910390fd5b6000612413610dc7565b9050600081836124239190615159565b905060008267ffffffffffffffff811115612441576124406147f7565b5b60405190808252806020026020018201604052801561246f5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff81111561248e5761248d6147f7565b5b6040519080825280602002602001820160405280156124bc5781602001602082028036833780820191505090505b5090506000805b858110156126125760006124d682611a0d565b90506000805b84811015612579578273ffffffffffffffffffffffffffffffffffffffff1687828151811061250e5761250d6156e0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361256657858181518110612544576125436156e0565b5b6020026020010180518091906125599061584f565b8152505060019150612579565b80806125719061584f565b9150506124dc565b50806125fd5781868581518110612593576125926156e0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060018585815181106125e2576125e16156e0565b5b60200260200101818152505083806125f99061584f565b9450505b5050808061260a9061584f565b9150506124c3565b5060005b8181101561273d57600085848381518110612634576126336156e0565b5b602002602001015161264691906150e8565b90506000811115612729578873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8684815181106126805761267f6156e0565b5b6020026020010151836040518363ffffffff1660e01b81526004016126a69291906146a7565b6020604051808303816000875af11580156126c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e99190615822565b612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271f906158e3565b60405180910390fd5b5b5080806127359061584f565b915050612616565b505050505050505050565b6000801b81565b806007600061275c612f45565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612809612f45565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161284e9190614365565b60405180910390a35050565b612865848484610e1b565b60008373ffffffffffffffffffffffffffffffffffffffff163b146128c75761289084848484613662565b6128c6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda6128f781612f31565b81601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b612944614262565b61294c614262565b612954612f4d565b8310806129685750612964613659565b8310155b1561297657809150506129a1565b61297f8361362e565b905080604001511561299457809150506129a1565b61299d836137b2565b9150505b919050565b60606129b182612ed2565b6129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e79061594f565b60405180910390fd5b6129f86137d2565b612a0183613864565b6040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001612a49939291906159ab565b6040516020818303038152906040529050919050565b60036004811115612a7357612a72614c53565b5b601060009054906101000a900460ff166004811115612a9557612a94614c53565b5b14612a9f57600080fd5b6000612aa9610dc7565b9050600082600e54612abb91906150e8565b9050600083118015612ada5750600d548383612ad79190615287565b11155b612b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1090615585565b60405180910390fd5b80341015612b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b53906155f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b9f57612b9a848461354a565b612baa565b612ba9338461354a565b5b50505050565b612bb98261113d565b612bc281612f31565b612bcc8383613374565b505050565b600d5481565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e54905090565b612ca761357f565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16612d07611fc4565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612da757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612dd75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e515750612e5082612e58565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ecb5750612eca82613932565b5b9050919050565b600081612edd612f4d565b11158015612eec575060005482105b8015612f2a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b612f4281612f3d61336c565b61399c565b50565b600033905090565b60006001905090565b60008082905080612f65612f4d565b11612feb57600054811015612fea5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612fe8575b60008103612fde576004600083600190039350838152602001908152602001600020549050612fb4565b809250505061301d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86130aa868684613a21565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b6131008282611fee565b6131d3576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061317861336c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6131df6130ec565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323490615a4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a390615aba565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600033905090565b61337e8282611fee565b15613452576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506133f761336c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b80471015613499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349090615b26565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516134bf90615b77565b60006040518083038185875af1925050503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b5050905080613545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353c90615bfe565b60405180910390fd5b505050565b613564828260405180602001604052806000815250613a2a565b5050565b6000826135758584613ac7565b1490509392505050565b61358761336c565b73ffffffffffffffffffffffffffffffffffffffff166135a5611fc4565b73ffffffffffffffffffffffffffffffffffffffff16146135fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f290615c6a565b60405180910390fd5b565b600c60006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561362b81613b1d565b50565b613636614262565b6136526004600084815260200190815260200160002054613be3565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613688612f45565b8786866040518563ffffffff1660e01b81526004016136aa9493929190615cdf565b6020604051808303816000875af19250505080156136e657506040513d601f19601f820116820180604052508101906136e39190615d40565b60015b61375f573d8060008114613716576040519150601f19603f3d011682016040523d82523d6000602084013e61371b565b606091505b506000815103613757576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6137ba614262565b6137cb6137c683612f56565b613be3565b9050919050565b6060601280546137e190615088565b80601f016020809104026020016040519081016040528092919081815260200182805461380d90615088565b801561385a5780601f1061382f5761010080835404028352916020019161385a565b820191906000526020600020905b81548152906001019060200180831161383d57829003601f168201915b5050505050905090565b60606000600161387384613c99565b01905060008167ffffffffffffffff811115613892576138916147f7565b5b6040519080825280601f01601f1916602001820160405280156138c45781602001600182028036833780820191505090505b509050600082602001820190505b600115613927578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161391b5761391a61512a565b5b049450600085036138d2575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6139a68282611fee565b613a1d576139b381613dec565b6139c18360001c6020613e19565b6040516020016139d2929190615e05565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a149190614410565b60405180910390fd5b5050565b60009392505050565b613a348383614055565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613ac257600080549050600083820390505b613a746000868380600101945086613662565b613aaa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613a61578160005414613abf57600080fd5b50505b505050565b60008082905060005b8451811015613b1257613afd82868381518110613af057613aef6156e0565b5b6020026020010151614210565b91508080613b0a9061584f565b915050613ad0565b508091505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613beb614262565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613cf7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613ced57613cec61512a565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613d34576d04ee2d6d415b85acef81000000008381613d2a57613d2961512a565b5b0492506020810190505b662386f26fc100008310613d6357662386f26fc100008381613d5957613d5861512a565b5b0492506010810190505b6305f5e1008310613d8c576305f5e1008381613d8257613d8161512a565b5b0492506008810190505b6127108310613db1576127108381613da757613da661512a565b5b0492506004810190505b60648310613dd45760648381613dca57613dc961512a565b5b0492506002810190505b600a8310613de3576001810190505b80915050919050565b6060613e128273ffffffffffffffffffffffffffffffffffffffff16601460ff16613e19565b9050919050565b606060006002836002613e2c91906150e8565b613e369190615287565b67ffffffffffffffff811115613e4f57613e4e6147f7565b5b6040519080825280601f01601f191660200182016040528015613e815781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613eb957613eb86156e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613f1d57613f1c6156e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002613f5d91906150e8565b613f679190615287565b90505b6001811115614007577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613fa957613fa86156e0565b5b1a60f81b828281518110613fc057613fbf6156e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061400090615e3f565b9050613f6a565b506000841461404b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404290615eb4565b60405180910390fd5b8091505092915050565b60008054905060008203614095576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6140a2600084838561308d565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506141198361410a6000866000613093565b6141138561423b565b176130bb565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146141ba57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061417f565b50600082036141f5576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061420b60008483856130e6565b505050565b600081831061422857614223828461424b565b614233565b614232838361424b565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6142fa816142c5565b811461430557600080fd5b50565b600081359050614317816142f1565b92915050565b600060208284031215614333576143326142bb565b5b600061434184828501614308565b91505092915050565b60008115159050919050565b61435f8161434a565b82525050565b600060208201905061437a6000830184614356565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156143ba57808201518184015260208101905061439f565b60008484015250505050565b6000601f19601f8301169050919050565b60006143e282614380565b6143ec818561438b565b93506143fc81856020860161439c565b614405816143c6565b840191505092915050565b6000602082019050818103600083015261442a81846143d7565b905092915050565b6000819050919050565b61444581614432565b811461445057600080fd5b50565b6000813590506144628161443c565b92915050565b60006020828403121561447e5761447d6142bb565b5b600061448c84828501614453565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144c082614495565b9050919050565b6144d0816144b5565b82525050565b60006020820190506144eb60008301846144c7565b92915050565b6144fa816144b5565b811461450557600080fd5b50565b600081359050614517816144f1565b92915050565b60008060408385031215614534576145336142bb565b5b600061454285828601614508565b925050602061455385828601614453565b9150509250929050565b61456681614432565b82525050565b6000602082019050614581600083018461455d565b92915050565b6000806040838503121561459e5761459d6142bb565b5b60006145ac85828601614453565b92505060206145bd85828601614453565b9150509250929050565b6000806000606084860312156145e0576145df6142bb565b5b60006145ee86828701614508565b93505060206145ff86828701614508565b925050604061461086828701614453565b9150509250925092565b6000819050919050565b61462d8161461a565b811461463857600080fd5b50565b60008135905061464a81614624565b92915050565b600060208284031215614666576146656142bb565b5b60006146748482850161463b565b91505092915050565b6146868161461a565b82525050565b60006020820190506146a1600083018461467d565b92915050565b60006040820190506146bc60008301856144c7565b6146c9602083018461455d565b9392505050565b6146d98161434a565b81146146e457600080fd5b50565b6000813590506146f6816146d0565b92915050565b600060208284031215614712576147116142bb565b5b6000614720848285016146e7565b91505092915050565b600080604083850312156147405761473f6142bb565b5b600061474e8582860161463b565b925050602061475f85828601614508565b9150509250929050565b60006bffffffffffffffffffffffff82169050919050565b61478a81614769565b811461479557600080fd5b50565b6000813590506147a781614781565b92915050565b600080604083850312156147c4576147c36142bb565b5b60006147d285828601614798565b92505060206147e385828601614508565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61482f826143c6565b810181811067ffffffffffffffff8211171561484e5761484d6147f7565b5b80604052505050565b60006148616142b1565b905061486d8282614826565b919050565b600067ffffffffffffffff82111561488d5761488c6147f7565b5b614896826143c6565b9050602081019050919050565b82818337600083830152505050565b60006148c56148c084614872565b614857565b9050828152602081018484840111156148e1576148e06147f2565b5b6148ec8482856148a3565b509392505050565b600082601f830112614909576149086147ed565b5b81356149198482602086016148b2565b91505092915050565b600060208284031215614938576149376142bb565b5b600082013567ffffffffffffffff811115614956576149556142c0565b5b614962848285016148f4565b91505092915050565b600080fd5b600080fd5b60008083601f84011261498b5761498a6147ed565b5b8235905067ffffffffffffffff8111156149a8576149a761496b565b5b6020830191508360208202830111156149c4576149c3614970565b5b9250929050565b6000806000604084860312156149e4576149e36142bb565b5b60006149f286828701614453565b935050602084013567ffffffffffffffff811115614a1357614a126142c0565b5b614a1f86828701614975565b92509250509250925092565b60008083601f840112614a4157614a406147ed565b5b8235905067ffffffffffffffff811115614a5e57614a5d61496b565b5b602083019150836020820283011115614a7a57614a79614970565b5b9250929050565b60008060208385031215614a9857614a976142bb565b5b600083013567ffffffffffffffff811115614ab657614ab56142c0565b5b614ac285828601614a2b565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b03816144b5565b82525050565b600067ffffffffffffffff82169050919050565b614b2681614b09565b82525050565b614b358161434a565b82525050565b600062ffffff82169050919050565b614b5381614b3b565b82525050565b608082016000820151614b6f6000850182614afa565b506020820151614b826020850182614b1d565b506040820151614b956040850182614b2c565b506060820151614ba86060850182614b4a565b50505050565b6000614bba8383614b59565b60808301905092915050565b6000602082019050919050565b6000614bde82614ace565b614be88185614ad9565b9350614bf383614aea565b8060005b83811015614c24578151614c0b8882614bae565b9750614c1683614bc6565b925050600181019050614bf7565b5085935050505092915050565b60006020820190508181036000830152614c4b8184614bd3565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60058110614c9357614c92614c53565b5b50565b6000819050614ca482614c82565b919050565b6000614cb482614c96565b9050919050565b614cc481614ca9565b82525050565b6000602082019050614cdf6000830184614cbb565b92915050565b600060208284031215614cfb57614cfa6142bb565b5b6000614d0984828501614508565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614d4781614432565b82525050565b6000614d598383614d3e565b60208301905092915050565b6000602082019050919050565b6000614d7d82614d12565b614d878185614d1d565b9350614d9283614d2e565b8060005b83811015614dc3578151614daa8882614d4d565b9750614db583614d65565b925050600181019050614d96565b5085935050505092915050565b60006020820190508181036000830152614dea8184614d72565b905092915050565b600080600060608486031215614e0b57614e0a6142bb565b5b6000614e1986828701614508565b9350506020614e2a86828701614453565b9250506040614e3b86828701614453565b9150509250925092565b60008060408385031215614e5c57614e5b6142bb565b5b6000614e6a85828601614508565b9250506020614e7b858286016146e7565b9150509250929050565b600067ffffffffffffffff821115614ea057614e9f6147f7565b5b614ea9826143c6565b9050602081019050919050565b6000614ec9614ec484614e85565b614857565b905082815260208101848484011115614ee557614ee46147f2565b5b614ef08482856148a3565b509392505050565b600082601f830112614f0d57614f0c6147ed565b5b8135614f1d848260208601614eb6565b91505092915050565b60008060008060808587031215614f4057614f3f6142bb565b5b6000614f4e87828801614508565b9450506020614f5f87828801614508565b9350506040614f7087828801614453565b925050606085013567ffffffffffffffff811115614f9157614f906142c0565b5b614f9d87828801614ef8565b91505092959194509250565b608082016000820151614fbf6000850182614afa565b506020820151614fd26020850182614b1d565b506040820151614fe56040850182614b2c565b506060820151614ff86060850182614b4a565b50505050565b60006080820190506150136000830184614fa9565b92915050565b600080604083850312156150305761502f6142bb565b5b600061503e85828601614508565b925050602061504f85828601614508565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150a057607f821691505b6020821081036150b3576150b2615059565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150f382614432565b91506150fe83614432565b925082820261510c81614432565b91508282048414831517615123576151226150b9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061516482614432565b915061516f83614432565b92508261517f5761517e61512a565b5b828204905092915050565b600060408201905061519f60008301856144c7565b6151ac60208301846144c7565b9392505050565b6000815190506151c28161443c565b92915050565b6000602082840312156151de576151dd6142bb565b5b60006151ec848285016151b3565b91505092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000615251602f8361438b565b915061525c826151f5565b604082019050919050565b6000602082019050818103600083015261528081615244565b9050919050565b600061529282614432565b915061529d83614432565b92508282019050808211156152b5576152b46150b9565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261531d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826152e0565b61532786836152e0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061536461535f61535a84614432565b61533f565b614432565b9050919050565b6000819050919050565b61537e83615349565b61539261538a8261536b565b8484546152ed565b825550505050565b600090565b6153a761539a565b6153b2818484615375565b505050565b5b818110156153d6576153cb60008261539f565b6001810190506153b8565b5050565b601f82111561541b576153ec816152bb565b6153f5846152d0565b81016020851015615404578190505b615418615410856152d0565b8301826153b7565b50505b505050565b600082821c905092915050565b600061543e60001984600802615420565b1980831691505092915050565b6000615457838361542d565b9150826002028217905092915050565b61547082614380565b67ffffffffffffffff811115615489576154886147f7565b5b6154938254615088565b61549e8282856153da565b600060209050601f8311600181146154d157600084156154bf578287015190505b6154c9858261544b565b865550615531565b601f1984166154df866152bb565b60005b82811015615507578489015182556001820191506020850194506020810190506154e2565b868310156155245784890151615520601f89168261542d565b8355505b6001600288020188555050505b505050505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061556f60148361438b565b915061557a82615539565b602082019050919050565b6000602082019050818103600083015261559e81615562565b9050919050565b7f4554482076616c7565206973206e6f7420636f72726563740000000000000000600082015250565b60006155db60188361438b565b91506155e6826155a5565b602082019050919050565b6000602082019050818103600083015261560a816155ce565b9050919050565b60008160601b9050919050565b600061562982615611565b9050919050565b600061563b8261561e565b9050919050565b61565361564e826144b5565b615630565b82525050565b60006156658284615642565b60148201915081905092915050565b7f496e76616c6964204d65726b6c652050726f6f66000000000000000000000000600082015250565b60006156aa60148361438b565b91506156b582615674565b602082019050919050565b600060208201905081810360008301526156d98161569d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b600061576b60298361438b565b91506157768261570f565b604082019050919050565b6000602082019050818103600083015261579a8161575e565b9050919050565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b60006157d760168361438b565b91506157e2826157a1565b602082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b60008151905061581c816146d0565b92915050565b600060208284031215615838576158376142bb565b5b60006158468482850161580d565b91505092915050565b600061585a82614432565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361588c5761588b6150b9565b5b600182019050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006158cd600f8361438b565b91506158d882615897565b602082019050919050565b600060208201905081810360008301526158fc816158c0565b9050919050565b7f746f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061593960148361438b565b915061594482615903565b602082019050919050565b600060208201905081810360008301526159688161592c565b9050919050565b600081905092915050565b600061598582614380565b61598f818561596f565b935061599f81856020860161439c565b80840191505092915050565b60006159b7828661597a565b91506159c3828561597a565b91506159cf828461597a565b9150819050949350505050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615a38602a8361438b565b9150615a43826159dc565b604082019050919050565b60006020820190508181036000830152615a6781615a2b565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000615aa460198361438b565b9150615aaf82615a6e565b602082019050919050565b60006020820190508181036000830152615ad381615a97565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000615b10601d8361438b565b9150615b1b82615ada565b602082019050919050565b60006020820190508181036000830152615b3f81615b03565b9050919050565b600081905092915050565b50565b6000615b61600083615b46565b9150615b6c82615b51565b600082019050919050565b6000615b8282615b54565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615be8603a8361438b565b9150615bf382615b8c565b604082019050919050565b60006020820190508181036000830152615c1781615bdb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615c5460208361438b565b9150615c5f82615c1e565b602082019050919050565b60006020820190508181036000830152615c8381615c47565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615cb182615c8a565b615cbb8185615c95565b9350615ccb81856020860161439c565b615cd4816143c6565b840191505092915050565b6000608082019050615cf460008301876144c7565b615d0160208301866144c7565b615d0e604083018561455d565b8181036060830152615d208184615ca6565b905095945050505050565b600081519050615d3a816142f1565b92915050565b600060208284031215615d5657615d556142bb565b5b6000615d6484828501615d2b565b91505092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615da360178361596f565b9150615dae82615d6d565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615def60118361596f565b9150615dfa82615db9565b601182019050919050565b6000615e1082615d96565b9150615e1c828561597a565b9150615e2782615de2565b9150615e33828461597a565b91508190509392505050565b6000615e4a82614432565b915060008203615e5d57615e5c6150b9565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615e9e60208361438b565b9150615ea982615e68565b602082019050919050565b60006020820190508181036000830152615ecd81615e91565b905091905056fea2646970667358221220d23fc40a723d6a398340c2550993422d8e873db12fbb629998b16c1171ff3f9d64736f6c63430008130033
Deployed Bytecode
0x6080604052600436106102935760003560e01c8063715018a61161015a578063a22cb465116100c1578063d547741f1161007a578063d547741f146109a7578063d5abeb01146109d0578063e30c3978146109fb578063e985e9c514610a26578063eb91d37e14610a63578063f2fde38b14610a8e57610293565b8063a22cb465146108a3578063b88d4fde146108cc578063c1e0eb90146108e8578063c23dc68f14610911578063c87b56dd1461094e578063ce6df2b91461098b57610293565b80638da5cb5b116101135780638da5cb5b1461079157806391d14854146107bc57806395d89b41146107f957806399a2557a146108245780639ab1b48414610861578063a217fddf1461087857610293565b8063715018a6146106bd57806378230864146106d457806379ba5097146106eb5780637cb64759146107025780638462151c1461072b578063894760691461076857610293565b806332781e7f116101fe5780635a546223116101b75780635a546223146105965780635bbb2177146105b2578063603f4d52146105ef5780636352211e1461061a5780636f8b44b01461065757806370a082311461068057610293565b806332781e7f146104bf57806336568abe146104e85780633ccfd60b1461051157806342842e0e14610528578063484b973c1461054457806355f804b31461056d57610293565b80631beafb1d116102505780631beafb1d146103ad57806323b872dd146103d6578063248a9ca3146103f25780632a55205a1461042f5780632e91fe7f1461046d5780632f2ff15d1461049657610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063084c40881461033d578063095ea7b31461036657806318160ddd14610382575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba919061431d565b610ab7565b6040516102cc9190614365565b60405180910390f35b3480156102e157600080fd5b506102ea610ae9565b6040516102f79190614410565b60405180910390f35b34801561030c57600080fd5b5061032760048036038101906103229190614468565b610b7b565b60405161033491906144d6565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190614468565b610bfa565b005b610380600480360381019061037b919061451d565b610c83565b005b34801561038e57600080fd5b50610397610dc7565b6040516103a4919061456c565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190614587565b610dde565b005b6103f060048036038101906103eb91906145c7565b610e1b565b005b3480156103fe57600080fd5b5061041960048036038101906104149190614650565b61113d565b604051610426919061468c565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190614587565b61115d565b6040516104649291906146a7565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f91906146fc565b611347565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190614729565b6114cf565b005b3480156104cb57600080fd5b506104e660048036038101906104e191906147ad565b6114f0565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190614729565b611529565b005b34801561051d57600080fd5b506105266115ac565b005b610542600480360381019061053d91906145c7565b6115cd565b005b34801561055057600080fd5b5061056b6004803603810190610566919061451d565b6115ed565b005b34801561057957600080fd5b50610594600480360381019061058f9190614922565b61164d565b005b6105b060048036038101906105ab91906149cb565b61168b565b005b3480156105be57600080fd5b506105d960048036038101906105d49190614a81565b611937565b6040516105e69190614c31565b60405180910390f35b3480156105fb57600080fd5b506106046119fa565b6040516106119190614cca565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190614468565b611a0d565b60405161064e91906144d6565b60405180910390f35b34801561066357600080fd5b5061067e60048036038101906106799190614468565b611a1f565b005b34801561068c57600080fd5b506106a760048036038101906106a29190614ce5565b611a68565b6040516106b4919061456c565b60405180910390f35b3480156106c957600080fd5b506106d2611b20565b005b3480156106e057600080fd5b506106e9611b34565b005b3480156106f757600080fd5b50610700611c09565b005b34801561070e57600080fd5b5061072960048036038101906107249190614650565b611c96565b005b34801561073757600080fd5b50610752600480360381019061074d9190614ce5565b611ccb565b60405161075f9190614dd0565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a9190614ce5565b611e0e565b005b34801561079d57600080fd5b506107a6611fc4565b6040516107b391906144d6565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de9190614729565b611fee565b6040516107f09190614365565b60405180910390f35b34801561080557600080fd5b5061080e612059565b60405161081b9190614410565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190614df2565b6120eb565b6040516108589190614dd0565b60405180910390f35b34801561086d57600080fd5b506108766122f7565b005b34801561088457600080fd5b5061088d612748565b60405161089a919061468c565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190614e45565b61274f565b005b6108e660048036038101906108e19190614f26565b61285a565b005b3480156108f457600080fd5b5061090f600480360381019061090a9190614ce5565b6128cd565b005b34801561091d57600080fd5b5061093860048036038101906109339190614468565b61293c565b6040516109459190614ffe565b60405180910390f35b34801561095a57600080fd5b5061097560048036038101906109709190614468565b6129a6565b6040516109829190614410565b60405180910390f35b6109a560048036038101906109a0919061451d565b612a5f565b005b3480156109b357600080fd5b506109ce60048036038101906109c99190614729565b612bb0565b005b3480156109dc57600080fd5b506109e5612bd1565b6040516109f2919061456c565b60405180910390f35b348015610a0757600080fd5b50610a10612bd7565b604051610a1d91906144d6565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190615019565b612c01565b604051610a5a9190614365565b60405180910390f35b348015610a6f57600080fd5b50610a78612c95565b604051610a85919061456c565b60405180910390f35b348015610a9a57600080fd5b50610ab56004803603810190610ab09190614ce5565b612c9f565b005b6000610ac282612d4c565b80610ad25750610ad182612dde565b5b80610ae25750610ae182612e58565b5b9050919050565b606060028054610af890615088565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2490615088565b8015610b715780601f10610b4657610100808354040283529160200191610b71565b820191906000526020600020905b815481529060010190602001808311610b5457829003601f168201915b5050505050905090565b6000610b8682612ed2565b610bbc576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda610c2481612f31565b600480811115610c3757610c36614c53565b5b821115610c4357600080fd5b816004811115610c5657610c55614c53565b5b601060006101000a81548160ff02191690836004811115610c7a57610c79614c53565b5b02179055505050565b6000610c8e82611a0d565b90508073ffffffffffffffffffffffffffffffffffffffff16610caf612f45565b73ffffffffffffffffffffffffffffffffffffffff1614610d1257610cdb81610cd6612f45565b612c01565b610d11576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610dd1612f4d565b6001546000540303905090565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda610e0881612f31565b82600e8190555081600f81905550505050565b6000610e2682612f56565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e8d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e9984613022565b91509150610eaf8187610eaa612f45565b613049565b610efb57610ec486610ebf612f45565b612c01565b610efa576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f61576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f6e868686600161308d565b8015610f7957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061104785611023888887613093565b7c0200000000000000000000000000000000000000000000000000000000176130bb565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110cd57600060018501905060006004600083815260200190815260200160002054036110cb5760005481146110ca578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461113586868660016130e6565b505050505050565b6000600a6000838152602001908152602001600020600101549050919050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112f25760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112fc6130ec565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661132891906150e8565b6113329190615159565b90508160000151819350935050509250929050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda61137181612f31565b81156114235773430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663662aa11d30731d1b1e30a9d15dba662f85119122e1d6510904346040518363ffffffff1660e01b81526004016113da92919061518a565b6020604051808303816000875af11580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d91906151c8565b506114cb565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663954fa5ee30731d1b1e30a9d15dba662f85119122e1d6510904346040518363ffffffff1660e01b815260040161148692919061518a565b6020604051808303816000875af11580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c991906151c8565b505b5050565b6114d88261113d565b6114e181612f31565b6114eb83836130f6565b505050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda61151a81612f31565b61152482846131d7565b505050565b61153161336c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461159e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159590615267565b60405180910390fd5b6115a88282613374565b5050565b6000801b6115b981612f31565b6115ca6115c4611fc4565b47613456565b50565b6115e88383836040518060200160405280600081525061285a565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661161781612f31565b6000611621610dc7565b9050600d5483826116329190615287565b111561163d57600080fd5b611647848461354a565b50505050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda61167781612f31565b81601290816116869190615467565b505050565b6002600481111561169f5761169e614c53565b5b601060009054906101000a900460ff1660048111156116c1576116c0614c53565b5b146116cb57600080fd5b60006116d5610dc7565b9050600084600e546116e791906150e8565b90506000851180156117065750600d5485836117039190615287565b11155b611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90615585565b60405180910390fd5b80341015611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f906155f1565b60405180910390fd5b60003360405160200161179b9190615659565b604051602081830303815290604052805190602001209050611801858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155483613568565b611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611837906156c0565b60405180910390fd5b600f5486601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461188e9190615287565b11156118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c690615585565b60405180910390fd5b6118d9338761354a565b85601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119289190615287565b92505081905550505050505050565b6060600083839050905060008167ffffffffffffffff81111561195d5761195c6147f7565b5b60405190808252806020026020018201604052801561199657816020015b611983614262565b81526020019060019003908161197b5790505b50905060005b8281146119ee576119c58686838181106119b9576119b86156e0565b5b9050602002013561293c565b8282815181106119d8576119d76156e0565b5b602002602001018190525080600101905061199c565b50809250505092915050565b601060009054906101000a900460ff1681565b6000611a1882612f56565b9050919050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda611a4981612f31565b81611a52610dc7565b1115611a5d57600080fd5b81600d819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611acf576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b2861357f565b611b3260006135fd565b565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda611b5e81612f31565b600480811115611b7157611b70614c53565b5b601060009054906101000a900460ff166004811115611b9357611b92614c53565b5b10611b9d57600080fd5b6001601060009054906101000a900460ff166004811115611bc157611bc0614c53565b5b611bcb9190615287565b6004811115611bdd57611bdc614c53565b5b601060006101000a81548160ff02191690836004811115611c0157611c00614c53565b5b021790555050565b6000611c1361336c565b90508073ffffffffffffffffffffffffffffffffffffffff16611c34612bd7565b73ffffffffffffffffffffffffffffffffffffffff1614611c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8190615781565b60405180910390fd5b611c93816135fd565b50565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda611cc081612f31565b816015819055505050565b60606000806000611cdb85611a68565b905060008167ffffffffffffffff811115611cf957611cf86147f7565b5b604051908082528060200260200182016040528015611d275781602001602082028036833780820191505090505b509050611d32614262565b6000611d3c612f4d565b90505b838614611e0057611d4f8161362e565b91508160400151611df557600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d9a57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611df45780838780600101985081518110611de757611de66156e0565b5b6020026020010181815250505b5b806001019050611d3f565b508195505050505050919050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda611e3881612f31565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e7157600080fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611eb191906144d6565b602060405180830381865afa158015611ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef291906151c8565b905060008111611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e906157ed565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611f729291906146a7565b6020604051808303816000875af1158015611f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb59190615822565b611fbe57600080fd5b50505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606003805461206890615088565b80601f016020809104026020016040519081016040528092919081815260200182805461209490615088565b80156120e15780601f106120b6576101008083540402835291602001916120e1565b820191906000526020600020905b8154815290600101906020018083116120c457829003601f168201915b5050505050905090565b6060818310612126576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612131613659565b905061213b612f4d565b85101561214d5761214a612f4d565b94505b80841115612159578093505b600061216487611a68565b905084861015612187576000868603905081811015612181578091505b5061218c565b600090505b60008167ffffffffffffffff8111156121a8576121a76147f7565b5b6040519080825280602002602001820160405280156121d65781602001602082028036833780820191505090505b509050600082036121ed57809450505050506122f0565b60006121f88861293c565b90506000816040015161220d57816000015190505b60008990505b8881141580156122235750848714155b156122e2576122318161362e565b925082604001516122d757600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461227c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122d657808488806001019950815181106122c9576122c86156e0565b5b6020026020010181815250505b5b806001019050612213565b508583528296505050505050505b9392505050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda61232181612f31565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161238391906144d6565b602060405180830381865afa1580156123a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c491906151c8565b905060008111612409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612400906157ed565b60405180910390fd5b6000612413610dc7565b9050600081836124239190615159565b905060008267ffffffffffffffff811115612441576124406147f7565b5b60405190808252806020026020018201604052801561246f5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff81111561248e5761248d6147f7565b5b6040519080825280602002602001820160405280156124bc5781602001602082028036833780820191505090505b5090506000805b858110156126125760006124d682611a0d565b90506000805b84811015612579578273ffffffffffffffffffffffffffffffffffffffff1687828151811061250e5761250d6156e0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361256657858181518110612544576125436156e0565b5b6020026020010180518091906125599061584f565b8152505060019150612579565b80806125719061584f565b9150506124dc565b50806125fd5781868581518110612593576125926156e0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060018585815181106125e2576125e16156e0565b5b60200260200101818152505083806125f99061584f565b9450505b5050808061260a9061584f565b9150506124c3565b5060005b8181101561273d57600085848381518110612634576126336156e0565b5b602002602001015161264691906150e8565b90506000811115612729578873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8684815181106126805761267f6156e0565b5b6020026020010151836040518363ffffffff1660e01b81526004016126a69291906146a7565b6020604051808303816000875af11580156126c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e99190615822565b612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271f906158e3565b60405180910390fd5b5b5080806127359061584f565b915050612616565b505050505050505050565b6000801b81565b806007600061275c612f45565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612809612f45565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161284e9190614365565b60405180910390a35050565b612865848484610e1b565b60008373ffffffffffffffffffffffffffffffffffffffff163b146128c75761289084848484613662565b6128c6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b7f61c92169ef077349011ff0b1383c894d86c5f0b41d986366b58a6cf31e93beda6128f781612f31565b81601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b612944614262565b61294c614262565b612954612f4d565b8310806129685750612964613659565b8310155b1561297657809150506129a1565b61297f8361362e565b905080604001511561299457809150506129a1565b61299d836137b2565b9150505b919050565b60606129b182612ed2565b6129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e79061594f565b60405180910390fd5b6129f86137d2565b612a0183613864565b6040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001612a49939291906159ab565b6040516020818303038152906040529050919050565b60036004811115612a7357612a72614c53565b5b601060009054906101000a900460ff166004811115612a9557612a94614c53565b5b14612a9f57600080fd5b6000612aa9610dc7565b9050600082600e54612abb91906150e8565b9050600083118015612ada5750600d548383612ad79190615287565b11155b612b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1090615585565b60405180910390fd5b80341015612b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b53906155f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612b9f57612b9a848461354a565b612baa565b612ba9338461354a565b5b50505050565b612bb98261113d565b612bc281612f31565b612bcc8383613374565b505050565b600d5481565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e54905090565b612ca761357f565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16612d07611fc4565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612da757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612dd75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e515750612e5082612e58565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ecb5750612eca82613932565b5b9050919050565b600081612edd612f4d565b11158015612eec575060005482105b8015612f2a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b612f4281612f3d61336c565b61399c565b50565b600033905090565b60006001905090565b60008082905080612f65612f4d565b11612feb57600054811015612fea5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612fe8575b60008103612fde576004600083600190039350838152602001908152602001600020549050612fb4565b809250505061301d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86130aa868684613a21565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b6131008282611fee565b6131d3576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061317861336c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6131df6130ec565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323490615a4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a390615aba565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600033905090565b61337e8282611fee565b15613452576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506133f761336c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b80471015613499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349090615b26565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516134bf90615b77565b60006040518083038185875af1925050503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b5050905080613545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353c90615bfe565b60405180910390fd5b505050565b613564828260405180602001604052806000815250613a2a565b5050565b6000826135758584613ac7565b1490509392505050565b61358761336c565b73ffffffffffffffffffffffffffffffffffffffff166135a5611fc4565b73ffffffffffffffffffffffffffffffffffffffff16146135fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f290615c6a565b60405180910390fd5b565b600c60006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561362b81613b1d565b50565b613636614262565b6136526004600084815260200190815260200160002054613be3565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613688612f45565b8786866040518563ffffffff1660e01b81526004016136aa9493929190615cdf565b6020604051808303816000875af19250505080156136e657506040513d601f19601f820116820180604052508101906136e39190615d40565b60015b61375f573d8060008114613716576040519150601f19603f3d011682016040523d82523d6000602084013e61371b565b606091505b506000815103613757576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6137ba614262565b6137cb6137c683612f56565b613be3565b9050919050565b6060601280546137e190615088565b80601f016020809104026020016040519081016040528092919081815260200182805461380d90615088565b801561385a5780601f1061382f5761010080835404028352916020019161385a565b820191906000526020600020905b81548152906001019060200180831161383d57829003601f168201915b5050505050905090565b60606000600161387384613c99565b01905060008167ffffffffffffffff811115613892576138916147f7565b5b6040519080825280601f01601f1916602001820160405280156138c45781602001600182028036833780820191505090505b509050600082602001820190505b600115613927578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161391b5761391a61512a565b5b049450600085036138d2575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6139a68282611fee565b613a1d576139b381613dec565b6139c18360001c6020613e19565b6040516020016139d2929190615e05565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a149190614410565b60405180910390fd5b5050565b60009392505050565b613a348383614055565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613ac257600080549050600083820390505b613a746000868380600101945086613662565b613aaa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613a61578160005414613abf57600080fd5b50505b505050565b60008082905060005b8451811015613b1257613afd82868381518110613af057613aef6156e0565b5b6020026020010151614210565b91508080613b0a9061584f565b915050613ad0565b508091505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613beb614262565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613cf7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613ced57613cec61512a565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613d34576d04ee2d6d415b85acef81000000008381613d2a57613d2961512a565b5b0492506020810190505b662386f26fc100008310613d6357662386f26fc100008381613d5957613d5861512a565b5b0492506010810190505b6305f5e1008310613d8c576305f5e1008381613d8257613d8161512a565b5b0492506008810190505b6127108310613db1576127108381613da757613da661512a565b5b0492506004810190505b60648310613dd45760648381613dca57613dc961512a565b5b0492506002810190505b600a8310613de3576001810190505b80915050919050565b6060613e128273ffffffffffffffffffffffffffffffffffffffff16601460ff16613e19565b9050919050565b606060006002836002613e2c91906150e8565b613e369190615287565b67ffffffffffffffff811115613e4f57613e4e6147f7565b5b6040519080825280601f01601f191660200182016040528015613e815781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613eb957613eb86156e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613f1d57613f1c6156e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002613f5d91906150e8565b613f679190615287565b90505b6001811115614007577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613fa957613fa86156e0565b5b1a60f81b828281518110613fc057613fbf6156e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061400090615e3f565b9050613f6a565b506000841461404b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404290615eb4565b60405180910390fd5b8091505092915050565b60008054905060008203614095576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6140a2600084838561308d565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506141198361410a6000866000613093565b6141138561423b565b176130bb565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146141ba57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061417f565b50600082036141f5576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061420b60008483856130e6565b505050565b600081831061422857614223828461424b565b614233565b614232838361424b565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6142fa816142c5565b811461430557600080fd5b50565b600081359050614317816142f1565b92915050565b600060208284031215614333576143326142bb565b5b600061434184828501614308565b91505092915050565b60008115159050919050565b61435f8161434a565b82525050565b600060208201905061437a6000830184614356565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156143ba57808201518184015260208101905061439f565b60008484015250505050565b6000601f19601f8301169050919050565b60006143e282614380565b6143ec818561438b565b93506143fc81856020860161439c565b614405816143c6565b840191505092915050565b6000602082019050818103600083015261442a81846143d7565b905092915050565b6000819050919050565b61444581614432565b811461445057600080fd5b50565b6000813590506144628161443c565b92915050565b60006020828403121561447e5761447d6142bb565b5b600061448c84828501614453565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144c082614495565b9050919050565b6144d0816144b5565b82525050565b60006020820190506144eb60008301846144c7565b92915050565b6144fa816144b5565b811461450557600080fd5b50565b600081359050614517816144f1565b92915050565b60008060408385031215614534576145336142bb565b5b600061454285828601614508565b925050602061455385828601614453565b9150509250929050565b61456681614432565b82525050565b6000602082019050614581600083018461455d565b92915050565b6000806040838503121561459e5761459d6142bb565b5b60006145ac85828601614453565b92505060206145bd85828601614453565b9150509250929050565b6000806000606084860312156145e0576145df6142bb565b5b60006145ee86828701614508565b93505060206145ff86828701614508565b925050604061461086828701614453565b9150509250925092565b6000819050919050565b61462d8161461a565b811461463857600080fd5b50565b60008135905061464a81614624565b92915050565b600060208284031215614666576146656142bb565b5b60006146748482850161463b565b91505092915050565b6146868161461a565b82525050565b60006020820190506146a1600083018461467d565b92915050565b60006040820190506146bc60008301856144c7565b6146c9602083018461455d565b9392505050565b6146d98161434a565b81146146e457600080fd5b50565b6000813590506146f6816146d0565b92915050565b600060208284031215614712576147116142bb565b5b6000614720848285016146e7565b91505092915050565b600080604083850312156147405761473f6142bb565b5b600061474e8582860161463b565b925050602061475f85828601614508565b9150509250929050565b60006bffffffffffffffffffffffff82169050919050565b61478a81614769565b811461479557600080fd5b50565b6000813590506147a781614781565b92915050565b600080604083850312156147c4576147c36142bb565b5b60006147d285828601614798565b92505060206147e385828601614508565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61482f826143c6565b810181811067ffffffffffffffff8211171561484e5761484d6147f7565b5b80604052505050565b60006148616142b1565b905061486d8282614826565b919050565b600067ffffffffffffffff82111561488d5761488c6147f7565b5b614896826143c6565b9050602081019050919050565b82818337600083830152505050565b60006148c56148c084614872565b614857565b9050828152602081018484840111156148e1576148e06147f2565b5b6148ec8482856148a3565b509392505050565b600082601f830112614909576149086147ed565b5b81356149198482602086016148b2565b91505092915050565b600060208284031215614938576149376142bb565b5b600082013567ffffffffffffffff811115614956576149556142c0565b5b614962848285016148f4565b91505092915050565b600080fd5b600080fd5b60008083601f84011261498b5761498a6147ed565b5b8235905067ffffffffffffffff8111156149a8576149a761496b565b5b6020830191508360208202830111156149c4576149c3614970565b5b9250929050565b6000806000604084860312156149e4576149e36142bb565b5b60006149f286828701614453565b935050602084013567ffffffffffffffff811115614a1357614a126142c0565b5b614a1f86828701614975565b92509250509250925092565b60008083601f840112614a4157614a406147ed565b5b8235905067ffffffffffffffff811115614a5e57614a5d61496b565b5b602083019150836020820283011115614a7a57614a79614970565b5b9250929050565b60008060208385031215614a9857614a976142bb565b5b600083013567ffffffffffffffff811115614ab657614ab56142c0565b5b614ac285828601614a2b565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b03816144b5565b82525050565b600067ffffffffffffffff82169050919050565b614b2681614b09565b82525050565b614b358161434a565b82525050565b600062ffffff82169050919050565b614b5381614b3b565b82525050565b608082016000820151614b6f6000850182614afa565b506020820151614b826020850182614b1d565b506040820151614b956040850182614b2c565b506060820151614ba86060850182614b4a565b50505050565b6000614bba8383614b59565b60808301905092915050565b6000602082019050919050565b6000614bde82614ace565b614be88185614ad9565b9350614bf383614aea565b8060005b83811015614c24578151614c0b8882614bae565b9750614c1683614bc6565b925050600181019050614bf7565b5085935050505092915050565b60006020820190508181036000830152614c4b8184614bd3565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60058110614c9357614c92614c53565b5b50565b6000819050614ca482614c82565b919050565b6000614cb482614c96565b9050919050565b614cc481614ca9565b82525050565b6000602082019050614cdf6000830184614cbb565b92915050565b600060208284031215614cfb57614cfa6142bb565b5b6000614d0984828501614508565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614d4781614432565b82525050565b6000614d598383614d3e565b60208301905092915050565b6000602082019050919050565b6000614d7d82614d12565b614d878185614d1d565b9350614d9283614d2e565b8060005b83811015614dc3578151614daa8882614d4d565b9750614db583614d65565b925050600181019050614d96565b5085935050505092915050565b60006020820190508181036000830152614dea8184614d72565b905092915050565b600080600060608486031215614e0b57614e0a6142bb565b5b6000614e1986828701614508565b9350506020614e2a86828701614453565b9250506040614e3b86828701614453565b9150509250925092565b60008060408385031215614e5c57614e5b6142bb565b5b6000614e6a85828601614508565b9250506020614e7b858286016146e7565b9150509250929050565b600067ffffffffffffffff821115614ea057614e9f6147f7565b5b614ea9826143c6565b9050602081019050919050565b6000614ec9614ec484614e85565b614857565b905082815260208101848484011115614ee557614ee46147f2565b5b614ef08482856148a3565b509392505050565b600082601f830112614f0d57614f0c6147ed565b5b8135614f1d848260208601614eb6565b91505092915050565b60008060008060808587031215614f4057614f3f6142bb565b5b6000614f4e87828801614508565b9450506020614f5f87828801614508565b9350506040614f7087828801614453565b925050606085013567ffffffffffffffff811115614f9157614f906142c0565b5b614f9d87828801614ef8565b91505092959194509250565b608082016000820151614fbf6000850182614afa565b506020820151614fd26020850182614b1d565b506040820151614fe56040850182614b2c565b506060820151614ff86060850182614b4a565b50505050565b60006080820190506150136000830184614fa9565b92915050565b600080604083850312156150305761502f6142bb565b5b600061503e85828601614508565b925050602061504f85828601614508565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150a057607f821691505b6020821081036150b3576150b2615059565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150f382614432565b91506150fe83614432565b925082820261510c81614432565b91508282048414831517615123576151226150b9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061516482614432565b915061516f83614432565b92508261517f5761517e61512a565b5b828204905092915050565b600060408201905061519f60008301856144c7565b6151ac60208301846144c7565b9392505050565b6000815190506151c28161443c565b92915050565b6000602082840312156151de576151dd6142bb565b5b60006151ec848285016151b3565b91505092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000615251602f8361438b565b915061525c826151f5565b604082019050919050565b6000602082019050818103600083015261528081615244565b9050919050565b600061529282614432565b915061529d83614432565b92508282019050808211156152b5576152b46150b9565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261531d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826152e0565b61532786836152e0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061536461535f61535a84614432565b61533f565b614432565b9050919050565b6000819050919050565b61537e83615349565b61539261538a8261536b565b8484546152ed565b825550505050565b600090565b6153a761539a565b6153b2818484615375565b505050565b5b818110156153d6576153cb60008261539f565b6001810190506153b8565b5050565b601f82111561541b576153ec816152bb565b6153f5846152d0565b81016020851015615404578190505b615418615410856152d0565b8301826153b7565b50505b505050565b600082821c905092915050565b600061543e60001984600802615420565b1980831691505092915050565b6000615457838361542d565b9150826002028217905092915050565b61547082614380565b67ffffffffffffffff811115615489576154886147f7565b5b6154938254615088565b61549e8282856153da565b600060209050601f8311600181146154d157600084156154bf578287015190505b6154c9858261544b565b865550615531565b601f1984166154df866152bb565b60005b82811015615507578489015182556001820191506020850194506020810190506154e2565b868310156155245784890151615520601f89168261542d565b8355505b6001600288020188555050505b505050505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061556f60148361438b565b915061557a82615539565b602082019050919050565b6000602082019050818103600083015261559e81615562565b9050919050565b7f4554482076616c7565206973206e6f7420636f72726563740000000000000000600082015250565b60006155db60188361438b565b91506155e6826155a5565b602082019050919050565b6000602082019050818103600083015261560a816155ce565b9050919050565b60008160601b9050919050565b600061562982615611565b9050919050565b600061563b8261561e565b9050919050565b61565361564e826144b5565b615630565b82525050565b60006156658284615642565b60148201915081905092915050565b7f496e76616c6964204d65726b6c652050726f6f66000000000000000000000000600082015250565b60006156aa60148361438b565b91506156b582615674565b602082019050919050565b600060208201905081810360008301526156d98161569d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b600061576b60298361438b565b91506157768261570f565b604082019050919050565b6000602082019050818103600083015261579a8161575e565b9050919050565b7f4e6f2062616c616e636520746f20776974686472617700000000000000000000600082015250565b60006157d760168361438b565b91506157e2826157a1565b602082019050919050565b60006020820190508181036000830152615806816157ca565b9050919050565b60008151905061581c816146d0565b92915050565b600060208284031215615838576158376142bb565b5b60006158468482850161580d565b91505092915050565b600061585a82614432565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361588c5761588b6150b9565b5b600182019050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006158cd600f8361438b565b91506158d882615897565b602082019050919050565b600060208201905081810360008301526158fc816158c0565b9050919050565b7f746f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061593960148361438b565b915061594482615903565b602082019050919050565b600060208201905081810360008301526159688161592c565b9050919050565b600081905092915050565b600061598582614380565b61598f818561596f565b935061599f81856020860161439c565b80840191505092915050565b60006159b7828661597a565b91506159c3828561597a565b91506159cf828461597a565b9150819050949350505050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615a38602a8361438b565b9150615a43826159dc565b604082019050919050565b60006020820190508181036000830152615a6781615a2b565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000615aa460198361438b565b9150615aaf82615a6e565b602082019050919050565b60006020820190508181036000830152615ad381615a97565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000615b10601d8361438b565b9150615b1b82615ada565b602082019050919050565b60006020820190508181036000830152615b3f81615b03565b9050919050565b600081905092915050565b50565b6000615b61600083615b46565b9150615b6c82615b51565b600082019050919050565b6000615b8282615b54565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615be8603a8361438b565b9150615bf382615b8c565b604082019050919050565b60006020820190508181036000830152615c1781615bdb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615c5460208361438b565b9150615c5f82615c1e565b602082019050919050565b60006020820190508181036000830152615c8381615c47565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615cb182615c8a565b615cbb8185615c95565b9350615ccb81856020860161439c565b615cd4816143c6565b840191505092915050565b6000608082019050615cf460008301876144c7565b615d0160208301866144c7565b615d0e604083018561455d565b8181036060830152615d208184615ca6565b905095945050505050565b600081519050615d3a816142f1565b92915050565b600060208284031215615d5657615d556142bb565b5b6000615d6484828501615d2b565b91505092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615da360178361596f565b9150615dae82615d6d565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615def60118361596f565b9150615dfa82615db9565b601182019050919050565b6000615e1082615d96565b9150615e1c828561597a565b9150615e2782615de2565b9150615e33828461597a565b91508190509392505050565b6000615e4a82614432565b915060008203615e5d57615e5c6150b9565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615e9e60208361438b565b9150615ea982615e68565b602082019050919050565b60006020820190508181036000830152615ecd81615e91565b905091905056fea2646970667358221220d23fc40a723d6a398340c2550993422d8e873db12fbb629998b16c1171ff3f9d64736f6c63430008130033
Deployed Bytecode Sourcemap
225234:8395:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;233301:325;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92737:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99228:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;230247:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98661:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88488:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;227827:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102867:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;194519:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;187533:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;233006:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;194960:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;232701:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;196104:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;230706:135;;;;;;;;;;;;;:::i;:::-;;105788:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;229822:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;228027:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;228556:770;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;129058:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;225664:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94130:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;227650:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89672:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;166864:103;;;;;;;;;;;;;:::i;:::-;;230068:171;;;;;;;;;;;;;:::i;:::-;;169470:216;;;;;;;;;;;;;:::i;:::-;;228154:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;132934:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;230849:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;166223:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;192992:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92913:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;129974:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;231206:1487;;;;;;;;;;;;;:::i;:::-;;192097:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99786:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106579:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;232861:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;128471:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;230441:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;229334:480;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;195400:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;225359:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;168558:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100177:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;227552:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;168858:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;233301:325;233427:4;233464:38;233490:11;233464:25;:38::i;:::-;:99;;;;233519:44;233551:11;233519:31;:44::i;:::-;233464:99;:154;;;;233580:38;233606:11;233580:25;:38::i;:::-;233464:154;233444:174;;233301:325;;;:::o;92737:100::-;92791:13;92824:5;92817:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92737:100;:::o;99228:218::-;99304:7;99329:16;99337:7;99329;:16::i;:::-;99324:64;;99354:34;;;;;;;;;;;;;;99324:64;99408:15;:24;99424:7;99408:24;;;;;;;;;;;:30;;;;;;;;;;;;99401:37;;99228:218;;;:::o;230247:186::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;230361:13:::1;230353:22:::0;::::1;;;;;;;:::i;:::-;;230343:6;:32;;230335:41;;;::::0;::::1;;230417:6;230399:26;;;;;;;;:::i;:::-;;230387:9;;:38;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;230247:186:::0;;:::o;98661:408::-;98750:13;98766:16;98774:7;98766;:16::i;:::-;98750:32;;98822:5;98799:28;;:19;:17;:19::i;:::-;:28;;;98795:175;;98847:44;98864:5;98871:19;:17;:19::i;:::-;98847:16;:44::i;:::-;98842:128;;98919:35;;;;;;;;;;;;;;98842:128;98795:175;99015:2;98982:15;:24;98998:7;98982:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;99053:7;99049:2;99033:28;;99042:5;99033:28;;;;;;;;;;;;98739:330;98661:408;;:::o;88488:323::-;88549:7;88777:15;:13;:15::i;:::-;88762:12;;88746:13;;:28;:46;88739:53;;88488:323;:::o;227827:192::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;227957:5:::1;227946:8;:16;;;;227995;227973:19;:38;;;;227827:192:::0;;;:::o;102867:2825::-;103009:27;103039;103058:7;103039:18;:27::i;:::-;103009:57;;103124:4;103083:45;;103099:19;103083:45;;;103079:86;;103137:28;;;;;;;;;;;;;;103079:86;103179:27;103208:23;103235:35;103262:7;103235:26;:35::i;:::-;103178:92;;;;103370:68;103395:15;103412:4;103418:19;:17;:19::i;:::-;103370:24;:68::i;:::-;103365:180;;103458:43;103475:4;103481:19;:17;:19::i;:::-;103458:16;:43::i;:::-;103453:92;;103510:35;;;;;;;;;;;;;;103453:92;103365:180;103576:1;103562:16;;:2;:16;;;103558:52;;103587:23;;;;;;;;;;;;;;103558:52;103623:43;103645:4;103651:2;103655:7;103664:1;103623:21;:43::i;:::-;103759:15;103756:160;;;103899:1;103878:19;103871:30;103756:160;104296:18;:24;104315:4;104296:24;;;;;;;;;;;;;;;;104294:26;;;;;;;;;;;;104365:18;:22;104384:2;104365:22;;;;;;;;;;;;;;;;104363:24;;;;;;;;;;;104687:146;104724:2;104773:45;104788:4;104794:2;104798:19;104773:14;:45::i;:::-;84887:8;104745:73;104687:18;:146::i;:::-;104658:17;:26;104676:7;104658:26;;;;;;;;;;;:175;;;;105004:1;84887:8;104953:19;:47;:52;104949:627;;105026:19;105058:1;105048:7;:11;105026:33;;105215:1;105181:17;:30;105199:11;105181:30;;;;;;;;;;;;:35;105177:384;;105319:13;;105304:11;:28;105300:242;;105499:19;105466:17;:30;105484:11;105466:30;;;;;;;;;;;:52;;;;105300:242;105177:384;105007:569;104949:627;105623:7;105619:2;105604:27;;105613:4;105604:27;;;;;;;;;;;;105642:42;105663:4;105669:2;105673:7;105682:1;105642:20;:42::i;:::-;102998:2694;;;102867:2825;;;:::o;194519:131::-;194593:7;194620:6;:12;194627:4;194620:12;;;;;;;;;;;:22;;;194613:29;;194519:131;;;:::o;187533:438::-;187628:7;187637;187657:26;187686:17;:26;187704:7;187686:26;;;;;;;;;;;187657:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;187757:1;187729:30;;:7;:16;;;:30;;;187725:92;;187786:19;187776:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;187725:92;187829:21;187893:17;:15;:17::i;:::-;187853:57;;187866:7;:23;;;187854:35;;:9;:35;;;;:::i;:::-;187853:57;;;;:::i;:::-;187829:81;;187931:7;:16;;;187949:13;187923:40;;;;;;187533:438;;;;;:::o;233006:283::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;233084:7:::1;233081:201;;;226375:42;233107:34;;;233150:4;226006:42;233107:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;233081:201;;;226375:42;233204:34;;;233247:4;226006:42;233204:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;233081:201;233006:283:::0;;:::o;194960:147::-;195043:18;195056:4;195043:12;:18::i;:::-;192588:16;192599:4;192588:10;:16::i;:::-;195074:25:::1;195085:4;195091:7;195074:10;:25::i;:::-;194960:147:::0;;;:::o;232701:152::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;232804:41:::1;232823:15;232840:4;232804:18;:41::i;:::-;232701:152:::0;;;:::o;196104:218::-;196211:12;:10;:12::i;:::-;196200:23;;:7;:23;;;196192:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;196288:26;196300:4;196306:7;196288:11;:26::i;:::-;196104:218;;:::o;230706:135::-;192142:4;230744:18;;192588:16;192599:4;192588:10;:16::i;:::-;230775:58:::1;230801:7;:5;:7::i;:::-;230811:21;230775:17;:58::i;:::-;230706:135:::0;:::o;105788:193::-;105934:39;105951:4;105957:2;105961:7;105934:39;;;;;;;;;;;;:16;:39::i;:::-;105788:193;;;:::o;229822:238::-;226606:24;192588:16;192599:4;192588:10;:16::i;:::-;229926:14:::1;229943:13;:11;:13::i;:::-;229926:30;;229995:9;;229984:7;229975:6;:16;;;;:::i;:::-;:29;;229967:38;;;::::0;::::1;;230016:36;230026:16;230044:7;230016:9;:36::i;:::-;229915:145;229822:238:::0;;;:::o;228027:115::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;228131:3:::1;228116:12;:18;;;;;;:::i;:::-;;228027:115:::0;;:::o;228556:770::-;228678:13;228665:26;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;228657:35;;;;;;228705:14;228722:13;:11;:13::i;:::-;228705:30;;228746:12;228772:7;228761:8;;:18;;;;:::i;:::-;228746:33;;228810:1;228800:7;:11;:44;;;;;228835:9;;228824:7;228815:6;:16;;;;:::i;:::-;:29;;228800:44;228792:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;228901:4;228888:9;:17;;228880:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;228947:12;228989:10;228972:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;228962:39;;;;;;228947:54;;229034:50;229053:12;;229034:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;229067:10;;229079:4;229034:18;:50::i;:::-;229012:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;229188:19;;229177:7;229153:9;:21;229163:10;229153:21;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:54;;229145:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;229245:30;229255:10;229267:7;229245:9;:30::i;:::-;229311:7;229286:9;:21;229296:10;229286:21;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;228646:680;;;228556:770;;;:::o;129058:528::-;129202:23;129268:22;129293:8;;:15;;129268:40;;129323:34;129381:14;129360:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;129323:73;;129416:9;129411:125;129432:14;129427:1;:19;129411:125;;129488:32;129508:8;;129517:1;129508:11;;;;;;;:::i;:::-;;;;;;;;129488:19;:32::i;:::-;129472:10;129483:1;129472:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;129448:3;;;;;129411:125;;;;129557:10;129550:17;;;;129058:528;;;;:::o;225664:42::-;;;;;;;;;;;;;:::o;94130:152::-;94202:7;94245:27;94264:7;94245:18;:27::i;:::-;94222:52;;94130:152;;;:::o;227650:169::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;227767:10:::1;227750:13;:11;:13::i;:::-;:27;;227742:36;;;::::0;::::1;;227801:10;227789:9;:22;;;;227650:169:::0;;:::o;89672:233::-;89744:7;89785:1;89768:19;;:5;:19;;;89764:60;;89796:28;;;;;;;;;;;;;;89764:60;83831:13;89842:18;:25;89861:5;89842:25;;;;;;;;;;;;;;;;:55;89835:62;;89672:233;;;:::o;166864:103::-;166109:13;:11;:13::i;:::-;166929:30:::1;166956:1;166929:18;:30::i;:::-;166864:103::o:0;230068:171::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;230161:13:::1;230149:25:::0;::::1;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;230141:34;;;::::0;::::1;;230229:1;230216:9;;;;;;;;;;;230208:18;;;;;;;;:::i;:::-;;:22;;;;:::i;:::-;230198:33;;;;;;;;:::i;:::-;;230186:9;;:45;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;230068:171:::0;:::o;169470:216::-;169523:14;169540:12;:10;:12::i;:::-;169523:29;;169589:6;169571:24;;:14;:12;:14::i;:::-;:24;;;169563:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;169652:26;169671:6;169652:18;:26::i;:::-;169512:174;169470:216::o;228154:126::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;228261:11:::1;228248:10;:24;;;;228154:126:::0;;:::o;132934:900::-;133012:16;133066:19;133100:25;133140:22;133165:16;133175:5;133165:9;:16::i;:::-;133140:41;;133196:25;133238:14;133224:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;133196:57;;133268:31;;:::i;:::-;133319:9;133331:15;:13;:15::i;:::-;133319:27;;133314:472;133363:14;133348:11;:29;133314:472;;133415:15;133428:1;133415:12;:15::i;:::-;133403:27;;133453:9;:16;;;133494:8;133449:73;133570:1;133544:28;;:9;:14;;;:28;;;133540:111;;133617:9;:14;;;133597:34;;133540:111;133694:5;133673:26;;:17;:26;;;133669:102;;133750:1;133724:8;133733:13;;;;;;133724:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;133669:102;133314:472;133379:3;;;;;133314:472;;;;133807:8;133800:15;;;;;;;132934:900;;;:::o;230849:349::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;230968:3:::1;230944:28;;:12;:28;;::::0;230936:37:::1;;;::::0;::::1;;230984:12;231006;230984:35;;231030:15;231048:5;:15;;;231072:4;231048:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;231030:48;;231107:1;231097:7;:11;231089:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;231154:5;:14;;;231169:10;231181:7;231154:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;231146:44;;;::::0;::::1;;230925:273;;230849:349:::0;;:::o;166223:87::-;166269:7;166296:6;;;;;;;;;;;166289:13;;166223:87;:::o;192992:147::-;193078:4;193102:6;:12;193109:4;193102:12;;;;;;;;;;;:20;;:29;193123:7;193102:29;;;;;;;;;;;;;;;;;;;;;;;;;193095:36;;192992:147;;;;:::o;92913:104::-;92969:13;93002:7;92995:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92913:104;:::o;129974:2513::-;130117:16;130184:4;130175:5;:13;130171:45;;130197:19;;;;;;;;;;;;;;130171:45;130231:19;130265:17;130285:14;:12;:14::i;:::-;130265:34;;130385:15;:13;:15::i;:::-;130377:5;:23;130373:87;;;130429:15;:13;:15::i;:::-;130421:23;;130373:87;130536:9;130529:4;:16;130525:73;;;130573:9;130566:16;;130525:73;130612:25;130640:16;130650:5;130640:9;:16::i;:::-;130612:44;;130834:4;130826:5;:12;130822:278;;;130859:19;130888:5;130881:4;:12;130859:34;;130930:17;130916:11;:31;130912:111;;;130992:11;130972:31;;130912:111;130840:198;130822:278;;;131083:1;131063:21;;130822:278;131114:25;131156:17;131142:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;131114:60;;131214:1;131193:17;:22;131189:78;;131243:8;131236:15;;;;;;;;131189:78;131411:31;131445:26;131465:5;131445:19;:26::i;:::-;131411:60;;131486:25;131731:9;:16;;;131726:92;;131788:9;:14;;;131768:34;;131726:92;131837:9;131849:5;131837:17;;131832:478;131861:4;131856:1;:9;;:45;;;;;131884:17;131869:11;:32;;131856:45;131832:478;;;131939:15;131952:1;131939:12;:15::i;:::-;131927:27;;131977:9;:16;;;132018:8;131973:73;132094:1;132068:28;;:9;:14;;;:28;;;132064:111;;132141:9;:14;;;132121:34;;132064:111;132218:5;132197:26;;:17;:26;;;132193:102;;132274:1;132248:8;132257:13;;;;;;132248:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;132193:102;131832:478;131903:3;;;;;131832:478;;;;132412:11;132402:8;132395:29;132460:8;132453:15;;;;;;;;129974:2513;;;;;;:::o;231206:1487::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;231276:21:::1;231307:16;;;;;;;;;;;231276:48;;231335:20;231358:14;:24;;;231391:4;231358:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;231335:62;;231431:1;231416:12;:16;231408:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;231472:20;231495:13;:11;:13::i;:::-;231472:36;;231521:19;231558:12;231543;:27;;;;:::i;:::-;231521:49;;231583:24;231624:12;231610:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;231583:54;;231648:31;231696:12;231682:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;231648:61;;231720:19;231834:9:::0;231829:543:::1;231853:12;231849:1;:16;231829:543;;;231887:14;231904:10;231912:1;231904:7;:10::i;:::-;231887:27;;231929:10;231967:9:::0;231962:227:::1;231986:11;231982:1;:15;231962:227;;;232041:6;232027:20;;:7;232035:1;232027:10;;;;;;;;:::i;:::-;;;;;;;;:20;;::::0;232023:151:::1;;232072:14;232087:1;232072:17;;;;;;;;:::i;:::-;;;;;;;:19;;;;;;;;:::i;:::-;;;::::0;::::1;232122:4;232114:12;;232149:5;;232023:151;231999:3;;;;;:::i;:::-;;;;231962:227;;;;232208:5;232203:158;;232257:6;232234:7;232242:11;232234:20;;;;;;;;:::i;:::-;;;;;;;:29;;;;;;;;;::::0;::::1;232312:1;232282:14;232297:11;232282:27;;;;;;;;:::i;:::-;;;;;;;:31;;;::::0;::::1;232332:13;;;;;:::i;:::-;;;;232203:158;231872:500;;231867:3;;;;;:::i;:::-;;;;231829:543;;;;232423:9;232418:268;232442:11;232438:1;:15;232418:268;;;232475:19;232517:11;232497:14;232512:1;232497:17;;;;;;;;:::i;:::-;;;;;;;;:31;;;;:::i;:::-;232475:53;;232561:1;232547:11;:15;232543:132;;;232591:14;:23;;;232615:7;232623:1;232615:10;;;;;;;;:::i;:::-;;;;;;;;232627:11;232591:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;232583:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;232543:132;232460:226;232455:3;;;;;:::i;:::-;;;;232418:268;;;;231265:1428;;;;;;;231206:1487:::0;:::o;192097:49::-;192142:4;192097:49;;;:::o;99786:234::-;99933:8;99881:18;:39;99900:19;:17;:19::i;:::-;99881:39;;;;;;;;;;;;;;;:49;99921:8;99881:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;99993:8;99957:55;;99972:19;:17;:19::i;:::-;99957:55;;;100003:8;99957:55;;;;;;:::i;:::-;;;;;;;;99786:234;;:::o;106579:407::-;106754:31;106767:4;106773:2;106777:7;106754:12;:31::i;:::-;106818:1;106800:2;:14;;;:19;106796:183;;106839:56;106870:4;106876:2;106880:7;106889:5;106839:30;:56::i;:::-;106834:145;;106923:40;;;;;;;;;;;;;;106834:145;106796:183;106579:407;;;;:::o;232861:137::-;226676:24;192588:16;192599:4;192588:10;:16::i;:::-;232981:9:::1;232956:22;;:34;;;;;;;;;;;;;;;;;;232861:137:::0;;:::o;128471:428::-;128555:21;;:::i;:::-;128589:31;;:::i;:::-;128645:15;:13;:15::i;:::-;128635:7;:25;:54;;;;128675:14;:12;:14::i;:::-;128664:7;:25;;128635:54;128631:103;;;128713:9;128706:16;;;;;128631:103;128756:21;128769:7;128756:12;:21::i;:::-;128744:33;;128792:9;:16;;;128788:65;;;128832:9;128825:16;;;;;128788:65;128870:21;128883:7;128870:12;:21::i;:::-;128863:28;;;128471:428;;;;:::o;230441:257::-;230532:13;230566:16;230574:7;230566;:16::i;:::-;230557:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;230650:10;:8;:10::i;:::-;230662:18;:7;:16;:18::i;:::-;230682:6;;;;;;;;;;;;;;;;;230633:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;230619:71;;230441:257;;;:::o;229334:480::-;229444:13;229431:26;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;229423:35;;;;;;229471:14;229488:13;:11;:13::i;:::-;229471:30;;229512:12;229538:7;229527:8;;:18;;;;:::i;:::-;229512:33;;229576:1;229566:7;:11;:44;;;;;229601:9;;229590:7;229581:6;:16;;;;:::i;:::-;:29;;229566:44;229558:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;229668:4;229655:9;:17;;229647:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;229732:1;229712:22;;:8;:22;;;:94;;229778:28;229788:8;229798:7;229778:9;:28::i;:::-;229712:94;;;229747:30;229757:10;229769:7;229747:9;:30::i;:::-;229712:94;229412:402;;229334:480;;:::o;195400:149::-;195484:18;195497:4;195484:12;:18::i;:::-;192588:16;192599:4;192588:10;:16::i;:::-;195515:26:::1;195527:4;195533:7;195515:11;:26::i;:::-;195400:149:::0;;;:::o;225359:34::-;;;;:::o;168558:101::-;168611:7;168638:13;;;;;;;;;;;168631:20;;168558:101;:::o;100177:164::-;100274:4;100298:18;:25;100317:5;100298:25;;;;;;;;;;;;;;;:35;100324:8;100298:35;;;;;;;;;;;;;;;;;;;;;;;;;100291:42;;100177:164;;;;:::o;227552:90::-;227599:7;227626:8;;227619:15;;227552:90;:::o;168858:181::-;166109:13;:11;:13::i;:::-;168964:8:::1;168948:13;;:24;;;;;;;;;;;;;;;;;;169022:8;168988:43;;169013:7;:5;:7::i;:::-;168988:43;;;;;;;;;;;;168858:181:::0;:::o;91835:639::-;91920:4;92259:10;92244:25;;:11;:25;;;;:102;;;;92336:10;92321:25;;:11;:25;;;;92244:102;:179;;;;92413:10;92398:25;;:11;:25;;;;92244:179;92224:199;;91835:639;;;:::o;192696:204::-;192781:4;192820:32;192805:47;;;:11;:47;;;;:87;;;;192856:36;192880:11;192856:23;:36::i;:::-;192805:87;192798:94;;192696:204;;;:::o;187263:215::-;187365:4;187404:26;187389:41;;;:11;:41;;;;:81;;;;187434:36;187458:11;187434:23;:36::i;:::-;187389:81;187382:88;;187263:215;;;:::o;100599:282::-;100664:4;100720:7;100701:15;:13;:15::i;:::-;:26;;:66;;;;;100754:13;;100744:7;:23;100701:66;:153;;;;;100853:1;84607:8;100805:17;:26;100823:7;100805:26;;;;;;;;;;;;:44;:49;100701:153;100681:173;;100599:282;;;:::o;193443:105::-;193510:30;193521:4;193527:12;:10;:12::i;:::-;193510:10;:30::i;:::-;193443:105;:::o;122907:::-;122967:7;122994:10;122987:17;;122907:105;:::o;228447:101::-;228512:7;228539:1;228532:8;;228447:101;:::o;95285:1275::-;95352:7;95372:12;95387:7;95372:22;;95455:4;95436:15;:13;:15::i;:::-;:23;95432:1061;;95489:13;;95482:4;:20;95478:1015;;;95527:14;95544:17;:23;95562:4;95544:23;;;;;;;;;;;;95527:40;;95661:1;84607:8;95633:6;:24;:29;95629:845;;96298:113;96315:1;96305:6;:11;96298:113;;96358:17;:25;96376:6;;;;;;;96358:25;;;;;;;;;;;;96349:34;;96298:113;;;96444:6;96437:13;;;;;;95629:845;95504:989;95478:1015;95432:1061;96521:31;;;;;;;;;;;;;;95285:1275;;;;:::o;101762:485::-;101864:27;101893:23;101934:38;101975:15;:24;101991:7;101975:24;;;;;;;;;;;101934:65;;102152:18;102129:41;;102209:19;102203:26;102184:45;;102114:126;101762:485;;;:::o;100990:659::-;101139:11;101304:16;101297:5;101293:28;101284:37;;101464:16;101453:9;101449:32;101436:45;;101614:15;101603:9;101600:30;101592:5;101581:9;101578:20;101575:56;101565:66;;100990:659;;;;;:::o;107648:159::-;;;;;:::o;122216:311::-;122351:7;122371:16;85011:3;122397:19;:41;;122371:68;;85011:3;122465:31;122476:4;122482:2;122486:9;122465:10;:31::i;:::-;122457:40;;:62;;122450:69;;;122216:311;;;;;:::o;97108:450::-;97188:14;97356:16;97349:5;97345:28;97336:37;;97533:5;97519:11;97494:23;97490:41;97487:52;97480:5;97477:63;97467:73;;97108:450;;;;:::o;108472:158::-;;;;;:::o;188253:97::-;188311:6;188337:5;188330:12;;188253:97;:::o;197701:238::-;197785:22;197793:4;197799:7;197785;:22::i;:::-;197780:152;;197856:4;197824:6;:12;197831:4;197824:12;;;;;;;;;;;:20;;:29;197845:7;197824:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;197907:12;:10;:12::i;:::-;197880:40;;197898:7;197880:40;;197892:4;197880:40;;;;;;;;;;197780:152;197701:238;;:::o;188621:332::-;188740:17;:15;:17::i;:::-;188724:33;;:12;:33;;;;188716:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;188843:1;188823:22;;:8;:22;;;188815:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;188910:35;;;;;;;;188922:8;188910:35;;;;;;188932:12;188910:35;;;;;188888:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;188621:332;;:::o;164774:98::-;164827:7;164854:10;164847:17;;164774:98;:::o;198119:239::-;198203:22;198211:4;198217:7;198203;:22::i;:::-;198199:152;;;198274:5;198242:6;:12;198249:4;198242:12;;;;;;;;;;;:20;;:29;198263:7;198242:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;198326:12;:10;:12::i;:::-;198299:40;;198317:7;198299:40;;198311:4;198299:40;;;;;;;;;;198199:152;198119:239;;:::o;175081:317::-;175196:6;175171:21;:31;;175163:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;175250:12;175268:9;:14;;175290:6;175268:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;175249:52;;;175320:7;175312:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;175152:246;175081:317;;:::o;116739:112::-;116816:27;116826:2;116830:8;116816:27;;;;;;;;;;;;:9;:27::i;:::-;116739:112;;:::o;135063:156::-;135154:4;135207;135178:25;135191:5;135198:4;135178:12;:25::i;:::-;:33;135171:40;;135063:156;;;;;:::o;166388:132::-;166463:12;:10;:12::i;:::-;166452:23;;:7;:5;:7::i;:::-;:23;;;166444:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;166388:132::o;169229:156::-;169319:13;;169312:20;;;;;;;;;;;169343:34;169368:8;169343:24;:34::i;:::-;169229:156;:::o;94733:161::-;94801:21;;:::i;:::-;94842:44;94861:17;:24;94879:5;94861:24;;;;;;;;;;;;94842:18;:44::i;:::-;94835:51;;94733:161;;;:::o;88175:103::-;88230:7;88257:13;;88250:20;;88175:103;:::o;109070:716::-;109233:4;109279:2;109254:45;;;109300:19;:17;:19::i;:::-;109321:4;109327:7;109336:5;109254:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;109250:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109554:1;109537:6;:13;:18;109533:235;;109583:40;;;;;;;;;;;;;;109533:235;109726:6;109720:13;109711:6;109707:2;109703:15;109696:38;109250:529;109423:54;;;109413:64;;;:6;:64;;;;109406:71;;;109070:716;;;;;;:::o;94471:166::-;94541:21;;:::i;:::-;94582:47;94601:27;94620:7;94601:18;:27::i;:::-;94582:18;:47::i;:::-;94575:54;;94471:166;;;:::o;228292:110::-;228349:13;228382:12;228375:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;228292:110;:::o;161693:716::-;161749:13;161800:14;161837:1;161817:17;161828:5;161817:10;:17::i;:::-;:21;161800:38;;161853:20;161887:6;161876:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;161853:41;;161909:11;162038:6;162034:2;162030:15;162022:6;162018:28;162011:35;;162075:288;162082:4;162075:288;;;162107:5;;;;;;;;162249:8;162244:2;162237:5;162233:14;162228:30;162223:3;162215:44;162305:2;162296:11;;;;;;:::i;:::-;;;;;162339:1;162330:5;:10;162075:288;162326:21;162075:288;162384:6;162377:13;;;;;161693:716;;;:::o;185713:157::-;185798:4;185837:25;185822:40;;;:11;:40;;;;185815:47;;185713:157;;;:::o;193838:492::-;193927:22;193935:4;193941:7;193927;:22::i;:::-;193922:401;;194115:28;194135:7;194115:19;:28::i;:::-;194216:38;194244:4;194236:13;;194251:2;194216:19;:38::i;:::-;194020:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;193966:345;;;;;;;;;;;:::i;:::-;;;;;;;;193922:401;193838:492;;:::o;121917:147::-;122054:6;121917:147;;;;;:::o;115966:689::-;116097:19;116103:2;116107:8;116097:5;:19::i;:::-;116176:1;116158:2;:14;;;:19;116154:483;;116198:11;116212:13;;116198:27;;116244:13;116266:8;116260:3;:14;116244:30;;116293:233;116324:62;116363:1;116367:2;116371:7;;;;;;116380:5;116324:30;:62::i;:::-;116319:167;;116422:40;;;;;;;;;;;;;;116319:167;116521:3;116513:5;:11;116293:233;;116608:3;116591:13;;:20;116587:34;;116613:8;;;116587:34;116179:458;;116154:483;115966:689;;;:::o;135862:296::-;135945:7;135965:20;135988:4;135965:27;;136008:9;136003:118;136027:5;:12;136023:1;:16;136003:118;;;136076:33;136086:12;136100:5;136106:1;136100:8;;;;;;;;:::i;:::-;;;;;;;;136076:9;:33::i;:::-;136061:48;;136041:3;;;;;:::i;:::-;;;;136003:118;;;;136138:12;136131:19;;;135862:296;;;;:::o;167483:191::-;167557:16;167576:6;;;;;;;;;;;167557:25;;167602:8;167593:6;;:17;;;;;;;;;;;;;;;;;;167657:8;167626:40;;167647:8;167626:40;;;;;;;;;;;;167546:128;167483:191;:::o;96659:366::-;96725:31;;:::i;:::-;96802:6;96769:9;:14;;:41;;;;;;;;;;;84490:3;96855:6;:33;;96821:9;:24;;:68;;;;;;;;;;;96947:1;84607:8;96919:6;:24;:29;;96900:9;:16;;:48;;;;;;;;;;;85011:3;96988:6;:28;;96959:9;:19;;:58;;;;;;;;;;;96659:366;;;:::o;158527:948::-;158580:7;158600:14;158617:1;158600:18;;158667:8;158658:5;:17;158654:106;;158705:8;158696:17;;;;;;:::i;:::-;;;;;158742:2;158732:12;;;;158654:106;158787:8;158778:5;:17;158774:106;;158825:8;158816:17;;;;;;:::i;:::-;;;;;158862:2;158852:12;;;;158774:106;158907:8;158898:5;:17;158894:106;;158945:8;158936:17;;;;;;:::i;:::-;;;;;158982:2;158972:12;;;;158894:106;159027:7;159018:5;:16;159014:103;;159064:7;159055:16;;;;;;:::i;:::-;;;;;159100:1;159090:11;;;;159014:103;159144:7;159135:5;:16;159131:103;;159181:7;159172:16;;;;;;:::i;:::-;;;;;159217:1;159207:11;;;;159131:103;159261:7;159252:5;:16;159248:103;;159298:7;159289:16;;;;;;:::i;:::-;;;;;159334:1;159324:11;;;;159248:103;159378:7;159369:5;:16;159365:68;;159416:1;159406:11;;;;159365:68;159461:6;159454:13;;;158527:948;;;:::o;163709:151::-;163767:13;163800:52;163828:4;163812:22;;161584:2;163800:52;;:11;:52::i;:::-;163793:59;;163709:151;;;:::o;163105:447::-;163180:13;163206:19;163251:1;163242:6;163238:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;163228:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;163206:47;;163264:15;:6;163271:1;163264:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;163290;:6;163297:1;163290:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;163321:9;163346:1;163337:6;163333:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;163321:26;;163316:131;163353:1;163349;:5;163316:131;;;163388:8;163405:3;163397:5;:11;163388:21;;;;;;;:::i;:::-;;;;;163376:6;163383:1;163376:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;163434:1;163424:11;;;;;163356:3;;;;:::i;:::-;;;163316:131;;;;163474:1;163465:5;:10;163457:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;163537:6;163523:21;;;163105:447;;;;:::o;110248:2966::-;110321:20;110344:13;;110321:36;;110384:1;110372:8;:13;110368:44;;110394:18;;;;;;;;;;;;;;110368:44;110425:61;110455:1;110459:2;110463:12;110477:8;110425:21;:61::i;:::-;110969:1;83969:2;110939:1;:26;;110938:32;110926:8;:45;110900:18;:22;110919:2;110900:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;111248:139;111285:2;111339:33;111362:1;111366:2;111370:1;111339:14;:33::i;:::-;111306:30;111327:8;111306:20;:30::i;:::-;:66;111248:18;:139::i;:::-;111214:17;:31;111232:12;111214:31;;;;;;;;;;;:173;;;;111404:16;111435:11;111464:8;111449:12;:23;111435:37;;111985:16;111981:2;111977:25;111965:37;;112357:12;112317:8;112276:1;112214:25;112155:1;112094;112067:335;112728:1;112714:12;112710:20;112668:346;112769:3;112760:7;112757:16;112668:346;;112987:7;112977:8;112974:1;112947:25;112944:1;112941;112936:59;112822:1;112813:7;112809:15;112798:26;;112668:346;;;112672:77;113059:1;113047:8;:13;113043:45;;113069:19;;;;;;;;;;;;;;113043:45;113121:3;113105:13;:19;;;;110674:2462;;113146:60;113175:1;113179:2;113183:12;113197:8;113146:20;:60::i;:::-;110310:2904;110248:2966;;:::o;143300:149::-;143363:7;143394:1;143390;:5;:51;;143421:20;143436:1;143439;143421:14;:20::i;:::-;143390:51;;;143398:20;143413:1;143416;143398:14;:20::i;:::-;143390:51;143383:58;;143300:149;;;;:::o;97660:324::-;97730:14;97963:1;97953:8;97950:15;97924:24;97920:46;97910:56;;97660:324;;;:::o;143457:268::-;143525:13;143632:1;143626:4;143619:15;143661:1;143655:4;143648:15;143702:4;143696;143686:21;143677:30;;143457:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:474::-;5310:6;5318;5367:2;5355:9;5346:7;5342:23;5338:32;5335:119;;;5373:79;;:::i;:::-;5335:119;5493:1;5518:53;5563:7;5554:6;5543:9;5539:22;5518:53;:::i;:::-;5508:63;;5464:117;5620:2;5646:53;5691:7;5682:6;5671:9;5667:22;5646:53;:::i;:::-;5636:63;;5591:118;5242:474;;;;;:::o;5722:619::-;5799:6;5807;5815;5864:2;5852:9;5843:7;5839:23;5835:32;5832:119;;;5870:79;;:::i;:::-;5832:119;5990:1;6015:53;6060:7;6051:6;6040:9;6036:22;6015:53;:::i;:::-;6005:63;;5961:117;6117:2;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6088:118;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5722:619;;;;;:::o;6347:77::-;6384:7;6413:5;6402:16;;6347:77;;;:::o;6430:122::-;6503:24;6521:5;6503:24;:::i;:::-;6496:5;6493:35;6483:63;;6542:1;6539;6532:12;6483:63;6430:122;:::o;6558:139::-;6604:5;6642:6;6629:20;6620:29;;6658:33;6685:5;6658:33;:::i;:::-;6558:139;;;;:::o;6703:329::-;6762:6;6811:2;6799:9;6790:7;6786:23;6782:32;6779:119;;;6817:79;;:::i;:::-;6779:119;6937:1;6962:53;7007:7;6998:6;6987:9;6983:22;6962:53;:::i;:::-;6952:63;;6908:117;6703:329;;;;:::o;7038:118::-;7125:24;7143:5;7125:24;:::i;:::-;7120:3;7113:37;7038:118;;:::o;7162:222::-;7255:4;7293:2;7282:9;7278:18;7270:26;;7306:71;7374:1;7363:9;7359:17;7350:6;7306:71;:::i;:::-;7162:222;;;;:::o;7390:332::-;7511:4;7549:2;7538:9;7534:18;7526:26;;7562:71;7630:1;7619:9;7615:17;7606:6;7562:71;:::i;:::-;7643:72;7711:2;7700:9;7696:18;7687:6;7643:72;:::i;:::-;7390:332;;;;;:::o;7728:116::-;7798:21;7813:5;7798:21;:::i;:::-;7791:5;7788:32;7778:60;;7834:1;7831;7824:12;7778:60;7728:116;:::o;7850:133::-;7893:5;7931:6;7918:20;7909:29;;7947:30;7971:5;7947:30;:::i;:::-;7850:133;;;;:::o;7989:323::-;8045:6;8094:2;8082:9;8073:7;8069:23;8065:32;8062:119;;;8100:79;;:::i;:::-;8062:119;8220:1;8245:50;8287:7;8278:6;8267:9;8263:22;8245:50;:::i;:::-;8235:60;;8191:114;7989:323;;;;:::o;8318:474::-;8386:6;8394;8443:2;8431:9;8422:7;8418:23;8414:32;8411:119;;;8449:79;;:::i;:::-;8411:119;8569:1;8594:53;8639:7;8630:6;8619:9;8615:22;8594:53;:::i;:::-;8584:63;;8540:117;8696:2;8722:53;8767:7;8758:6;8747:9;8743:22;8722:53;:::i;:::-;8712:63;;8667:118;8318:474;;;;;:::o;8798:109::-;8834:7;8874:26;8867:5;8863:38;8852:49;;8798:109;;;:::o;8913:120::-;8985:23;9002:5;8985:23;:::i;:::-;8978:5;8975:34;8965:62;;9023:1;9020;9013:12;8965:62;8913:120;:::o;9039:137::-;9084:5;9122:6;9109:20;9100:29;;9138:32;9164:5;9138:32;:::i;:::-;9039:137;;;;:::o;9182:472::-;9249:6;9257;9306:2;9294:9;9285:7;9281:23;9277:32;9274:119;;;9312:79;;:::i;:::-;9274:119;9432:1;9457:52;9501:7;9492:6;9481:9;9477:22;9457:52;:::i;:::-;9447:62;;9403:116;9558:2;9584:53;9629:7;9620:6;9609:9;9605:22;9584:53;:::i;:::-;9574:63;;9529:118;9182:472;;;;;:::o;9660:117::-;9769:1;9766;9759:12;9783:117;9892:1;9889;9882:12;9906:180;9954:77;9951:1;9944:88;10051:4;10048:1;10041:15;10075:4;10072:1;10065:15;10092:281;10175:27;10197:4;10175:27;:::i;:::-;10167:6;10163:40;10305:6;10293:10;10290:22;10269:18;10257:10;10254:34;10251:62;10248:88;;;10316:18;;:::i;:::-;10248:88;10356:10;10352:2;10345:22;10135:238;10092:281;;:::o;10379:129::-;10413:6;10440:20;;:::i;:::-;10430:30;;10469:33;10497:4;10489:6;10469:33;:::i;:::-;10379:129;;;:::o;10514:308::-;10576:4;10666:18;10658:6;10655:30;10652:56;;;10688:18;;:::i;:::-;10652:56;10726:29;10748:6;10726:29;:::i;:::-;10718:37;;10810:4;10804;10800:15;10792:23;;10514:308;;;:::o;10828:146::-;10925:6;10920:3;10915;10902:30;10966:1;10957:6;10952:3;10948:16;10941:27;10828:146;;;:::o;10980:425::-;11058:5;11083:66;11099:49;11141:6;11099:49;:::i;:::-;11083:66;:::i;:::-;11074:75;;11172:6;11165:5;11158:21;11210:4;11203:5;11199:16;11248:3;11239:6;11234:3;11230:16;11227:25;11224:112;;;11255:79;;:::i;:::-;11224:112;11345:54;11392:6;11387:3;11382;11345:54;:::i;:::-;11064:341;10980:425;;;;;:::o;11425:340::-;11481:5;11530:3;11523:4;11515:6;11511:17;11507:27;11497:122;;11538:79;;:::i;:::-;11497:122;11655:6;11642:20;11680:79;11755:3;11747:6;11740:4;11732:6;11728:17;11680:79;:::i;:::-;11671:88;;11487:278;11425:340;;;;:::o;11771:509::-;11840:6;11889:2;11877:9;11868:7;11864:23;11860:32;11857:119;;;11895:79;;:::i;:::-;11857:119;12043:1;12032:9;12028:17;12015:31;12073:18;12065:6;12062:30;12059:117;;;12095:79;;:::i;:::-;12059:117;12200:63;12255:7;12246:6;12235:9;12231:22;12200:63;:::i;:::-;12190:73;;11986:287;11771:509;;;;:::o;12286:117::-;12395:1;12392;12385:12;12409:117;12518:1;12515;12508:12;12549:568;12622:8;12632:6;12682:3;12675:4;12667:6;12663:17;12659:27;12649:122;;12690:79;;:::i;:::-;12649:122;12803:6;12790:20;12780:30;;12833:18;12825:6;12822:30;12819:117;;;12855:79;;:::i;:::-;12819:117;12969:4;12961:6;12957:17;12945:29;;13023:3;13015:4;13007:6;13003:17;12993:8;12989:32;12986:41;12983:128;;;13030:79;;:::i;:::-;12983:128;12549:568;;;;;:::o;13123:704::-;13218:6;13226;13234;13283:2;13271:9;13262:7;13258:23;13254:32;13251:119;;;13289:79;;:::i;:::-;13251:119;13409:1;13434:53;13479:7;13470:6;13459:9;13455:22;13434:53;:::i;:::-;13424:63;;13380:117;13564:2;13553:9;13549:18;13536:32;13595:18;13587:6;13584:30;13581:117;;;13617:79;;:::i;:::-;13581:117;13730:80;13802:7;13793:6;13782:9;13778:22;13730:80;:::i;:::-;13712:98;;;;13507:313;13123:704;;;;;:::o;13850:568::-;13923:8;13933:6;13983:3;13976:4;13968:6;13964:17;13960:27;13950:122;;13991:79;;:::i;:::-;13950:122;14104:6;14091:20;14081:30;;14134:18;14126:6;14123:30;14120:117;;;14156:79;;:::i;:::-;14120:117;14270:4;14262:6;14258:17;14246:29;;14324:3;14316:4;14308:6;14304:17;14294:8;14290:32;14287:41;14284:128;;;14331:79;;:::i;:::-;14284:128;13850:568;;;;;:::o;14424:559::-;14510:6;14518;14567:2;14555:9;14546:7;14542:23;14538:32;14535:119;;;14573:79;;:::i;:::-;14535:119;14721:1;14710:9;14706:17;14693:31;14751:18;14743:6;14740:30;14737:117;;;14773:79;;:::i;:::-;14737:117;14886:80;14958:7;14949:6;14938:9;14934:22;14886:80;:::i;:::-;14868:98;;;;14664:312;14424:559;;;;;:::o;14989:146::-;15088:6;15122:5;15116:12;15106:22;;14989:146;;;:::o;15141:216::-;15272:11;15306:6;15301:3;15294:19;15346:4;15341:3;15337:14;15322:29;;15141:216;;;;:::o;15363:164::-;15462:4;15485:3;15477:11;;15515:4;15510:3;15506:14;15498:22;;15363:164;;;:::o;15533:108::-;15610:24;15628:5;15610:24;:::i;:::-;15605:3;15598:37;15533:108;;:::o;15647:101::-;15683:7;15723:18;15716:5;15712:30;15701:41;;15647:101;;;:::o;15754:105::-;15829:23;15846:5;15829:23;:::i;:::-;15824:3;15817:36;15754:105;;:::o;15865:99::-;15936:21;15951:5;15936:21;:::i;:::-;15931:3;15924:34;15865:99;;:::o;15970:91::-;16006:7;16046:8;16039:5;16035:20;16024:31;;15970:91;;;:::o;16067:105::-;16142:23;16159:5;16142:23;:::i;:::-;16137:3;16130:36;16067:105;;:::o;16250:866::-;16401:4;16396:3;16392:14;16488:4;16481:5;16477:16;16471:23;16507:63;16564:4;16559:3;16555:14;16541:12;16507:63;:::i;:::-;16416:164;16672:4;16665:5;16661:16;16655:23;16691:61;16746:4;16741:3;16737:14;16723:12;16691:61;:::i;:::-;16590:172;16846:4;16839:5;16835:16;16829:23;16865:57;16916:4;16911:3;16907:14;16893:12;16865:57;:::i;:::-;16772:160;17019:4;17012:5;17008:16;17002:23;17038:61;17093:4;17088:3;17084:14;17070:12;17038:61;:::i;:::-;16942:167;16370:746;16250:866;;:::o;17122:307::-;17255:10;17276:110;17382:3;17374:6;17276:110;:::i;:::-;17418:4;17413:3;17409:14;17395:28;;17122:307;;;;:::o;17435:145::-;17537:4;17569;17564:3;17560:14;17552:22;;17435:145;;;:::o;17662:988::-;17845:3;17874:86;17954:5;17874:86;:::i;:::-;17976:118;18087:6;18082:3;17976:118;:::i;:::-;17969:125;;18118:88;18200:5;18118:88;:::i;:::-;18229:7;18260:1;18245:380;18270:6;18267:1;18264:13;18245:380;;;18346:6;18340:13;18373:127;18496:3;18481:13;18373:127;:::i;:::-;18366:134;;18523:92;18608:6;18523:92;:::i;:::-;18513:102;;18305:320;18292:1;18289;18285:9;18280:14;;18245:380;;;18249:14;18641:3;18634:10;;17850:800;;;17662:988;;;;:::o;18656:501::-;18863:4;18901:2;18890:9;18886:18;18878:26;;18950:9;18944:4;18940:20;18936:1;18925:9;18921:17;18914:47;18978:172;19145:4;19136:6;18978:172;:::i;:::-;18970:180;;18656:501;;;;:::o;19163:180::-;19211:77;19208:1;19201:88;19308:4;19305:1;19298:15;19332:4;19329:1;19322:15;19349:120;19437:1;19430:5;19427:12;19417:46;;19443:18;;:::i;:::-;19417:46;19349:120;:::o;19475:141::-;19527:7;19556:5;19545:16;;19562:48;19604:5;19562:48;:::i;:::-;19475:141;;;:::o;19622:::-;19685:9;19718:39;19751:5;19718:39;:::i;:::-;19705:52;;19622:141;;;:::o;19769:157::-;19869:50;19913:5;19869:50;:::i;:::-;19864:3;19857:63;19769:157;;:::o;19932:248::-;20038:4;20076:2;20065:9;20061:18;20053:26;;20089:84;20170:1;20159:9;20155:17;20146:6;20089:84;:::i;:::-;19932:248;;;;:::o;20186:329::-;20245:6;20294:2;20282:9;20273:7;20269:23;20265:32;20262:119;;;20300:79;;:::i;:::-;20262:119;20420:1;20445:53;20490:7;20481:6;20470:9;20466:22;20445:53;:::i;:::-;20435:63;;20391:117;20186:329;;;;:::o;20521:114::-;20588:6;20622:5;20616:12;20606:22;;20521:114;;;:::o;20641:184::-;20740:11;20774:6;20769:3;20762:19;20814:4;20809:3;20805:14;20790:29;;20641:184;;;;:::o;20831:132::-;20898:4;20921:3;20913:11;;20951:4;20946:3;20942:14;20934:22;;20831:132;;;:::o;20969:108::-;21046:24;21064:5;21046:24;:::i;:::-;21041:3;21034:37;20969:108;;:::o;21083:179::-;21152:10;21173:46;21215:3;21207:6;21173:46;:::i;:::-;21251:4;21246:3;21242:14;21228:28;;21083:179;;;;:::o;21268:113::-;21338:4;21370;21365:3;21361:14;21353:22;;21268:113;;;:::o;21417:732::-;21536:3;21565:54;21613:5;21565:54;:::i;:::-;21635:86;21714:6;21709:3;21635:86;:::i;:::-;21628:93;;21745:56;21795:5;21745:56;:::i;:::-;21824:7;21855:1;21840:284;21865:6;21862:1;21859:13;21840:284;;;21941:6;21935:13;21968:63;22027:3;22012:13;21968:63;:::i;:::-;21961:70;;22054:60;22107:6;22054:60;:::i;:::-;22044:70;;21900:224;21887:1;21884;21880:9;21875:14;;21840:284;;;21844:14;22140:3;22133:10;;21541:608;;;21417:732;;;;:::o;22155:373::-;22298:4;22336:2;22325:9;22321:18;22313:26;;22385:9;22379:4;22375:20;22371:1;22360:9;22356:17;22349:47;22413:108;22516:4;22507:6;22413:108;:::i;:::-;22405:116;;22155:373;;;;:::o;22534:619::-;22611:6;22619;22627;22676:2;22664:9;22655:7;22651:23;22647:32;22644:119;;;22682:79;;:::i;:::-;22644:119;22802:1;22827:53;22872:7;22863:6;22852:9;22848:22;22827:53;:::i;:::-;22817:63;;22773:117;22929:2;22955:53;23000:7;22991:6;22980:9;22976:22;22955:53;:::i;:::-;22945:63;;22900:118;23057:2;23083:53;23128:7;23119:6;23108:9;23104:22;23083:53;:::i;:::-;23073:63;;23028:118;22534:619;;;;;:::o;23159:468::-;23224:6;23232;23281:2;23269:9;23260:7;23256:23;23252:32;23249:119;;;23287:79;;:::i;:::-;23249:119;23407:1;23432:53;23477:7;23468:6;23457:9;23453:22;23432:53;:::i;:::-;23422:63;;23378:117;23534:2;23560:50;23602:7;23593:6;23582:9;23578:22;23560:50;:::i;:::-;23550:60;;23505:115;23159:468;;;;;:::o;23633:307::-;23694:4;23784:18;23776:6;23773:30;23770:56;;;23806:18;;:::i;:::-;23770:56;23844:29;23866:6;23844:29;:::i;:::-;23836:37;;23928:4;23922;23918:15;23910:23;;23633:307;;;:::o;23946:423::-;24023:5;24048:65;24064:48;24105:6;24064:48;:::i;:::-;24048:65;:::i;:::-;24039:74;;24136:6;24129:5;24122:21;24174:4;24167:5;24163:16;24212:3;24203:6;24198:3;24194:16;24191:25;24188:112;;;24219:79;;:::i;:::-;24188:112;24309:54;24356:6;24351:3;24346;24309:54;:::i;:::-;24029:340;23946:423;;;;;:::o;24388:338::-;24443:5;24492:3;24485:4;24477:6;24473:17;24469:27;24459:122;;24500:79;;:::i;:::-;24459:122;24617:6;24604:20;24642:78;24716:3;24708:6;24701:4;24693:6;24689:17;24642:78;:::i;:::-;24633:87;;24449:277;24388:338;;;;:::o;24732:943::-;24827:6;24835;24843;24851;24900:3;24888:9;24879:7;24875:23;24871:33;24868:120;;;24907:79;;:::i;:::-;24868:120;25027:1;25052:53;25097:7;25088:6;25077:9;25073:22;25052:53;:::i;:::-;25042:63;;24998:117;25154:2;25180:53;25225:7;25216:6;25205:9;25201:22;25180:53;:::i;:::-;25170:63;;25125:118;25282:2;25308:53;25353:7;25344:6;25333:9;25329:22;25308:53;:::i;:::-;25298:63;;25253:118;25438:2;25427:9;25423:18;25410:32;25469:18;25461:6;25458:30;25455:117;;;25491:79;;:::i;:::-;25455:117;25596:62;25650:7;25641:6;25630:9;25626:22;25596:62;:::i;:::-;25586:72;;25381:287;24732:943;;;;;;;:::o;25753:876::-;25914:4;25909:3;25905:14;26001:4;25994:5;25990:16;25984:23;26020:63;26077:4;26072:3;26068:14;26054:12;26020:63;:::i;:::-;25929:164;26185:4;26178:5;26174:16;26168:23;26204:61;26259:4;26254:3;26250:14;26236:12;26204:61;:::i;:::-;26103:172;26359:4;26352:5;26348:16;26342:23;26378:57;26429:4;26424:3;26420:14;26406:12;26378:57;:::i;:::-;26285:160;26532:4;26525:5;26521:16;26515:23;26551:61;26606:4;26601:3;26597:14;26583:12;26551:61;:::i;:::-;26455:167;25883:746;25753:876;;:::o;26635:351::-;26792:4;26830:3;26819:9;26815:19;26807:27;;26844:135;26976:1;26965:9;26961:17;26952:6;26844:135;:::i;:::-;26635:351;;;;:::o;26992:474::-;27060:6;27068;27117:2;27105:9;27096:7;27092:23;27088:32;27085:119;;;27123:79;;:::i;:::-;27085:119;27243:1;27268:53;27313:7;27304:6;27293:9;27289:22;27268:53;:::i;:::-;27258:63;;27214:117;27370:2;27396:53;27441:7;27432:6;27421:9;27417:22;27396:53;:::i;:::-;27386:63;;27341:118;26992:474;;;;;:::o;27472:180::-;27520:77;27517:1;27510:88;27617:4;27614:1;27607:15;27641:4;27638:1;27631:15;27658:320;27702:6;27739:1;27733:4;27729:12;27719:22;;27786:1;27780:4;27776:12;27807:18;27797:81;;27863:4;27855:6;27851:17;27841:27;;27797:81;27925:2;27917:6;27914:14;27894:18;27891:38;27888:84;;27944:18;;:::i;:::-;27888:84;27709:269;27658:320;;;:::o;27984:180::-;28032:77;28029:1;28022:88;28129:4;28126:1;28119:15;28153:4;28150:1;28143:15;28170:410;28210:7;28233:20;28251:1;28233:20;:::i;:::-;28228:25;;28267:20;28285:1;28267:20;:::i;:::-;28262:25;;28322:1;28319;28315:9;28344:30;28362:11;28344:30;:::i;:::-;28333:41;;28523:1;28514:7;28510:15;28507:1;28504:22;28484:1;28477:9;28457:83;28434:139;;28553:18;;:::i;:::-;28434:139;28218:362;28170:410;;;;:::o;28586:180::-;28634:77;28631:1;28624:88;28731:4;28728:1;28721:15;28755:4;28752:1;28745:15;28772:185;28812:1;28829:20;28847:1;28829:20;:::i;:::-;28824:25;;28863:20;28881:1;28863:20;:::i;:::-;28858:25;;28902:1;28892:35;;28907:18;;:::i;:::-;28892:35;28949:1;28946;28942:9;28937:14;;28772:185;;;;:::o;28963:332::-;29084:4;29122:2;29111:9;29107:18;29099:26;;29135:71;29203:1;29192:9;29188:17;29179:6;29135:71;:::i;:::-;29216:72;29284:2;29273:9;29269:18;29260:6;29216:72;:::i;:::-;28963:332;;;;;:::o;29301:143::-;29358:5;29389:6;29383:13;29374:22;;29405:33;29432:5;29405:33;:::i;:::-;29301:143;;;;:::o;29450:351::-;29520:6;29569:2;29557:9;29548:7;29544:23;29540:32;29537:119;;;29575:79;;:::i;:::-;29537:119;29695:1;29720:64;29776:7;29767:6;29756:9;29752:22;29720:64;:::i;:::-;29710:74;;29666:128;29450:351;;;;:::o;29807:234::-;29947:34;29943:1;29935:6;29931:14;29924:58;30016:17;30011:2;30003:6;29999:15;29992:42;29807:234;:::o;30047:366::-;30189:3;30210:67;30274:2;30269:3;30210:67;:::i;:::-;30203:74;;30286:93;30375:3;30286:93;:::i;:::-;30404:2;30399:3;30395:12;30388:19;;30047:366;;;:::o;30419:419::-;30585:4;30623:2;30612:9;30608:18;30600:26;;30672:9;30666:4;30662:20;30658:1;30647:9;30643:17;30636:47;30700:131;30826:4;30700:131;:::i;:::-;30692:139;;30419:419;;;:::o;30844:191::-;30884:3;30903:20;30921:1;30903:20;:::i;:::-;30898:25;;30937:20;30955:1;30937:20;:::i;:::-;30932:25;;30980:1;30977;30973:9;30966:16;;31001:3;30998:1;30995:10;30992:36;;;31008:18;;:::i;:::-;30992:36;30844:191;;;;:::o;31041:141::-;31090:4;31113:3;31105:11;;31136:3;31133:1;31126:14;31170:4;31167:1;31157:18;31149:26;;31041:141;;;:::o;31188:93::-;31225:6;31272:2;31267;31260:5;31256:14;31252:23;31242:33;;31188:93;;;:::o;31287:107::-;31331:8;31381:5;31375:4;31371:16;31350:37;;31287:107;;;;:::o;31400:393::-;31469:6;31519:1;31507:10;31503:18;31542:97;31572:66;31561:9;31542:97;:::i;:::-;31660:39;31690:8;31679:9;31660:39;:::i;:::-;31648:51;;31732:4;31728:9;31721:5;31717:21;31708:30;;31781:4;31771:8;31767:19;31760:5;31757:30;31747:40;;31476:317;;31400:393;;;;;:::o;31799:60::-;31827:3;31848:5;31841:12;;31799:60;;;:::o;31865:142::-;31915:9;31948:53;31966:34;31975:24;31993:5;31975:24;:::i;:::-;31966:34;:::i;:::-;31948:53;:::i;:::-;31935:66;;31865:142;;;:::o;32013:75::-;32056:3;32077:5;32070:12;;32013:75;;;:::o;32094:269::-;32204:39;32235:7;32204:39;:::i;:::-;32265:91;32314:41;32338:16;32314:41;:::i;:::-;32306:6;32299:4;32293:11;32265:91;:::i;:::-;32259:4;32252:105;32170:193;32094:269;;;:::o;32369:73::-;32414:3;32369:73;:::o;32448:189::-;32525:32;;:::i;:::-;32566:65;32624:6;32616;32610:4;32566:65;:::i;:::-;32501:136;32448:189;;:::o;32643:186::-;32703:120;32720:3;32713:5;32710:14;32703:120;;;32774:39;32811:1;32804:5;32774:39;:::i;:::-;32747:1;32740:5;32736:13;32727:22;;32703:120;;;32643:186;;:::o;32835:543::-;32936:2;32931:3;32928:11;32925:446;;;32970:38;33002:5;32970:38;:::i;:::-;33054:29;33072:10;33054:29;:::i;:::-;33044:8;33040:44;33237:2;33225:10;33222:18;33219:49;;;33258:8;33243:23;;33219:49;33281:80;33337:22;33355:3;33337:22;:::i;:::-;33327:8;33323:37;33310:11;33281:80;:::i;:::-;32940:431;;32925:446;32835:543;;;:::o;33384:117::-;33438:8;33488:5;33482:4;33478:16;33457:37;;33384:117;;;;:::o;33507:169::-;33551:6;33584:51;33632:1;33628:6;33620:5;33617:1;33613:13;33584:51;:::i;:::-;33580:56;33665:4;33659;33655:15;33645:25;;33558:118;33507:169;;;;:::o;33681:295::-;33757:4;33903:29;33928:3;33922:4;33903:29;:::i;:::-;33895:37;;33965:3;33962:1;33958:11;33952:4;33949:21;33941:29;;33681:295;;;;:::o;33981:1395::-;34098:37;34131:3;34098:37;:::i;:::-;34200:18;34192:6;34189:30;34186:56;;;34222:18;;:::i;:::-;34186:56;34266:38;34298:4;34292:11;34266:38;:::i;:::-;34351:67;34411:6;34403;34397:4;34351:67;:::i;:::-;34445:1;34469:4;34456:17;;34501:2;34493:6;34490:14;34518:1;34513:618;;;;35175:1;35192:6;35189:77;;;35241:9;35236:3;35232:19;35226:26;35217:35;;35189:77;35292:67;35352:6;35345:5;35292:67;:::i;:::-;35286:4;35279:81;35148:222;34483:887;;34513:618;34565:4;34561:9;34553:6;34549:22;34599:37;34631:4;34599:37;:::i;:::-;34658:1;34672:208;34686:7;34683:1;34680:14;34672:208;;;34765:9;34760:3;34756:19;34750:26;34742:6;34735:42;34816:1;34808:6;34804:14;34794:24;;34863:2;34852:9;34848:18;34835:31;;34709:4;34706:1;34702:12;34697:17;;34672:208;;;34908:6;34899:7;34896:19;34893:179;;;34966:9;34961:3;34957:19;34951:26;35009:48;35051:4;35043:6;35039:17;35028:9;35009:48;:::i;:::-;35001:6;34994:64;34916:156;34893:179;35118:1;35114;35106:6;35102:14;35098:22;35092:4;35085:36;34520:611;;;34483:887;;34073:1303;;;33981:1395;;:::o;35382:170::-;35522:22;35518:1;35510:6;35506:14;35499:46;35382:170;:::o;35558:366::-;35700:3;35721:67;35785:2;35780:3;35721:67;:::i;:::-;35714:74;;35797:93;35886:3;35797:93;:::i;:::-;35915:2;35910:3;35906:12;35899:19;;35558:366;;;:::o;35930:419::-;36096:4;36134:2;36123:9;36119:18;36111:26;;36183:9;36177:4;36173:20;36169:1;36158:9;36154:17;36147:47;36211:131;36337:4;36211:131;:::i;:::-;36203:139;;35930:419;;;:::o;36355:174::-;36495:26;36491:1;36483:6;36479:14;36472:50;36355:174;:::o;36535:366::-;36677:3;36698:67;36762:2;36757:3;36698:67;:::i;:::-;36691:74;;36774:93;36863:3;36774:93;:::i;:::-;36892:2;36887:3;36883:12;36876:19;;36535:366;;;:::o;36907:419::-;37073:4;37111:2;37100:9;37096:18;37088:26;;37160:9;37154:4;37150:20;37146:1;37135:9;37131:17;37124:47;37188:131;37314:4;37188:131;:::i;:::-;37180:139;;36907:419;;;:::o;37332:94::-;37365:8;37413:5;37409:2;37405:14;37384:35;;37332:94;;;:::o;37432:::-;37471:7;37500:20;37514:5;37500:20;:::i;:::-;37489:31;;37432:94;;;:::o;37532:100::-;37571:7;37600:26;37620:5;37600:26;:::i;:::-;37589:37;;37532:100;;;:::o;37638:157::-;37743:45;37763:24;37781:5;37763:24;:::i;:::-;37743:45;:::i;:::-;37738:3;37731:58;37638:157;;:::o;37801:256::-;37913:3;37928:75;37999:3;37990:6;37928:75;:::i;:::-;38028:2;38023:3;38019:12;38012:19;;38048:3;38041:10;;37801:256;;;;:::o;38063:170::-;38203:22;38199:1;38191:6;38187:14;38180:46;38063:170;:::o;38239:366::-;38381:3;38402:67;38466:2;38461:3;38402:67;:::i;:::-;38395:74;;38478:93;38567:3;38478:93;:::i;:::-;38596:2;38591:3;38587:12;38580:19;;38239:366;;;:::o;38611:419::-;38777:4;38815:2;38804:9;38800:18;38792:26;;38864:9;38858:4;38854:20;38850:1;38839:9;38835:17;38828:47;38892:131;39018:4;38892:131;:::i;:::-;38884:139;;38611:419;;;:::o;39036:180::-;39084:77;39081:1;39074:88;39181:4;39178:1;39171:15;39205:4;39202:1;39195:15;39222:228;39362:34;39358:1;39350:6;39346:14;39339:58;39431:11;39426:2;39418:6;39414:15;39407:36;39222:228;:::o;39456:366::-;39598:3;39619:67;39683:2;39678:3;39619:67;:::i;:::-;39612:74;;39695:93;39784:3;39695:93;:::i;:::-;39813:2;39808:3;39804:12;39797:19;;39456:366;;;:::o;39828:419::-;39994:4;40032:2;40021:9;40017:18;40009:26;;40081:9;40075:4;40071:20;40067:1;40056:9;40052:17;40045:47;40109:131;40235:4;40109:131;:::i;:::-;40101:139;;39828:419;;;:::o;40253:172::-;40393:24;40389:1;40381:6;40377:14;40370:48;40253:172;:::o;40431:366::-;40573:3;40594:67;40658:2;40653:3;40594:67;:::i;:::-;40587:74;;40670:93;40759:3;40670:93;:::i;:::-;40788:2;40783:3;40779:12;40772:19;;40431:366;;;:::o;40803:419::-;40969:4;41007:2;40996:9;40992:18;40984:26;;41056:9;41050:4;41046:20;41042:1;41031:9;41027:17;41020:47;41084:131;41210:4;41084:131;:::i;:::-;41076:139;;40803:419;;;:::o;41228:137::-;41282:5;41313:6;41307:13;41298:22;;41329:30;41353:5;41329:30;:::i;:::-;41228:137;;;;:::o;41371:345::-;41438:6;41487:2;41475:9;41466:7;41462:23;41458:32;41455:119;;;41493:79;;:::i;:::-;41455:119;41613:1;41638:61;41691:7;41682:6;41671:9;41667:22;41638:61;:::i;:::-;41628:71;;41584:125;41371:345;;;;:::o;41722:233::-;41761:3;41784:24;41802:5;41784:24;:::i;:::-;41775:33;;41830:66;41823:5;41820:77;41817:103;;41900:18;;:::i;:::-;41817:103;41947:1;41940:5;41936:13;41929:20;;41722:233;;;:::o;41961:165::-;42101:17;42097:1;42089:6;42085:14;42078:41;41961:165;:::o;42132:366::-;42274:3;42295:67;42359:2;42354:3;42295:67;:::i;:::-;42288:74;;42371:93;42460:3;42371:93;:::i;:::-;42489:2;42484:3;42480:12;42473:19;;42132:366;;;:::o;42504:419::-;42670:4;42708:2;42697:9;42693:18;42685:26;;42757:9;42751:4;42747:20;42743:1;42732:9;42728:17;42721:47;42785:131;42911:4;42785:131;:::i;:::-;42777:139;;42504:419;;;:::o;42929:170::-;43069:22;43065:1;43057:6;43053:14;43046:46;42929:170;:::o;43105:366::-;43247:3;43268:67;43332:2;43327:3;43268:67;:::i;:::-;43261:74;;43344:93;43433:3;43344:93;:::i;:::-;43462:2;43457:3;43453:12;43446:19;;43105:366;;;:::o;43477:419::-;43643:4;43681:2;43670:9;43666:18;43658:26;;43730:9;43724:4;43720:20;43716:1;43705:9;43701:17;43694:47;43758:131;43884:4;43758:131;:::i;:::-;43750:139;;43477:419;;;:::o;43902:148::-;44004:11;44041:3;44026:18;;43902:148;;;;:::o;44056:390::-;44162:3;44190:39;44223:5;44190:39;:::i;:::-;44245:89;44327:6;44322:3;44245:89;:::i;:::-;44238:96;;44343:65;44401:6;44396:3;44389:4;44382:5;44378:16;44343:65;:::i;:::-;44433:6;44428:3;44424:16;44417:23;;44166:280;44056:390;;;;:::o;44452:595::-;44680:3;44702:95;44793:3;44784:6;44702:95;:::i;:::-;44695:102;;44814:95;44905:3;44896:6;44814:95;:::i;:::-;44807:102;;44926:95;45017:3;45008:6;44926:95;:::i;:::-;44919:102;;45038:3;45031:10;;44452:595;;;;;;:::o;45053:229::-;45193:34;45189:1;45181:6;45177:14;45170:58;45262:12;45257:2;45249:6;45245:15;45238:37;45053:229;:::o;45288:366::-;45430:3;45451:67;45515:2;45510:3;45451:67;:::i;:::-;45444:74;;45527:93;45616:3;45527:93;:::i;:::-;45645:2;45640:3;45636:12;45629:19;;45288:366;;;:::o;45660:419::-;45826:4;45864:2;45853:9;45849:18;45841:26;;45913:9;45907:4;45903:20;45899:1;45888:9;45884:17;45877:47;45941:131;46067:4;45941:131;:::i;:::-;45933:139;;45660:419;;;:::o;46085:175::-;46225:27;46221:1;46213:6;46209:14;46202:51;46085:175;:::o;46266:366::-;46408:3;46429:67;46493:2;46488:3;46429:67;:::i;:::-;46422:74;;46505:93;46594:3;46505:93;:::i;:::-;46623:2;46618:3;46614:12;46607:19;;46266:366;;;:::o;46638:419::-;46804:4;46842:2;46831:9;46827:18;46819:26;;46891:9;46885:4;46881:20;46877:1;46866:9;46862:17;46855:47;46919:131;47045:4;46919:131;:::i;:::-;46911:139;;46638:419;;;:::o;47063:179::-;47203:31;47199:1;47191:6;47187:14;47180:55;47063:179;:::o;47248:366::-;47390:3;47411:67;47475:2;47470:3;47411:67;:::i;:::-;47404:74;;47487:93;47576:3;47487:93;:::i;:::-;47605:2;47600:3;47596:12;47589:19;;47248:366;;;:::o;47620:419::-;47786:4;47824:2;47813:9;47809:18;47801:26;;47873:9;47867:4;47863:20;47859:1;47848:9;47844:17;47837:47;47901:131;48027:4;47901:131;:::i;:::-;47893:139;;47620:419;;;:::o;48045:147::-;48146:11;48183:3;48168:18;;48045:147;;;;:::o;48198:114::-;;:::o;48318:398::-;48477:3;48498:83;48579:1;48574:3;48498:83;:::i;:::-;48491:90;;48590:93;48679:3;48590:93;:::i;:::-;48708:1;48703:3;48699:11;48692:18;;48318:398;;;:::o;48722:379::-;48906:3;48928:147;49071:3;48928:147;:::i;:::-;48921:154;;49092:3;49085:10;;48722:379;;;:::o;49107:245::-;49247:34;49243:1;49235:6;49231:14;49224:58;49316:28;49311:2;49303:6;49299:15;49292:53;49107:245;:::o;49358:366::-;49500:3;49521:67;49585:2;49580:3;49521:67;:::i;:::-;49514:74;;49597:93;49686:3;49597:93;:::i;:::-;49715:2;49710:3;49706:12;49699:19;;49358:366;;;:::o;49730:419::-;49896:4;49934:2;49923:9;49919:18;49911:26;;49983:9;49977:4;49973:20;49969:1;49958:9;49954:17;49947:47;50011:131;50137:4;50011:131;:::i;:::-;50003:139;;49730:419;;;:::o;50155:182::-;50295:34;50291:1;50283:6;50279:14;50272:58;50155:182;:::o;50343:366::-;50485:3;50506:67;50570:2;50565:3;50506:67;:::i;:::-;50499:74;;50582:93;50671:3;50582:93;:::i;:::-;50700:2;50695:3;50691:12;50684:19;;50343:366;;;:::o;50715:419::-;50881:4;50919:2;50908:9;50904:18;50896:26;;50968:9;50962:4;50958:20;50954:1;50943:9;50939:17;50932:47;50996:131;51122:4;50996:131;:::i;:::-;50988:139;;50715:419;;;:::o;51140:98::-;51191:6;51225:5;51219:12;51209:22;;51140:98;;;:::o;51244:168::-;51327:11;51361:6;51356:3;51349:19;51401:4;51396:3;51392:14;51377:29;;51244:168;;;;:::o;51418:373::-;51504:3;51532:38;51564:5;51532:38;:::i;:::-;51586:70;51649:6;51644:3;51586:70;:::i;:::-;51579:77;;51665:65;51723:6;51718:3;51711:4;51704:5;51700:16;51665:65;:::i;:::-;51755:29;51777:6;51755:29;:::i;:::-;51750:3;51746:39;51739:46;;51508:283;51418:373;;;;:::o;51797:640::-;51992:4;52030:3;52019:9;52015:19;52007:27;;52044:71;52112:1;52101:9;52097:17;52088:6;52044:71;:::i;:::-;52125:72;52193:2;52182:9;52178:18;52169:6;52125:72;:::i;:::-;52207;52275:2;52264:9;52260:18;52251:6;52207:72;:::i;:::-;52326:9;52320:4;52316:20;52311:2;52300:9;52296:18;52289:48;52354:76;52425:4;52416:6;52354:76;:::i;:::-;52346:84;;51797:640;;;;;;;:::o;52443:141::-;52499:5;52530:6;52524:13;52515:22;;52546:32;52572:5;52546:32;:::i;:::-;52443:141;;;;:::o;52590:349::-;52659:6;52708:2;52696:9;52687:7;52683:23;52679:32;52676:119;;;52714:79;;:::i;:::-;52676:119;52834:1;52859:63;52914:7;52905:6;52894:9;52890:22;52859:63;:::i;:::-;52849:73;;52805:127;52590:349;;;;:::o;52945:173::-;53085:25;53081:1;53073:6;53069:14;53062:49;52945:173;:::o;53124:402::-;53284:3;53305:85;53387:2;53382:3;53305:85;:::i;:::-;53298:92;;53399:93;53488:3;53399:93;:::i;:::-;53517:2;53512:3;53508:12;53501:19;;53124:402;;;:::o;53532:167::-;53672:19;53668:1;53660:6;53656:14;53649:43;53532:167;:::o;53705:402::-;53865:3;53886:85;53968:2;53963:3;53886:85;:::i;:::-;53879:92;;53980:93;54069:3;53980:93;:::i;:::-;54098:2;54093:3;54089:12;54082:19;;53705:402;;;:::o;54113:967::-;54495:3;54517:148;54661:3;54517:148;:::i;:::-;54510:155;;54682:95;54773:3;54764:6;54682:95;:::i;:::-;54675:102;;54794:148;54938:3;54794:148;:::i;:::-;54787:155;;54959:95;55050:3;55041:6;54959:95;:::i;:::-;54952:102;;55071:3;55064:10;;54113:967;;;;;:::o;55086:171::-;55125:3;55148:24;55166:5;55148:24;:::i;:::-;55139:33;;55194:4;55187:5;55184:15;55181:41;;55202:18;;:::i;:::-;55181:41;55249:1;55242:5;55238:13;55231:20;;55086:171;;;:::o;55263:182::-;55403:34;55399:1;55391:6;55387:14;55380:58;55263:182;:::o;55451:366::-;55593:3;55614:67;55678:2;55673:3;55614:67;:::i;:::-;55607:74;;55690:93;55779:3;55690:93;:::i;:::-;55808:2;55803:3;55799:12;55792:19;;55451:366;;;:::o;55823:419::-;55989:4;56027:2;56016:9;56012:18;56004:26;;56076:9;56070:4;56066:20;56062:1;56051:9;56047:17;56040:47;56104:131;56230:4;56104:131;:::i;:::-;56096:139;;55823:419;;;:::o
Swarm Source
ipfs://d23fc40a723d6a398340c2550993422d8e873db12fbb629998b16c1171ff3f9d
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.