Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deploy | 10959197 | 2 days ago | IN | 0 S | 0.18041255 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
10959197 | 2 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
H3rmesContractDeployer
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-03-01 */ // SPDX-License-Identifier: MIT pragma solidity >=0.8.0 ^0.8.0 ^0.8.28; // lib/openzeppelin-contracts/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) /** * @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; } // lib/openzeppelin-contracts/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } // lib/openzeppelin-contracts/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) /** * @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); } } } // lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. /** * @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; } } // lib/solmate/src/utils/Bytes32AddressLib.sol /// @notice Library for converting between addresses and bytes32 values. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Bytes32AddressLib.sol) library Bytes32AddressLib { function fromLast20Bytes(bytes32 bytesValue) internal pure returns (address) { return address(uint160(uint256(bytesValue))); } function fillLast12Bytes(address addressValue) internal pure returns (bytes32) { return bytes32(bytes20(addressValue)); } } // lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // lib/openzeppelin-contracts/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.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); } } // lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.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; } } // lib/solmate/src/utils/CREATE3.sol /// @notice Deploy to deterministic addresses without an initcode factor. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/CREATE3.sol) /// @author Modified from 0xSequence (https://github.com/0xSequence/create3/blob/master/contracts/Create3.sol) library CREATE3 { using Bytes32AddressLib for bytes32; //--------------------------------------------------------------------------------// // Opcode | Opcode + Arguments | Description | Stack View // //--------------------------------------------------------------------------------// // 0x36 | 0x36 | CALLDATASIZE | size // // 0x3d | 0x3d | RETURNDATASIZE | 0 size // // 0x3d | 0x3d | RETURNDATASIZE | 0 0 size // // 0x37 | 0x37 | CALLDATACOPY | // // 0x36 | 0x36 | CALLDATASIZE | size // // 0x3d | 0x3d | RETURNDATASIZE | 0 size // // 0x34 | 0x34 | CALLVALUE | value 0 size // // 0xf0 | 0xf0 | CREATE | newContract // //--------------------------------------------------------------------------------// // Opcode | Opcode + Arguments | Description | Stack View // //--------------------------------------------------------------------------------// // 0x67 | 0x67XXXXXXXXXXXXXXXX | PUSH8 bytecode | bytecode // // 0x3d | 0x3d | RETURNDATASIZE | 0 bytecode // // 0x52 | 0x52 | MSTORE | // // 0x60 | 0x6008 | PUSH1 08 | 8 // // 0x60 | 0x6018 | PUSH1 18 | 24 8 // // 0xf3 | 0xf3 | RETURN | // //--------------------------------------------------------------------------------// bytes internal constant PROXY_BYTECODE = hex"67_36_3d_3d_37_36_3d_34_f0_3d_52_60_08_60_18_f3"; bytes32 internal constant PROXY_BYTECODE_HASH = keccak256(PROXY_BYTECODE); function deploy( bytes32 salt, bytes memory creationCode, uint256 value ) internal returns (address deployed) { bytes memory proxyChildBytecode = PROXY_BYTECODE; address proxy; /// @solidity memory-safe-assembly assembly { // Deploy a new contract with our pre-made bytecode via CREATE2. // We start 32 bytes into the code to avoid copying the byte length. proxy := create2(0, add(proxyChildBytecode, 32), mload(proxyChildBytecode), salt) } require(proxy != address(0), "DEPLOYMENT_FAILED"); deployed = getDeployed(salt); (bool success, ) = proxy.call{value: value}(creationCode); require(success && deployed.code.length != 0, "INITIALIZATION_FAILED"); } function getDeployed(bytes32 salt) internal view returns (address) { return getDeployed(salt, address(this)); } function getDeployed(bytes32 salt, address creator) internal pure returns (address) { address proxy = keccak256( abi.encodePacked( // Prefix: bytes1(0xFF), // Creator: creator, // Salt: salt, // Bytecode hash: PROXY_BYTECODE_HASH ) ).fromLast20Bytes(); return keccak256( abi.encodePacked( // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01) // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex) hex"d6_94", proxy, hex"01" // Nonce of the proxy contract (1) ) ).fromLast20Bytes(); } } // lib/openzeppelin-contracts/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.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()); } } } // lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // src/H3rmesContractDeployer.sol /** * @title H3rmesContractDeployer * @notice Deploys contracts to deterministic addresses using CREATE3 * @dev Uses AccessControlEnumerable for permission management */ contract H3rmesContractDeployer is AccessControlEnumerable { /// @notice Role identifier for addresses permitted to deploy contracts bytes32 public constant DEPLOYER_ROLE = keccak256("DEPLOYER_ROLE"); bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); /** * @notice Information about a deployed contract * @param name The identifier name of the contract * @param version The version string of the contract * @param contractAddress The address where the contract was deployed */ struct H3rmesContractDeployment { string name; string version; address contractAddress; } /// @notice Array storing all contracts deployed through this deployer H3rmesContractDeployment[] public h3rmesContractDeployments; /** * @notice Emitted when a contract is successfully deployed * @param name Name identifier of the deployed contract * @param version Version identifier of the deployed contract * @param contractAddress The address where the contract was deployed */ event ContractDeployed( string name, string version, address indexed contractAddress ); /** * @notice Configures the contract with initial roles * @param admin Address that will have admin privileges * @param deployer Address that will have deployment privileges */ constructor(address admin, address deployer) { _grantRole(DEFAULT_ADMIN_ROLE, admin); _grantRole(DEPLOYER_ROLE, deployer); } /** * @notice Deploys a contract using CREATE3 * @dev Creates a deterministic address based on name and version * @param bytecode The initialization bytecode for the contract * @param name Name identifier for the contract * @param version Version identifier for the contract * @return contractAddress The address where the contract was deployed */ function deploy( bytes memory bytecode, string memory name, string memory version ) public payable onlyRole(DEPLOYER_ROLE) returns (address contractAddress) { // Generate salt from name and version bytes32 salt = keccak256(abi.encodePacked(name, version)); contractAddress = CREATE3.deploy(salt, bytecode, msg.value); require(contractAddress != address(0), "H3rmesContractDeployer: deployment failed"); h3rmesContractDeployments.push(H3rmesContractDeployment({ name: name, version: version, contractAddress: contractAddress })); emit ContractDeployed(name, version, contractAddress); } /** * @notice Deploys multiple contracts with the same bytecode * @dev Batched deployment using different name/version identifiers * @param bytecode The initialization bytecode for the contracts * @param names Array of name identifiers for each contract * @param versions Array of version identifiers for each contract * @return contractAddresses Array of addresses where contracts were deployed */ function deployMany( bytes memory bytecode, string[] memory names, string[] memory versions ) external onlyRole(DEPLOYER_ROLE) returns (address[] memory contractAddresses) { require(names.length == versions.length, "H3rmesContractDeployer: arrays length mismatch"); contractAddresses = new address[](names.length); for (uint256 i; i < names.length; ++i) { contractAddresses[i] = deploy(bytecode, names[i], versions[i]); } } /** * @notice Returns the total number of deployed contracts * @return The length of the deployments array */ function deployedContractsLength() external view returns (uint256) { return h3rmesContractDeployments.length; } /** * @notice Retrieves all deployed contract information * @return Array of all contract deployment records */ function getDeployedContracts() external view returns (H3rmesContractDeployment[] memory) { return h3rmesContractDeployments; } /** * @notice Computes the address of a contract based on name and version * @dev Does not deploy the contract, only computes the address * @param name Name identifier for the contract * @param version Version identifier for the contract * @return The computed address of the contract */ function computeAddress(string memory name, string memory version) public view returns (address) { bytes32 salt = keccak256(abi.encodePacked(name, version)); return CREATE3.getDeployed(salt); } function execute(address target, bytes memory data) public payable onlyRole(EXECUTOR_ROLE) returns (bytes memory) { (bool success, bytes memory returnData) = target.call{value: msg.value}(data); require(success, "H3rmesContractDeployer: execution failed"); return returnData; } /** * @notice Grants or revokes the executor role from an address * @param executor Address to grant or revoke the executor role */ function toggleExecutorRole(address executor) external onlyRole(DEFAULT_ADMIN_ROLE) { if (hasRole(EXECUTOR_ROLE, executor)) { revokeRole(EXECUTOR_ROLE, executor); } else { grantRole(EXECUTOR_ROLE, executor); } } /** * @notice Grants or revokes the deployer role from an address * @param deployer Address to grant or revoke the deployer role */ function toggleDeployerRole(address deployer) external onlyRole(DEFAULT_ADMIN_ROLE) { if (hasRole(DEPLOYER_ROLE, deployer)) { revokeRole(DEPLOYER_ROLE, deployer); } else { grantRole(DEPLOYER_ROLE, deployer); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"deployer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"version","type":"string"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"ContractDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPLOYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"name":"computeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"name":"deploy","outputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"string[]","name":"versions","type":"string[]"}],"name":"deployMany","outputs":[{"internalType":"address[]","name":"contractAddresses","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployedContractsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getDeployedContracts","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct H3rmesContractDeployer.H3rmesContractDeployment[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"h3rmesContractDeployments","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"address","name":"contractAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deployer","type":"address"}],"name":"toggleDeployerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"}],"name":"toggleExecutorRole","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f5ffd5b506040516134d23803806134d283398181016040528101906100319190610320565b6100435f5f1b8361007a60201b60201c565b6100737ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c8261007a60201b60201c565b505061035e565b61008a82826100b260201b60201c565b6100ad8160015f8581526020019081526020015f2061019860201b90919060201c565b505050565b6100c282826101cb60201b60201c565b6101945760015f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061013961022e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f6101c3835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61023560201b60201c565b905092915050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f61024683836102a260201b60201c565b61029857825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f20819055506001905061029c565b5f90505b92915050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102ef826102c6565b9050919050565b6102ff816102e5565b8114610309575f5ffd5b50565b5f8151905061031a816102f6565b92915050565b5f5f60408385031215610336576103356102c2565b5b5f6103438582860161030c565b92505060206103548582860161030c565b9150509250929050565b6131678061036b5f395ff3fe60806040526004361061011e575f3560e01c80639010d07c1161009f578063ca15c87311610063578063ca15c87314610420578063d547741f1461045c578063e34d1a3814610484578063ecd00261146104ac578063fe99434e146104d65761011e565b80639010d07c1461031857806391d14854146103545780639f5d4cab14610390578063a217fddf146103cc578063aa9a068f146103f65761011e565b8063248a9ca3116100e6578063248a9ca3146102125780632f2ff15d1461024e57806336568abe14610276578063368b81b71461029e5780636dc6720b146102dc5761011e565b806301ffc9a71461012257806307bd02651461015e5780630852aaab1461018857806311f96783146101b25780631cff79cd146101e2575b5f5ffd5b34801561012d575f5ffd5b5061014860048036038101906101439190611b46565b6104fe565b6040516101559190611b8b565b60405180910390f35b348015610169575f5ffd5b50610172610577565b60405161017f9190611bbc565b60405180910390f35b348015610193575f5ffd5b5061019c61059b565b6040516101a99190611bed565b60405180910390f35b6101cc60048036038101906101c79190611de0565b6105a7565b6040516101d99190611ec3565b60405180910390f35b6101fc60048036038101906101f79190611f06565b61079d565b6040516102099190611fc0565b60405180910390f35b34801561021d575f5ffd5b506102386004803603810190610233919061200a565b610881565b6040516102459190611bbc565b60405180910390f35b348015610259575f5ffd5b50610274600480360381019061026f9190612035565b61089d565b005b348015610281575f5ffd5b5061029c60048036038101906102979190612035565b6108be565b005b3480156102a9575f5ffd5b506102c460048036038101906102bf919061209d565b610941565b6040516102d39392919061211a565b60405180910390f35b3480156102e7575f5ffd5b5061030260048036038101906102fd919061215d565b610aa1565b60405161030f9190611ec3565b60405180910390f35b348015610323575f5ffd5b5061033e600480360381019061033991906121d3565b610ae0565b60405161034b9190611ec3565b60405180910390f35b34801561035f575f5ffd5b5061037a60048036038101906103759190612035565b610b0c565b6040516103879190611b8b565b60405180910390f35b34801561039b575f5ffd5b506103b660048036038101906103b191906122f3565b610b6f565b6040516103c3919061244e565b60405180910390f35b3480156103d7575f5ffd5b506103e0610cd6565b6040516103ed9190611bbc565b60405180910390f35b348015610401575f5ffd5b5061040a610cdc565b60405161041791906125c5565b60405180910390f35b34801561042b575f5ffd5b506104466004803603810190610441919061200a565b610eac565b6040516104539190611bed565b60405180910390f35b348015610467575f5ffd5b50610482600480360381019061047d9190612035565b610ecd565b005b34801561048f575f5ffd5b506104aa60048036038101906104a591906125e5565b610eee565b005b3480156104b7575f5ffd5b506104c0610f87565b6040516104cd9190611bbc565b60405180910390f35b3480156104e1575f5ffd5b506104fc60048036038101906104f791906125e5565b610fab565b005b5f7f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610570575061056f82611044565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b5f600280549050905090565b5f7ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c6105d2816110bd565b5f84846040516020016105e692919061264a565b6040516020818303038152906040528051906020012090506106098187346110d1565b92505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610679576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610670906126dd565b60405180910390fd5b600260405180606001604052808781526020018681526020018573ffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f0190816106e591906128f8565b5060208201518160010190816106fb91906128f8565b506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff167fa9adb2ba03a7a3001aff8bc35e246e328acbacef958e65fce0079caeeb89962b868660405161078c9291906129c7565b60405180910390a250509392505050565b60607fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636107c9816110bd565b5f5f8573ffffffffffffffffffffffffffffffffffffffff1634866040516107f19190612a36565b5f6040518083038185875af1925050503d805f811461082b576040519150601f19603f3d011682016040523d82523d5f602084013e610830565b606091505b509150915081610875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086c90612abc565b60405180910390fd5b80935050505092915050565b5f5f5f8381526020019081526020015f20600101549050919050565b6108a682610881565b6108af816110bd565b6108b98383611267565b505050565b6108c6611299565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90612b4a565b60405180910390fd5b61093d82826112a0565b5050565b60028181548110610950575f80fd5b905f5260205f2090600302015f91509050805f01805461096f90612728565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90612728565b80156109e65780601f106109bd576101008083540402835291602001916109e6565b820191905f5260205f20905b8154815290600101906020018083116109c957829003601f168201915b5050505050908060010180546109fb90612728565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2790612728565b8015610a725780601f10610a4957610100808354040283529160200191610a72565b820191905f5260205f20905b815481529060010190602001808311610a5557829003601f168201915b505050505090806002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b5f5f8383604051602001610ab692919061264a565b604051602081830303815290604052805190602001209050610ad7816112d2565b91505092915050565b5f610b048260015f8681526020019081526020015f206112e490919063ffffffff16565b905092915050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60607ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c610b9b816110bd565b8251845114610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd690612bd8565b60405180910390fd5b835167ffffffffffffffff811115610bfa57610bf9611c1e565b5b604051908082528060200260200182016040528015610c285781602001602082028036833780820191505090505b5091505f5b8451811015610ccd57610c7586868381518110610c4d57610c4c612bf6565b5b6020026020010151868481518110610c6857610c67612bf6565b5b60200260200101516105a7565b838281518110610c8857610c87612bf6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050806001019050610c2d565b50509392505050565b5f5f1b81565b60606002805480602002602001604051908101604052809291908181526020015f905b82821015610ea3578382905f5260205f2090600302016040518060600160405290815f82018054610d2f90612728565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5b90612728565b8015610da65780601f10610d7d57610100808354040283529160200191610da6565b820191905f5260205f20905b815481529060010190602001808311610d8957829003601f168201915b50505050508152602001600182018054610dbf90612728565b80601f0160208091040260200160405190810160405280929190818152602001828054610deb90612728565b8015610e365780601f10610e0d57610100808354040283529160200191610e36565b820191905f5260205f20905b815481529060010190602001808311610e1957829003601f168201915b50505050508152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190610cff565b50505050905090565b5f610ec660015f8481526020019081526020015f206112fb565b9050919050565b610ed682610881565b610edf816110bd565b610ee983836112a0565b505050565b5f5f1b610efa816110bd565b610f247fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6383610b0c565b15610f5857610f537fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6383610ecd565b610f83565b610f827fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e638361089d565b5b5050565b7ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c81565b5f5f1b610fb7816110bd565b610fe17ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c83610b0c565b15611015576110107ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c83610ecd565b611040565b61103f7ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c8361089d565b5b5050565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110b657506110b58261130e565b5b9050919050565b6110ce816110c9611299565b611377565b50565b5f5f6040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090505f858251602084015ff590505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90612c6d565b60405180910390fd5b61118e866112d2565b92505f8173ffffffffffffffffffffffffffffffffffffffff1685876040516111b79190612a36565b5f6040518083038185875af1925050503d805f81146111f1576040519150601f19603f3d011682016040523d82523d5f602084013e6111f6565b606091505b5050905080801561121e57505f8473ffffffffffffffffffffffffffffffffffffffff163b14155b61125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490612cd5565b60405180910390fd5b5050509392505050565b61127182826113fb565b6112948160015f8581526020019081526020015f206114d590919063ffffffff16565b505050565b5f33905090565b6112aa8282611502565b6112cd8160015f8581526020019081526020015f206115dc90919063ffffffff16565b505050565b5f6112dd8230611609565b9050919050565b5f6112f1835f01836116ba565b5f1c905092915050565b5f611307825f016116e1565b9050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113818282610b0c565b6113f75761138e816116f0565b61139b835f1c602061171d565b6040516020016113ac929190612d87565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee9190612dc0565b60405180910390fd5b5050565b6114058282610b0c565b6114d15760015f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611476611299565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f6114fa835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611952565b905092915050565b61150c8282610b0c565b156115d8575f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061157d611299565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f611601835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6119b9565b905092915050565b5f5f61168060ff60f81b84866040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f300000000000000000000000000000000815250805190602001206040516020016116659493929190612e90565b60405160208183030381529060405280519060200120611ab5565b90506116b1816040516020016116969190612f71565b60405160208183030381529060405280519060200120611ab5565b91505092915050565b5f825f0182815481106116d0576116cf612bf6565b5b905f5260205f200154905092915050565b5f815f01805490509050919050565b60606117168273ffffffffffffffffffffffffffffffffffffffff16601460ff1661171d565b9050919050565b60605f600283600261172f9190612fce565b611739919061300f565b67ffffffffffffffff81111561175257611751611c1e565b5b6040519080825280601f01601f1916602001820160405280156117845781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106117bb576117ba612bf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061181e5761181d612bf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f600184600261185c9190612fce565b611866919061300f565b90505b6001811115611905577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106118a8576118a7612bf6565b5b1a60f81b8282815181106118bf576118be612bf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c9450806118fe90613042565b9050611869565b505f8414611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f906130b3565b60405180910390fd5b8091505092915050565b5f61195d8383611ac0565b6119af57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f2081905550600190506119b3565b5f90505b92915050565b5f5f836001015f8481526020019081526020015f205490505f8114611aaa575f6001826119e691906130d1565b90505f6001865f01805490506119fc91906130d1565b9050818114611a62575f865f018281548110611a1b57611a1a612bf6565b5b905f5260205f200154905080875f018481548110611a3c57611a3b612bf6565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611a7557611a74613104565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611aaf565b5f9150505b92915050565b5f815f1c9050919050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b2581611af1565b8114611b2f575f5ffd5b50565b5f81359050611b4081611b1c565b92915050565b5f60208284031215611b5b57611b5a611ae9565b5b5f611b6884828501611b32565b91505092915050565b5f8115159050919050565b611b8581611b71565b82525050565b5f602082019050611b9e5f830184611b7c565b92915050565b5f819050919050565b611bb681611ba4565b82525050565b5f602082019050611bcf5f830184611bad565b92915050565b5f819050919050565b611be781611bd5565b82525050565b5f602082019050611c005f830184611bde565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611c5482611c0e565b810181811067ffffffffffffffff82111715611c7357611c72611c1e565b5b80604052505050565b5f611c85611ae0565b9050611c918282611c4b565b919050565b5f67ffffffffffffffff821115611cb057611caf611c1e565b5b611cb982611c0e565b9050602081019050919050565b828183375f83830152505050565b5f611ce6611ce184611c96565b611c7c565b905082815260208101848484011115611d0257611d01611c0a565b5b611d0d848285611cc6565b509392505050565b5f82601f830112611d2957611d28611c06565b5b8135611d39848260208601611cd4565b91505092915050565b5f67ffffffffffffffff821115611d5c57611d5b611c1e565b5b611d6582611c0e565b9050602081019050919050565b5f611d84611d7f84611d42565b611c7c565b905082815260208101848484011115611da057611d9f611c0a565b5b611dab848285611cc6565b509392505050565b5f82601f830112611dc757611dc6611c06565b5b8135611dd7848260208601611d72565b91505092915050565b5f5f5f60608486031215611df757611df6611ae9565b5b5f84013567ffffffffffffffff811115611e1457611e13611aed565b5b611e2086828701611d15565b935050602084013567ffffffffffffffff811115611e4157611e40611aed565b5b611e4d86828701611db3565b925050604084013567ffffffffffffffff811115611e6e57611e6d611aed565b5b611e7a86828701611db3565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611ead82611e84565b9050919050565b611ebd81611ea3565b82525050565b5f602082019050611ed65f830184611eb4565b92915050565b611ee581611ea3565b8114611eef575f5ffd5b50565b5f81359050611f0081611edc565b92915050565b5f5f60408385031215611f1c57611f1b611ae9565b5b5f611f2985828601611ef2565b925050602083013567ffffffffffffffff811115611f4a57611f49611aed565b5b611f5685828601611d15565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611f9282611f60565b611f9c8185611f6a565b9350611fac818560208601611f7a565b611fb581611c0e565b840191505092915050565b5f6020820190508181035f830152611fd88184611f88565b905092915050565b611fe981611ba4565b8114611ff3575f5ffd5b50565b5f8135905061200481611fe0565b92915050565b5f6020828403121561201f5761201e611ae9565b5b5f61202c84828501611ff6565b91505092915050565b5f5f6040838503121561204b5761204a611ae9565b5b5f61205885828601611ff6565b925050602061206985828601611ef2565b9150509250929050565b61207c81611bd5565b8114612086575f5ffd5b50565b5f8135905061209781612073565b92915050565b5f602082840312156120b2576120b1611ae9565b5b5f6120bf84828501612089565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6120ec826120c8565b6120f681856120d2565b9350612106818560208601611f7a565b61210f81611c0e565b840191505092915050565b5f6060820190508181035f83015261213281866120e2565b9050818103602083015261214681856120e2565b90506121556040830184611eb4565b949350505050565b5f5f6040838503121561217357612172611ae9565b5b5f83013567ffffffffffffffff8111156121905761218f611aed565b5b61219c85828601611db3565b925050602083013567ffffffffffffffff8111156121bd576121bc611aed565b5b6121c985828601611db3565b9150509250929050565b5f5f604083850312156121e9576121e8611ae9565b5b5f6121f685828601611ff6565b925050602061220785828601612089565b9150509250929050565b5f67ffffffffffffffff82111561222b5761222a611c1e565b5b602082029050602081019050919050565b5f5ffd5b5f61225261224d84612211565b611c7c565b905080838252602082019050602084028301858111156122755761227461223c565b5b835b818110156122bc57803567ffffffffffffffff81111561229a57612299611c06565b5b8086016122a78982611db3565b85526020850194505050602081019050612277565b5050509392505050565b5f82601f8301126122da576122d9611c06565b5b81356122ea848260208601612240565b91505092915050565b5f5f5f6060848603121561230a57612309611ae9565b5b5f84013567ffffffffffffffff81111561232757612326611aed565b5b61233386828701611d15565b935050602084013567ffffffffffffffff81111561235457612353611aed565b5b612360868287016122c6565b925050604084013567ffffffffffffffff81111561238157612380611aed565b5b61238d868287016122c6565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6123c981611ea3565b82525050565b5f6123da83836123c0565b60208301905092915050565b5f602082019050919050565b5f6123fc82612397565b61240681856123a1565b9350612411836123b1565b805f5b8381101561244157815161242888826123cf565b9750612433836123e6565b925050600181019050612414565b5085935050505092915050565b5f6020820190508181035f83015261246681846123f2565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f6124b1826120c8565b6124bb8185612497565b93506124cb818560208601611f7a565b6124d481611c0e565b840191505092915050565b5f606083015f8301518482035f8601526124f982826124a7565b9150506020830151848203602086015261251382826124a7565b915050604083015161252860408601826123c0565b508091505092915050565b5f61253e83836124df565b905092915050565b5f602082019050919050565b5f61255c8261246e565b6125668185612478565b93508360208202850161257885612488565b805f5b858110156125b357848403895281516125948582612533565b945061259f83612546565b925060208a0199505060018101905061257b565b50829750879550505050505092915050565b5f6020820190508181035f8301526125dd8184612552565b905092915050565b5f602082840312156125fa576125f9611ae9565b5b5f61260784828501611ef2565b91505092915050565b5f81905092915050565b5f612624826120c8565b61262e8185612610565b935061263e818560208601611f7a565b80840191505092915050565b5f612655828561261a565b9150612661828461261a565b91508190509392505050565b7f4833726d6573436f6e74726163744465706c6f7965723a206465706c6f796d655f8201527f6e74206661696c65640000000000000000000000000000000000000000000000602082015250565b5f6126c76029836120d2565b91506126d28261266d565b604082019050919050565b5f6020820190508181035f8301526126f4816126bb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061273f57607f821691505b602082108103612752576127516126fb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026127b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612779565b6127be8683612779565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6127f96127f46127ef84611bd5565b6127d6565b611bd5565b9050919050565b5f819050919050565b612812836127df565b61282661281e82612800565b848454612785565b825550505050565b5f5f905090565b61283d61282e565b612848818484612809565b505050565b5b8181101561286b576128605f82612835565b60018101905061284e565b5050565b601f8211156128b05761288181612758565b61288a8461276a565b81016020851015612899578190505b6128ad6128a58561276a565b83018261284d565b50505b505050565b5f82821c905092915050565b5f6128d05f19846008026128b5565b1980831691505092915050565b5f6128e883836128c1565b9150826002028217905092915050565b612901826120c8565b67ffffffffffffffff81111561291a57612919611c1e565b5b6129248254612728565b61292f82828561286f565b5f60209050601f831160018114612960575f841561294e578287015190505b61295885826128dd565b8655506129bf565b601f19841661296e86612758565b5f5b8281101561299557848901518255600182019150602085019450602081019050612970565b868310156129b257848901516129ae601f8916826128c1565b8355505b6001600288020188555050505b505050505050565b5f6040820190508181035f8301526129df81856120e2565b905081810360208301526129f381846120e2565b90509392505050565b5f81905092915050565b5f612a1082611f60565b612a1a81856129fc565b9350612a2a818560208601611f7a565b80840191505092915050565b5f612a418284612a06565b915081905092915050565b7f4833726d6573436f6e74726163744465706c6f7965723a20657865637574696f5f8201527f6e206661696c6564000000000000000000000000000000000000000000000000602082015250565b5f612aa66028836120d2565b9150612ab182612a4c565b604082019050919050565b5f6020820190508181035f830152612ad381612a9a565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612b34602f836120d2565b9150612b3f82612ada565b604082019050919050565b5f6020820190508181035f830152612b6181612b28565b9050919050565b7f4833726d6573436f6e74726163744465706c6f7965723a20617272617973206c5f8201527f656e677468206d69736d61746368000000000000000000000000000000000000602082015250565b5f612bc2602e836120d2565b9150612bcd82612b68565b604082019050919050565b5f6020820190508181035f830152612bef81612bb6565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4445504c4f594d454e545f4641494c45440000000000000000000000000000005f82015250565b5f612c576011836120d2565b9150612c6282612c23565b602082019050919050565b5f6020820190508181035f830152612c8481612c4b565b9050919050565b7f494e495449414c495a4154494f4e5f4641494c454400000000000000000000005f82015250565b5f612cbf6015836120d2565b9150612cca82612c8b565b602082019050919050565b5f6020820190508181035f830152612cec81612cb3565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612d27601783612610565b9150612d3282612cf3565b601782019050919050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612d71601183612610565b9150612d7c82612d3d565b601182019050919050565b5f612d9182612d1b565b9150612d9d828561261a565b9150612da882612d65565b9150612db4828461261a565b91508190509392505050565b5f6020820190508181035f830152612dd881846120e2565b905092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b5f819050919050565b612e25612e2082612de0565b612e0b565b82525050565b5f8160601b9050919050565b5f612e4182612e2b565b9050919050565b5f612e5282612e37565b9050919050565b612e6a612e6582611ea3565b612e48565b82525050565b5f819050919050565b612e8a612e8582611ba4565b612e70565b82525050565b5f612e9b8287612e14565b600182019150612eab8286612e59565b601482019150612ebb8285612e79565b602082019150612ecb8284612e79565b60208201915081905095945050505050565b7fd6940000000000000000000000000000000000000000000000000000000000005f82015250565b5f612f11600283612610565b9150612f1c82612edd565b600282019050919050565b7f01000000000000000000000000000000000000000000000000000000000000005f82015250565b5f612f5b600183612610565b9150612f6682612f27565b600182019050919050565b5f612f7b82612f05565b9150612f878284612e59565b601482019150612f9682612f4f565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612fd882611bd5565b9150612fe383611bd5565b9250828202612ff181611bd5565b9150828204841483151761300857613007612fa1565b5b5092915050565b5f61301982611bd5565b915061302483611bd5565b925082820190508082111561303c5761303b612fa1565b5b92915050565b5f61304c82611bd5565b91505f820361305e5761305d612fa1565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61309d6020836120d2565b91506130a882613069565b602082019050919050565b5f6020820190508181035f8301526130ca81613091565b9050919050565b5f6130db82611bd5565b91506130e683611bd5565b92508282039050818111156130fe576130fd612fa1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220f866333c394b7b7a7d7bb2e020a58be923ae4add33bb2db3849d69d6934fd49064736f6c634300081c0033000000000000000000000000d80d8937dffae190b57f3d9179758165c84fb71b000000000000000000000000d80d8937dffae190b57f3d9179758165c84fb71b
Deployed Bytecode
0x60806040526004361061011e575f3560e01c80639010d07c1161009f578063ca15c87311610063578063ca15c87314610420578063d547741f1461045c578063e34d1a3814610484578063ecd00261146104ac578063fe99434e146104d65761011e565b80639010d07c1461031857806391d14854146103545780639f5d4cab14610390578063a217fddf146103cc578063aa9a068f146103f65761011e565b8063248a9ca3116100e6578063248a9ca3146102125780632f2ff15d1461024e57806336568abe14610276578063368b81b71461029e5780636dc6720b146102dc5761011e565b806301ffc9a71461012257806307bd02651461015e5780630852aaab1461018857806311f96783146101b25780631cff79cd146101e2575b5f5ffd5b34801561012d575f5ffd5b5061014860048036038101906101439190611b46565b6104fe565b6040516101559190611b8b565b60405180910390f35b348015610169575f5ffd5b50610172610577565b60405161017f9190611bbc565b60405180910390f35b348015610193575f5ffd5b5061019c61059b565b6040516101a99190611bed565b60405180910390f35b6101cc60048036038101906101c79190611de0565b6105a7565b6040516101d99190611ec3565b60405180910390f35b6101fc60048036038101906101f79190611f06565b61079d565b6040516102099190611fc0565b60405180910390f35b34801561021d575f5ffd5b506102386004803603810190610233919061200a565b610881565b6040516102459190611bbc565b60405180910390f35b348015610259575f5ffd5b50610274600480360381019061026f9190612035565b61089d565b005b348015610281575f5ffd5b5061029c60048036038101906102979190612035565b6108be565b005b3480156102a9575f5ffd5b506102c460048036038101906102bf919061209d565b610941565b6040516102d39392919061211a565b60405180910390f35b3480156102e7575f5ffd5b5061030260048036038101906102fd919061215d565b610aa1565b60405161030f9190611ec3565b60405180910390f35b348015610323575f5ffd5b5061033e600480360381019061033991906121d3565b610ae0565b60405161034b9190611ec3565b60405180910390f35b34801561035f575f5ffd5b5061037a60048036038101906103759190612035565b610b0c565b6040516103879190611b8b565b60405180910390f35b34801561039b575f5ffd5b506103b660048036038101906103b191906122f3565b610b6f565b6040516103c3919061244e565b60405180910390f35b3480156103d7575f5ffd5b506103e0610cd6565b6040516103ed9190611bbc565b60405180910390f35b348015610401575f5ffd5b5061040a610cdc565b60405161041791906125c5565b60405180910390f35b34801561042b575f5ffd5b506104466004803603810190610441919061200a565b610eac565b6040516104539190611bed565b60405180910390f35b348015610467575f5ffd5b50610482600480360381019061047d9190612035565b610ecd565b005b34801561048f575f5ffd5b506104aa60048036038101906104a591906125e5565b610eee565b005b3480156104b7575f5ffd5b506104c0610f87565b6040516104cd9190611bbc565b60405180910390f35b3480156104e1575f5ffd5b506104fc60048036038101906104f791906125e5565b610fab565b005b5f7f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610570575061056f82611044565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b5f600280549050905090565b5f7ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c6105d2816110bd565b5f84846040516020016105e692919061264a565b6040516020818303038152906040528051906020012090506106098187346110d1565b92505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610679576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610670906126dd565b60405180910390fd5b600260405180606001604052808781526020018681526020018573ffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f0190816106e591906128f8565b5060208201518160010190816106fb91906128f8565b506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508273ffffffffffffffffffffffffffffffffffffffff167fa9adb2ba03a7a3001aff8bc35e246e328acbacef958e65fce0079caeeb89962b868660405161078c9291906129c7565b60405180910390a250509392505050565b60607fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636107c9816110bd565b5f5f8573ffffffffffffffffffffffffffffffffffffffff1634866040516107f19190612a36565b5f6040518083038185875af1925050503d805f811461082b576040519150601f19603f3d011682016040523d82523d5f602084013e610830565b606091505b509150915081610875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086c90612abc565b60405180910390fd5b80935050505092915050565b5f5f5f8381526020019081526020015f20600101549050919050565b6108a682610881565b6108af816110bd565b6108b98383611267565b505050565b6108c6611299565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90612b4a565b60405180910390fd5b61093d82826112a0565b5050565b60028181548110610950575f80fd5b905f5260205f2090600302015f91509050805f01805461096f90612728565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90612728565b80156109e65780601f106109bd576101008083540402835291602001916109e6565b820191905f5260205f20905b8154815290600101906020018083116109c957829003601f168201915b5050505050908060010180546109fb90612728565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2790612728565b8015610a725780601f10610a4957610100808354040283529160200191610a72565b820191905f5260205f20905b815481529060010190602001808311610a5557829003601f168201915b505050505090806002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b5f5f8383604051602001610ab692919061264a565b604051602081830303815290604052805190602001209050610ad7816112d2565b91505092915050565b5f610b048260015f8681526020019081526020015f206112e490919063ffffffff16565b905092915050565b5f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60607ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c610b9b816110bd565b8251845114610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd690612bd8565b60405180910390fd5b835167ffffffffffffffff811115610bfa57610bf9611c1e565b5b604051908082528060200260200182016040528015610c285781602001602082028036833780820191505090505b5091505f5b8451811015610ccd57610c7586868381518110610c4d57610c4c612bf6565b5b6020026020010151868481518110610c6857610c67612bf6565b5b60200260200101516105a7565b838281518110610c8857610c87612bf6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050806001019050610c2d565b50509392505050565b5f5f1b81565b60606002805480602002602001604051908101604052809291908181526020015f905b82821015610ea3578382905f5260205f2090600302016040518060600160405290815f82018054610d2f90612728565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5b90612728565b8015610da65780601f10610d7d57610100808354040283529160200191610da6565b820191905f5260205f20905b815481529060010190602001808311610d8957829003601f168201915b50505050508152602001600182018054610dbf90612728565b80601f0160208091040260200160405190810160405280929190818152602001828054610deb90612728565b8015610e365780601f10610e0d57610100808354040283529160200191610e36565b820191905f5260205f20905b815481529060010190602001808311610e1957829003601f168201915b50505050508152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190610cff565b50505050905090565b5f610ec660015f8481526020019081526020015f206112fb565b9050919050565b610ed682610881565b610edf816110bd565b610ee983836112a0565b505050565b5f5f1b610efa816110bd565b610f247fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6383610b0c565b15610f5857610f537fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6383610ecd565b610f83565b610f827fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e638361089d565b5b5050565b7ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c81565b5f5f1b610fb7816110bd565b610fe17ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c83610b0c565b15611015576110107ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c83610ecd565b611040565b61103f7ffc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c8361089d565b5b5050565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110b657506110b58261130e565b5b9050919050565b6110ce816110c9611299565b611377565b50565b5f5f6040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090505f858251602084015ff590505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90612c6d565b60405180910390fd5b61118e866112d2565b92505f8173ffffffffffffffffffffffffffffffffffffffff1685876040516111b79190612a36565b5f6040518083038185875af1925050503d805f81146111f1576040519150601f19603f3d011682016040523d82523d5f602084013e6111f6565b606091505b5050905080801561121e57505f8473ffffffffffffffffffffffffffffffffffffffff163b14155b61125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490612cd5565b60405180910390fd5b5050509392505050565b61127182826113fb565b6112948160015f8581526020019081526020015f206114d590919063ffffffff16565b505050565b5f33905090565b6112aa8282611502565b6112cd8160015f8581526020019081526020015f206115dc90919063ffffffff16565b505050565b5f6112dd8230611609565b9050919050565b5f6112f1835f01836116ba565b5f1c905092915050565b5f611307825f016116e1565b9050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6113818282610b0c565b6113f75761138e816116f0565b61139b835f1c602061171d565b6040516020016113ac929190612d87565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee9190612dc0565b60405180910390fd5b5050565b6114058282610b0c565b6114d15760015f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611476611299565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f6114fa835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611952565b905092915050565b61150c8282610b0c565b156115d8575f5f5f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061157d611299565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f611601835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6119b9565b905092915050565b5f5f61168060ff60f81b84866040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f300000000000000000000000000000000815250805190602001206040516020016116659493929190612e90565b60405160208183030381529060405280519060200120611ab5565b90506116b1816040516020016116969190612f71565b60405160208183030381529060405280519060200120611ab5565b91505092915050565b5f825f0182815481106116d0576116cf612bf6565b5b905f5260205f200154905092915050565b5f815f01805490509050919050565b60606117168273ffffffffffffffffffffffffffffffffffffffff16601460ff1661171d565b9050919050565b60605f600283600261172f9190612fce565b611739919061300f565b67ffffffffffffffff81111561175257611751611c1e565b5b6040519080825280601f01601f1916602001820160405280156117845781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106117bb576117ba612bf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061181e5761181d612bf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f600184600261185c9190612fce565b611866919061300f565b90505b6001811115611905577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106118a8576118a7612bf6565b5b1a60f81b8282815181106118bf576118be612bf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c9450806118fe90613042565b9050611869565b505f8414611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f906130b3565b60405180910390fd5b8091505092915050565b5f61195d8383611ac0565b6119af57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f2081905550600190506119b3565b5f90505b92915050565b5f5f836001015f8481526020019081526020015f205490505f8114611aaa575f6001826119e691906130d1565b90505f6001865f01805490506119fc91906130d1565b9050818114611a62575f865f018281548110611a1b57611a1a612bf6565b5b905f5260205f200154905080875f018481548110611a3c57611a3b612bf6565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611a7557611a74613104565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611aaf565b5f9150505b92915050565b5f815f1c9050919050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b2581611af1565b8114611b2f575f5ffd5b50565b5f81359050611b4081611b1c565b92915050565b5f60208284031215611b5b57611b5a611ae9565b5b5f611b6884828501611b32565b91505092915050565b5f8115159050919050565b611b8581611b71565b82525050565b5f602082019050611b9e5f830184611b7c565b92915050565b5f819050919050565b611bb681611ba4565b82525050565b5f602082019050611bcf5f830184611bad565b92915050565b5f819050919050565b611be781611bd5565b82525050565b5f602082019050611c005f830184611bde565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611c5482611c0e565b810181811067ffffffffffffffff82111715611c7357611c72611c1e565b5b80604052505050565b5f611c85611ae0565b9050611c918282611c4b565b919050565b5f67ffffffffffffffff821115611cb057611caf611c1e565b5b611cb982611c0e565b9050602081019050919050565b828183375f83830152505050565b5f611ce6611ce184611c96565b611c7c565b905082815260208101848484011115611d0257611d01611c0a565b5b611d0d848285611cc6565b509392505050565b5f82601f830112611d2957611d28611c06565b5b8135611d39848260208601611cd4565b91505092915050565b5f67ffffffffffffffff821115611d5c57611d5b611c1e565b5b611d6582611c0e565b9050602081019050919050565b5f611d84611d7f84611d42565b611c7c565b905082815260208101848484011115611da057611d9f611c0a565b5b611dab848285611cc6565b509392505050565b5f82601f830112611dc757611dc6611c06565b5b8135611dd7848260208601611d72565b91505092915050565b5f5f5f60608486031215611df757611df6611ae9565b5b5f84013567ffffffffffffffff811115611e1457611e13611aed565b5b611e2086828701611d15565b935050602084013567ffffffffffffffff811115611e4157611e40611aed565b5b611e4d86828701611db3565b925050604084013567ffffffffffffffff811115611e6e57611e6d611aed565b5b611e7a86828701611db3565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611ead82611e84565b9050919050565b611ebd81611ea3565b82525050565b5f602082019050611ed65f830184611eb4565b92915050565b611ee581611ea3565b8114611eef575f5ffd5b50565b5f81359050611f0081611edc565b92915050565b5f5f60408385031215611f1c57611f1b611ae9565b5b5f611f2985828601611ef2565b925050602083013567ffffffffffffffff811115611f4a57611f49611aed565b5b611f5685828601611d15565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611f9282611f60565b611f9c8185611f6a565b9350611fac818560208601611f7a565b611fb581611c0e565b840191505092915050565b5f6020820190508181035f830152611fd88184611f88565b905092915050565b611fe981611ba4565b8114611ff3575f5ffd5b50565b5f8135905061200481611fe0565b92915050565b5f6020828403121561201f5761201e611ae9565b5b5f61202c84828501611ff6565b91505092915050565b5f5f6040838503121561204b5761204a611ae9565b5b5f61205885828601611ff6565b925050602061206985828601611ef2565b9150509250929050565b61207c81611bd5565b8114612086575f5ffd5b50565b5f8135905061209781612073565b92915050565b5f602082840312156120b2576120b1611ae9565b5b5f6120bf84828501612089565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6120ec826120c8565b6120f681856120d2565b9350612106818560208601611f7a565b61210f81611c0e565b840191505092915050565b5f6060820190508181035f83015261213281866120e2565b9050818103602083015261214681856120e2565b90506121556040830184611eb4565b949350505050565b5f5f6040838503121561217357612172611ae9565b5b5f83013567ffffffffffffffff8111156121905761218f611aed565b5b61219c85828601611db3565b925050602083013567ffffffffffffffff8111156121bd576121bc611aed565b5b6121c985828601611db3565b9150509250929050565b5f5f604083850312156121e9576121e8611ae9565b5b5f6121f685828601611ff6565b925050602061220785828601612089565b9150509250929050565b5f67ffffffffffffffff82111561222b5761222a611c1e565b5b602082029050602081019050919050565b5f5ffd5b5f61225261224d84612211565b611c7c565b905080838252602082019050602084028301858111156122755761227461223c565b5b835b818110156122bc57803567ffffffffffffffff81111561229a57612299611c06565b5b8086016122a78982611db3565b85526020850194505050602081019050612277565b5050509392505050565b5f82601f8301126122da576122d9611c06565b5b81356122ea848260208601612240565b91505092915050565b5f5f5f6060848603121561230a57612309611ae9565b5b5f84013567ffffffffffffffff81111561232757612326611aed565b5b61233386828701611d15565b935050602084013567ffffffffffffffff81111561235457612353611aed565b5b612360868287016122c6565b925050604084013567ffffffffffffffff81111561238157612380611aed565b5b61238d868287016122c6565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6123c981611ea3565b82525050565b5f6123da83836123c0565b60208301905092915050565b5f602082019050919050565b5f6123fc82612397565b61240681856123a1565b9350612411836123b1565b805f5b8381101561244157815161242888826123cf565b9750612433836123e6565b925050600181019050612414565b5085935050505092915050565b5f6020820190508181035f83015261246681846123f2565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f6124b1826120c8565b6124bb8185612497565b93506124cb818560208601611f7a565b6124d481611c0e565b840191505092915050565b5f606083015f8301518482035f8601526124f982826124a7565b9150506020830151848203602086015261251382826124a7565b915050604083015161252860408601826123c0565b508091505092915050565b5f61253e83836124df565b905092915050565b5f602082019050919050565b5f61255c8261246e565b6125668185612478565b93508360208202850161257885612488565b805f5b858110156125b357848403895281516125948582612533565b945061259f83612546565b925060208a0199505060018101905061257b565b50829750879550505050505092915050565b5f6020820190508181035f8301526125dd8184612552565b905092915050565b5f602082840312156125fa576125f9611ae9565b5b5f61260784828501611ef2565b91505092915050565b5f81905092915050565b5f612624826120c8565b61262e8185612610565b935061263e818560208601611f7a565b80840191505092915050565b5f612655828561261a565b9150612661828461261a565b91508190509392505050565b7f4833726d6573436f6e74726163744465706c6f7965723a206465706c6f796d655f8201527f6e74206661696c65640000000000000000000000000000000000000000000000602082015250565b5f6126c76029836120d2565b91506126d28261266d565b604082019050919050565b5f6020820190508181035f8301526126f4816126bb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061273f57607f821691505b602082108103612752576127516126fb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026127b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612779565b6127be8683612779565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6127f96127f46127ef84611bd5565b6127d6565b611bd5565b9050919050565b5f819050919050565b612812836127df565b61282661281e82612800565b848454612785565b825550505050565b5f5f905090565b61283d61282e565b612848818484612809565b505050565b5b8181101561286b576128605f82612835565b60018101905061284e565b5050565b601f8211156128b05761288181612758565b61288a8461276a565b81016020851015612899578190505b6128ad6128a58561276a565b83018261284d565b50505b505050565b5f82821c905092915050565b5f6128d05f19846008026128b5565b1980831691505092915050565b5f6128e883836128c1565b9150826002028217905092915050565b612901826120c8565b67ffffffffffffffff81111561291a57612919611c1e565b5b6129248254612728565b61292f82828561286f565b5f60209050601f831160018114612960575f841561294e578287015190505b61295885826128dd565b8655506129bf565b601f19841661296e86612758565b5f5b8281101561299557848901518255600182019150602085019450602081019050612970565b868310156129b257848901516129ae601f8916826128c1565b8355505b6001600288020188555050505b505050505050565b5f6040820190508181035f8301526129df81856120e2565b905081810360208301526129f381846120e2565b90509392505050565b5f81905092915050565b5f612a1082611f60565b612a1a81856129fc565b9350612a2a818560208601611f7a565b80840191505092915050565b5f612a418284612a06565b915081905092915050565b7f4833726d6573436f6e74726163744465706c6f7965723a20657865637574696f5f8201527f6e206661696c6564000000000000000000000000000000000000000000000000602082015250565b5f612aa66028836120d2565b9150612ab182612a4c565b604082019050919050565b5f6020820190508181035f830152612ad381612a9a565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f612b34602f836120d2565b9150612b3f82612ada565b604082019050919050565b5f6020820190508181035f830152612b6181612b28565b9050919050565b7f4833726d6573436f6e74726163744465706c6f7965723a20617272617973206c5f8201527f656e677468206d69736d61746368000000000000000000000000000000000000602082015250565b5f612bc2602e836120d2565b9150612bcd82612b68565b604082019050919050565b5f6020820190508181035f830152612bef81612bb6565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4445504c4f594d454e545f4641494c45440000000000000000000000000000005f82015250565b5f612c576011836120d2565b9150612c6282612c23565b602082019050919050565b5f6020820190508181035f830152612c8481612c4b565b9050919050565b7f494e495449414c495a4154494f4e5f4641494c454400000000000000000000005f82015250565b5f612cbf6015836120d2565b9150612cca82612c8b565b602082019050919050565b5f6020820190508181035f830152612cec81612cb3565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612d27601783612610565b9150612d3282612cf3565b601782019050919050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612d71601183612610565b9150612d7c82612d3d565b601182019050919050565b5f612d9182612d1b565b9150612d9d828561261a565b9150612da882612d65565b9150612db4828461261a565b91508190509392505050565b5f6020820190508181035f830152612dd881846120e2565b905092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b5f819050919050565b612e25612e2082612de0565b612e0b565b82525050565b5f8160601b9050919050565b5f612e4182612e2b565b9050919050565b5f612e5282612e37565b9050919050565b612e6a612e6582611ea3565b612e48565b82525050565b5f819050919050565b612e8a612e8582611ba4565b612e70565b82525050565b5f612e9b8287612e14565b600182019150612eab8286612e59565b601482019150612ebb8285612e79565b602082019150612ecb8284612e79565b60208201915081905095945050505050565b7fd6940000000000000000000000000000000000000000000000000000000000005f82015250565b5f612f11600283612610565b9150612f1c82612edd565b600282019050919050565b7f01000000000000000000000000000000000000000000000000000000000000005f82015250565b5f612f5b600183612610565b9150612f6682612f27565b600182019050919050565b5f612f7b82612f05565b9150612f878284612e59565b601482019150612f9682612f4f565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612fd882611bd5565b9150612fe383611bd5565b9250828202612ff181611bd5565b9150828204841483151761300857613007612fa1565b5b5092915050565b5f61301982611bd5565b915061302483611bd5565b925082820190508082111561303c5761303b612fa1565b5b92915050565b5f61304c82611bd5565b91505f820361305e5761305d612fa1565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61309d6020836120d2565b91506130a882613069565b602082019050919050565b5f6020820190508181035f8301526130ca81613091565b9050919050565b5f6130db82611bd5565b91506130e683611bd5565b92508282039050818111156130fe576130fd612fa1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220f866333c394b7b7a7d7bb2e020a58be923ae4add33bb2db3849d69d6934fd49064736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d80d8937dffae190b57f3d9179758165c84fb71b000000000000000000000000d80d8937dffae190b57f3d9179758165c84fb71b
-----Decoded View---------------
Arg [0] : admin (address): 0xD80d8937dFfAe190B57F3d9179758165C84FB71b
Arg [1] : deployer (address): 0xD80d8937dFfAe190B57F3d9179758165C84FB71b
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d80d8937dffae190b57f3d9179758165c84fb71b
Arg [1] : 000000000000000000000000d80d8937dffae190b57f3d9179758165c84fb71b
Deployed Bytecode Sourcemap
51284:6039:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49249:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51500:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55175:125;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53283:746;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56145:309;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44852:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45293:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46437:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52045:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;55923:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50062:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43325:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54483:551;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42430:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55443:141;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50389:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45733:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56617:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51427:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57049:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49249:214;49334:4;49373:42;49358:57;;;:11;:57;;;;:97;;;;49419:36;49443:11;49419:23;:36::i;:::-;49358:97;49351:104;;49249:214;;;:::o;51500:66::-;51540:26;51500:66;:::o;55175:125::-;55233:7;55260:25;:32;;;;55253:39;;55175:125;:::o;53283:746::-;53447:23;51467:26;42921:16;42932:4;42921:10;:16::i;:::-;53531:12:::1;53573:4;53579:7;53556:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53546:42;;;;;;53531:57;;53627:41;53642:4;53648:8;53658:9;53627:14;:41::i;:::-;53609:59;;53714:1;53687:29;;:15;:29;;::::0;53679:83:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;53775:25;53806:140;;;;;;;;53852:4;53806:140;;;;53880:7;53806:140;;;;53919:15;53806:140;;;;::::0;53775:172:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54005:15;53973:48;;;53990:4;53996:7;53973:48;;;;;;;:::i;:::-;;;;;;;;53472:557;53283:746:::0;;;;;;:::o;56145:309::-;56245:12;51540:26;42921:16;42932:4;42921:10;:16::i;:::-;56271:12:::1;56285:23;56312:6;:11;;56331:9;56342:4;56312:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56270:77;;;;56366:7;56358:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;56436:10;56429:17;;;;56145:309:::0;;;;;:::o;44852:131::-;44926:7;44953:6;:12;44960:4;44953:12;;;;;;;;;;;:22;;;44946:29;;44852:131;;;:::o;45293:147::-;45376:18;45389:4;45376:12;:18::i;:::-;42921:16;42932:4;42921:10;:16::i;:::-;45407:25:::1;45418:4;45424:7;45407:10;:25::i;:::-;45293:147:::0;;;:::o;46437:218::-;46544:12;:10;:12::i;:::-;46533:23;;:7;:23;;;46525:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;46621:26;46633:4;46639:7;46621:11;:26::i;:::-;46437:218;;:::o;52045:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55923:216::-;56011:7;56031:12;56073:4;56079:7;56056:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56046:42;;;;;;56031:57;;56106:25;56126:4;56106:19;:25::i;:::-;56099:32;;;55923:216;;;;:::o;50062:153::-;50152:7;50179:28;50201:5;50179:12;:18;50192:4;50179:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;50172:35;;50062:153;;;;:::o;43325:147::-;43411:4;43435:6;:12;43442:4;43435:12;;;;;;;;;;;:20;;:29;43456:7;43435:29;;;;;;;;;;;;;;;;;;;;;;;;;43428:36;;43325:147;;;;:::o;54483:551::-;54678:34;51467:26;42921:16;42932:4;42921:10;:16::i;:::-;54754:8:::1;:15;54738:5;:12;:31;54730:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;54875:5;:12;54861:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54841:47;;54904:9;54899:128;54919:5;:12;54915:1;:16;54899:128;;;54976:39;54983:8;54993:5;54999:1;54993:8;;;;;;;;:::i;:::-;;;;;;;;55003;55012:1;55003:11;;;;;;;;:::i;:::-;;;;;;;;54976:6;:39::i;:::-;54953:17;54971:1;54953:20;;;;;;;;:::i;:::-;;;;;;;:62;;;;;;;;;::::0;::::1;54933:3;;;;;54899:128;;;;54483:551:::0;;;;;;:::o;42430:49::-;42475:4;42430:49;;;:::o;55443:141::-;55498:33;55551:25;55544:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55443:141;:::o;50389:142::-;50469:7;50496:27;:12;:18;50509:4;50496:18;;;;;;;;;;;:25;:27::i;:::-;50489:34;;50389:142;;;:::o;45733:149::-;45817:18;45830:4;45817:12;:18::i;:::-;42921:16;42932:4;42921:10;:16::i;:::-;45848:26:::1;45860:4;45866:7;45848:11;:26::i;:::-;45733:149:::0;;;:::o;56617:269::-;42475:4;56681:18;;42921:16;42932:4;42921:10;:16::i;:::-;56716:32:::1;51540:26;56739:8;56716:7;:32::i;:::-;56712:167;;;56765:35;51540:26;56791:8;56765:10;:35::i;:::-;56712:167;;;56833:34;51540:26;56858:8;56833:9;:34::i;:::-;56712:167;56617:269:::0;;:::o;51427:66::-;51467:26;51427:66;:::o;57049:269::-;42475:4;57113:18;;42921:16;42932:4;42921:10;:16::i;:::-;57148:32:::1;51467:26;57171:8;57148:7;:32::i;:::-;57144:167;;;57197:35;51467:26;57223:8;57197:10;:35::i;:::-;57144:167;;;57265:34;51467:26;57290:8;57265:9;:34::i;:::-;57144:167;57049:269:::0;;:::o;43029:204::-;43114:4;43153:32;43138:47;;;:11;:47;;;;:87;;;;43189:36;43213:11;43189:23;:36::i;:::-;43138:87;43131:94;;43029:204;;;:::o;43776:105::-;43843:30;43854:4;43860:12;:10;:12::i;:::-;43843:10;:30::i;:::-;43776:105;:::o;38633:815::-;38757:16;38786:31;38820:14;;;;;;;;;;;;;;;;;38786:48;;38847:13;39175:4;39154:18;39148:25;39143:2;39123:18;39119:27;39116:1;39108:72;39099:81;;39226:1;39209:19;;:5;:19;;;39201:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;39274:17;39286:4;39274:11;:17::i;:::-;39263:28;;39303:12;39321:5;:10;;39339:5;39346:12;39321:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39302:57;;;39378:7;:36;;;;;39413:1;39389:8;:20;;;:25;;39378:36;39370:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;38775:673;;;38633:815;;;;;:::o;50624:169::-;50712:31;50729:4;50735:7;50712:16;:31::i;:::-;50754;50777:7;50754:12;:18;50767:4;50754:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;50624:169;;:::o;3752:98::-;3805:7;3832:10;3825:17;;3752:98;:::o;50887:174::-;50976:32;50994:4;51000:7;50976:17;:32::i;:::-;51019:34;51045:7;51019:12;:18;51032:4;51019:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;50887:174;;:::o;39456:125::-;39514:7;39541:32;39553:4;39567;39541:11;:32::i;:::-;39534:39;;39456:125;;;:::o;27566:158::-;27640:7;27691:22;27695:3;:10;;27707:5;27691:3;:22::i;:::-;27683:31;;27660:56;;27566:158;;;;:::o;27095:117::-;27158:7;27185:19;27193:3;:10;;27185:7;:19::i;:::-;27178:26;;27095:117;;;:::o;36003:157::-;36088:4;36127:25;36112:40;;;:11;:40;;;;36105:47;;36003:157;;;:::o;44171:492::-;44260:22;44268:4;44274:7;44260;:22::i;:::-;44255:401;;44448:28;44468:7;44448:19;:28::i;:::-;44549:38;44577:4;44569:13;;44584:2;44549:19;:38::i;:::-;44353:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44299:345;;;;;;;;;;;:::i;:::-;;;;;;;;44255:401;44171:492;;:::o;48034:238::-;48118:22;48126:4;48132:7;48118;:22::i;:::-;48113:152;;48189:4;48157:6;:12;48164:4;48157:12;;;;;;;;;;;:20;;:29;48178:7;48157:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;48240:12;:10;:12::i;:::-;48213:40;;48231:7;48213:40;;48225:4;48213:40;;;;;;;;;;48113:152;48034:238;;:::o;26270:152::-;26340:4;26364:50;26369:3;:10;;26405:5;26389:23;;26381:32;;26364:4;:50::i;:::-;26357:57;;26270:152;;;;:::o;48452:239::-;48536:22;48544:4;48550:7;48536;:22::i;:::-;48532:152;;;48607:5;48575:6;:12;48582:4;48575:12;;;;;;;;;;;:20;;:29;48596:7;48575:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;48659:12;:10;:12::i;:::-;48632:40;;48650:7;48632:40;;48644:4;48632:40;;;;;;;;;;48532:152;48452:239;;:::o;26598:158::-;26671:4;26695:53;26703:3;:10;;26739:5;26723:23;;26715:32;;26695:7;:53::i;:::-;26688:60;;26598:158;;;;:::o;39589:886::-;39664:7;39684:13;39700:320;39794:4;39787:12;;39847:7;39899:4;38609:14;;;;;;;;;;;;;;;;;38599:25;;;;;;39724:267;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39700:302;;;;;;:318;:320::i;:::-;39684:336;;40053:414;40345:5;40081:353;;;;;;;;:::i;:::-;;;;;;;;;;;;;40053:396;;;;;;:412;:414::i;:::-;40033:434;;;39589:886;;;;:::o;22775:120::-;22842:7;22869:3;:11;;22881:5;22869:18;;;;;;;;:::i;:::-;;;;;;;;;;22862:25;;22775:120;;;;:::o;22312:109::-;22368:7;22395:3;:11;;:18;;;;22388:25;;22312:109;;;:::o;35004:151::-;35062:13;35095:52;35123:4;35107:22;;33159:2;35095:52;;:11;:52::i;:::-;35088:59;;35004:151;;;:::o;34400:447::-;34475:13;34501:19;34546:1;34537:6;34533:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;34523:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34501:47;;34559:15;:6;34566:1;34559:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;34585;:6;34592:1;34585:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;34616:9;34641:1;34632:6;34628:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;34616:26;;34611:131;34648:1;34644;:5;34611:131;;;34683:8;34700:3;34692:5;:11;34683:21;;;;;;;:::i;:::-;;;;;34671:6;34678:1;34671:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;34729:1;34719:11;;;;;34651:3;;;;:::i;:::-;;;34611:131;;;;34769:1;34760:5;:10;34752:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34832:6;34818:21;;;34400:447;;;;:::o;20001:414::-;20064:4;20086:21;20096:3;20101:5;20086:9;:21::i;:::-;20081:327;;20124:3;:11;;20141:5;20124:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20307:3;:11;;:18;;;;20285:3;:12;;:19;20298:5;20285:19;;;;;;;;;;;:40;;;;20347:4;20340:11;;;;20081:327;20391:5;20384:12;;20001:414;;;;;:::o;20591:1420::-;20657:4;20775:18;20796:3;:12;;:19;20809:5;20796:19;;;;;;;;;;;;20775:40;;20846:1;20832:10;:15;20828:1176;;21207:21;21244:1;21231:10;:14;;;;:::i;:::-;21207:38;;21260:17;21301:1;21280:3;:11;;:18;;;;:22;;;;:::i;:::-;21260:42;;21336:13;21323:9;:26;21319:405;;21370:17;21390:3;:11;;21402:9;21390:22;;;;;;;;:::i;:::-;;;;;;;;;;21370:42;;21544:9;21515:3;:11;;21527:13;21515:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;21655:10;21629:3;:12;;:23;21642:9;21629:23;;;;;;;;;;;:36;;;;21351:373;21319:405;21805:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21900:3;:12;;:19;21913:5;21900:19;;;;;;;;;;;21893:26;;;21943:4;21936:11;;;;;;;20828:1176;21987:5;21980:12;;;20591:1420;;;;;:::o;31328:140::-;31396:7;31447:10;31439:19;;31416:44;;31328:140;;;:::o;22097:129::-;22170:4;22217:1;22194:3;:12;;:19;22207:5;22194:19;;;;;;;;;;;;:24;;22187:31;;22097:129;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:77::-;1990:7;2019:5;2008:16;;1953:77;;;:::o;2036:118::-;2123:24;2141:5;2123:24;:::i;:::-;2118:3;2111:37;2036:118;;:::o;2160:222::-;2253:4;2291:2;2280:9;2276:18;2268:26;;2304:71;2372:1;2361:9;2357:17;2348:6;2304:71;:::i;:::-;2160:222;;;;:::o;2388:117::-;2497:1;2494;2487:12;2511:117;2620:1;2617;2610:12;2634:102;2675:6;2726:2;2722:7;2717:2;2710:5;2706:14;2702:28;2692:38;;2634:102;;;:::o;2742:180::-;2790:77;2787:1;2780:88;2887:4;2884:1;2877:15;2911:4;2908:1;2901:15;2928:281;3011:27;3033:4;3011:27;:::i;:::-;3003:6;2999:40;3141:6;3129:10;3126:22;3105:18;3093:10;3090:34;3087:62;3084:88;;;3152:18;;:::i;:::-;3084:88;3192:10;3188:2;3181:22;2971:238;2928:281;;:::o;3215:129::-;3249:6;3276:20;;:::i;:::-;3266:30;;3305:33;3333:4;3325:6;3305:33;:::i;:::-;3215:129;;;:::o;3350:307::-;3411:4;3501:18;3493:6;3490:30;3487:56;;;3523:18;;:::i;:::-;3487:56;3561:29;3583:6;3561:29;:::i;:::-;3553:37;;3645:4;3639;3635:15;3627:23;;3350:307;;;:::o;3663:148::-;3761:6;3756:3;3751;3738:30;3802:1;3793:6;3788:3;3784:16;3777:27;3663:148;;;:::o;3817:423::-;3894:5;3919:65;3935:48;3976:6;3935:48;:::i;:::-;3919:65;:::i;:::-;3910:74;;4007:6;4000:5;3993:21;4045:4;4038:5;4034:16;4083:3;4074:6;4069:3;4065:16;4062:25;4059:112;;;4090:79;;:::i;:::-;4059:112;4180:54;4227:6;4222:3;4217;4180:54;:::i;:::-;3900:340;3817:423;;;;;:::o;4259:338::-;4314:5;4363:3;4356:4;4348:6;4344:17;4340:27;4330:122;;4371:79;;:::i;:::-;4330:122;4488:6;4475:20;4513:78;4587:3;4579:6;4572:4;4564:6;4560:17;4513:78;:::i;:::-;4504:87;;4320:277;4259:338;;;;:::o;4603:308::-;4665:4;4755:18;4747:6;4744:30;4741:56;;;4777:18;;:::i;:::-;4741:56;4815:29;4837:6;4815:29;:::i;:::-;4807:37;;4899:4;4893;4889:15;4881:23;;4603:308;;;:::o;4917:425::-;4995:5;5020:66;5036:49;5078:6;5036:49;:::i;:::-;5020:66;:::i;:::-;5011:75;;5109:6;5102:5;5095:21;5147:4;5140:5;5136:16;5185:3;5176:6;5171:3;5167:16;5164:25;5161:112;;;5192:79;;:::i;:::-;5161:112;5282:54;5329:6;5324:3;5319;5282:54;:::i;:::-;5001:341;4917:425;;;;;:::o;5362:340::-;5418:5;5467:3;5460:4;5452:6;5448:17;5444:27;5434:122;;5475:79;;:::i;:::-;5434:122;5592:6;5579:20;5617:79;5692:3;5684:6;5677:4;5669:6;5665:17;5617:79;:::i;:::-;5608:88;;5424:278;5362:340;;;;:::o;5708:1157::-;5814:6;5822;5830;5879:2;5867:9;5858:7;5854:23;5850:32;5847:119;;;5885:79;;:::i;:::-;5847:119;6033:1;6022:9;6018:17;6005:31;6063:18;6055:6;6052:30;6049:117;;;6085:79;;:::i;:::-;6049:117;6190:62;6244:7;6235:6;6224:9;6220:22;6190:62;:::i;:::-;6180:72;;5976:286;6329:2;6318:9;6314:18;6301:32;6360:18;6352:6;6349:30;6346:117;;;6382:79;;:::i;:::-;6346:117;6487:63;6542:7;6533:6;6522:9;6518:22;6487:63;:::i;:::-;6477:73;;6272:288;6627:2;6616:9;6612:18;6599:32;6658:18;6650:6;6647:30;6644:117;;;6680:79;;:::i;:::-;6644:117;6785:63;6840:7;6831:6;6820:9;6816:22;6785:63;:::i;:::-;6775:73;;6570:288;5708:1157;;;;;:::o;6871:126::-;6908:7;6948:42;6941:5;6937:54;6926:65;;6871:126;;;:::o;7003:96::-;7040:7;7069:24;7087:5;7069:24;:::i;:::-;7058:35;;7003:96;;;:::o;7105:118::-;7192:24;7210:5;7192:24;:::i;:::-;7187:3;7180:37;7105:118;;:::o;7229:222::-;7322:4;7360:2;7349:9;7345:18;7337:26;;7373:71;7441:1;7430:9;7426:17;7417:6;7373:71;:::i;:::-;7229:222;;;;:::o;7457:122::-;7530:24;7548:5;7530:24;:::i;:::-;7523:5;7520:35;7510:63;;7569:1;7566;7559:12;7510:63;7457:122;:::o;7585:139::-;7631:5;7669:6;7656:20;7647:29;;7685:33;7712:5;7685:33;:::i;:::-;7585:139;;;;:::o;7730:652::-;7807:6;7815;7864:2;7852:9;7843:7;7839:23;7835:32;7832:119;;;7870:79;;:::i;:::-;7832:119;7990:1;8015:53;8060:7;8051:6;8040:9;8036:22;8015:53;:::i;:::-;8005:63;;7961:117;8145:2;8134:9;8130:18;8117:32;8176:18;8168:6;8165:30;8162:117;;;8198:79;;:::i;:::-;8162:117;8303:62;8357:7;8348:6;8337:9;8333:22;8303:62;:::i;:::-;8293:72;;8088:287;7730:652;;;;;:::o;8388:98::-;8439:6;8473:5;8467:12;8457:22;;8388:98;;;:::o;8492:168::-;8575:11;8609:6;8604:3;8597:19;8649:4;8644:3;8640:14;8625:29;;8492:168;;;;:::o;8666:139::-;8755:6;8750:3;8745;8739:23;8796:1;8787:6;8782:3;8778:16;8771:27;8666:139;;;:::o;8811:373::-;8897:3;8925:38;8957:5;8925:38;:::i;:::-;8979:70;9042:6;9037:3;8979:70;:::i;:::-;8972:77;;9058:65;9116:6;9111:3;9104:4;9097:5;9093:16;9058:65;:::i;:::-;9148:29;9170:6;9148:29;:::i;:::-;9143:3;9139:39;9132:46;;8901:283;8811:373;;;;:::o;9190:309::-;9301:4;9339:2;9328:9;9324:18;9316:26;;9388:9;9382:4;9378:20;9374:1;9363:9;9359:17;9352:47;9416:76;9487:4;9478:6;9416:76;:::i;:::-;9408:84;;9190:309;;;;:::o;9505:122::-;9578:24;9596:5;9578:24;:::i;:::-;9571:5;9568:35;9558:63;;9617:1;9614;9607:12;9558:63;9505:122;:::o;9633:139::-;9679:5;9717:6;9704:20;9695:29;;9733:33;9760:5;9733:33;:::i;:::-;9633:139;;;;:::o;9778:329::-;9837:6;9886:2;9874:9;9865:7;9861:23;9857:32;9854:119;;;9892:79;;:::i;:::-;9854:119;10012:1;10037:53;10082:7;10073:6;10062:9;10058:22;10037:53;:::i;:::-;10027:63;;9983:117;9778:329;;;;:::o;10113:474::-;10181:6;10189;10238:2;10226:9;10217:7;10213:23;10209:32;10206:119;;;10244:79;;:::i;:::-;10206:119;10364:1;10389:53;10434:7;10425:6;10414:9;10410:22;10389:53;:::i;:::-;10379:63;;10335:117;10491:2;10517:53;10562:7;10553:6;10542:9;10538:22;10517:53;:::i;:::-;10507:63;;10462:118;10113:474;;;;;:::o;10593:122::-;10666:24;10684:5;10666:24;:::i;:::-;10659:5;10656:35;10646:63;;10705:1;10702;10695:12;10646:63;10593:122;:::o;10721:139::-;10767:5;10805:6;10792:20;10783:29;;10821:33;10848:5;10821:33;:::i;:::-;10721:139;;;;:::o;10866:329::-;10925:6;10974:2;10962:9;10953:7;10949:23;10945:32;10942:119;;;10980:79;;:::i;:::-;10942:119;11100:1;11125:53;11170:7;11161:6;11150:9;11146:22;11125:53;:::i;:::-;11115:63;;11071:117;10866:329;;;;:::o;11201:99::-;11253:6;11287:5;11281:12;11271:22;;11201:99;;;:::o;11306:169::-;11390:11;11424:6;11419:3;11412:19;11464:4;11459:3;11455:14;11440:29;;11306:169;;;;:::o;11481:377::-;11569:3;11597:39;11630:5;11597:39;:::i;:::-;11652:71;11716:6;11711:3;11652:71;:::i;:::-;11645:78;;11732:65;11790:6;11785:3;11778:4;11771:5;11767:16;11732:65;:::i;:::-;11822:29;11844:6;11822:29;:::i;:::-;11817:3;11813:39;11806:46;;11573:285;11481:377;;;;:::o;11864:624::-;12053:4;12091:2;12080:9;12076:18;12068:26;;12140:9;12134:4;12130:20;12126:1;12115:9;12111:17;12104:47;12168:78;12241:4;12232:6;12168:78;:::i;:::-;12160:86;;12293:9;12287:4;12283:20;12278:2;12267:9;12263:18;12256:48;12321:78;12394:4;12385:6;12321:78;:::i;:::-;12313:86;;12409:72;12477:2;12466:9;12462:18;12453:6;12409:72;:::i;:::-;11864:624;;;;;;:::o;12494:834::-;12582:6;12590;12639:2;12627:9;12618:7;12614:23;12610:32;12607:119;;;12645:79;;:::i;:::-;12607:119;12793:1;12782:9;12778:17;12765:31;12823:18;12815:6;12812:30;12809:117;;;12845:79;;:::i;:::-;12809:117;12950:63;13005:7;12996:6;12985:9;12981:22;12950:63;:::i;:::-;12940:73;;12736:287;13090:2;13079:9;13075:18;13062:32;13121:18;13113:6;13110:30;13107:117;;;13143:79;;:::i;:::-;13107:117;13248:63;13303:7;13294:6;13283:9;13279:22;13248:63;:::i;:::-;13238:73;;13033:288;12494:834;;;;;:::o;13334:474::-;13402:6;13410;13459:2;13447:9;13438:7;13434:23;13430:32;13427:119;;;13465:79;;:::i;:::-;13427:119;13585:1;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13556:117;13712:2;13738:53;13783:7;13774:6;13763:9;13759:22;13738:53;:::i;:::-;13728:63;;13683:118;13334:474;;;;;:::o;13814:321::-;13901:4;13991:18;13983:6;13980:30;13977:56;;;14013:18;;:::i;:::-;13977:56;14063:4;14055:6;14051:17;14043:25;;14123:4;14117;14113:15;14105:23;;13814:321;;;:::o;14141:117::-;14250:1;14247;14240:12;14280:945;14386:5;14411:91;14427:74;14494:6;14427:74;:::i;:::-;14411:91;:::i;:::-;14402:100;;14522:5;14551:6;14544:5;14537:21;14585:4;14578:5;14574:16;14567:23;;14638:4;14630:6;14626:17;14618:6;14614:30;14667:3;14659:6;14656:15;14653:122;;;14686:79;;:::i;:::-;14653:122;14801:6;14784:435;14818:6;14813:3;14810:15;14784:435;;;14907:3;14894:17;14943:18;14930:11;14927:35;14924:122;;;14965:79;;:::i;:::-;14924:122;15089:11;15081:6;15077:24;15127:47;15170:3;15158:10;15127:47;:::i;:::-;15122:3;15115:60;15204:4;15199:3;15195:14;15188:21;;14860:359;;14844:4;14839:3;14835:14;14828:21;;14784:435;;;14788:21;14392:833;;14280:945;;;;;:::o;15247:390::-;15328:5;15377:3;15370:4;15362:6;15358:17;15354:27;15344:122;;15385:79;;:::i;:::-;15344:122;15502:6;15489:20;15527:104;15627:3;15619:6;15612:4;15604:6;15600:17;15527:104;:::i;:::-;15518:113;;15334:303;15247:390;;;;:::o;15643:1257::-;15799:6;15807;15815;15864:2;15852:9;15843:7;15839:23;15835:32;15832:119;;;15870:79;;:::i;:::-;15832:119;16018:1;16007:9;16003:17;15990:31;16048:18;16040:6;16037:30;16034:117;;;16070:79;;:::i;:::-;16034:117;16175:62;16229:7;16220:6;16209:9;16205:22;16175:62;:::i;:::-;16165:72;;15961:286;16314:2;16303:9;16299:18;16286:32;16345:18;16337:6;16334:30;16331:117;;;16367:79;;:::i;:::-;16331:117;16472:88;16552:7;16543:6;16532:9;16528:22;16472:88;:::i;:::-;16462:98;;16257:313;16637:2;16626:9;16622:18;16609:32;16668:18;16660:6;16657:30;16654:117;;;16690:79;;:::i;:::-;16654:117;16795:88;16875:7;16866:6;16855:9;16851:22;16795:88;:::i;:::-;16785:98;;16580:313;15643:1257;;;;;:::o;16906:114::-;16973:6;17007:5;17001:12;16991:22;;16906:114;;;:::o;17026:184::-;17125:11;17159:6;17154:3;17147:19;17199:4;17194:3;17190:14;17175:29;;17026:184;;;;:::o;17216:132::-;17283:4;17306:3;17298:11;;17336:4;17331:3;17327:14;17319:22;;17216:132;;;:::o;17354:108::-;17431:24;17449:5;17431:24;:::i;:::-;17426:3;17419:37;17354:108;;:::o;17468:179::-;17537:10;17558:46;17600:3;17592:6;17558:46;:::i;:::-;17636:4;17631:3;17627:14;17613:28;;17468:179;;;;:::o;17653:113::-;17723:4;17755;17750:3;17746:14;17738:22;;17653:113;;;:::o;17802:732::-;17921:3;17950:54;17998:5;17950:54;:::i;:::-;18020:86;18099:6;18094:3;18020:86;:::i;:::-;18013:93;;18130:56;18180:5;18130:56;:::i;:::-;18209:7;18240:1;18225:284;18250:6;18247:1;18244:13;18225:284;;;18326:6;18320:13;18353:63;18412:3;18397:13;18353:63;:::i;:::-;18346:70;;18439:60;18492:6;18439:60;:::i;:::-;18429:70;;18285:224;18272:1;18269;18265:9;18260:14;;18225:284;;;18229:14;18525:3;18518:10;;17926:608;;;17802:732;;;;:::o;18540:373::-;18683:4;18721:2;18710:9;18706:18;18698:26;;18770:9;18764:4;18760:20;18756:1;18745:9;18741:17;18734:47;18798:108;18901:4;18892:6;18798:108;:::i;:::-;18790:116;;18540:373;;;;:::o;18919:156::-;19028:6;19062:5;19056:12;19046:22;;18919:156;;;:::o;19081:226::-;19222:11;19256:6;19251:3;19244:19;19296:4;19291:3;19287:14;19272:29;;19081:226;;;;:::o;19313:174::-;19422:4;19445:3;19437:11;;19475:4;19470:3;19466:14;19458:22;;19313:174;;;:::o;19493:159::-;19567:11;19601:6;19596:3;19589:19;19641:4;19636:3;19632:14;19617:29;;19493:159;;;;:::o;19658:357::-;19736:3;19764:39;19797:5;19764:39;:::i;:::-;19819:61;19873:6;19868:3;19819:61;:::i;:::-;19812:68;;19889:65;19947:6;19942:3;19935:4;19928:5;19924:16;19889:65;:::i;:::-;19979:29;20001:6;19979:29;:::i;:::-;19974:3;19970:39;19963:46;;19740:275;19658:357;;;;:::o;20141:889::-;20284:3;20320:4;20315:3;20311:14;20407:4;20400:5;20396:16;20390:23;20460:3;20454:4;20450:14;20443:4;20438:3;20434:14;20427:38;20486:73;20554:4;20540:12;20486:73;:::i;:::-;20478:81;;20335:235;20655:4;20648:5;20644:16;20638:23;20708:3;20702:4;20698:14;20691:4;20686:3;20682:14;20675:38;20734:73;20802:4;20788:12;20734:73;:::i;:::-;20726:81;;20580:238;20911:4;20904:5;20900:16;20894:23;20930:63;20987:4;20982:3;20978:14;20964:12;20930:63;:::i;:::-;20828:175;21020:4;21013:11;;20289:741;20141:889;;;;:::o;21036:324::-;21189:10;21224:130;21350:3;21342:6;21224:130;:::i;:::-;21210:144;;21036:324;;;;:::o;21366:155::-;21478:4;21510;21505:3;21501:14;21493:22;;21366:155;;;:::o;21651:1247::-;21854:3;21883:96;21973:5;21883:96;:::i;:::-;21995:128;22116:6;22111:3;21995:128;:::i;:::-;21988:135;;22149:3;22194:4;22186:6;22182:17;22177:3;22173:27;22224:98;22316:5;22224:98;:::i;:::-;22345:7;22376:1;22361:492;22386:6;22383:1;22380:13;22361:492;;;22457:9;22451:4;22447:20;22442:3;22435:33;22508:6;22502:13;22536:148;22679:4;22664:13;22536:148;:::i;:::-;22528:156;;22707:102;22802:6;22707:102;:::i;:::-;22697:112;;22838:4;22833:3;22829:14;22822:21;;22421:432;22408:1;22405;22401:9;22396:14;;22361:492;;;22365:14;22869:4;22862:11;;22889:3;22882:10;;21859:1039;;;;;21651:1247;;;;:::o;22904:541::-;23131:4;23169:2;23158:9;23154:18;23146:26;;23218:9;23212:4;23208:20;23204:1;23193:9;23189:17;23182:47;23246:192;23433:4;23424:6;23246:192;:::i;:::-;23238:200;;22904:541;;;;:::o;23451:329::-;23510:6;23559:2;23547:9;23538:7;23534:23;23530:32;23527:119;;;23565:79;;:::i;:::-;23527:119;23685:1;23710:53;23755:7;23746:6;23735:9;23731:22;23710:53;:::i;:::-;23700:63;;23656:117;23451:329;;;;:::o;23786:148::-;23888:11;23925:3;23910:18;;23786:148;;;;:::o;23940:390::-;24046:3;24074:39;24107:5;24074:39;:::i;:::-;24129:89;24211:6;24206:3;24129:89;:::i;:::-;24122:96;;24227:65;24285:6;24280:3;24273:4;24266:5;24262:16;24227:65;:::i;:::-;24317:6;24312:3;24308:16;24301:23;;24050:280;23940:390;;;;:::o;24336:435::-;24516:3;24538:95;24629:3;24620:6;24538:95;:::i;:::-;24531:102;;24650:95;24741:3;24732:6;24650:95;:::i;:::-;24643:102;;24762:3;24755:10;;24336:435;;;;;:::o;24777:228::-;24917:34;24913:1;24905:6;24901:14;24894:58;24986:11;24981:2;24973:6;24969:15;24962:36;24777:228;:::o;25011:366::-;25153:3;25174:67;25238:2;25233:3;25174:67;:::i;:::-;25167:74;;25250:93;25339:3;25250:93;:::i;:::-;25368:2;25363:3;25359:12;25352:19;;25011:366;;;:::o;25383:419::-;25549:4;25587:2;25576:9;25572:18;25564:26;;25636:9;25630:4;25626:20;25622:1;25611:9;25607:17;25600:47;25664:131;25790:4;25664:131;:::i;:::-;25656:139;;25383:419;;;:::o;25808:180::-;25856:77;25853:1;25846:88;25953:4;25950:1;25943:15;25977:4;25974:1;25967:15;25994:320;26038:6;26075:1;26069:4;26065:12;26055:22;;26122:1;26116:4;26112:12;26143:18;26133:81;;26199:4;26191:6;26187:17;26177:27;;26133:81;26261:2;26253:6;26250:14;26230:18;26227:38;26224:84;;26280:18;;:::i;:::-;26224:84;26045:269;25994:320;;;:::o;26320:141::-;26369:4;26392:3;26384:11;;26415:3;26412:1;26405:14;26449:4;26446:1;26436:18;26428:26;;26320:141;;;:::o;26467:93::-;26504:6;26551:2;26546;26539:5;26535:14;26531:23;26521:33;;26467:93;;;:::o;26566:107::-;26610:8;26660:5;26654:4;26650:16;26629:37;;26566:107;;;;:::o;26679:393::-;26748:6;26798:1;26786:10;26782:18;26821:97;26851:66;26840:9;26821:97;:::i;:::-;26939:39;26969:8;26958:9;26939:39;:::i;:::-;26927:51;;27011:4;27007:9;27000:5;26996:21;26987:30;;27060:4;27050:8;27046:19;27039:5;27036:30;27026:40;;26755:317;;26679:393;;;;;:::o;27078:60::-;27106:3;27127:5;27120:12;;27078:60;;;:::o;27144:142::-;27194:9;27227:53;27245:34;27254:24;27272:5;27254:24;:::i;:::-;27245:34;:::i;:::-;27227:53;:::i;:::-;27214:66;;27144:142;;;:::o;27292:75::-;27335:3;27356:5;27349:12;;27292:75;;;:::o;27373:269::-;27483:39;27514:7;27483:39;:::i;:::-;27544:91;27593:41;27617:16;27593:41;:::i;:::-;27585:6;27578:4;27572:11;27544:91;:::i;:::-;27538:4;27531:105;27449:193;27373:269;;;:::o;27648:73::-;27693:3;27714:1;27707:8;;27648:73;:::o;27727:189::-;27804:32;;:::i;:::-;27845:65;27903:6;27895;27889:4;27845:65;:::i;:::-;27780:136;27727:189;;:::o;27922:186::-;27982:120;27999:3;27992:5;27989:14;27982:120;;;28053:39;28090:1;28083:5;28053:39;:::i;:::-;28026:1;28019:5;28015:13;28006:22;;27982:120;;;27922:186;;:::o;28114:543::-;28215:2;28210:3;28207:11;28204:446;;;28249:38;28281:5;28249:38;:::i;:::-;28333:29;28351:10;28333:29;:::i;:::-;28323:8;28319:44;28516:2;28504:10;28501:18;28498:49;;;28537:8;28522:23;;28498:49;28560:80;28616:22;28634:3;28616:22;:::i;:::-;28606:8;28602:37;28589:11;28560:80;:::i;:::-;28219:431;;28204:446;28114:543;;;:::o;28663:117::-;28717:8;28767:5;28761:4;28757:16;28736:37;;28663:117;;;;:::o;28786:169::-;28830:6;28863:51;28911:1;28907:6;28899:5;28896:1;28892:13;28863:51;:::i;:::-;28859:56;28944:4;28938;28934:15;28924:25;;28837:118;28786:169;;;;:::o;28960:295::-;29036:4;29182:29;29207:3;29201:4;29182:29;:::i;:::-;29174:37;;29244:3;29241:1;29237:11;29231:4;29228:21;29220:29;;28960:295;;;;:::o;29260:1395::-;29377:37;29410:3;29377:37;:::i;:::-;29479:18;29471:6;29468:30;29465:56;;;29501:18;;:::i;:::-;29465:56;29545:38;29577:4;29571:11;29545:38;:::i;:::-;29630:67;29690:6;29682;29676:4;29630:67;:::i;:::-;29724:1;29748:4;29735:17;;29780:2;29772:6;29769:14;29797:1;29792:618;;;;30454:1;30471:6;30468:77;;;30520:9;30515:3;30511:19;30505:26;30496:35;;30468:77;30571:67;30631:6;30624:5;30571:67;:::i;:::-;30565:4;30558:81;30427:222;29762:887;;29792:618;29844:4;29840:9;29832:6;29828:22;29878:37;29910:4;29878:37;:::i;:::-;29937:1;29951:208;29965:7;29962:1;29959:14;29951:208;;;30044:9;30039:3;30035:19;30029:26;30021:6;30014:42;30095:1;30087:6;30083:14;30073:24;;30142:2;30131:9;30127:18;30114:31;;29988:4;29985:1;29981:12;29976:17;;29951:208;;;30187:6;30178:7;30175:19;30172:179;;;30245:9;30240:3;30236:19;30230:26;30288:48;30330:4;30322:6;30318:17;30307:9;30288:48;:::i;:::-;30280:6;30273:64;30195:156;30172:179;30397:1;30393;30385:6;30381:14;30377:22;30371:4;30364:36;29799:611;;;29762:887;;29352:1303;;;29260:1395;;:::o;30661:514::-;30822:4;30860:2;30849:9;30845:18;30837:26;;30909:9;30903:4;30899:20;30895:1;30884:9;30880:17;30873:47;30937:78;31010:4;31001:6;30937:78;:::i;:::-;30929:86;;31062:9;31056:4;31052:20;31047:2;31036:9;31032:18;31025:48;31090:78;31163:4;31154:6;31090:78;:::i;:::-;31082:86;;30661:514;;;;;:::o;31181:147::-;31282:11;31319:3;31304:18;;31181:147;;;;:::o;31334:386::-;31438:3;31466:38;31498:5;31466:38;:::i;:::-;31520:88;31601:6;31596:3;31520:88;:::i;:::-;31513:95;;31617:65;31675:6;31670:3;31663:4;31656:5;31652:16;31617:65;:::i;:::-;31707:6;31702:3;31698:16;31691:23;;31442:278;31334:386;;;;:::o;31726:271::-;31856:3;31878:93;31967:3;31958:6;31878:93;:::i;:::-;31871:100;;31988:3;31981:10;;31726:271;;;;:::o;32003:227::-;32143:34;32139:1;32131:6;32127:14;32120:58;32212:10;32207:2;32199:6;32195:15;32188:35;32003:227;:::o;32236:366::-;32378:3;32399:67;32463:2;32458:3;32399:67;:::i;:::-;32392:74;;32475:93;32564:3;32475:93;:::i;:::-;32593:2;32588:3;32584:12;32577:19;;32236:366;;;:::o;32608:419::-;32774:4;32812:2;32801:9;32797:18;32789:26;;32861:9;32855:4;32851:20;32847:1;32836:9;32832:17;32825:47;32889:131;33015:4;32889:131;:::i;:::-;32881:139;;32608:419;;;:::o;33033:234::-;33173:34;33169:1;33161:6;33157:14;33150:58;33242:17;33237:2;33229:6;33225:15;33218:42;33033:234;:::o;33273:366::-;33415:3;33436:67;33500:2;33495:3;33436:67;:::i;:::-;33429:74;;33512:93;33601:3;33512:93;:::i;:::-;33630:2;33625:3;33621:12;33614:19;;33273:366;;;:::o;33645:419::-;33811:4;33849:2;33838:9;33834:18;33826:26;;33898:9;33892:4;33888:20;33884:1;33873:9;33869:17;33862:47;33926:131;34052:4;33926:131;:::i;:::-;33918:139;;33645:419;;;:::o;34070:233::-;34210:34;34206:1;34198:6;34194:14;34187:58;34279:16;34274:2;34266:6;34262:15;34255:41;34070:233;:::o;34309:366::-;34451:3;34472:67;34536:2;34531:3;34472:67;:::i;:::-;34465:74;;34548:93;34637:3;34548:93;:::i;:::-;34666:2;34661:3;34657:12;34650:19;;34309:366;;;:::o;34681:419::-;34847:4;34885:2;34874:9;34870:18;34862:26;;34934:9;34928:4;34924:20;34920:1;34909:9;34905:17;34898:47;34962:131;35088:4;34962:131;:::i;:::-;34954:139;;34681:419;;;:::o;35106:180::-;35154:77;35151:1;35144:88;35251:4;35248:1;35241:15;35275:4;35272:1;35265:15;35292:167;35432:19;35428:1;35420:6;35416:14;35409:43;35292:167;:::o;35465:366::-;35607:3;35628:67;35692:2;35687:3;35628:67;:::i;:::-;35621:74;;35704:93;35793:3;35704:93;:::i;:::-;35822:2;35817:3;35813:12;35806:19;;35465:366;;;:::o;35837:419::-;36003:4;36041:2;36030:9;36026:18;36018:26;;36090:9;36084:4;36080:20;36076:1;36065:9;36061:17;36054:47;36118:131;36244:4;36118:131;:::i;:::-;36110:139;;35837:419;;;:::o;36262:171::-;36402:23;36398:1;36390:6;36386:14;36379:47;36262:171;:::o;36439:366::-;36581:3;36602:67;36666:2;36661:3;36602:67;:::i;:::-;36595:74;;36678:93;36767:3;36678:93;:::i;:::-;36796:2;36791:3;36787:12;36780:19;;36439:366;;;:::o;36811:419::-;36977:4;37015:2;37004:9;37000:18;36992:26;;37064:9;37058:4;37054:20;37050:1;37039:9;37035:17;37028:47;37092:131;37218:4;37092:131;:::i;:::-;37084:139;;36811:419;;;:::o;37236:173::-;37376:25;37372:1;37364:6;37360:14;37353:49;37236:173;:::o;37415:402::-;37575:3;37596:85;37678:2;37673:3;37596:85;:::i;:::-;37589:92;;37690:93;37779:3;37690:93;:::i;:::-;37808:2;37803:3;37799:12;37792:19;;37415:402;;;:::o;37823:167::-;37963:19;37959:1;37951:6;37947:14;37940:43;37823:167;:::o;37996:402::-;38156:3;38177:85;38259:2;38254:3;38177:85;:::i;:::-;38170:92;;38271:93;38360:3;38271:93;:::i;:::-;38389:2;38384:3;38380:12;38373:19;;37996:402;;;:::o;38404:967::-;38786:3;38808:148;38952:3;38808:148;:::i;:::-;38801:155;;38973:95;39064:3;39055:6;38973:95;:::i;:::-;38966:102;;39085:148;39229:3;39085:148;:::i;:::-;39078:155;;39250:95;39341:3;39332:6;39250:95;:::i;:::-;39243:102;;39362:3;39355:10;;38404:967;;;;;:::o;39377:313::-;39490:4;39528:2;39517:9;39513:18;39505:26;;39577:9;39571:4;39567:20;39563:1;39552:9;39548:17;39541:47;39605:78;39678:4;39669:6;39605:78;:::i;:::-;39597:86;;39377:313;;;;:::o;39696:149::-;39732:7;39772:66;39765:5;39761:78;39750:89;;39696:149;;;:::o;39851:78::-;39889:7;39918:5;39907:16;;39851:78;;;:::o;39935:153::-;40038:43;40057:23;40074:5;40057:23;:::i;:::-;40038:43;:::i;:::-;40033:3;40026:56;39935:153;;:::o;40094:94::-;40127:8;40175:5;40171:2;40167:14;40146:35;;40094:94;;;:::o;40194:::-;40233:7;40262:20;40276:5;40262:20;:::i;:::-;40251:31;;40194:94;;;:::o;40294:100::-;40333:7;40362:26;40382:5;40362:26;:::i;:::-;40351:37;;40294:100;;;:::o;40400:157::-;40505:45;40525:24;40543:5;40525:24;:::i;:::-;40505:45;:::i;:::-;40500:3;40493:58;40400:157;;:::o;40563:79::-;40602:7;40631:5;40620:16;;40563:79;;;:::o;40648:157::-;40753:45;40773:24;40791:5;40773:24;:::i;:::-;40753:45;:::i;:::-;40748:3;40741:58;40648:157;;:::o;40811:674::-;41005:3;41020:73;41089:3;41080:6;41020:73;:::i;:::-;41118:1;41113:3;41109:11;41102:18;;41130:75;41201:3;41192:6;41130:75;:::i;:::-;41230:2;41225:3;41221:12;41214:19;;41243:75;41314:3;41305:6;41243:75;:::i;:::-;41343:2;41338:3;41334:12;41327:19;;41356:75;41427:3;41418:6;41356:75;:::i;:::-;41456:2;41451:3;41447:12;41440:19;;41476:3;41469:10;;40811:674;;;;;;;:::o;41491:214::-;41631:66;41627:1;41619:6;41615:14;41608:90;41491:214;:::o;41711:400::-;41871:3;41892:84;41974:1;41969:3;41892:84;:::i;:::-;41885:91;;41985:93;42074:3;41985:93;:::i;:::-;42103:1;42098:3;42094:11;42087:18;;41711:400;;;:::o;42117:214::-;42257:66;42253:1;42245:6;42241:14;42234:90;42117:214;:::o;42337:400::-;42497:3;42518:84;42600:1;42595:3;42518:84;:::i;:::-;42511:91;;42611:93;42700:3;42611:93;:::i;:::-;42729:1;42724:3;42720:11;42713:18;;42337:400;;;:::o;42743:788::-;43057:3;43079:148;43223:3;43079:148;:::i;:::-;43072:155;;43237:75;43308:3;43299:6;43237:75;:::i;:::-;43337:2;43332:3;43328:12;43321:19;;43357:148;43501:3;43357:148;:::i;:::-;43350:155;;43522:3;43515:10;;42743:788;;;;:::o;43537:180::-;43585:77;43582:1;43575:88;43682:4;43679:1;43672:15;43706:4;43703:1;43696:15;43723:410;43763:7;43786:20;43804:1;43786:20;:::i;:::-;43781:25;;43820:20;43838:1;43820:20;:::i;:::-;43815:25;;43875:1;43872;43868:9;43897:30;43915:11;43897:30;:::i;:::-;43886:41;;44076:1;44067:7;44063:15;44060:1;44057:22;44037:1;44030:9;44010:83;43987:139;;44106:18;;:::i;:::-;43987:139;43771:362;43723:410;;;;:::o;44139:191::-;44179:3;44198:20;44216:1;44198:20;:::i;:::-;44193:25;;44232:20;44250:1;44232:20;:::i;:::-;44227:25;;44275:1;44272;44268:9;44261:16;;44296:3;44293:1;44290:10;44287:36;;;44303:18;;:::i;:::-;44287:36;44139:191;;;;:::o;44336:171::-;44375:3;44398:24;44416:5;44398:24;:::i;:::-;44389:33;;44444:4;44437:5;44434:15;44431:41;;44452:18;;:::i;:::-;44431:41;44499:1;44492:5;44488:13;44481:20;;44336:171;;;:::o;44513:182::-;44653:34;44649:1;44641:6;44637:14;44630:58;44513:182;:::o;44701:366::-;44843:3;44864:67;44928:2;44923:3;44864:67;:::i;:::-;44857:74;;44940:93;45029:3;44940:93;:::i;:::-;45058:2;45053:3;45049:12;45042:19;;44701:366;;;:::o;45073:419::-;45239:4;45277:2;45266:9;45262:18;45254:26;;45326:9;45320:4;45316:20;45312:1;45301:9;45297:17;45290:47;45354:131;45480:4;45354:131;:::i;:::-;45346:139;;45073:419;;;:::o;45498:194::-;45538:4;45558:20;45576:1;45558:20;:::i;:::-;45553:25;;45592:20;45610:1;45592:20;:::i;:::-;45587:25;;45636:1;45633;45629:9;45621:17;;45660:1;45654:4;45651:11;45648:37;;;45665:18;;:::i;:::-;45648:37;45498:194;;;;:::o;45698:180::-;45746:77;45743:1;45736:88;45843:4;45840:1;45833:15;45867:4;45864:1;45857:15
Swarm Source
ipfs://f866333c394b7b7a7d7bb2e020a58be923ae4add33bb2db3849d69d6934fd490
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.