- Contract name:
- ReleaseRegister
- Optimization enabled
- false
- Compiler version
- v0.8.17+commit.8df45f5f
- Verified at
- 2023-05-04T19:54:41.585688Z
Constructor Arguments
0000000000000000000000000000000000000000000000000000000000000000
Arg [0] (uint8) : 0
contracts/lit-core/ReleaseRegister.sol
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "hardhat/console.sol"; contract ReleaseRegister is AccessControl { /* ========== DEPS ========== */ using EnumerableSet for EnumerableSet.Bytes32Set; /* ========== TYPE DEFINITIONS ========== */ bytes32 public constant ADMIN_ROLE = keccak256("ADMIN"); bytes32 public constant CREATOR_ROLE = keccak256("CREATOR"); bytes32 public constant ACTIVATOR_ROLE = keccak256("ACTIVATOR"); bytes32 public constant DEACTIVATOR_ROLE = keccak256("DEACTIVATOR"); bytes32 public constant BURNER_ROLE = keccak256("BURNER"); // Also update contracts/release/mod.rs uint public constant RELEASE_OPTION_RO = 1 << 1; uint public constant RELEASE_OPTION_USERS = 1 << 2; uint public constant RELEASE_OPTION_SSH = 1 << 3; enum Status { Null, Pending, Active, Disabled } enum Env { Dev, Staging, Prod } enum Type { Node, Prov, Build } enum Platform { MetalAmdSev } struct Release { Status status; Env env; Type typ; uint date; Platform platform; uint options; bytes id_key_digest; bytes public_key; bytes cid; } /* ========== ERRORS ========== */ /// A release with this ID does not exist. error ReleaseNotFound(); /// The env provided is not valid for this contract.. error InvalidEnv(); /// The status provided is not valid in this context. error InvalidStatus(); /// The ADMIN role is required to use this function error AdminRoleRequired(); /// The CREATOR role is required to use this function error CreatorRoleRequired(); /// The ACTIVATOR role is required when setting status to Active error ActivatorRoleRequired(); /// The DEACTIVATOR role is required when setting status to Disabled error DeactivatorRoleRequired(); /// The BURNER role is required when burning a release error BurnerRoleRequired(); /* ========== EVENTS ========== */ event InitCreator(bytes domain, bytes authorKeyDigest); event AllowedEnvAdded(Env env); event AllowedEnvRemoved(Env env); event AllowedSubnetAdded(address subnet); event AllowedSubnetRemoved(address subnet); event AllowedAdminSigningPublicKeyAdded(bytes pubKey); event AllowedAdminSigningPublicKeyRemoved(bytes pubKey); event AllowedAuthorKeyDigestAdded(bytes digest); event AllowedAuthorKeyDigestRemoved(bytes digest); event ReleaseCreated( bytes32 releaseId, Status status, Env env, Type typ, uint date, Platform platform, uint options, bytes id_key_digest, bytes public_key, bytes cid ); event ReleaseStatusChange(bytes32 releaseId, Status status); event ReleaseBurned(bytes32 releaseId); /* ========== STATE VARIABLES ========== */ bool creatorInit; bytes creatorDomain; mapping(Env => bool) allowedEnvs; mapping(address => bool) allowedSubnets; mapping(bytes => bool) allowedAdminSigningPublicKeys; mapping(bytes => bool) allowedAuthorKeyDigests; mapping(bytes32 => Release) releases; mapping(bytes32 => bytes32) activeReleases; EnumerableSet.Bytes32Set activeReleaseSet; /* ========== CONSTRUCTOR ========== */ constructor(Env env) { _setupRole(ADMIN_ROLE, msg.sender); _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); _setRoleAdmin(CREATOR_ROLE, ADMIN_ROLE); _setRoleAdmin(ACTIVATOR_ROLE, ADMIN_ROLE); _setRoleAdmin(DEACTIVATOR_ROLE, ADMIN_ROLE); _setRoleAdmin(BURNER_ROLE, ADMIN_ROLE); allowedEnvs[env] = true; emit AllowedEnvAdded(env); } /* ========== MUTATIVE FUNCTIONS ========== */ /// initialise the creator portion of the contract (provisioning). function initCreator( Env env, address subnetId, bytes memory domain, bytes memory authorKeyDigest ) public { // Check roles if (!hasRole(CREATOR_ROLE, msg.sender)) { revert CreatorRoleRequired(); } // Ensure the env is allowed if (allowedEnvs[env] != true) { revert InvalidEnv(); } if (env != Env.Dev && env != Env.Staging) { require(!creatorInit, "initCreator() may only be called once"); } creatorInit = true; creatorDomain = domain; allowedSubnets[subnetId] = true; allowedAuthorKeyDigests[authorKeyDigest] = true; emit AllowedAuthorKeyDigestAdded(authorKeyDigest); emit AllowedSubnetAdded(subnetId); emit InitCreator(domain, authorKeyDigest); } /// add an allowed env function addAllowedEnv(Env env) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } allowedEnvs[env] = true; emit AllowedEnvAdded(env); } /// remove an allowed env function removeAllowedEnv(Env env) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } delete allowedEnvs[env]; emit AllowedEnvRemoved(env); } /// add an allowed subnet function addAllowedSubnet(address subnet) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } allowedSubnets[subnet] = true; emit AllowedSubnetAdded(subnet); } /// remove an allowed subnet function removeAllowedSubnet(address subnet) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } delete allowedSubnets[subnet]; emit AllowedSubnetRemoved(subnet); } /// add an admin signing public key function addAllowedAdminSigningPublicKey(bytes memory pubKey) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } allowedAdminSigningPublicKeys[pubKey] = true; emit AllowedAdminSigningPublicKeyAdded(pubKey); } /// remove an admin signing public key function removeAllowedAdminSigningPublicKey(bytes memory pubKey) public { // Check roles if (!hasRole(ADMIN_ROLE, msg.sender)) { revert AdminRoleRequired(); } delete allowedAdminSigningPublicKeys[pubKey]; emit AllowedAdminSigningPublicKeyRemoved(pubKey); } /// create a release function updateActiveRelease(bytes32 releaseId) internal virtual { // Ensure it exists if (releases[releaseId].status == Status.Null) { revert ReleaseNotFound(); } Release memory release = releases[releaseId]; // Ensure it's active. if (release.status != Status.Active) { revert InvalidStatus(); } bytes32 activeHashKey = keccak256( abi.encodePacked(release.env, release.typ, release.platform) ); bytes32 currentActiveId = activeReleases[activeHashKey]; if (currentActiveId != 0) { if (release.date > releases[currentActiveId].date) { activeReleases[activeHashKey] = releaseId; } } else { activeReleases[activeHashKey] = releaseId; } // Add to set activeReleaseSet.add(releaseId); } /// create a release function createRelease( bytes32 releaseId, Status status, Env env, Type typ, Platform platform, uint options, bytes memory id_key_digest, bytes memory public_key, bytes memory cid, uint date ) public { // Check roles if (!hasRole(CREATOR_ROLE, msg.sender)) { revert CreatorRoleRequired(); } if (status == Status.Active) { if (!hasRole(ACTIVATOR_ROLE, msg.sender)) { revert ActivatorRoleRequired(); } } else if (status != Status.Pending && status != Status.Disabled) { revert InvalidStatus(); } // Ensure the env is allowed if (allowedEnvs[env] != true) { revert InvalidEnv(); } // Ensure the subnet is allowed require( allowedSubnets[_extractAddressFromBytes32(releaseId, 4)] == true, "The provided subnet (within the release id) is not valid for this contract" ); if (env != Env.Dev && env != Env.Staging) { // Ensure does not already exist require( releases[releaseId].status == Status.Null, "A release with this ID already exists" ); } // Check options if (env == Env.Prod) { require( (options & RELEASE_OPTION_RO) != 0, "The RO option is required for prod releases" ); } // Add the new release if (date == 0) { date = block.timestamp; } releases[releaseId] = Release( status, env, typ, date, platform, options, id_key_digest, public_key, cid ); // Emit events emit ReleaseCreated( releaseId, status, env, typ, date, platform, options, id_key_digest, public_key, cid ); if (status == Status.Active) { updateActiveRelease(releaseId); emit ReleaseStatusChange(releaseId, status); } } /// set the release status function setReleaseStatus(bytes32 releaseId, Status status) public { // Check roles if (status == Status.Active) { if (!hasRole(ACTIVATOR_ROLE, msg.sender)) { revert ActivatorRoleRequired(); } } else if (status == Status.Disabled) { if (!hasRole(DEACTIVATOR_ROLE, msg.sender)) { revert DeactivatorRoleRequired(); } } else { revert InvalidStatus(); } // Ensure it exists if (releases[releaseId].status == Status.Null) { revert ReleaseNotFound(); } // Ensure status can be changed Release memory release = releases[releaseId]; if (status != Status.Active) { require( getActiveRelease(release.env, release.typ, release.platform) != releaseId, "Must replace active release before changing status from Active" ); } // Update the status releases[releaseId].status = status; // Emit events emit ReleaseStatusChange(releaseId, status); // Update active release if (status == Status.Active) { updateActiveRelease(releaseId); } else { activeReleaseSet.remove(releaseId); } } /// burn a release function burnRelease(bytes32 releaseId) public { // Check roles if (!hasRole(BURNER_ROLE, msg.sender)) { revert BurnerRoleRequired(); } // Ensure it exists if (releases[releaseId].status == Status.Null) { revert ReleaseNotFound(); } // Delete delete releases[releaseId]; activeReleaseSet.remove(releaseId); // Emit events emit ReleaseBurned(releaseId); } /* ========== VIEWS ========== */ /// Check if the creator init method has been called. function hasCreatorInit() external view returns (bool) { return (creatorInit); } /// Get the creator (provisioning) domain. function getCreatorDomain() external view returns (bytes memory) { return (creatorDomain); } /// Check if has allowed env. function hasAllowedEnv(Env env) external view returns (bool) { return (allowedEnvs[env]); } /// Check if has allowed subnet. function hasAllowedSubnet(address subnet) external view returns (bool) { return (allowedSubnets[subnet]); } /// Check if has allowed author key digest. function hasAllowedAuthorKeyDigest( bytes memory digest ) external view returns (bool) { return (allowedAuthorKeyDigests[digest]); } /// Check if has allowed admin signing public key. function hasAllowedAdminSigningPublicKey( bytes memory pubKey ) external view returns (bool) { return (allowedAdminSigningPublicKeys[pubKey]); } /// Returns the release for a given id. function getRelease( bytes32 releaseId ) external view returns (Release memory) { return releases[releaseId]; } /// Returns the active release for a given criteria. function getActiveRelease( Env env, Type typ, Platform platform ) public view returns (bytes32) { bytes32 activeHashKey = keccak256(abi.encodePacked(env, typ, platform)); return (activeReleases[activeHashKey]); } /// Returns the active releases. function getActiveReleases() public view returns (bytes32[] memory) { return (activeReleaseSet.values()); } /* ========== UTILS ========== */ function _extractAddressFromBytes32( bytes32 input, uint offset ) private pure returns (address) { bytes32 out; for (uint i = 0; i < 20; i++) { out |= bytes32(input[offset + i] & 0xFF) >> (i * 8); } return address(uint160(bytes20(out))); } }
@openzeppelin/contracts/access/AccessControl.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @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: * * ``` * 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}: * * ``` * 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. */ 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()); } } }
@openzeppelin/contracts/access/IAccessControl.sol
// SPDX-License-Identifier: MIT // 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; }
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
@openzeppelin/contracts/utils/Strings.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
@openzeppelin/contracts/utils/introspection/ERC165.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
@openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
@openzeppelin/contracts/utils/math/Math.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // ā `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // ā `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
@openzeppelin/contracts/utils/structs/EnumerableSet.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
hardhat/console.sol
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"}]},{"type":"error","name":"ActivatorRoleRequired","inputs":[]},{"type":"error","name":"AdminRoleRequired","inputs":[]},{"type":"error","name":"BurnerRoleRequired","inputs":[]},{"type":"error","name":"CreatorRoleRequired","inputs":[]},{"type":"error","name":"DeactivatorRoleRequired","inputs":[]},{"type":"error","name":"InvalidEnv","inputs":[]},{"type":"error","name":"InvalidStatus","inputs":[]},{"type":"error","name":"ReleaseNotFound","inputs":[]},{"type":"event","name":"AllowedAdminSigningPublicKeyAdded","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedAdminSigningPublicKeyRemoved","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedAuthorKeyDigestAdded","inputs":[{"type":"bytes","name":"digest","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedAuthorKeyDigestRemoved","inputs":[{"type":"bytes","name":"digest","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedEnvAdded","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedEnvRemoved","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedSubnetAdded","inputs":[{"type":"address","name":"subnet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"AllowedSubnetRemoved","inputs":[{"type":"address","name":"subnet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"InitCreator","inputs":[{"type":"bytes","name":"domain","internalType":"bytes","indexed":false},{"type":"bytes","name":"authorKeyDigest","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"ReleaseBurned","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"ReleaseCreated","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32","indexed":false},{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status","indexed":false},{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env","indexed":false},{"type":"uint8","name":"typ","internalType":"enum ReleaseRegister.Type","indexed":false},{"type":"uint256","name":"date","internalType":"uint256","indexed":false},{"type":"uint8","name":"platform","internalType":"enum ReleaseRegister.Platform","indexed":false},{"type":"uint256","name":"options","internalType":"uint256","indexed":false},{"type":"bytes","name":"id_key_digest","internalType":"bytes","indexed":false},{"type":"bytes","name":"public_key","internalType":"bytes","indexed":false},{"type":"bytes","name":"cid","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"ReleaseStatusChange","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32","indexed":false},{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status","indexed":false}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"ACTIVATOR_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"BURNER_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"CREATOR_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEACTIVATOR_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RELEASE_OPTION_RO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RELEASE_OPTION_SSH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RELEASE_OPTION_USERS","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAllowedAdminSigningPublicKey","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAllowedEnv","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAllowedSubnet","inputs":[{"type":"address","name":"subnet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnRelease","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createRelease","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32"},{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status"},{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"},{"type":"uint8","name":"typ","internalType":"enum ReleaseRegister.Type"},{"type":"uint8","name":"platform","internalType":"enum ReleaseRegister.Platform"},{"type":"uint256","name":"options","internalType":"uint256"},{"type":"bytes","name":"id_key_digest","internalType":"bytes"},{"type":"bytes","name":"public_key","internalType":"bytes"},{"type":"bytes","name":"cid","internalType":"bytes"},{"type":"uint256","name":"date","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getActiveRelease","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"},{"type":"uint8","name":"typ","internalType":"enum ReleaseRegister.Type"},{"type":"uint8","name":"platform","internalType":"enum ReleaseRegister.Platform"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32[]","name":"","internalType":"bytes32[]"}],"name":"getActiveReleases","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"getCreatorDomain","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct ReleaseRegister.Release","components":[{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status"},{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"},{"type":"uint8","name":"typ","internalType":"enum ReleaseRegister.Type"},{"type":"uint256","name":"date","internalType":"uint256"},{"type":"uint8","name":"platform","internalType":"enum ReleaseRegister.Platform"},{"type":"uint256","name":"options","internalType":"uint256"},{"type":"bytes","name":"id_key_digest","internalType":"bytes"},{"type":"bytes","name":"public_key","internalType":"bytes"},{"type":"bytes","name":"cid","internalType":"bytes"}]}],"name":"getRelease","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAllowedAdminSigningPublicKey","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAllowedAuthorKeyDigest","inputs":[{"type":"bytes","name":"digest","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAllowedEnv","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAllowedSubnet","inputs":[{"type":"address","name":"subnet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasCreatorInit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initCreator","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"},{"type":"address","name":"subnetId","internalType":"address"},{"type":"bytes","name":"domain","internalType":"bytes"},{"type":"bytes","name":"authorKeyDigest","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAllowedAdminSigningPublicKey","inputs":[{"type":"bytes","name":"pubKey","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAllowedEnv","inputs":[{"type":"uint8","name":"env","internalType":"enum ReleaseRegister.Env"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAllowedSubnet","inputs":[{"type":"address","name":"subnet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setReleaseStatus","inputs":[{"type":"bytes32","name":"releaseId","internalType":"bytes32"},{"type":"uint8","name":"status","internalType":"enum ReleaseRegister.Status"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b5060405162004fd938038062004fd98339818101604052810190620000379190620004a1565b620000697fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42336200027960201b60201c565b6200009b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42806200028f60201b60201c565b620000ed7f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db67fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426200028f60201b60201c565b6200013f7fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426200028f60201b60201c565b620001917f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426200028f60201b60201c565b620001e37f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c87fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426200028f60201b60201c565b600160036000836002811115620001ff57620001fe620004d3565b5b6002811115620002145762000213620004d3565b5b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece8015816040516200026a919062000553565b60405180910390a15062000570565b6200028b8282620002f260201b60201c565b5050565b6000620002a283620003e360201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b6200030482826200040260201b60201c565b620003df57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003846200046c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000806000838152602001908152602001600020600101549050919050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600080fd5b600381106200048757600080fd5b50565b6000815190506200049b8162000479565b92915050565b600060208284031215620004ba57620004b962000474565b5b6000620004ca848285016200048a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110620005165762000515620004d3565b5b50565b6000819050620005298262000502565b919050565b60006200053b8262000519565b9050919050565b6200054d816200052e565b82525050565b60006020820190506200056a600083018462000542565b92915050565b614a5980620005806000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806375b238fc1161011a578063a98b109f116100ad578063d547741f1161007c578063d547741f146105ef578063d6bc626d1461060b578063db2d303b1461063b578063e1c0af0814610657578063f2dc99161461067357610206565b8063a98b109f14610569578063ad76939414610599578063bc7ca317146105b7578063bf8332c1146105d357610206565b806391d14854116100e957806391d14854146104cd5780639bb4e2f7146104fd578063a09083001461051b578063a217fddf1461054b57610206565b806375b238fc146104455780637f698e92146104635780638aeda25a146104935780638deb3893146104b157610206565b8063277dceaf1161019d5780633acd1ea31161016c5780633acd1ea3146103b35780633dc6c858146103d1578063458be7dc146103ef57806370e65a451461040d57806374bc81391461042957610206565b8063277dceaf1461033f578063282c51f31461035d5780632f2ff15d1461037b57806336568abe1461039757610206565b80630e1e59dd116101d95780630e1e59dd146102a75780631bd564dc146102c3578063248a9ca3146102f35780632609e5861461032357610206565b806301ffc9a71461020b578063023e92881461023b57806308740a3b146102595780630e092b1814610277575b600080fd5b610225600480360381019061022091906132a6565b61068f565b60405161023291906132ee565b60405180910390f35b610243610709565b60405161025091906133d1565b60405180910390f35b61026161071a565b60405161026e9190613402565b60405180910390f35b610291600480360381019061028c9190613563565b61073e565b60405161029e91906132ee565b60405180910390f35b6102c160048036038101906102bc91906135fd565b610773565b005b6102dd60048036038101906102d89190613662565b610d72565b6040516102ea91906132ee565b60405180910390f35b61030d6004803603810190610308919061368f565b610dc0565b60405161031a9190613402565b60405180910390f35b61033d6004803603810190610338919061368f565b610ddf565b005b610347610fb5565b60405161035491906136d5565b60405180910390f35b610365610fba565b6040516103729190613402565b60405180910390f35b6103956004803603810190610390919061374e565b610fde565b005b6103b160048036038101906103ac919061374e565b610fff565b005b6103bb611082565b6040516103c891906136d5565b60405180910390f35b6103d9611087565b6040516103e691906132ee565b60405180910390f35b6103f761109e565b6040516104049190613402565b60405180910390f35b61042760048036038101906104229190613563565b6110c2565b005b610443600480360381019061043e9190613662565b611193565b005b61044d61127d565b60405161045a9190613402565b60405180910390f35b61047d6004803603810190610478919061368f565b6112a1565b60405161048a9190613a3e565b60405180910390f35b61049b611585565b6040516104a89190613402565b60405180910390f35b6104cb60048036038101906104c69190613662565b6115a9565b005b6104e760048036038101906104e2919061374e565b61168a565b6040516104f491906132ee565b60405180910390f35b6105056116f4565b6040516105129190613aaa565b60405180910390f35b61053560048036038101906105309190613acc565b611786565b60405161054291906132ee565b60405180910390f35b6105536117dc565b6040516105609190613402565b60405180910390f35b610583600480360381019061057e9190613b43565b6117e3565b6040516105909190613402565b60405180910390f35b6105a1611831565b6040516105ae91906136d5565b60405180910390f35b6105d160048036038101906105cc9190613b96565b611836565b005b6105ed60048036038101906105e89190613c61565b611b2e565b005b6106096004803603810190610604919061374e565b6121b0565b005b61062560048036038101906106209190613563565b6121d1565b60405161063291906132ee565b60405180910390f35b61065560048036038101906106509190613acc565b612206565b005b610671600480360381019061066c9190613563565b6122ef565b005b61068d60048036038101906106889190613acc565b6123b7565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107025750610701826124a9565b5b9050919050565b60606107156009612513565b905090565b7fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c81565b60006005826040516107509190613dd0565b908152602001604051809103902060009054906101000a900460ff169050919050565b600260038111156107875761078661378e565b5b81600381111561079a5761079961378e565b5b03610804576107c97fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c3361168a565b6107ff576040517f5c21123e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c7565b6003808111156108175761081661378e565b5b81600381111561082a5761082961378e565b5b03610894576108597f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf3361168a565b61088f576040517f093efaf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c6565b6040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600060038111156108db576108da61378e565b5b6007600084815260200190815260200160002060000160009054906101000a900460ff1660038111156109115761091061378e565b5b03610948576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060076000848152602001908152602001600020604051806101200160405290816000820160009054906101000a900460ff16600381111561098e5761098d61378e565b5b60038111156109a05761099f61378e565b5b81526020016000820160019054906101000a900460ff1660028111156109c9576109c861378e565b5b60028111156109db576109da61378e565b5b81526020016000820160029054906101000a900460ff166002811115610a0457610a0361378e565b5b6002811115610a1657610a1561378e565b5b8152602001600182015481526020016002820160009054906101000a900460ff166000811115610a4957610a4861378e565b5b6000811115610a5b57610a5a61378e565b5b815260200160038201548152602001600482018054610a7990613e16565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa590613e16565b8015610af25780601f10610ac757610100808354040283529160200191610af2565b820191906000526020600020905b815481529060010190602001808311610ad557829003601f168201915b50505050508152602001600582018054610b0b90613e16565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790613e16565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b50505050508152602001600682018054610b9d90613e16565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc990613e16565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b505050505081525050905060026003811115610c3557610c3461378e565b5b826003811115610c4857610c4761378e565b5b14610ca65782610c658260200151836040015184608001516117e3565b03610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c90613eca565b60405180910390fd5b5b816007600085815260200190815260200160002060000160006101000a81548160ff02191690836003811115610cdf57610cde61378e565b5b02179055507f6ae24fa3345cd7488c35e11c5278059a0a545fd008c33d2d396d917b69bed5bf8383604051610d15929190613ef9565b60405180910390a160026003811115610d3157610d3061378e565b5b826003811115610d4457610d4361378e565b5b03610d5757610d5283612534565b610d6d565b610d6b8360096129c190919063ffffffff16565b505b505050565b600060036000836002811115610d8b57610d8a61378e565b5b6002811115610d9d57610d9c61378e565b5b815260200190815260200160002060009054906101000a900460ff169050919050565b6000806000838152602001908152602001600020600101549050919050565b610e097f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c83361168a565b610e3f576040517ff4ecad6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003811115610e5357610e5261378e565b5b6007600083815260200190815260200160002060000160009054906101000a900460ff166003811115610e8957610e8861378e565b5b03610ec0576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60076000828152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549060ff021916905560018201600090556002820160006101000a81549060ff02191690556003820160009055600482016000610f44919061314a565b600582016000610f54919061314a565b600682016000610f64919061314a565b5050610f7a8160096129c190919063ffffffff16565b507fe4a7f7b48251ad70e63f800758a445b00386e2fa98d5afce96a546e8fce2114e81604051610faa9190613402565b60405180910390a150565b600481565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b610fe782610dc0565b610ff0816129d8565b610ffa83836129ec565b505050565b611007612acc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b90613f94565b60405180910390fd5b61107e8282612ad4565b5050565b600881565b6000600160009054906101000a900460ff16905090565b7f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf81565b6110ec7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b611122576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016005826040516111349190613dd0565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507fe7735e9f569fe61671662a8829db77de38ef614c77b1b136c958aff781df7c75816040516111889190613aaa565b60405180910390a150565b6111bd7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b6111f3576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083600281111561120c5761120b61378e565b5b600281111561121e5761121d61378e565b5b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece8015816040516112729190613fc3565b60405180910390a150565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6112a961318a565b60076000838152602001908152602001600020604051806101200160405290816000820160009054906101000a900460ff1660038111156112ed576112ec61378e565b5b60038111156112ff576112fe61378e565b5b81526020016000820160019054906101000a900460ff1660028111156113285761132761378e565b5b600281111561133a5761133961378e565b5b81526020016000820160029054906101000a900460ff1660028111156113635761136261378e565b5b60028111156113755761137461378e565b5b8152602001600182015481526020016002820160009054906101000a900460ff1660008111156113a8576113a761378e565b5b60008111156113ba576113b961378e565b5b8152602001600382015481526020016004820180546113d890613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461140490613e16565b80156114515780601f1061142657610100808354040283529160200191611451565b820191906000526020600020905b81548152906001019060200180831161143457829003601f168201915b5050505050815260200160058201805461146a90613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461149690613e16565b80156114e35780601f106114b8576101008083540402835291602001916114e3565b820191906000526020600020905b8154815290600101906020018083116114c657829003601f168201915b505050505081526020016006820180546114fc90613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461152890613e16565b80156115755780601f1061154a57610100808354040283529160200191611575565b820191906000526020600020905b81548152906001019060200180831161155857829003601f168201915b5050505050815250509050919050565b7f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db681565b6115d37fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b611609576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360008260028111156116205761161f61378e565b5b60028111156116325761163161378e565b5b815260200190815260200160002060006101000a81549060ff02191690557f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad478160405161167f9190613fc3565b60405180910390a150565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606002805461170390613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461172f90613e16565b801561177c5780601f106117515761010080835404028352916020019161177c565b820191906000526020600020905b81548152906001019060200180831161175f57829003601f168201915b5050505050905090565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000801b81565b6000808484846040516020016117fb93929190614042565b60405160208183030381529060405280519060200120905060086000828152602001908152602001600020549150509392505050565b600281565b6118607f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db63361168a565b611896576040517f80510fe100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515600360008660028111156118b1576118b061378e565b5b60028111156118c3576118c261378e565b5b815260200190815260200160002060009054906101000a900460ff16151514611918576040517fc8e7a97c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600281111561192c5761192b61378e565b5b84600281111561193f5761193e61378e565b5b1415801561197257506001600281111561195c5761195b61378e565b5b84600281111561196f5761196e61378e565b5b14155b156119c857600160009054906101000a900460ff16156119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119be906140f1565b60405180910390fd5b5b60018060006101000a81548160ff02191690831515021790555081600290816119f191906142bd565b506001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600682604051611a5c9190613dd0565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507f18f0396c6d01876d7610d96877b44f017ab4ca2265b13079b10e0be6b6af30d481604051611ab09190613aaa565b60405180910390a17f1a7b784416b53672844a12947a59696e835a6d8dffbb0c4630a4d04812bd627883604051611ae7919061439e565b60405180910390a17f5b590cceabbeb28cd16e41a811ba46df5bb82c98920d5e7ff77e4fa9db709b338282604051611b209291906143b9565b60405180910390a150505050565b611b587f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db63361168a565b611b8e576040517f80510fe100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115611ba257611ba161378e565b5b896003811115611bb557611bb461378e565b5b03611c1f57611be47fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c3361168a565b611c1a576040517f5c21123e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cb0565b60016003811115611c3357611c3261378e565b5b896003811115611c4657611c4561378e565b5b14158015611c785750600380811115611c6257611c6161378e565b5b896003811115611c7557611c7461378e565b5b14155b15611caf576040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60011515600360008a6002811115611ccb57611cca61378e565b5b6002811115611cdd57611cdc61378e565b5b815260200190815260200160002060009054906101000a900460ff16151514611d32576040517fc8e7a97c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001151560046000611d458d6004612bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc690614488565b60405180910390fd5b60006002811115611de357611de261378e565b5b886002811115611df657611df561378e565b5b14158015611e29575060016002811115611e1357611e1261378e565b5b886002811115611e2657611e2561378e565b5b14155b15611eb95760006003811115611e4257611e4161378e565b5b600760008c815260200190815260200160002060000160009054906101000a900460ff166003811115611e7857611e7761378e565b5b14611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf9061451a565b60405180910390fd5b5b600280811115611ecc57611ecb61378e565b5b886002811115611edf57611ede61378e565b5b03611f2b5760006002861603611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f21906145ac565b60405180910390fd5b5b60008103611f37574290505b6040518061012001604052808a6003811115611f5657611f5561378e565b5b8152602001896002811115611f6e57611f6d61378e565b5b8152602001886002811115611f8657611f8561378e565b5b8152602001828152602001876000811115611fa457611fa361378e565b5b815260200186815260200185815260200184815260200183815250600760008c815260200190815260200160002060008201518160000160006101000a81548160ff02191690836003811115611ffd57611ffc61378e565b5b021790555060208201518160000160016101000a81548160ff0219169083600281111561202d5761202c61378e565b5b021790555060408201518160000160026101000a81548160ff0219169083600281111561205d5761205c61378e565b5b02179055506060820151816001015560808201518160020160006101000a81548160ff021916908360008111156120975761209661378e565b5b021790555060a0820151816003015560c08201518160040190816120bb91906142bd565b5060e08201518160050190816120d191906142bd565b506101008201518160060190816120e891906142bd565b509050507f4a31c6a8fec8204586ffa810ed030ffe53094bb602ad82bb8e9d32d0116e70ea8a8a8a8a858b8b8b8b8b60405161212d9a999897969594939291906145ea565b60405180910390a1600260038111156121495761214861378e565b5b89600381111561215c5761215b61378e565b5b036121a45761216a8a612534565b7f6ae24fa3345cd7488c35e11c5278059a0a545fd008c33d2d396d917b69bed5bf8a8a60405161219b929190613ef9565b60405180910390a15b50505050505050505050565b6121b982610dc0565b6121c2816129d8565b6121cc8383612ad4565b505050565b60006006826040516121e39190613dd0565b908152602001604051809103902060009054906101000a900460ff169050919050565b6122307fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b612266576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690557ff580a1ea01c0ed3ec5e4797c560ee7046c3591588c0feb814f5f2d4eca50272c816040516122e4919061439e565b60405180910390a150565b6123197fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b61234f576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058160405161235f9190613dd0565b908152602001604051809103902060006101000a81549060ff02191690557ff13042255d0b58f7acc82c201a0cd4d834b0783dd7b3c29cca9b96840d633f74816040516123ac9190613aaa565b60405180910390a150565b6123e17fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b612417576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f1a7b784416b53672844a12947a59696e835a6d8dffbb0c4630a4d04812bd62788160405161249e919061439e565b60405180910390a150565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600061252383600001612c42565b905060608190508092505050919050565b600060038111156125485761254761378e565b5b6007600083815260200190815260200160002060000160009054906101000a900460ff16600381111561257e5761257d61378e565b5b036125b5576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060076000838152602001908152602001600020604051806101200160405290816000820160009054906101000a900460ff1660038111156125fb576125fa61378e565b5b600381111561260d5761260c61378e565b5b81526020016000820160019054906101000a900460ff1660028111156126365761263561378e565b5b60028111156126485761264761378e565b5b81526020016000820160029054906101000a900460ff1660028111156126715761267061378e565b5b60028111156126835761268261378e565b5b8152602001600182015481526020016002820160009054906101000a900460ff1660008111156126b6576126b561378e565b5b60008111156126c8576126c761378e565b5b8152602001600382015481526020016004820180546126e690613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461271290613e16565b801561275f5780601f106127345761010080835404028352916020019161275f565b820191906000526020600020905b81548152906001019060200180831161274257829003601f168201915b5050505050815260200160058201805461277890613e16565b80601f01602080910402602001604051908101604052809291908181526020018280546127a490613e16565b80156127f15780601f106127c6576101008083540402835291602001916127f1565b820191906000526020600020905b8154815290600101906020018083116127d457829003601f168201915b5050505050815260200160068201805461280a90613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461283690613e16565b80156128835780601f1061285857610100808354040283529160200191612883565b820191906000526020600020905b81548152906001019060200180831161286657829003601f168201915b5050505050815250509050600260038111156128a2576128a161378e565b5b816000015160038111156128b9576128b861378e565b5b146128f0576040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081602001518260400151836080015160405160200161291393929190614042565b6040516020818303038152906040528051906020012090506000600860008381526020019081526020016000205490506000801b811461298d57600760008281526020019081526020016000206001015483606001511115612988578360086000848152602001908152602001600020819055505b6129a6565b8360086000848152602001908152602001600020819055505b6129ba846009612c9e90919063ffffffff16565b5050505050565b60006129d08360000183612cb5565b905092915050565b6129e9816129e4612acc565b612dc9565b50565b6129f6828261168a565b612ac857600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612a6d612acc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b612ade828261168a565b15612bb157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b56612acc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008060005b6014811015612c3457600881612bd191906146ca565b60ff60f81b868387612be3919061470c565b60208110612bf457612bf3614740565b5b1a60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c821791508080612c2c9061476f565b915050612bbb565b508060601c91505092915050565b606081600001805480602002602001604051908101604052809291908181526020018280548015612c9257602002820191906000526020600020905b815481526020019060010190808311612c7e575b50505050509050919050565b6000612cad8360000183612e4e565b905092915050565b60008083600101600084815260200190815260200160002054905060008114612dbd576000600182612ce791906147b7565b9050600060018660000180549050612cff91906147b7565b9050818114612d6e576000866000018281548110612d2057612d1f614740565b5b9060005260206000200154905080876000018481548110612d4457612d43614740565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612d8257612d816147eb565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612dc3565b60009150505b92915050565b612dd3828261168a565b612e4a57612de081612ebe565b612dee8360001c6020612eeb565b604051602001612dff9291906148f9565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e41919061496c565b60405180910390fd5b5050565b6000612e5a8383613127565b612eb3578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612eb8565b600090505b92915050565b6060612ee48273ffffffffffffffffffffffffffffffffffffffff16601460ff16612eeb565b9050919050565b606060006002836002612efe91906146ca565b612f08919061470c565b67ffffffffffffffff811115612f2157612f20613438565b5b6040519080825280601f01601f191660200182016040528015612f535781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f8b57612f8a614740565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fef57612fee614740565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261302f91906146ca565b613039919061470c565b90505b60018111156130d9577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061307b5761307a614740565b5b1a60f81b82828151811061309257613091614740565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130d29061498e565b905061303c565b506000841461311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311490614a03565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020541415905092915050565b50805461315690613e16565b6000825580601f106131685750613187565b601f016020900490600052602060002090810190613186919061321d565b5b50565b604051806101200160405280600060038111156131aa576131a961378e565b5b8152602001600060028111156131c3576131c261378e565b5b8152602001600060028111156131dc576131db61378e565b5b8152602001600081526020016000808111156131fb576131fa61378e565b5b8152602001600081526020016060815260200160608152602001606081525090565b5b8082111561323657600081600090555060010161321e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132838161324e565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb613244565b5b60006132ca84828501613291565b91505092915050565b60008115159050919050565b6132e8816132d3565b82525050565b600060208201905061330360008301846132df565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61334881613335565b82525050565b600061335a838361333f565b60208301905092915050565b6000602082019050919050565b600061337e82613309565b6133888185613314565b935061339383613325565b8060005b838110156133c45781516133ab888261334e565b97506133b683613366565b925050600181019050613397565b5085935050505092915050565b600060208201905081810360008301526133eb8184613373565b905092915050565b6133fc81613335565b82525050565b600060208201905061341760008301846133f3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61347082613427565b810181811067ffffffffffffffff8211171561348f5761348e613438565b5b80604052505050565b60006134a261323a565b90506134ae8282613467565b919050565b600067ffffffffffffffff8211156134ce576134cd613438565b5b6134d782613427565b9050602081019050919050565b82818337600083830152505050565b6000613506613501846134b3565b613498565b90508281526020810184848401111561352257613521613422565b5b61352d8482856134e4565b509392505050565b600082601f83011261354a5761354961341d565b5b813561355a8482602086016134f3565b91505092915050565b60006020828403121561357957613578613244565b5b600082013567ffffffffffffffff81111561359757613596613249565b5b6135a384828501613535565b91505092915050565b6135b581613335565b81146135c057600080fd5b50565b6000813590506135d2816135ac565b92915050565b600481106135e557600080fd5b50565b6000813590506135f7816135d8565b92915050565b6000806040838503121561361457613613613244565b5b6000613622858286016135c3565b9250506020613633858286016135e8565b9150509250929050565b6003811061364a57600080fd5b50565b60008135905061365c8161363d565b92915050565b60006020828403121561367857613677613244565b5b60006136868482850161364d565b91505092915050565b6000602082840312156136a5576136a4613244565b5b60006136b3848285016135c3565b91505092915050565b6000819050919050565b6136cf816136bc565b82525050565b60006020820190506136ea60008301846136c6565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061371b826136f0565b9050919050565b61372b81613710565b811461373657600080fd5b50565b60008135905061374881613722565b92915050565b6000806040838503121561376557613764613244565b5b6000613773858286016135c3565b925050602061378485828601613739565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106137ce576137cd61378e565b5b50565b60008190506137df826137bd565b919050565b60006137ef826137d1565b9050919050565b6137ff816137e4565b82525050565b600381106138165761381561378e565b5b50565b600081905061382782613805565b919050565b600061383782613819565b9050919050565b6138478161382c565b82525050565b6003811061385e5761385d61378e565b5b50565b600081905061386f8261384d565b919050565b600061387f82613861565b9050919050565b61388f81613874565b82525050565b61389e816136bc565b82525050565b600181106138b5576138b461378e565b5b50565b60008190506138c6826138a4565b919050565b60006138d6826138b8565b9050919050565b6138e6816138cb565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561392657808201518184015260208101905061390b565b60008484015250505050565b600061393d826138ec565b61394781856138f7565b9350613957818560208601613908565b61396081613427565b840191505092915050565b60006101208301600083015161398460008601826137f6565b506020830151613997602086018261383e565b5060408301516139aa6040860182613886565b5060608301516139bd6060860182613895565b5060808301516139d060808601826138dd565b5060a08301516139e360a0860182613895565b5060c083015184820360c08601526139fb8282613932565b91505060e083015184820360e0860152613a158282613932565b915050610100830151848203610100860152613a318282613932565b9150508091505092915050565b60006020820190508181036000830152613a58818461396b565b905092915050565b600082825260208201905092915050565b6000613a7c826138ec565b613a868185613a60565b9350613a96818560208601613908565b613a9f81613427565b840191505092915050565b60006020820190508181036000830152613ac48184613a71565b905092915050565b600060208284031215613ae257613ae1613244565b5b6000613af084828501613739565b91505092915050565b60038110613b0657600080fd5b50565b600081359050613b1881613af9565b92915050565b60018110613b2b57600080fd5b50565b600081359050613b3d81613b1e565b92915050565b600080600060608486031215613b5c57613b5b613244565b5b6000613b6a8682870161364d565b9350506020613b7b86828701613b09565b9250506040613b8c86828701613b2e565b9150509250925092565b60008060008060808587031215613bb057613baf613244565b5b6000613bbe8782880161364d565b9450506020613bcf87828801613739565b935050604085013567ffffffffffffffff811115613bf057613bef613249565b5b613bfc87828801613535565b925050606085013567ffffffffffffffff811115613c1d57613c1c613249565b5b613c2987828801613535565b91505092959194509250565b613c3e816136bc565b8114613c4957600080fd5b50565b600081359050613c5b81613c35565b92915050565b6000806000806000806000806000806101408b8d031215613c8557613c84613244565b5b6000613c938d828e016135c3565b9a50506020613ca48d828e016135e8565b9950506040613cb58d828e0161364d565b9850506060613cc68d828e01613b09565b9750506080613cd78d828e01613b2e565b96505060a0613ce88d828e01613c4c565b95505060c08b013567ffffffffffffffff811115613d0957613d08613249565b5b613d158d828e01613535565b94505060e08b013567ffffffffffffffff811115613d3657613d35613249565b5b613d428d828e01613535565b9350506101008b013567ffffffffffffffff811115613d6457613d63613249565b5b613d708d828e01613535565b925050610120613d828d828e01613c4c565b9150509295989b9194979a5092959850565b600081905092915050565b6000613daa826138ec565b613db48185613d94565b9350613dc4818560208601613908565b80840191505092915050565b6000613ddc8284613d9f565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e2e57607f821691505b602082108103613e4157613e40613de7565b5b50919050565b600082825260208201905092915050565b7f4d757374207265706c616365206163746976652072656c65617365206265666f60008201527f7265206368616e67696e67207374617475732066726f6d204163746976650000602082015250565b6000613eb4603e83613e47565b9150613ebf82613e58565b604082019050919050565b60006020820190508181036000830152613ee381613ea7565b9050919050565b613ef3816137e4565b82525050565b6000604082019050613f0e60008301856133f3565b613f1b6020830184613eea565b9392505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613f7e602f83613e47565b9150613f8982613f22565b604082019050919050565b60006020820190508181036000830152613fad81613f71565b9050919050565b613fbd8161382c565b82525050565b6000602082019050613fd86000830184613fb4565b92915050565b60008160f81b9050919050565b6000613ff682613fde565b9050919050565b61400e6140098261382c565b613feb565b82525050565b61402561402082613874565b613feb565b82525050565b61403c614037826138cb565b613feb565b82525050565b600061404e8286613ffd565b60018201915061405e8285614014565b60018201915061406e828461402b565b600182019150819050949350505050565b7f696e697443726561746f722829206d6179206f6e6c792062652063616c6c656460008201527f206f6e6365000000000000000000000000000000000000000000000000000000602082015250565b60006140db602583613e47565b91506140e68261407f565b604082019050919050565b6000602082019050818103600083015261410a816140ce565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614136565b61417d8683614136565b95508019841693508086168417925050509392505050565b6000819050919050565b60006141ba6141b56141b0846136bc565b614195565b6136bc565b9050919050565b6000819050919050565b6141d48361419f565b6141e86141e0826141c1565b848454614143565b825550505050565b600090565b6141fd6141f0565b6142088184846141cb565b505050565b5b8181101561422c576142216000826141f5565b60018101905061420e565b5050565b601f8211156142715761424281614111565b61424b84614126565b8101602085101561425a578190505b61426e61426685614126565b83018261420d565b50505b505050565b600082821c905092915050565b600061429460001984600802614276565b1980831691505092915050565b60006142ad8383614283565b9150826002028217905092915050565b6142c6826138ec565b67ffffffffffffffff8111156142df576142de613438565b5b6142e98254613e16565b6142f4828285614230565b600060209050601f8311600181146143275760008415614315578287015190505b61431f85826142a1565b865550614387565b601f19841661433586614111565b60005b8281101561435d57848901518255600182019150602085019450602081019050614338565b8683101561437a5784890151614376601f891682614283565b8355505b6001600288020188555050505b505050505050565b61439881613710565b82525050565b60006020820190506143b3600083018461438f565b92915050565b600060408201905081810360008301526143d38185613a71565b905081810360208301526143e78184613a71565b90509392505050565b7f5468652070726f7669646564207375626e6574202877697468696e207468652060008201527f72656c6561736520696429206973206e6f742076616c696420666f722074686960208201527f7320636f6e747261637400000000000000000000000000000000000000000000604082015250565b6000614472604a83613e47565b915061447d826143f0565b606082019050919050565b600060208201905081810360008301526144a181614465565b9050919050565b7f412072656c656173652077697468207468697320494420616c7265616479206560008201527f7869737473000000000000000000000000000000000000000000000000000000602082015250565b6000614504602583613e47565b915061450f826144a8565b604082019050919050565b60006020820190508181036000830152614533816144f7565b9050919050565b7f54686520524f206f7074696f6e20697320726571756972656420666f7220707260008201527f6f642072656c6561736573000000000000000000000000000000000000000000602082015250565b6000614596602b83613e47565b91506145a18261453a565b604082019050919050565b600060208201905081810360008301526145c581614589565b9050919050565b6145d581613874565b82525050565b6145e4816138cb565b82525050565b600061014082019050614600600083018d6133f3565b61460d602083018c613eea565b61461a604083018b613fb4565b614627606083018a6145cc565b61463460808301896136c6565b61464160a08301886145db565b61464e60c08301876136c6565b81810360e08301526146608186613a71565b90508181036101008301526146758185613a71565b905081810361012083015261468a8184613a71565b90509b9a5050505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146d5826136bc565b91506146e0836136bc565b92508282026146ee816136bc565b915082820484148315176147055761470461469b565b5b5092915050565b6000614717826136bc565b9150614722836136bc565b925082820190508082111561473a5761473961469b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061477a826136bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147ac576147ab61469b565b5b600182019050919050565b60006147c2826136bc565b91506147cd836136bc565b92508282039050818111156147e5576147e461469b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061485b60178361481a565b915061486682614825565b601782019050919050565b600081519050919050565b600061488782614871565b614891818561481a565b93506148a1818560208601613908565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006148e360118361481a565b91506148ee826148ad565b601182019050919050565b60006149048261484e565b9150614910828561487c565b915061491b826148d6565b9150614927828461487c565b91508190509392505050565b600061493e82614871565b6149488185613e47565b9350614958818560208601613908565b61496181613427565b840191505092915050565b600060208201905081810360008301526149868184614933565b905092915050565b6000614999826136bc565b9150600082036149ac576149ab61469b565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006149ed602083613e47565b91506149f8826149b7565b602082019050919050565b60006020820190508181036000830152614a1c816149e0565b905091905056fea264697066735822122063139cd078acf389d8a41de31a68b8c101be2be94fcc8d16daf5516e5fc56cd964736f6c634300081100330000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806375b238fc1161011a578063a98b109f116100ad578063d547741f1161007c578063d547741f146105ef578063d6bc626d1461060b578063db2d303b1461063b578063e1c0af0814610657578063f2dc99161461067357610206565b8063a98b109f14610569578063ad76939414610599578063bc7ca317146105b7578063bf8332c1146105d357610206565b806391d14854116100e957806391d14854146104cd5780639bb4e2f7146104fd578063a09083001461051b578063a217fddf1461054b57610206565b806375b238fc146104455780637f698e92146104635780638aeda25a146104935780638deb3893146104b157610206565b8063277dceaf1161019d5780633acd1ea31161016c5780633acd1ea3146103b35780633dc6c858146103d1578063458be7dc146103ef57806370e65a451461040d57806374bc81391461042957610206565b8063277dceaf1461033f578063282c51f31461035d5780632f2ff15d1461037b57806336568abe1461039757610206565b80630e1e59dd116101d95780630e1e59dd146102a75780631bd564dc146102c3578063248a9ca3146102f35780632609e5861461032357610206565b806301ffc9a71461020b578063023e92881461023b57806308740a3b146102595780630e092b1814610277575b600080fd5b610225600480360381019061022091906132a6565b61068f565b60405161023291906132ee565b60405180910390f35b610243610709565b60405161025091906133d1565b60405180910390f35b61026161071a565b60405161026e9190613402565b60405180910390f35b610291600480360381019061028c9190613563565b61073e565b60405161029e91906132ee565b60405180910390f35b6102c160048036038101906102bc91906135fd565b610773565b005b6102dd60048036038101906102d89190613662565b610d72565b6040516102ea91906132ee565b60405180910390f35b61030d6004803603810190610308919061368f565b610dc0565b60405161031a9190613402565b60405180910390f35b61033d6004803603810190610338919061368f565b610ddf565b005b610347610fb5565b60405161035491906136d5565b60405180910390f35b610365610fba565b6040516103729190613402565b60405180910390f35b6103956004803603810190610390919061374e565b610fde565b005b6103b160048036038101906103ac919061374e565b610fff565b005b6103bb611082565b6040516103c891906136d5565b60405180910390f35b6103d9611087565b6040516103e691906132ee565b60405180910390f35b6103f761109e565b6040516104049190613402565b60405180910390f35b61042760048036038101906104229190613563565b6110c2565b005b610443600480360381019061043e9190613662565b611193565b005b61044d61127d565b60405161045a9190613402565b60405180910390f35b61047d6004803603810190610478919061368f565b6112a1565b60405161048a9190613a3e565b60405180910390f35b61049b611585565b6040516104a89190613402565b60405180910390f35b6104cb60048036038101906104c69190613662565b6115a9565b005b6104e760048036038101906104e2919061374e565b61168a565b6040516104f491906132ee565b60405180910390f35b6105056116f4565b6040516105129190613aaa565b60405180910390f35b61053560048036038101906105309190613acc565b611786565b60405161054291906132ee565b60405180910390f35b6105536117dc565b6040516105609190613402565b60405180910390f35b610583600480360381019061057e9190613b43565b6117e3565b6040516105909190613402565b60405180910390f35b6105a1611831565b6040516105ae91906136d5565b60405180910390f35b6105d160048036038101906105cc9190613b96565b611836565b005b6105ed60048036038101906105e89190613c61565b611b2e565b005b6106096004803603810190610604919061374e565b6121b0565b005b61062560048036038101906106209190613563565b6121d1565b60405161063291906132ee565b60405180910390f35b61065560048036038101906106509190613acc565b612206565b005b610671600480360381019061066c9190613563565b6122ef565b005b61068d60048036038101906106889190613acc565b6123b7565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107025750610701826124a9565b5b9050919050565b60606107156009612513565b905090565b7fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c81565b60006005826040516107509190613dd0565b908152602001604051809103902060009054906101000a900460ff169050919050565b600260038111156107875761078661378e565b5b81600381111561079a5761079961378e565b5b03610804576107c97fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c3361168a565b6107ff576040517f5c21123e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c7565b6003808111156108175761081661378e565b5b81600381111561082a5761082961378e565b5b03610894576108597f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf3361168a565b61088f576040517f093efaf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c6565b6040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600060038111156108db576108da61378e565b5b6007600084815260200190815260200160002060000160009054906101000a900460ff1660038111156109115761091061378e565b5b03610948576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060076000848152602001908152602001600020604051806101200160405290816000820160009054906101000a900460ff16600381111561098e5761098d61378e565b5b60038111156109a05761099f61378e565b5b81526020016000820160019054906101000a900460ff1660028111156109c9576109c861378e565b5b60028111156109db576109da61378e565b5b81526020016000820160029054906101000a900460ff166002811115610a0457610a0361378e565b5b6002811115610a1657610a1561378e565b5b8152602001600182015481526020016002820160009054906101000a900460ff166000811115610a4957610a4861378e565b5b6000811115610a5b57610a5a61378e565b5b815260200160038201548152602001600482018054610a7990613e16565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa590613e16565b8015610af25780601f10610ac757610100808354040283529160200191610af2565b820191906000526020600020905b815481529060010190602001808311610ad557829003601f168201915b50505050508152602001600582018054610b0b90613e16565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790613e16565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b50505050508152602001600682018054610b9d90613e16565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc990613e16565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b505050505081525050905060026003811115610c3557610c3461378e565b5b826003811115610c4857610c4761378e565b5b14610ca65782610c658260200151836040015184608001516117e3565b03610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c90613eca565b60405180910390fd5b5b816007600085815260200190815260200160002060000160006101000a81548160ff02191690836003811115610cdf57610cde61378e565b5b02179055507f6ae24fa3345cd7488c35e11c5278059a0a545fd008c33d2d396d917b69bed5bf8383604051610d15929190613ef9565b60405180910390a160026003811115610d3157610d3061378e565b5b826003811115610d4457610d4361378e565b5b03610d5757610d5283612534565b610d6d565b610d6b8360096129c190919063ffffffff16565b505b505050565b600060036000836002811115610d8b57610d8a61378e565b5b6002811115610d9d57610d9c61378e565b5b815260200190815260200160002060009054906101000a900460ff169050919050565b6000806000838152602001908152602001600020600101549050919050565b610e097f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c83361168a565b610e3f576040517ff4ecad6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003811115610e5357610e5261378e565b5b6007600083815260200190815260200160002060000160009054906101000a900460ff166003811115610e8957610e8861378e565b5b03610ec0576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60076000828152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549060ff02191690556000820160026101000a81549060ff021916905560018201600090556002820160006101000a81549060ff02191690556003820160009055600482016000610f44919061314a565b600582016000610f54919061314a565b600682016000610f64919061314a565b5050610f7a8160096129c190919063ffffffff16565b507fe4a7f7b48251ad70e63f800758a445b00386e2fa98d5afce96a546e8fce2114e81604051610faa9190613402565b60405180910390a150565b600481565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b610fe782610dc0565b610ff0816129d8565b610ffa83836129ec565b505050565b611007612acc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b90613f94565b60405180910390fd5b61107e8282612ad4565b5050565b600881565b6000600160009054906101000a900460ff16905090565b7f50a3dccc47363872dd46de62b59273989edb72901adea0b961d5232bf9a1febf81565b6110ec7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b611122576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016005826040516111349190613dd0565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507fe7735e9f569fe61671662a8829db77de38ef614c77b1b136c958aff781df7c75816040516111889190613aaa565b60405180910390a150565b6111bd7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b6111f3576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083600281111561120c5761120b61378e565b5b600281111561121e5761121d61378e565b5b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f839ad2743d4062df579edf3818f642b71ee0688a35d6bc4438ef5314cece8015816040516112729190613fc3565b60405180910390a150565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b6112a961318a565b60076000838152602001908152602001600020604051806101200160405290816000820160009054906101000a900460ff1660038111156112ed576112ec61378e565b5b60038111156112ff576112fe61378e565b5b81526020016000820160019054906101000a900460ff1660028111156113285761132761378e565b5b600281111561133a5761133961378e565b5b81526020016000820160029054906101000a900460ff1660028111156113635761136261378e565b5b60028111156113755761137461378e565b5b8152602001600182015481526020016002820160009054906101000a900460ff1660008111156113a8576113a761378e565b5b60008111156113ba576113b961378e565b5b8152602001600382015481526020016004820180546113d890613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461140490613e16565b80156114515780601f1061142657610100808354040283529160200191611451565b820191906000526020600020905b81548152906001019060200180831161143457829003601f168201915b5050505050815260200160058201805461146a90613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461149690613e16565b80156114e35780601f106114b8576101008083540402835291602001916114e3565b820191906000526020600020905b8154815290600101906020018083116114c657829003601f168201915b505050505081526020016006820180546114fc90613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461152890613e16565b80156115755780601f1061154a57610100808354040283529160200191611575565b820191906000526020600020905b81548152906001019060200180831161155857829003601f168201915b5050505050815250509050919050565b7f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db681565b6115d37fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b611609576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360008260028111156116205761161f61378e565b5b60028111156116325761163161378e565b5b815260200190815260200160002060006101000a81549060ff02191690557f3f178f17dae6caf8ca09c4857502baf7744e8597de42d6596476fe9e06b8ad478160405161167f9190613fc3565b60405180910390a150565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606002805461170390613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461172f90613e16565b801561177c5780601f106117515761010080835404028352916020019161177c565b820191906000526020600020905b81548152906001019060200180831161175f57829003601f168201915b5050505050905090565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000801b81565b6000808484846040516020016117fb93929190614042565b60405160208183030381529060405280519060200120905060086000828152602001908152602001600020549150509392505050565b600281565b6118607f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db63361168a565b611896576040517f80510fe100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515600360008660028111156118b1576118b061378e565b5b60028111156118c3576118c261378e565b5b815260200190815260200160002060009054906101000a900460ff16151514611918576040517fc8e7a97c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600281111561192c5761192b61378e565b5b84600281111561193f5761193e61378e565b5b1415801561197257506001600281111561195c5761195b61378e565b5b84600281111561196f5761196e61378e565b5b14155b156119c857600160009054906101000a900460ff16156119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119be906140f1565b60405180910390fd5b5b60018060006101000a81548160ff02191690831515021790555081600290816119f191906142bd565b506001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600682604051611a5c9190613dd0565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507f18f0396c6d01876d7610d96877b44f017ab4ca2265b13079b10e0be6b6af30d481604051611ab09190613aaa565b60405180910390a17f1a7b784416b53672844a12947a59696e835a6d8dffbb0c4630a4d04812bd627883604051611ae7919061439e565b60405180910390a17f5b590cceabbeb28cd16e41a811ba46df5bb82c98920d5e7ff77e4fa9db709b338282604051611b209291906143b9565b60405180910390a150505050565b611b587f3c2519c4487d47714872f92cf90a50c25f5deaec2789dc2a497b1272df611db63361168a565b611b8e576040517f80510fe100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115611ba257611ba161378e565b5b896003811115611bb557611bb461378e565b5b03611c1f57611be47fce1f15692823e8a9d77ca8c1b7a2cc145ffd008750ee9d3f8604f9c52eeea73c3361168a565b611c1a576040517f5c21123e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cb0565b60016003811115611c3357611c3261378e565b5b896003811115611c4657611c4561378e565b5b14158015611c785750600380811115611c6257611c6161378e565b5b896003811115611c7557611c7461378e565b5b14155b15611caf576040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60011515600360008a6002811115611ccb57611cca61378e565b5b6002811115611cdd57611cdc61378e565b5b815260200190815260200160002060009054906101000a900460ff16151514611d32576040517fc8e7a97c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001151560046000611d458d6004612bb5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc690614488565b60405180910390fd5b60006002811115611de357611de261378e565b5b886002811115611df657611df561378e565b5b14158015611e29575060016002811115611e1357611e1261378e565b5b886002811115611e2657611e2561378e565b5b14155b15611eb95760006003811115611e4257611e4161378e565b5b600760008c815260200190815260200160002060000160009054906101000a900460ff166003811115611e7857611e7761378e565b5b14611eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaf9061451a565b60405180910390fd5b5b600280811115611ecc57611ecb61378e565b5b886002811115611edf57611ede61378e565b5b03611f2b5760006002861603611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f21906145ac565b60405180910390fd5b5b60008103611f37574290505b6040518061012001604052808a6003811115611f5657611f5561378e565b5b8152602001896002811115611f6e57611f6d61378e565b5b8152602001886002811115611f8657611f8561378e565b5b8152602001828152602001876000811115611fa457611fa361378e565b5b815260200186815260200185815260200184815260200183815250600760008c815260200190815260200160002060008201518160000160006101000a81548160ff02191690836003811115611ffd57611ffc61378e565b5b021790555060208201518160000160016101000a81548160ff0219169083600281111561202d5761202c61378e565b5b021790555060408201518160000160026101000a81548160ff0219169083600281111561205d5761205c61378e565b5b02179055506060820151816001015560808201518160020160006101000a81548160ff021916908360008111156120975761209661378e565b5b021790555060a0820151816003015560c08201518160040190816120bb91906142bd565b5060e08201518160050190816120d191906142bd565b506101008201518160060190816120e891906142bd565b509050507f4a31c6a8fec8204586ffa810ed030ffe53094bb602ad82bb8e9d32d0116e70ea8a8a8a8a858b8b8b8b8b60405161212d9a999897969594939291906145ea565b60405180910390a1600260038111156121495761214861378e565b5b89600381111561215c5761215b61378e565b5b036121a45761216a8a612534565b7f6ae24fa3345cd7488c35e11c5278059a0a545fd008c33d2d396d917b69bed5bf8a8a60405161219b929190613ef9565b60405180910390a15b50505050505050505050565b6121b982610dc0565b6121c2816129d8565b6121cc8383612ad4565b505050565b60006006826040516121e39190613dd0565b908152602001604051809103902060009054906101000a900460ff169050919050565b6122307fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b612266576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690557ff580a1ea01c0ed3ec5e4797c560ee7046c3591588c0feb814f5f2d4eca50272c816040516122e4919061439e565b60405180910390a150565b6123197fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b61234f576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058160405161235f9190613dd0565b908152602001604051809103902060006101000a81549060ff02191690557ff13042255d0b58f7acc82c201a0cd4d834b0783dd7b3c29cca9b96840d633f74816040516123ac9190613aaa565b60405180910390a150565b6123e17fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423361168a565b612417576040517fc890f84a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f1a7b784416b53672844a12947a59696e835a6d8dffbb0c4630a4d04812bd62788160405161249e919061439e565b60405180910390a150565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600061252383600001612c42565b905060608190508092505050919050565b600060038111156125485761254761378e565b5b6007600083815260200190815260200160002060000160009054906101000a900460ff16600381111561257e5761257d61378e565b5b036125b5576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060076000838152602001908152602001600020604051806101200160405290816000820160009054906101000a900460ff1660038111156125fb576125fa61378e565b5b600381111561260d5761260c61378e565b5b81526020016000820160019054906101000a900460ff1660028111156126365761263561378e565b5b60028111156126485761264761378e565b5b81526020016000820160029054906101000a900460ff1660028111156126715761267061378e565b5b60028111156126835761268261378e565b5b8152602001600182015481526020016002820160009054906101000a900460ff1660008111156126b6576126b561378e565b5b60008111156126c8576126c761378e565b5b8152602001600382015481526020016004820180546126e690613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461271290613e16565b801561275f5780601f106127345761010080835404028352916020019161275f565b820191906000526020600020905b81548152906001019060200180831161274257829003601f168201915b5050505050815260200160058201805461277890613e16565b80601f01602080910402602001604051908101604052809291908181526020018280546127a490613e16565b80156127f15780601f106127c6576101008083540402835291602001916127f1565b820191906000526020600020905b8154815290600101906020018083116127d457829003601f168201915b5050505050815260200160068201805461280a90613e16565b80601f016020809104026020016040519081016040528092919081815260200182805461283690613e16565b80156128835780601f1061285857610100808354040283529160200191612883565b820191906000526020600020905b81548152906001019060200180831161286657829003601f168201915b5050505050815250509050600260038111156128a2576128a161378e565b5b816000015160038111156128b9576128b861378e565b5b146128f0576040517ff525e32000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081602001518260400151836080015160405160200161291393929190614042565b6040516020818303038152906040528051906020012090506000600860008381526020019081526020016000205490506000801b811461298d57600760008281526020019081526020016000206001015483606001511115612988578360086000848152602001908152602001600020819055505b6129a6565b8360086000848152602001908152602001600020819055505b6129ba846009612c9e90919063ffffffff16565b5050505050565b60006129d08360000183612cb5565b905092915050565b6129e9816129e4612acc565b612dc9565b50565b6129f6828261168a565b612ac857600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612a6d612acc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b612ade828261168a565b15612bb157600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b56612acc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008060005b6014811015612c3457600881612bd191906146ca565b60ff60f81b868387612be3919061470c565b60208110612bf457612bf3614740565b5b1a60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c821791508080612c2c9061476f565b915050612bbb565b508060601c91505092915050565b606081600001805480602002602001604051908101604052809291908181526020018280548015612c9257602002820191906000526020600020905b815481526020019060010190808311612c7e575b50505050509050919050565b6000612cad8360000183612e4e565b905092915050565b60008083600101600084815260200190815260200160002054905060008114612dbd576000600182612ce791906147b7565b9050600060018660000180549050612cff91906147b7565b9050818114612d6e576000866000018281548110612d2057612d1f614740565b5b9060005260206000200154905080876000018481548110612d4457612d43614740565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612d8257612d816147eb565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612dc3565b60009150505b92915050565b612dd3828261168a565b612e4a57612de081612ebe565b612dee8360001c6020612eeb565b604051602001612dff9291906148f9565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e41919061496c565b60405180910390fd5b5050565b6000612e5a8383613127565b612eb3578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612eb8565b600090505b92915050565b6060612ee48273ffffffffffffffffffffffffffffffffffffffff16601460ff16612eeb565b9050919050565b606060006002836002612efe91906146ca565b612f08919061470c565b67ffffffffffffffff811115612f2157612f20613438565b5b6040519080825280601f01601f191660200182016040528015612f535781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f8b57612f8a614740565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fef57612fee614740565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261302f91906146ca565b613039919061470c565b90505b60018111156130d9577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061307b5761307a614740565b5b1a60f81b82828151811061309257613091614740565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130d29061498e565b905061303c565b506000841461311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311490614a03565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020541415905092915050565b50805461315690613e16565b6000825580601f106131685750613187565b601f016020900490600052602060002090810190613186919061321d565b5b50565b604051806101200160405280600060038111156131aa576131a961378e565b5b8152602001600060028111156131c3576131c261378e565b5b8152602001600060028111156131dc576131db61378e565b5b8152602001600081526020016000808111156131fb576131fa61378e565b5b8152602001600081526020016060815260200160608152602001606081525090565b5b8082111561323657600081600090555060010161321e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132838161324e565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb613244565b5b60006132ca84828501613291565b91505092915050565b60008115159050919050565b6132e8816132d3565b82525050565b600060208201905061330360008301846132df565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b61334881613335565b82525050565b600061335a838361333f565b60208301905092915050565b6000602082019050919050565b600061337e82613309565b6133888185613314565b935061339383613325565b8060005b838110156133c45781516133ab888261334e565b97506133b683613366565b925050600181019050613397565b5085935050505092915050565b600060208201905081810360008301526133eb8184613373565b905092915050565b6133fc81613335565b82525050565b600060208201905061341760008301846133f3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61347082613427565b810181811067ffffffffffffffff8211171561348f5761348e613438565b5b80604052505050565b60006134a261323a565b90506134ae8282613467565b919050565b600067ffffffffffffffff8211156134ce576134cd613438565b5b6134d782613427565b9050602081019050919050565b82818337600083830152505050565b6000613506613501846134b3565b613498565b90508281526020810184848401111561352257613521613422565b5b61352d8482856134e4565b509392505050565b600082601f83011261354a5761354961341d565b5b813561355a8482602086016134f3565b91505092915050565b60006020828403121561357957613578613244565b5b600082013567ffffffffffffffff81111561359757613596613249565b5b6135a384828501613535565b91505092915050565b6135b581613335565b81146135c057600080fd5b50565b6000813590506135d2816135ac565b92915050565b600481106135e557600080fd5b50565b6000813590506135f7816135d8565b92915050565b6000806040838503121561361457613613613244565b5b6000613622858286016135c3565b9250506020613633858286016135e8565b9150509250929050565b6003811061364a57600080fd5b50565b60008135905061365c8161363d565b92915050565b60006020828403121561367857613677613244565b5b60006136868482850161364d565b91505092915050565b6000602082840312156136a5576136a4613244565b5b60006136b3848285016135c3565b91505092915050565b6000819050919050565b6136cf816136bc565b82525050565b60006020820190506136ea60008301846136c6565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061371b826136f0565b9050919050565b61372b81613710565b811461373657600080fd5b50565b60008135905061374881613722565b92915050565b6000806040838503121561376557613764613244565b5b6000613773858286016135c3565b925050602061378485828601613739565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106137ce576137cd61378e565b5b50565b60008190506137df826137bd565b919050565b60006137ef826137d1565b9050919050565b6137ff816137e4565b82525050565b600381106138165761381561378e565b5b50565b600081905061382782613805565b919050565b600061383782613819565b9050919050565b6138478161382c565b82525050565b6003811061385e5761385d61378e565b5b50565b600081905061386f8261384d565b919050565b600061387f82613861565b9050919050565b61388f81613874565b82525050565b61389e816136bc565b82525050565b600181106138b5576138b461378e565b5b50565b60008190506138c6826138a4565b919050565b60006138d6826138b8565b9050919050565b6138e6816138cb565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561392657808201518184015260208101905061390b565b60008484015250505050565b600061393d826138ec565b61394781856138f7565b9350613957818560208601613908565b61396081613427565b840191505092915050565b60006101208301600083015161398460008601826137f6565b506020830151613997602086018261383e565b5060408301516139aa6040860182613886565b5060608301516139bd6060860182613895565b5060808301516139d060808601826138dd565b5060a08301516139e360a0860182613895565b5060c083015184820360c08601526139fb8282613932565b91505060e083015184820360e0860152613a158282613932565b915050610100830151848203610100860152613a318282613932565b9150508091505092915050565b60006020820190508181036000830152613a58818461396b565b905092915050565b600082825260208201905092915050565b6000613a7c826138ec565b613a868185613a60565b9350613a96818560208601613908565b613a9f81613427565b840191505092915050565b60006020820190508181036000830152613ac48184613a71565b905092915050565b600060208284031215613ae257613ae1613244565b5b6000613af084828501613739565b91505092915050565b60038110613b0657600080fd5b50565b600081359050613b1881613af9565b92915050565b60018110613b2b57600080fd5b50565b600081359050613b3d81613b1e565b92915050565b600080600060608486031215613b5c57613b5b613244565b5b6000613b6a8682870161364d565b9350506020613b7b86828701613b09565b9250506040613b8c86828701613b2e565b9150509250925092565b60008060008060808587031215613bb057613baf613244565b5b6000613bbe8782880161364d565b9450506020613bcf87828801613739565b935050604085013567ffffffffffffffff811115613bf057613bef613249565b5b613bfc87828801613535565b925050606085013567ffffffffffffffff811115613c1d57613c1c613249565b5b613c2987828801613535565b91505092959194509250565b613c3e816136bc565b8114613c4957600080fd5b50565b600081359050613c5b81613c35565b92915050565b6000806000806000806000806000806101408b8d031215613c8557613c84613244565b5b6000613c938d828e016135c3565b9a50506020613ca48d828e016135e8565b9950506040613cb58d828e0161364d565b9850506060613cc68d828e01613b09565b9750506080613cd78d828e01613b2e565b96505060a0613ce88d828e01613c4c565b95505060c08b013567ffffffffffffffff811115613d0957613d08613249565b5b613d158d828e01613535565b94505060e08b013567ffffffffffffffff811115613d3657613d35613249565b5b613d428d828e01613535565b9350506101008b013567ffffffffffffffff811115613d6457613d63613249565b5b613d708d828e01613535565b925050610120613d828d828e01613c4c565b9150509295989b9194979a5092959850565b600081905092915050565b6000613daa826138ec565b613db48185613d94565b9350613dc4818560208601613908565b80840191505092915050565b6000613ddc8284613d9f565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e2e57607f821691505b602082108103613e4157613e40613de7565b5b50919050565b600082825260208201905092915050565b7f4d757374207265706c616365206163746976652072656c65617365206265666f60008201527f7265206368616e67696e67207374617475732066726f6d204163746976650000602082015250565b6000613eb4603e83613e47565b9150613ebf82613e58565b604082019050919050565b60006020820190508181036000830152613ee381613ea7565b9050919050565b613ef3816137e4565b82525050565b6000604082019050613f0e60008301856133f3565b613f1b6020830184613eea565b9392505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613f7e602f83613e47565b9150613f8982613f22565b604082019050919050565b60006020820190508181036000830152613fad81613f71565b9050919050565b613fbd8161382c565b82525050565b6000602082019050613fd86000830184613fb4565b92915050565b60008160f81b9050919050565b6000613ff682613fde565b9050919050565b61400e6140098261382c565b613feb565b82525050565b61402561402082613874565b613feb565b82525050565b61403c614037826138cb565b613feb565b82525050565b600061404e8286613ffd565b60018201915061405e8285614014565b60018201915061406e828461402b565b600182019150819050949350505050565b7f696e697443726561746f722829206d6179206f6e6c792062652063616c6c656460008201527f206f6e6365000000000000000000000000000000000000000000000000000000602082015250565b60006140db602583613e47565b91506140e68261407f565b604082019050919050565b6000602082019050818103600083015261410a816140ce565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614136565b61417d8683614136565b95508019841693508086168417925050509392505050565b6000819050919050565b60006141ba6141b56141b0846136bc565b614195565b6136bc565b9050919050565b6000819050919050565b6141d48361419f565b6141e86141e0826141c1565b848454614143565b825550505050565b600090565b6141fd6141f0565b6142088184846141cb565b505050565b5b8181101561422c576142216000826141f5565b60018101905061420e565b5050565b601f8211156142715761424281614111565b61424b84614126565b8101602085101561425a578190505b61426e61426685614126565b83018261420d565b50505b505050565b600082821c905092915050565b600061429460001984600802614276565b1980831691505092915050565b60006142ad8383614283565b9150826002028217905092915050565b6142c6826138ec565b67ffffffffffffffff8111156142df576142de613438565b5b6142e98254613e16565b6142f4828285614230565b600060209050601f8311600181146143275760008415614315578287015190505b61431f85826142a1565b865550614387565b601f19841661433586614111565b60005b8281101561435d57848901518255600182019150602085019450602081019050614338565b8683101561437a5784890151614376601f891682614283565b8355505b6001600288020188555050505b505050505050565b61439881613710565b82525050565b60006020820190506143b3600083018461438f565b92915050565b600060408201905081810360008301526143d38185613a71565b905081810360208301526143e78184613a71565b90509392505050565b7f5468652070726f7669646564207375626e6574202877697468696e207468652060008201527f72656c6561736520696429206973206e6f742076616c696420666f722074686960208201527f7320636f6e747261637400000000000000000000000000000000000000000000604082015250565b6000614472604a83613e47565b915061447d826143f0565b606082019050919050565b600060208201905081810360008301526144a181614465565b9050919050565b7f412072656c656173652077697468207468697320494420616c7265616479206560008201527f7869737473000000000000000000000000000000000000000000000000000000602082015250565b6000614504602583613e47565b915061450f826144a8565b604082019050919050565b60006020820190508181036000830152614533816144f7565b9050919050565b7f54686520524f206f7074696f6e20697320726571756972656420666f7220707260008201527f6f642072656c6561736573000000000000000000000000000000000000000000602082015250565b6000614596602b83613e47565b91506145a18261453a565b604082019050919050565b600060208201905081810360008301526145c581614589565b9050919050565b6145d581613874565b82525050565b6145e4816138cb565b82525050565b600061014082019050614600600083018d6133f3565b61460d602083018c613eea565b61461a604083018b613fb4565b614627606083018a6145cc565b61463460808301896136c6565b61464160a08301886145db565b61464e60c08301876136c6565b81810360e08301526146608186613a71565b90508181036101008301526146758185613a71565b905081810361012083015261468a8184613a71565b90509b9a5050505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146d5826136bc565b91506146e0836136bc565b92508282026146ee816136bc565b915082820484148315176147055761470461469b565b5b5092915050565b6000614717826136bc565b9150614722836136bc565b925082820190508082111561473a5761473961469b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061477a826136bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147ac576147ab61469b565b5b600182019050919050565b60006147c2826136bc565b91506147cd836136bc565b92508282039050818111156147e5576147e461469b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061485b60178361481a565b915061486682614825565b601782019050919050565b600081519050919050565b600061488782614871565b614891818561481a565b93506148a1818560208601613908565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006148e360118361481a565b91506148ee826148ad565b601182019050919050565b60006149048261484e565b9150614910828561487c565b915061491b826148d6565b9150614927828461487c565b91508190509392505050565b600061493e82614871565b6149488185613e47565b9350614958818560208601613908565b61496181613427565b840191505092915050565b600060208201905081810360008301526149868184614933565b905092915050565b6000614999826136bc565b9150600082036149ac576149ab61469b565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006149ed602083613e47565b91506149f8826149b7565b602082019050919050565b60006020820190508181036000830152614a1c816149e0565b905091905056fea264697066735822122063139cd078acf389d8a41de31a68b8c101be2be94fcc8d16daf5516e5fc56cd964736f6c63430008110033