Source Code
Overview
XPL Balance
XPL Value
$0.00Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
EUROPToken
Compiler Version
v0.8.8+commit.dddeac2f
Contract Source Code (Solidity)
/** *Submitted for verification at plasmascan.to on 2025-12-19 */ // Sources flattened with hardhat v2.22.5 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMathUpgradeable { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { 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 = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMathUpgradeable.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { 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); _; } function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).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 ", StringsUpgradeable.toHexString(account), " is missing role ", StringsUpgradeable.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()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerableUpgradeable is IAccessControlUpgradeable { /** * @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); } // File @openzeppelin/contracts-upgradeable/utils/structs/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * 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 EnumerableSetUpgradeable { // 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; } } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable { using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; mapping(bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers; function __AccessControlEnumerable_init() internal onlyInitializing { } function __AccessControlEnumerable_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerableUpgradeable).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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // File @openzeppelin/contracts-upgradeable/proxy/beacon/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // File @openzeppelin/contracts-upgradeable/proxy/ERC1967/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[45] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable { function __ERC20Burnable_init() internal onlyInitializing { } function __ERC20Burnable_init_unchained() internal onlyInitializing { } /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * * IMPORTANT: This contract does not include public pause and unpause functions. In * addition to inheriting this contract, you must define both functions, invoking the * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will * make the contract unpausable. */ abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable { function __ERC20Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __ERC20Pausable_init_unchained() internal onlyInitializing { } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/presets/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/presets/ERC20PresetMinterPauser.sol) pragma solidity ^0.8.0; /** * @dev {ERC20} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. * * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ */ contract ERC20PresetMinterPauserUpgradeable is Initializable, ContextUpgradeable, AccessControlEnumerableUpgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); function initialize(string memory name, string memory symbol) public virtual initializer { __ERC20PresetMinterPauser_init(name, symbol); } /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * See {ERC20-constructor}. */ function __ERC20PresetMinterPauser_init(string memory name, string memory symbol) internal onlyInitializing { __ERC20_init_unchained(name, symbol); __Pausable_init_unchained(); __ERC20PresetMinterPauser_init_unchained(name, symbol); } function __ERC20PresetMinterPauser_init_unchained(string memory, string memory) internal onlyInitializing { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 amount) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); _mint(to, amount); } /** * @dev Pauses all token transfers. * * See {ERC20Pausable} and {Pausable-_pause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * * See {ERC20Pausable} and {Pausable-_unpause}. * * Requirements: * * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause"); _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override(ERC20Upgradeable, ERC20PausableUpgradeable) { super._beforeTokenTransfer(from, to, amount); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol) pragma solidity ^0.8.0; interface IERC5267Upgradeable { /** * @dev MAY be emitted to signal that the domain could have changed. */ event EIP712DomainChanged(); /** * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 * signature. */ function eip712Domain() external view returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ); } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.8; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. * * _Available since v3.4._ * * @custom:storage-size 52 */ abstract contract EIP712Upgradeable is Initializable, IERC5267Upgradeable { bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); /// @custom:oz-renamed-from _HASHED_NAME bytes32 private _hashedName; /// @custom:oz-renamed-from _HASHED_VERSION bytes32 private _hashedVersion; string private _name; string private _version; /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ function __EIP712_init(string memory name, string memory version) internal onlyInitializing { __EIP712_init_unchained(name, version); } function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing { _name = name; _version = version; // Reset prior values in storage if upgrading _hashedName = 0; _hashedVersion = 0; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { return _buildDomainSeparator(); } function _buildDomainSeparator() private view returns (bytes32) { return keccak256(abi.encode(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev See {EIP-5267}. * * _Available since v4.9._ */ function eip712Domain() public view virtual override returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ) { // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized // and the EIP712 domain is not reliable, as it will be missing name and version. require(_hashedName == 0 && _hashedVersion == 0, "EIP712: Uninitialized"); return ( hex"0f", // 01111 _EIP712Name(), _EIP712Version(), block.chainid, address(this), bytes32(0), new uint256[](0) ); } /** * @dev The name parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712Name() internal virtual view returns (string memory) { return _name; } /** * @dev The version parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712Version() internal virtual view returns (string memory) { return _version; } /** * @dev The hash of the name parameter for the EIP712 domain. * * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead. */ function _EIP712NameHash() internal view returns (bytes32) { string memory name = _EIP712Name(); if (bytes(name).length > 0) { return keccak256(bytes(name)); } else { // If the name is empty, the contract may have been upgraded without initializing the new storage. // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design. bytes32 hashedName = _hashedName; if (hashedName != 0) { return hashedName; } else { return keccak256(""); } } } /** * @dev The hash of the version parameter for the EIP712 domain. * * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead. */ function _EIP712VersionHash() internal view returns (bytes32) { string memory version = _EIP712Version(); if (bytes(version).length > 0) { return keccak256(bytes(version)); } else { // If the version is empty, the contract may have been upgraded without initializing the new storage. // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design. bytes32 hashedVersion = _hashedVersion; if (hashedVersion != 0) { return hashedVersion; } else { return keccak256(""); } } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; // EIP-712 is Final as of 2022-08-11. This file is deprecated. // File Contracts/Blacklistable.sol /** * * Copyright (c) 2023 SCEME SAS * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ pragma solidity ^0.8.0; /** * @title Blacklistable Token * @dev Allows accounts to be blacklisted by a "blacklister" role */ contract Blacklistable is OwnableUpgradeable { address public blacklister; mapping(address => bool) internal blacklisted; event Blacklisted(address indexed _account); event UnBlacklisted(address indexed _account); event BlacklisterChanged(address indexed newBlacklister); /** * @dev Throws if called by any account other than the blacklister */ modifier onlyBlacklister() { require( msg.sender == blacklister, "Blacklistable: caller is not the blacklister" ); _; } /** * @dev Throws if argument account is blacklisted * @param account The address to check */ modifier notBlacklisted(address account) { require( !blacklisted[account], "Blacklistable: account is blacklisted" ); _; } /** * @dev Checks if account is blacklisted * @param account The address to check */ function isBlacklisted(address account) external view returns (bool) { return blacklisted[account]; } /** * @dev Adds account to blacklist * @param account The address to blacklist */ function blacklist(address account) external onlyBlacklister { blacklisted[account] = true; emit Blacklisted(account); } /** * @dev Removes account from blacklist * @param account The address to remove from the blacklist */ function unBlacklist(address account) external onlyBlacklister { blacklisted[account] = false; emit UnBlacklisted(account); } function updateBlacklister(address newBlacklister) internal { require( newBlacklister != address(0), "Blacklistable: new blacklister is the zero address" ); blacklister = newBlacklister; emit BlacklisterChanged(blacklister); } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File Contracts/ERC20MetaTxUpgradeable.sol /** * * Copyright (c) 2023 SCEME SAS * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20MetaTxUpgradeable is Initializable, ERC20Upgradeable, EIP712Upgradeable { using CountersUpgradeable for CountersUpgradeable.Counter; mapping(address => CountersUpgradeable.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private _PERMIT_TYPEHASH; bytes32 private _TWA_TYPEHASH; /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ function __ERC20MetaTx_init(string memory name) internal onlyInitializing { __Context_init_unchained(); __EIP712_init_unchained(name, "1"); __ERC20MetaTx_init_unchained(); } function __ERC20MetaTx_init_unchained() internal onlyInitializing { _PERMIT_TYPEHASH = keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ); _TWA_TYPEHASH = keccak256( "TransferWithAuthorization(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ); } /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external virtual { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSAUpgradeable.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } function transferWithAuthorization( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external virtual { require(block.timestamp <= deadline, "ERC20TWA: expired deadline"); bytes32 structHash = keccak256(abi.encode(_TWA_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSAUpgradeable.recover(hash, v, r, s); require(signer == owner, "ERC20TWA: invalid signature:"); _transfer(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { CountersUpgradeable.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } uint256[49] private __gap; } // File Contracts/Token.sol /** * * Copyright (c) 2023 SCEME SAS * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ pragma solidity ^0.8.0; contract EUROPToken is Initializable, ERC20PresetMinterPauserUpgradeable, ERC20MetaTxUpgradeable, Blacklistable, UUPSUpgradeable { bytes32 public constant ADMIN = keccak256('ADMIN'); bytes32 public constant MASTER_MINTER = keccak256('MASTER_MINTER'); mapping(address => uint256) public minterAllowed; address private _trustedForwarder; address private _feesFaucet; uint256 private _txfeeRate; uint256 private _gaslessBasefee; uint8 constant DECIMALS = 6; uint256 constant FEE_RATIO = 10000; event Mint(address indexed minter, address indexed to, uint256 amount); event MinterConfigured(address indexed minter, uint256 minterAllowedAmount); event FeeFaucetUpdated(address newFeeFaucet); event TxFeeRateUpdated(uint256 newTxFeeRate); event GaslessBasefeeUpdated(uint256 newGaslessBasefee); event TrustedForwarderUpdated(address newTrustedForwarder); /// @custom:oz-upgrades-unsafe-allow constructor constructor() initializer {} function initializeEUROP() initializer public { __ERC20PresetMinterPauser_init(unicode"EURØP", "EUROP"); __ERC20MetaTx_init("EUROP"); __UUPSUpgradeable_init(); __Ownable_init(); _setRoleAdmin(MINTER_ROLE, MASTER_MINTER); _setupRole(ADMIN, address(0)); _setupRole(MASTER_MINTER, address(0)); _txfeeRate = 0; _gaslessBasefee = 0; } function decimals() public view virtual override returns (uint8) { return DECIMALS; } /** * @dev Function to update the admin * @param newAdmin The address of the admin */ function setAdministrator(address newAdmin) onlyOwner public virtual { revokeRole(ADMIN, getRoleMember(ADMIN, 0)); revokeRole(PAUSER_ROLE, getRoleMember(PAUSER_ROLE, 0)); grantRole(ADMIN, newAdmin); grantRole(PAUSER_ROLE, newAdmin); updateBlacklister(newAdmin); } /** * @dev Function to update the masterMinter * @param newMasterMinter The address of the masterMinter */ function setMasterMinter(address newMasterMinter) public virtual { revokeRole(MASTER_MINTER, getRoleMember(MASTER_MINTER, 0)); grantRole(MASTER_MINTER, newMasterMinter); } /** * @dev Ignore this function, it's just to test the upgradeability logic */ function doNothing() public pure returns(bool){ return true; } /** * @dev Override ownable implementation to make sure the new owner is also the new admin * @param newOwner The address of the owner */ function transferOwnership(address newOwner) public override onlyOwner { setOwner(newOwner); } /** * @dev Function to update the DEFAULT_ADMIN_ROLE and owner * @param newOwner The address of the owner */ function setOwner(address newOwner) public virtual { // Sanity check if(newOwner == address(0) || newOwner == owner()) return; grantRole(DEFAULT_ADMIN_ROLE, newOwner);//_owner revokeRole(DEFAULT_ADMIN_ROLE, getRoleMember(DEFAULT_ADMIN_ROLE, 0)); super.transferOwnership(newOwner); } function _authorizeUpgrade(address newImplementation) internal onlyRole(DEFAULT_ADMIN_ROLE) override {} /** * @dev Function to set feesFaucet * @param feesFaucet New feesFaucet address */ function setFeeFaucet(address feesFaucet) external onlyRole(ADMIN){ require(feesFaucet != address(0), "EUROP: new feesFaucet can't be address 0"); _feesFaucet = feesFaucet; emit FeeFaucetUpdated(feesFaucet); } /** * @dev Function to update tx fee rate * @param newRate The address of the minter */ function updateTxFeeRate(uint256 newRate) external onlyRole(ADMIN){ require(newRate <= FEE_RATIO, "EUROP: new rate too high"); //out of 10000 _txfeeRate = newRate; emit TxFeeRateUpdated(_txfeeRate); } /** * @dev Function to update tx fee rate */ function getTxFeeRate() public view returns(uint256){ return _txfeeRate; } /** * @dev Function to calculate fees * @param txAmount amount of the transaction in eurus */ function calculateTxFee(uint256 txAmount) public view returns(uint256){ return txAmount * _txfeeRate / FEE_RATIO; } /** * @dev Function to trigger tx fee payment to feesFaucet (internal) * @param from The address of the payer * @param txAmount amount of the transaction in eurus */ function _payTxFee(address from, uint256 txAmount) internal returns(bool) { uint256 txFees = calculateTxFee(txAmount); require(balanceOf(from) >= txFees + txAmount, "EUROP: tx fees"); if (_feesFaucet != address(0)){ _transfer(from, _feesFaucet, txFees); } return true; } /** * @dev Function to update gasless tx basefee * @param newBaseFee new gasless basefee amount */ function updateGaslessBasefee(uint256 newBaseFee) external onlyRole(ADMIN){ _gaslessBasefee = newBaseFee; emit GaslessBasefeeUpdated(newBaseFee); } /** * @dev Function to get gasless basefee */ function getGaslessBasefee() public view returns(uint256){ return _gaslessBasefee; } /** * @dev Function to trigger gaslessBasefee payment from payer to paymaster * Can only be called from trustedForwarder * @param payer Address of basefee payer (meta-tx signer) * @param paymaster Address of paymester (meta-tx executer) */ function payGaslessBasefee(address payer, address paymaster) external { require(isTrustedForwarder(msg.sender), "EUROP: only trustedForwarder can process gasless basefee payment"); require(balanceOf(payer) >= _gaslessBasefee, "EUROP: balance too low, can't pay gasless basefee"); uint256 feeRate = _txfeeRate; _txfeeRate = 0; _transfer(payer, paymaster, _gaslessBasefee); _txfeeRate = feeRate; } /** * @dev Function to add/update a new minter * @param minter The address of the minter * @param minterAllowedAmount The minting amount allowed for the minter */ function addMinter(address minter, uint256 minterAllowedAmount) external virtual { minterAllowed[minter] = minterAllowedAmount; grantRole(MINTER_ROLE, minter); } /** * @dev Function to remove a minter * @param minter The address of the minter to remove */ function removeMinter(address minter) external virtual { minterAllowed[minter] = 0; revokeRole(MINTER_ROLE, minter); } /** * @dev Function to update the minting allowance of a minter * @param minter The address of the minter * @param minterAllowedAmount The new minting amount allowed for the minter */ function updateMintingAllowance(address minter, uint256 minterAllowedAmount) external virtual onlyRole(MASTER_MINTER) { require(hasRole(MINTER_ROLE, minter), "EUROP: only minter can have minting allowance"); minterAllowed[minter] = minterAllowedAmount; } /** * @dev Function to mint tokens * @param to The address that will receive the minted tokens. * @param amount The amount of tokens to mint. Must be less than or equal * to the minterAllowance of the caller. */ function mint(address to, uint256 amount) public whenNotPaused notBlacklisted(to) override { require((hasRole(MASTER_MINTER, _msgSender()) || hasRole(MINTER_ROLE, _msgSender())), "EUROP: not allowed to mint"); require(amount > 0, "EUROP: mint amount not greater than 0"); // MINTER_ROLE allowance management if(hasRole(MINTER_ROLE, _msgSender())) { uint256 mintingAllowedAmount = minterAllowed[_msgSender()]; require( amount <= mintingAllowedAmount, "EUROP: mint amount exceeds minterAllowance" ); minterAllowed[_msgSender()] = mintingAllowedAmount - amount ; } _mint(to, amount); emit Mint(_msgSender(), to, amount); } /** * @dev allows a minter to burn some of its own tokens * Validates that caller is a minter and that sender is not blacklisted * amount is less than or equal to the minter's account balance * @param amount uint256 the amount of tokens to be burned */ function burn(uint256 amount) public virtual override whenNotPaused notBlacklisted(_msgSender()) { require((hasRole(MASTER_MINTER, _msgSender()) || hasRole(MINTER_ROLE, _msgSender())) ,"EUROP: not allowed to burn"); _burn(_msgSender(), amount); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20Upgradeable, ERC20PresetMinterPauserUpgradeable) { super._beforeTokenTransfer(from, to, amount); } function _transfer( address sender, address recipient, uint256 amount ) internal virtual override notBlacklisted(sender) notBlacklisted(recipient) { if(_txfeeRate > 0 && recipient != _feesFaucet) _payTxFee(sender, amount); super._transfer(sender, recipient, amount); } /** * @dev force a transfer from any account to any account * Validates that caller is the admin * @param from address the account from which to send * @param to address the account that will receive the tokens * @param amount uint256 the amount of token to send */ function forceTransfer(address from, address to, uint256 amount) external virtual onlyRole(ADMIN) { super._transfer(from, to, amount); } /** * @dev Function to update trustedForwarder * @param trustedForwarder Address of new trustedForwarder */ function setTrustedForwarder(address trustedForwarder) external onlyRole(ADMIN) { require(trustedForwarder != address(0), "EUROP: new trustedForwarder can't be address 0"); _trustedForwarder = trustedForwarder; emit TrustedForwarderUpdated(_trustedForwarder); } /** * @dev Function to check if caller is a trusted Forwarder * @param forwarder The address of the forwarder */ function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return forwarder == _trustedForwarder; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"Blacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBlacklister","type":"address"}],"name":"BlacklisterChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newFeeFaucet","type":"address"}],"name":"FeeFaucetUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newGaslessBasefee","type":"uint256"}],"name":"GaslessBasefeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"minterAllowedAmount","type":"uint256"}],"name":"MinterConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newTrustedForwarder","type":"address"}],"name":"TrustedForwarderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTxFeeRate","type":"uint256"}],"name":"TxFeeRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"UnBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MASTER_MINTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"minterAllowedAmount","type":"uint256"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blacklister","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"txAmount","type":"uint256"}],"name":"calculateTxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"doNothing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"forceTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getGaslessBasefee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"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":[],"name":"getTxFeeRate","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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeEUROP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minterAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payer","type":"address"},{"internalType":"address","name":"paymaster","type":"address"}],"name":"payGaslessBasefee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdministrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feesFaucet","type":"address"}],"name":"setFeeFaucet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMasterMinter","type":"address"}],"name":"setMasterMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trustedForwarder","type":"address"}],"name":"setTrustedForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBaseFee","type":"uint256"}],"name":"updateGaslessBasefee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"minterAllowedAmount","type":"uint256"}],"name":"updateMintingAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"updateTxFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
60a06040523060601b6080523480156200001857600080fd5b50600054610100900460ff16158080156200003a5750600054600160ff909116105b806200006a575062000057306200014460201b620029e91760201c565b1580156200006a575060005460ff166001145b620000d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff191660011790558015620000f6576000805461ff0019166101001790555b80156200013d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5062000153565b6001600160a01b03163b151590565b60805160601c6151636200018e60003960008181611273015281816112f801528181611a5d01528181611ae20152611bc801526151636000f3fe6080604052600436106103de5760003560e01c8063706d4b881161020d578063a9059cbb11610128578063dd62ed3e116100bb578063ea923e8f1161008a578063f9f92be41161006f578063f9f92be414610c27578063fa3f323a14610c47578063fe575a8714610c6757600080fd5b8063ea923e8f14610be7578063f2fde38b14610c0757600080fd5b8063dd62ed3e14610b38578063df8089ef14610b7e578063e63ab1e914610b9e578063e9c2917814610bd257600080fd5b8063d505accf116100f7578063d505accf14610aa4578063d539139314610ac4578063d547741f14610af8578063da74222814610b1857600080fd5b8063a9059cbb14610a23578063a94bdb9014610a43578063bd10243014610a63578063ca15c87314610a8457600080fd5b80638da5cb5b116101a0578063994c4a361161016f578063994c4a36146109ae5780639a44e987146109ce578063a217fddf146109ee578063a457c2d714610a0357600080fd5b80638da5cb5b146109005780639010d07c1461093357806391d148541461095357806395d89b411461099957600080fd5b806379cc6790116101dc57806379cc6790146108835780637ecebe00146108a35780638456cb59146108c357806384b0196e146108d857600080fd5b8063706d4b88146107f857806370a0823114610818578063715018a61461084e578063761248b41461086357600080fd5b80633142b012116102fd57806342966c681161029057806352d1902d1161025f57806352d1902d1461078457806353068e3614610799578063572b6c05146107af5780635c975abb146107df57600080fd5b806342966c681461070357806346946dfa146107235780634cd88b76146107515780634f1ef2861461077157600080fd5b80633659cfe6116102cc5780633659cfe61461068e57806339509351146106ae5780633f4ba83a146106ce57806340c10f19146106e357600080fd5b80633142b0121461060557806333bebb77146106395780633644e5151461065957806336568abe1461066e57600080fd5b80631a895266116103755780632f2ff15d116103445780632f2ff15d146105955780632f576f20146105b55780633092afd5146105c9578063313ce567146105e957600080fd5b80631a895266146104f157806323b872dd14610511578063248a9ca3146105315780632a0acc6a1461056157600080fd5b806312ce4cc5116103b157806312ce4cc51461047c57806313af40351461049c57806317e6f547146104bc57806318160ddd146104dc57600080fd5b806301ffc9a7146103e357806306fdde0314610418578063095ea7b31461043a5780631029f4671461045a575b600080fd5b3480156103ef57600080fd5b506104036103fe366004614aec565b610ca1565b60405190151581526020015b60405180910390f35b34801561042457600080fd5b5061042d610ce5565b60405161040f9190614b6e565b34801561044657600080fd5b50610403610455366004614b9d565b610d77565b34801561046657600080fd5b5061047a610475366004614b9d565b610d99565b005b34801561048857600080fd5b506102f9545b60405190815260200161040f565b3480156104a857600080fd5b5061047a6104b7366004614bc7565b610e93565b3480156104c857600080fd5b5061047a6104d7366004614be2565b610ee5565b3480156104e857600080fd5b5060cb5461048e565b3480156104fd57600080fd5b5061047a61050c366004614bc7565b61102c565b34801561051d57600080fd5b5061040361052c366004614c55565b6110e6565b34801561053d57600080fd5b5061048e61054c366004614c91565b60009081526065602052604090206001015490565b34801561056d57600080fd5b5061048e7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b3480156105a157600080fd5b5061047a6105b0366004614caa565b611114565b3480156105c157600080fd5b506001610403565b3480156105d557600080fd5b5061047a6105e4366004614bc7565b61113e565b3480156105f557600080fd5b506040516006815260200161040f565b34801561061157600080fd5b5061048e7f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb181565b34801561064557600080fd5b5061047a610654366004614c55565b611182565b34801561066557600080fd5b5061048e6111bd565b34801561067a57600080fd5b5061047a610689366004614caa565b6111cc565b34801561069a57600080fd5b5061047a6106a9366004614bc7565b611268565b3480156106ba57600080fd5b506104036106c9366004614b9d565b6113e1565b3480156106da57600080fd5b5061047a611433565b3480156106ef57600080fd5b5061047a6106fe366004614b9d565b6114db565b34801561070f57600080fd5b5061047a61071e366004614c91565b6117ec565b34801561072f57600080fd5b5061048e61073e366004614bc7565b6102f56020526000908152604090205481565b34801561075d57600080fd5b5061047a61076c366004614d82565b61192f565b61047a61077f366004614de6565b611a52565b34801561079057600080fd5b5061048e611bbb565b3480156107a557600080fd5b506102f85461048e565b3480156107bb57600080fd5b506104036107ca366004614bc7565b6102f6546001600160a01b0391821691161490565b3480156107eb57600080fd5b5061012d5460ff16610403565b34801561080457600080fd5b5061048e610813366004614c91565b611c80565b34801561082457600080fd5b5061048e610833366004614bc7565b6001600160a01b0316600090815260c9602052604090205490565b34801561085a57600080fd5b5061047a611c9e565b34801561086f57600080fd5b5061047a61087e366004614b9d565b611cb0565b34801561088f57600080fd5b5061047a61089e366004614b9d565b611cf6565b3480156108af57600080fd5b5061048e6108be366004614bc7565b611d12565b3480156108cf57600080fd5b5061047a611d31565b3480156108e457600080fd5b506108ed611dd7565b60405161040f9796959493929190614e3e565b34801561090c57600080fd5b5061022b546001600160a01b03165b6040516001600160a01b03909116815260200161040f565b34801561093f57600080fd5b5061091b61094e366004614ef0565b611e9b565b34801561095f57600080fd5b5061040361096e366004614caa565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156109a557600080fd5b5061042d611eba565b3480156109ba57600080fd5b5061047a6109c9366004614bc7565b611ec9565b3480156109da57600080fd5b5061047a6109e9366004614c91565b611fc6565b3480156109fa57600080fd5b5061048e600081565b348015610a0f57600080fd5b50610403610a1e366004614b9d565b612026565b348015610a2f57600080fd5b50610403610a3e366004614b9d565b6120dd565b348015610a4f57600080fd5b5061047a610a5e366004614c91565b6120f5565b348015610a6f57600080fd5b5061025d5461091b906001600160a01b031681565b348015610a9057600080fd5b5061048e610a9f366004614c91565b6121a7565b348015610ab057600080fd5b5061047a610abf366004614be2565b6121be565b348015610ad057600080fd5b5061048e7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b348015610b0457600080fd5b5061047a610b13366004614caa565b6122f9565b348015610b2457600080fd5b5061047a610b33366004614bc7565b61231e565b348015610b4457600080fd5b5061048e610b53366004614f12565b6001600160a01b03918216600090815260ca6020908152604080832093909416825291909152205490565b348015610b8a57600080fd5b5061047a610b99366004614bc7565b612413565b348015610baa57600080fd5b5061048e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b348015610bde57600080fd5b5061047a612516565b348015610bf357600080fd5b5061047a610c02366004614f12565b61276b565b348015610c1357600080fd5b5061047a610c22366004614bc7565b6128a2565b348015610c3357600080fd5b5061047a610c42366004614bc7565b6128b3565b348015610c5357600080fd5b5061047a610c62366004614bc7565b612970565b348015610c7357600080fd5b50610403610c82366004614bc7565b6001600160a01b0316600090815261025e602052604090205460ff1690565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610cdf5750610cdf826129f8565b92915050565b606060cc8054610cf490614f3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2090614f3c565b8015610d6d5780601f10610d4257610100808354040283529160200191610d6d565b820191906000526020600020905b815481529060010190602001808311610d5057829003601f168201915b5050505050905090565b600080610d82612a5f565b9050610d8f818585612a88565b5060019392505050565b7f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb1610dc381612bd8565b6001600160a01b03831660009081527fa0f6cebec7fb889cc5ac88647269c4c0108fb926abd2111b551f234b348876df602052604090205460ff16610e755760405162461bcd60e51b815260206004820152602d60248201527f4555524f503a206f6e6c79206d696e7465722063616e2068617665206d696e7460448201527f696e6720616c6c6f77616e63650000000000000000000000000000000000000060648201526084015b60405180910390fd5b506001600160a01b0390911660009081526102f56020526040902055565b6001600160a01b0381161580610eb7575061022b546001600160a01b038281169116145b15610ebf5750565b610eca600082611114565b610ed96000610b138180611e9b565b610ee281612be9565b50565b83421115610f355760405162461bcd60e51b815260206004820152601a60248201527f45524332305457413a206578706972656420646561646c696e650000000000006044820152606401610e6c565b60006101f954888888610f478c612c76565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610fa282612c9f565b90506000610fb282878787612ce7565b9050896001600160a01b0316816001600160a01b0316146110155760405162461bcd60e51b815260206004820152601c60248201527f45524332305457413a20696e76616c6964207369676e61747572653a000000006044820152606401610e6c565b6110208a8a8a612d11565b50505050505050505050565b61025d546001600160a01b0316331461109c5760405162461bcd60e51b815260206004820152602c60248201527f426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201526b10313630b1b5b634b9ba32b960a11b6064820152608401610e6c565b6001600160a01b038116600081815261025e6020526040808220805460ff19169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b6000806110f1612a5f565b90506110fe858285612e4a565b611109858585612d11565b506001949350505050565b60008281526065602052604090206001015461112f81612bd8565b6111398383612ed6565b505050565b6001600160a01b03811660009081526102f56020526040812055610ee27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6826122f9565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426111ac81612bd8565b6111b7848484612ef8565b50505050565b60006111c76130f7565b905090565b6111d4612a5f565b6001600160a01b0316816001600160a01b03161461125a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610e6c565b6112648282613101565b5050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156112f65760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610e6c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166113517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146113bc5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610e6c565b6113c581613123565b60408051600080825260208201909252610ee29183919061312e565b6000806113ec612a5f565b9050610d8f81858561142485896001600160a01b03918216600090815260ca6020908152604080832093909416825291909152205490565b61142e9190614f87565b612a88565b61145f7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61096e612a5f565b6114d15760405162461bcd60e51b815260206004820152603960248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20756e7061757365000000000000006064820152608401610e6c565b6114d96132dd565b565b6114e3613336565b6001600160a01b038216600090815261025e6020526040902054829060ff161561155d5760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c6044820152641a5cdd195960da1b6064820152608401610e6c565b6115897f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb161096e612a5f565b806115bb57506115bb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661096e612a5f565b6116075760405162461bcd60e51b815260206004820152601a60248201527f4555524f503a206e6f7420616c6c6f77656420746f206d696e740000000000006044820152606401610e6c565b6000821161167d5760405162461bcd60e51b815260206004820152602560248201527f4555524f503a206d696e7420616d6f756e74206e6f742067726561746572207460448201527f68616e20300000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6116a97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661096e612a5f565b156117895760006102f560006116bd612a5f565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808311156117565760405162461bcd60e51b815260206004820152602a60248201527f4555524f503a206d696e7420616d6f756e742065786365656473206d696e746560448201527f72416c6c6f77616e6365000000000000000000000000000000000000000000006064820152608401610e6c565b6117608382614f9f565b6102f5600061176d612a5f565b6001600160a01b03168152602081019190915260400160002055505b611793838361338a565b826001600160a01b03166117a5612a5f565b6001600160a01b03167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516117df91815260200190565b60405180910390a3505050565b6117f4613336565b6117fc612a5f565b6001600160a01b038116600090815261025e602052604090205460ff16156118745760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c6044820152641a5cdd195960da1b6064820152608401610e6c565b6118a07f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb161096e612a5f565b806118d257506118d27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661096e612a5f565b61191e5760405162461bcd60e51b815260206004820152601a60248201527f4555524f503a206e6f7420616c6c6f77656420746f206275726e0000000000006044820152606401610e6c565b611264611929612a5f565b83613457565b600054610100900460ff161580801561194f5750600054600160ff909116105b806119695750303b158015611969575060005460ff166001145b6119db5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610e6c565b6000805460ff1916600117905580156119fe576000805461ff0019166101001790555b611a0883836135ce565b8015611139576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611ae05760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610e6c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611b3b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614611ba65760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610e6c565b611baf82613123565b6112648282600161312e565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c5b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610e6c565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b60006127106102f85483611c949190614fb6565b610cdf9190614fd5565b611ca6613655565b6114d960006136cf565b6001600160a01b03821660009081526102f5602052604090208190556112647f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a683611114565b611d0882611d02612a5f565b83612e4a565b6112648282613457565b6001600160a01b03811660009081526101f76020526040812054610cdf565b611d5d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61096e612a5f565b611dcf5760405162461bcd60e51b815260206004820152603760248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f2070617573650000000000000000006064820152608401610e6c565b6114d9613722565b6000606080600080600060606101c3546000801b148015611df957506101c454155b611e455760405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152606401610e6c565b611e4d613761565b611e55613771565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000828152609760205260408120611eb39083613781565b9392505050565b606060cd8054610cf490614f3c565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42611ef381612bd8565b6001600160a01b038216611f6f5760405162461bcd60e51b815260206004820152602860248201527f4555524f503a206e657720666565734661756365742063616e2774206265206160448201527f64647265737320300000000000000000000000000000000000000000000000006064820152608401610e6c565b6102f780546001600160a01b0319166001600160a01b0384169081179091556040519081527f1853fb5b390e0e1d3ec65528a6256c05aa4d861464cb86bf011847199de5cb4a906020015b60405180910390a15050565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42611ff081612bd8565b6102f98290556040518281527f6dc57988d2f8eb0711bb24076265502e05367f0b6cd2cb7fe5781f8867b94f7290602001611fba565b600080612031612a5f565b6001600160a01b03818116600090815260ca6020908152604080832093891683529290522054909150838110156120d05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6111098286868403612a88565b6000806120e8612a5f565b9050610d8f818585612d11565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261211f81612bd8565b6127108211156121715760405162461bcd60e51b815260206004820152601860248201527f4555524f503a206e6577207261746520746f6f206869676800000000000000006044820152606401610e6c565b6102f88290556040518281527f18717a1dc8e70148d6455f9650638ea4a902bb8f47386e9fbee21213f873033b90602001611fba565b6000818152609760205260408120610cdf9061378d565b8342111561220e5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610e6c565b60006101f8548888886122208c612c76565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061227b82612c9f565b9050600061228b82878787612ce7565b9050896001600160a01b0316816001600160a01b0316146122ee5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610e6c565b6110208a8a8a612a88565b60008281526065602052604090206001015461231481612bd8565b6111398383613101565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261234881612bd8565b6001600160a01b0382166123c45760405162461bcd60e51b815260206004820152602e60248201527f4555524f503a206e65772074727573746564466f727761726465722063616e2760448201527f74206265206164647265737320300000000000000000000000000000000000006064820152608401610e6c565b6102f680546001600160a01b0319166001600160a01b0384169081179091556040519081527fa4388ecc389b1390354ae0c65a856c0d7dd4fb648419f5d3ac0b99e38f46fd1190602001611fba565b61241b613655565b61246a7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42610b137fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426000611e9b565b6124b97f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b137f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6000611e9b565b6124e37fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4282611114565b61250d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611114565b610ee281613797565b600054610100900460ff16158080156125365750600054600160ff909116105b806125505750303b158015612550575060005460ff166001145b6125c25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610e6c565b6000805460ff1916600117905580156125e5576000805461ff0019166101001790555b6126416040518060400160405280600681526020017f455552c3985000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020016404555524f560dc1b8152506135ce565b6126676040518060400160405280600581526020016404555524f560dc1b81525061385e565b61266f613918565b612677613983565b6126c17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a67f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb16139f6565b6126ec7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426000613a41565b6127177f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb16000613a41565b60006102f88190556102f9558015610ee2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6102f6546001600160a01b031633146127ee576040805162461bcd60e51b81526020600482015260248101919091527f4555524f503a206f6e6c792074727573746564466f727761726465722063616e60448201527f2070726f63657373206761736c6573732062617365666565207061796d656e746064820152608401610e6c565b6102f9546001600160a01b038316600090815260c96020526040902054101561287f5760405162461bcd60e51b815260206004820152603160248201527f4555524f503a2062616c616e636520746f6f206c6f772c2063616e277420706160448201527f79206761736c65737320626173656665650000000000000000000000000000006064820152608401610e6c565b6102f8805460009091556102f95461289a9084908490612d11565b6102f8555050565b6128aa613655565b610ee281610e93565b61025d546001600160a01b031633146129235760405162461bcd60e51b815260206004820152602c60248201527f426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201526b10313630b1b5b634b9ba32b960a11b6064820152608401610e6c565b6001600160a01b038116600081815261025e6020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b6129bf7f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb1610b137f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb16000611e9b565b610ee27f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb182611114565b6001600160a01b03163b151590565b60006001600160e01b031982167f7965db0b000000000000000000000000000000000000000000000000000000001480610cdf57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610cdf565b6102f6546000906001600160a01b0316331415612a83575060131936013560601c90565b503390565b6001600160a01b038316612b035760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b038216612b7f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b03838116600081815260ca602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016117df565b610ee281612be4612a5f565b613a4b565b612bf1613655565b6001600160a01b038116612c6d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e6c565b610ee2816136cf565b6001600160a01b03811660009081526101f7602052604090208054600181018255905b50919050565b6000610cdf612cac6130f7565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000612cf887878787613ac0565b91509150612d0581613b84565b5090505b949350505050565b6001600160a01b038316600090815261025e6020526040902054839060ff1615612d8b5760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c6044820152641a5cdd195960da1b6064820152608401610e6c565b6001600160a01b038316600090815261025e6020526040902054839060ff1615612e055760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c6044820152641a5cdd195960da1b6064820152608401610e6c565b60006102f854118015612e2757506102f7546001600160a01b03858116911614155b15612e3857612e368584613ced565b505b612e43858585612ef8565b5050505050565b6001600160a01b03838116600090815260ca602090815260408083209386168352929052205460001981146111b75781811015612ec95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e6c565b6111b78484848403612a88565b612ee08282613d97565b60008281526097602052604090206111399082613e3a565b6001600160a01b038316612f745760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b038216612ff05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b612ffb838383613e4f565b6001600160a01b038316600090815260c960205260409020548181101561308a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b03808516600081815260c9602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130ea9086815260200190565b60405180910390a36111b7565b60006111c7613e5a565b61310b8282613ece565b60008281526097602052604090206111399082613f6f565b600061126481612bd8565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156131615761113983613f84565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319a57600080fd5b505afa9250505080156131ca575060408051601f3d908101601f191682019092526131c791810190614ff7565b60015b61323c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610e6c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146132d15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610e6c565b50611139838383614042565b6132e5614067565b61012d805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613319612a5f565b6040516001600160a01b03909116815260200160405180910390a1565b61012d5460ff16156114d95760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e6c565b6001600160a01b0382166133e05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610e6c565b6133ec60008383613e4f565b8060cb60008282546133fe9190614f87565b90915550506001600160a01b038216600081815260c960209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b0382166134d35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6134df82600083613e4f565b6001600160a01b038216600090815260c960205260409020548181101561356e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b038316600081815260c960209081526040808320868603905560cb80548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600054610100900460ff166136395760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b61364382826140ba565b61364b61414c565b61126482826141c4565b61365d612a5f565b6001600160a01b031661367961022b546001600160a01b031690565b6001600160a01b0316146114d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e6c565b61022b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61372a613336565b61012d805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613319612a5f565b60606101c58054610cf490614f3c565b60606101c68054610cf490614f3c565b6000611eb38383614299565b6000610cdf825490565b6001600160a01b0381166138135760405162461bcd60e51b815260206004820152603260248201527f426c61636b6c69737461626c653a206e657720626c61636b6c6973746572206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610e6c565b61025d80546001600160a01b0319166001600160a01b0383169081179091556040517fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b600054610100900460ff166138c95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b6138d1613918565b613910816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506142c3565b610ee2614368565b600054610100900460ff166114d95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b600054610100900460ff166139ee5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b6114d961441f565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6112648282612ed6565b60008281526065602090815260408083206001600160a01b038516845290915290205460ff1661126457613a7e8161449a565b613a898360206144ac565b604051602001613a9a929190615010565b60408051601f198184030181529082905262461bcd60e51b8252610e6c91600401614b6e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613af75750600090506003613b7b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613b4b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613b7457600060019250925050613b7b565b9150600090505b94509492505050565b6000816004811115613b9857613b98615091565b1415613ba15750565b6001816004811115613bb557613bb5615091565b1415613c035760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610e6c565b6002816004811115613c1757613c17615091565b1415613c655760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610e6c565b6003816004811115613c7957613c79615091565b1415610ee25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b600080613cf983611c80565b9050613d058382614f87565b6001600160a01b038516600090815260c960205260409020541015613d6c5760405162461bcd60e51b815260206004820152600e60248201527f4555524f503a20747820666565730000000000000000000000000000000000006044820152606401610e6c565b6102f7546001600160a01b031615610d8f576102f754610d8f9085906001600160a01b031683612d11565b60008281526065602090815260408083206001600160a01b038516845290915290205460ff166112645760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19166001179055613df6612a5f565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611eb3836001600160a01b03841661468d565b6111398383836146dc565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613e856146e7565b613e8d614745565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008281526065602090815260408083206001600160a01b038516845290915290205460ff16156112645760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19169055613f2b612a5f565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6000611eb3836001600160a01b038416614777565b6001600160a01b0381163b6140015760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610e6c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b61404b8361486a565b6000825111806140585750805b15611139576111b783836148aa565b61012d5460ff166114d95760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610e6c565b600054610100900460ff166141255760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b81516141389060cc906020850190614a5c565b5080516111399060cd906020840190614a5c565b600054610100900460ff166141b75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b61012d805460ff19169055565b600054610100900460ff1661422f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b614241600061423c612a5f565b613a41565b61426d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661423c612a5f565b6112647f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61423c612a5f565b60008260000182815481106142b0576142b06150a7565b9060005260206000200154905092915050565b600054610100900460ff1661432e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b8151614342906101c5906020850190614a5c565b508051614357906101c6906020840190614a5c565b505060006101c38190556101c45550565b600054610100900460ff166143d35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96101f8557f72a9ba9d768e35b4ab8761b0abf8d49a4318cec0209bdc7ba8ac6136bf16ec8f6101f955565b600054610100900460ff1661448a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b6114d9614495612a5f565b6136cf565b6060610cdf6001600160a01b03831660145b606060006144bb836002614fb6565b6144c6906002614f87565b67ffffffffffffffff8111156144de576144de614cd6565b6040519080825280601f01601f191660200182016040528015614508576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061453f5761453f6150a7565b60200101906001600160f81b031916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061458a5761458a6150a7565b60200101906001600160f81b031916908160001a90535060006145ae846002614fb6565b6145b9906001614f87565b90505b600181111561463e577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106145fa576145fa6150a7565b1a60f81b828281518110614610576146106150a7565b60200101906001600160f81b031916908160001a90535060049490941c93614637816150bd565b90506145bc565b508315611eb35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610e6c565b60008181526001830160205260408120546146d457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610cdf565b506000610cdf565b6111398383836148cf565b6000806146f2613761565b805190915015614709578051602090910120919050565b6101c35480156147195792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5090565b600080614750613771565b805190915015614767578051602090910120919050565b6101c45480156147195792915050565b6000818152600183016020526040812054801561486057600061479b600183614f9f565b85549091506000906147af90600190614f9f565b90508181146148145760008660000182815481106147cf576147cf6150a7565b90600052602060002001549050808760000184815481106147f2576147f26150a7565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614825576148256150d4565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610cdf565b6000915050610cdf565b61487381613f84565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611eb3838360405180606001604052806027815260200161510760279139614949565b61012d5460ff16156111395760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e7366657220776860448201527f696c6520706175736564000000000000000000000000000000000000000000006064820152608401610e6c565b6060600080856001600160a01b03168560405161496691906150ea565b600060405180830381855af49150503d80600081146149a1576040519150601f19603f3d011682016040523d82523d6000602084013e6149a6565b606091505b50915091506149b7868383876149c1565b9695505050505050565b60608315614a2d578251614a26576001600160a01b0385163b614a265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e6c565b5081612d09565b612d098383815115614a425781518083602001fd5b8060405162461bcd60e51b8152600401610e6c9190614b6e565b828054614a6890614f3c565b90600052602060002090601f016020900481019282614a8a5760008555614ad0565b82601f10614aa357805160ff1916838001178555614ad0565b82800160010185558215614ad0579182015b82811115614ad0578251825591602001919060010190614ab5565b506147419291505b808211156147415760008155600101614ad8565b600060208284031215614afe57600080fd5b81356001600160e01b031981168114611eb357600080fd5b60005b83811015614b31578181015183820152602001614b19565b838111156111b75750506000910152565b60008151808452614b5a816020860160208601614b16565b601f01601f19169290920160200192915050565b602081526000611eb36020830184614b42565b80356001600160a01b0381168114614b9857600080fd5b919050565b60008060408385031215614bb057600080fd5b614bb983614b81565b946020939093013593505050565b600060208284031215614bd957600080fd5b611eb382614b81565b600080600080600080600060e0888a031215614bfd57600080fd5b614c0688614b81565b9650614c1460208901614b81565b95506040880135945060608801359350608088013560ff81168114614c3857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215614c6a57600080fd5b614c7384614b81565b9250614c8160208501614b81565b9150604084013590509250925092565b600060208284031215614ca357600080fd5b5035919050565b60008060408385031215614cbd57600080fd5b82359150614ccd60208401614b81565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115614d0757614d07614cd6565b604051601f8501601f19908116603f01168101908282118183101715614d2f57614d2f614cd6565b81604052809350858152868686011115614d4857600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112614d7357600080fd5b611eb383833560208501614cec565b60008060408385031215614d9557600080fd5b823567ffffffffffffffff80821115614dad57600080fd5b614db986838701614d62565b93506020850135915080821115614dcf57600080fd5b50614ddc85828601614d62565b9150509250929050565b60008060408385031215614df957600080fd5b614e0283614b81565b9150602083013567ffffffffffffffff811115614e1e57600080fd5b8301601f81018513614e2f57600080fd5b614ddc85823560208401614cec565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152614e7a60e084018a614b42565b8381036040850152614e8c818a614b42565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015614ede57835183529284019291840191600101614ec2565b50909c9b505050505050505050505050565b60008060408385031215614f0357600080fd5b50508035926020909101359150565b60008060408385031215614f2557600080fd5b614f2e83614b81565b9150614ccd60208401614b81565b600181811c90821680614f5057607f821691505b60208210811415612c9957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115614f9a57614f9a614f71565b500190565b600082821015614fb157614fb1614f71565b500390565b6000816000190483118215151615614fd057614fd0614f71565b500290565b600082614ff257634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561500957600080fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615048816017850160208801614b16565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351615085816028840160208801614b16565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816150cc576150cc614f71565b506000190190565b634e487b7160e01b600052603160045260246000fd5b600082516150fc818460208701614b16565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c48646720b98266809cb66ef40cbb0a4582b3117792b78b696a7e0985d2cba3964736f6c63430008080033
Deployed Bytecode
0x6080604052600436106103de5760003560e01c8063706d4b881161020d578063a9059cbb11610128578063dd62ed3e116100bb578063ea923e8f1161008a578063f9f92be41161006f578063f9f92be414610c27578063fa3f323a14610c47578063fe575a8714610c6757600080fd5b8063ea923e8f14610be7578063f2fde38b14610c0757600080fd5b8063dd62ed3e14610b38578063df8089ef14610b7e578063e63ab1e914610b9e578063e9c2917814610bd257600080fd5b8063d505accf116100f7578063d505accf14610aa4578063d539139314610ac4578063d547741f14610af8578063da74222814610b1857600080fd5b8063a9059cbb14610a23578063a94bdb9014610a43578063bd10243014610a63578063ca15c87314610a8457600080fd5b80638da5cb5b116101a0578063994c4a361161016f578063994c4a36146109ae5780639a44e987146109ce578063a217fddf146109ee578063a457c2d714610a0357600080fd5b80638da5cb5b146109005780639010d07c1461093357806391d148541461095357806395d89b411461099957600080fd5b806379cc6790116101dc57806379cc6790146108835780637ecebe00146108a35780638456cb59146108c357806384b0196e146108d857600080fd5b8063706d4b88146107f857806370a0823114610818578063715018a61461084e578063761248b41461086357600080fd5b80633142b012116102fd57806342966c681161029057806352d1902d1161025f57806352d1902d1461078457806353068e3614610799578063572b6c05146107af5780635c975abb146107df57600080fd5b806342966c681461070357806346946dfa146107235780634cd88b76146107515780634f1ef2861461077157600080fd5b80633659cfe6116102cc5780633659cfe61461068e57806339509351146106ae5780633f4ba83a146106ce57806340c10f19146106e357600080fd5b80633142b0121461060557806333bebb77146106395780633644e5151461065957806336568abe1461066e57600080fd5b80631a895266116103755780632f2ff15d116103445780632f2ff15d146105955780632f576f20146105b55780633092afd5146105c9578063313ce567146105e957600080fd5b80631a895266146104f157806323b872dd14610511578063248a9ca3146105315780632a0acc6a1461056157600080fd5b806312ce4cc5116103b157806312ce4cc51461047c57806313af40351461049c57806317e6f547146104bc57806318160ddd146104dc57600080fd5b806301ffc9a7146103e357806306fdde0314610418578063095ea7b31461043a5780631029f4671461045a575b600080fd5b3480156103ef57600080fd5b506104036103fe366004614aec565b610ca1565b60405190151581526020015b60405180910390f35b34801561042457600080fd5b5061042d610ce5565b60405161040f9190614b6e565b34801561044657600080fd5b50610403610455366004614b9d565b610d77565b34801561046657600080fd5b5061047a610475366004614b9d565b610d99565b005b34801561048857600080fd5b506102f9545b60405190815260200161040f565b3480156104a857600080fd5b5061047a6104b7366004614bc7565b610e93565b3480156104c857600080fd5b5061047a6104d7366004614be2565b610ee5565b3480156104e857600080fd5b5060cb5461048e565b3480156104fd57600080fd5b5061047a61050c366004614bc7565b61102c565b34801561051d57600080fd5b5061040361052c366004614c55565b6110e6565b34801561053d57600080fd5b5061048e61054c366004614c91565b60009081526065602052604090206001015490565b34801561056d57600080fd5b5061048e7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4281565b3480156105a157600080fd5b5061047a6105b0366004614caa565b611114565b3480156105c157600080fd5b506001610403565b3480156105d557600080fd5b5061047a6105e4366004614bc7565b61113e565b3480156105f557600080fd5b506040516006815260200161040f565b34801561061157600080fd5b5061048e7f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb181565b34801561064557600080fd5b5061047a610654366004614c55565b611182565b34801561066557600080fd5b5061048e6111bd565b34801561067a57600080fd5b5061047a610689366004614caa565b6111cc565b34801561069a57600080fd5b5061047a6106a9366004614bc7565b611268565b3480156106ba57600080fd5b506104036106c9366004614b9d565b6113e1565b3480156106da57600080fd5b5061047a611433565b3480156106ef57600080fd5b5061047a6106fe366004614b9d565b6114db565b34801561070f57600080fd5b5061047a61071e366004614c91565b6117ec565b34801561072f57600080fd5b5061048e61073e366004614bc7565b6102f56020526000908152604090205481565b34801561075d57600080fd5b5061047a61076c366004614d82565b61192f565b61047a61077f366004614de6565b611a52565b34801561079057600080fd5b5061048e611bbb565b3480156107a557600080fd5b506102f85461048e565b3480156107bb57600080fd5b506104036107ca366004614bc7565b6102f6546001600160a01b0391821691161490565b3480156107eb57600080fd5b5061012d5460ff16610403565b34801561080457600080fd5b5061048e610813366004614c91565b611c80565b34801561082457600080fd5b5061048e610833366004614bc7565b6001600160a01b0316600090815260c9602052604090205490565b34801561085a57600080fd5b5061047a611c9e565b34801561086f57600080fd5b5061047a61087e366004614b9d565b611cb0565b34801561088f57600080fd5b5061047a61089e366004614b9d565b611cf6565b3480156108af57600080fd5b5061048e6108be366004614bc7565b611d12565b3480156108cf57600080fd5b5061047a611d31565b3480156108e457600080fd5b506108ed611dd7565b60405161040f9796959493929190614e3e565b34801561090c57600080fd5b5061022b546001600160a01b03165b6040516001600160a01b03909116815260200161040f565b34801561093f57600080fd5b5061091b61094e366004614ef0565b611e9b565b34801561095f57600080fd5b5061040361096e366004614caa565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156109a557600080fd5b5061042d611eba565b3480156109ba57600080fd5b5061047a6109c9366004614bc7565b611ec9565b3480156109da57600080fd5b5061047a6109e9366004614c91565b611fc6565b3480156109fa57600080fd5b5061048e600081565b348015610a0f57600080fd5b50610403610a1e366004614b9d565b612026565b348015610a2f57600080fd5b50610403610a3e366004614b9d565b6120dd565b348015610a4f57600080fd5b5061047a610a5e366004614c91565b6120f5565b348015610a6f57600080fd5b5061025d5461091b906001600160a01b031681565b348015610a9057600080fd5b5061048e610a9f366004614c91565b6121a7565b348015610ab057600080fd5b5061047a610abf366004614be2565b6121be565b348015610ad057600080fd5b5061048e7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b348015610b0457600080fd5b5061047a610b13366004614caa565b6122f9565b348015610b2457600080fd5b5061047a610b33366004614bc7565b61231e565b348015610b4457600080fd5b5061048e610b53366004614f12565b6001600160a01b03918216600090815260ca6020908152604080832093909416825291909152205490565b348015610b8a57600080fd5b5061047a610b99366004614bc7565b612413565b348015610baa57600080fd5b5061048e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b348015610bde57600080fd5b5061047a612516565b348015610bf357600080fd5b5061047a610c02366004614f12565b61276b565b348015610c1357600080fd5b5061047a610c22366004614bc7565b6128a2565b348015610c3357600080fd5b5061047a610c42366004614bc7565b6128b3565b348015610c5357600080fd5b5061047a610c62366004614bc7565b612970565b348015610c7357600080fd5b50610403610c82366004614bc7565b6001600160a01b0316600090815261025e602052604090205460ff1690565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610cdf5750610cdf826129f8565b92915050565b606060cc8054610cf490614f3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2090614f3c565b8015610d6d5780601f10610d4257610100808354040283529160200191610d6d565b820191906000526020600020905b815481529060010190602001808311610d5057829003601f168201915b5050505050905090565b600080610d82612a5f565b9050610d8f818585612a88565b5060019392505050565b7f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb1610dc381612bd8565b6001600160a01b03831660009081527fa0f6cebec7fb889cc5ac88647269c4c0108fb926abd2111b551f234b348876df602052604090205460ff16610e755760405162461bcd60e51b815260206004820152602d60248201527f4555524f503a206f6e6c79206d696e7465722063616e2068617665206d696e7460448201527f696e6720616c6c6f77616e63650000000000000000000000000000000000000060648201526084015b60405180910390fd5b506001600160a01b0390911660009081526102f56020526040902055565b6001600160a01b0381161580610eb7575061022b546001600160a01b038281169116145b15610ebf5750565b610eca600082611114565b610ed96000610b138180611e9b565b610ee281612be9565b50565b83421115610f355760405162461bcd60e51b815260206004820152601a60248201527f45524332305457413a206578706972656420646561646c696e650000000000006044820152606401610e6c565b60006101f954888888610f478c612c76565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610fa282612c9f565b90506000610fb282878787612ce7565b9050896001600160a01b0316816001600160a01b0316146110155760405162461bcd60e51b815260206004820152601c60248201527f45524332305457413a20696e76616c6964207369676e61747572653a000000006044820152606401610e6c565b6110208a8a8a612d11565b50505050505050505050565b61025d546001600160a01b0316331461109c5760405162461bcd60e51b815260206004820152602c60248201527f426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201526b10313630b1b5b634b9ba32b960a11b6064820152608401610e6c565b6001600160a01b038116600081815261025e6020526040808220805460ff19169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b6000806110f1612a5f565b90506110fe858285612e4a565b611109858585612d11565b506001949350505050565b60008281526065602052604090206001015461112f81612bd8565b6111398383612ed6565b505050565b6001600160a01b03811660009081526102f56020526040812055610ee27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6826122f9565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426111ac81612bd8565b6111b7848484612ef8565b50505050565b60006111c76130f7565b905090565b6111d4612a5f565b6001600160a01b0316816001600160a01b03161461125a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610e6c565b6112648282613101565b5050565b306001600160a01b037f000000000000000000000000a1058c5e9de4710e2854e5668531e54d80cdd51d1614156112f65760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610e6c565b7f000000000000000000000000a1058c5e9de4710e2854e5668531e54d80cdd51d6001600160a01b03166113517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146113bc5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610e6c565b6113c581613123565b60408051600080825260208201909252610ee29183919061312e565b6000806113ec612a5f565b9050610d8f81858561142485896001600160a01b03918216600090815260ca6020908152604080832093909416825291909152205490565b61142e9190614f87565b612a88565b61145f7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61096e612a5f565b6114d15760405162461bcd60e51b815260206004820152603960248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20756e7061757365000000000000006064820152608401610e6c565b6114d96132dd565b565b6114e3613336565b6001600160a01b038216600090815261025e6020526040902054829060ff161561155d5760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c6044820152641a5cdd195960da1b6064820152608401610e6c565b6115897f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb161096e612a5f565b806115bb57506115bb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661096e612a5f565b6116075760405162461bcd60e51b815260206004820152601a60248201527f4555524f503a206e6f7420616c6c6f77656420746f206d696e740000000000006044820152606401610e6c565b6000821161167d5760405162461bcd60e51b815260206004820152602560248201527f4555524f503a206d696e7420616d6f756e74206e6f742067726561746572207460448201527f68616e20300000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6116a97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661096e612a5f565b156117895760006102f560006116bd612a5f565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808311156117565760405162461bcd60e51b815260206004820152602a60248201527f4555524f503a206d696e7420616d6f756e742065786365656473206d696e746560448201527f72416c6c6f77616e6365000000000000000000000000000000000000000000006064820152608401610e6c565b6117608382614f9f565b6102f5600061176d612a5f565b6001600160a01b03168152602081019190915260400160002055505b611793838361338a565b826001600160a01b03166117a5612a5f565b6001600160a01b03167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516117df91815260200190565b60405180910390a3505050565b6117f4613336565b6117fc612a5f565b6001600160a01b038116600090815261025e602052604090205460ff16156118745760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c6044820152641a5cdd195960da1b6064820152608401610e6c565b6118a07f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb161096e612a5f565b806118d257506118d27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661096e612a5f565b61191e5760405162461bcd60e51b815260206004820152601a60248201527f4555524f503a206e6f7420616c6c6f77656420746f206275726e0000000000006044820152606401610e6c565b611264611929612a5f565b83613457565b600054610100900460ff161580801561194f5750600054600160ff909116105b806119695750303b158015611969575060005460ff166001145b6119db5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610e6c565b6000805460ff1916600117905580156119fe576000805461ff0019166101001790555b611a0883836135ce565b8015611139576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b306001600160a01b037f000000000000000000000000a1058c5e9de4710e2854e5668531e54d80cdd51d161415611ae05760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608401610e6c565b7f000000000000000000000000a1058c5e9de4710e2854e5668531e54d80cdd51d6001600160a01b0316611b3b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614611ba65760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608401610e6c565b611baf82613123565b6112648282600161312e565b6000306001600160a01b037f000000000000000000000000a1058c5e9de4710e2854e5668531e54d80cdd51d1614611c5b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610e6c565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b60006127106102f85483611c949190614fb6565b610cdf9190614fd5565b611ca6613655565b6114d960006136cf565b6001600160a01b03821660009081526102f5602052604090208190556112647f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a683611114565b611d0882611d02612a5f565b83612e4a565b6112648282613457565b6001600160a01b03811660009081526101f76020526040812054610cdf565b611d5d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61096e612a5f565b611dcf5760405162461bcd60e51b815260206004820152603760248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f2070617573650000000000000000006064820152608401610e6c565b6114d9613722565b6000606080600080600060606101c3546000801b148015611df957506101c454155b611e455760405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152606401610e6c565b611e4d613761565b611e55613771565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000828152609760205260408120611eb39083613781565b9392505050565b606060cd8054610cf490614f3c565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42611ef381612bd8565b6001600160a01b038216611f6f5760405162461bcd60e51b815260206004820152602860248201527f4555524f503a206e657720666565734661756365742063616e2774206265206160448201527f64647265737320300000000000000000000000000000000000000000000000006064820152608401610e6c565b6102f780546001600160a01b0319166001600160a01b0384169081179091556040519081527f1853fb5b390e0e1d3ec65528a6256c05aa4d861464cb86bf011847199de5cb4a906020015b60405180910390a15050565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42611ff081612bd8565b6102f98290556040518281527f6dc57988d2f8eb0711bb24076265502e05367f0b6cd2cb7fe5781f8867b94f7290602001611fba565b600080612031612a5f565b6001600160a01b03818116600090815260ca6020908152604080832093891683529290522054909150838110156120d05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6111098286868403612a88565b6000806120e8612a5f565b9050610d8f818585612d11565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261211f81612bd8565b6127108211156121715760405162461bcd60e51b815260206004820152601860248201527f4555524f503a206e6577207261746520746f6f206869676800000000000000006044820152606401610e6c565b6102f88290556040518281527f18717a1dc8e70148d6455f9650638ea4a902bb8f47386e9fbee21213f873033b90602001611fba565b6000818152609760205260408120610cdf9061378d565b8342111561220e5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610e6c565b60006101f8548888886122208c612c76565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061227b82612c9f565b9050600061228b82878787612ce7565b9050896001600160a01b0316816001600160a01b0316146122ee5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610e6c565b6110208a8a8a612a88565b60008281526065602052604090206001015461231481612bd8565b6111398383613101565b7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4261234881612bd8565b6001600160a01b0382166123c45760405162461bcd60e51b815260206004820152602e60248201527f4555524f503a206e65772074727573746564466f727761726465722063616e2760448201527f74206265206164647265737320300000000000000000000000000000000000006064820152608401610e6c565b6102f680546001600160a01b0319166001600160a01b0384169081179091556040519081527fa4388ecc389b1390354ae0c65a856c0d7dd4fb648419f5d3ac0b99e38f46fd1190602001611fba565b61241b613655565b61246a7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42610b137fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426000611e9b565b6124b97f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b137f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6000611e9b565b6124e37fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4282611114565b61250d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a82611114565b610ee281613797565b600054610100900460ff16158080156125365750600054600160ff909116105b806125505750303b158015612550575060005460ff166001145b6125c25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610e6c565b6000805460ff1916600117905580156125e5576000805461ff0019166101001790555b6126416040518060400160405280600681526020017f455552c3985000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020016404555524f560dc1b8152506135ce565b6126676040518060400160405280600581526020016404555524f560dc1b81525061385e565b61266f613918565b612677613983565b6126c17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a67f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb16139f6565b6126ec7fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec426000613a41565b6127177f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb16000613a41565b60006102f88190556102f9558015610ee2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6102f6546001600160a01b031633146127ee576040805162461bcd60e51b81526020600482015260248101919091527f4555524f503a206f6e6c792074727573746564466f727761726465722063616e60448201527f2070726f63657373206761736c6573732062617365666565207061796d656e746064820152608401610e6c565b6102f9546001600160a01b038316600090815260c96020526040902054101561287f5760405162461bcd60e51b815260206004820152603160248201527f4555524f503a2062616c616e636520746f6f206c6f772c2063616e277420706160448201527f79206761736c65737320626173656665650000000000000000000000000000006064820152608401610e6c565b6102f8805460009091556102f95461289a9084908490612d11565b6102f8555050565b6128aa613655565b610ee281610e93565b61025d546001600160a01b031633146129235760405162461bcd60e51b815260206004820152602c60248201527f426c61636b6c69737461626c653a2063616c6c6572206973206e6f742074686560448201526b10313630b1b5b634b9ba32b960a11b6064820152608401610e6c565b6001600160a01b038116600081815261025e6020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b6129bf7f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb1610b137f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb16000611e9b565b610ee27f433aa8cd04e3bb4863b80cca89cac0174e1e63dfd1976ac065e50afdf7e63bb182611114565b6001600160a01b03163b151590565b60006001600160e01b031982167f7965db0b000000000000000000000000000000000000000000000000000000001480610cdf57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610cdf565b6102f6546000906001600160a01b0316331415612a83575060131936013560601c90565b503390565b6001600160a01b038316612b035760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b038216612b7f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b03838116600081815260ca602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016117df565b610ee281612be4612a5f565b613a4b565b612bf1613655565b6001600160a01b038116612c6d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e6c565b610ee2816136cf565b6001600160a01b03811660009081526101f7602052604090208054600181018255905b50919050565b6000610cdf612cac6130f7565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000612cf887878787613ac0565b91509150612d0581613b84565b5090505b949350505050565b6001600160a01b038316600090815261025e6020526040902054839060ff1615612d8b5760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c6044820152641a5cdd195960da1b6064820152608401610e6c565b6001600160a01b038316600090815261025e6020526040902054839060ff1615612e055760405162461bcd60e51b815260206004820152602560248201527f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c6044820152641a5cdd195960da1b6064820152608401610e6c565b60006102f854118015612e2757506102f7546001600160a01b03858116911614155b15612e3857612e368584613ced565b505b612e43858585612ef8565b5050505050565b6001600160a01b03838116600090815260ca602090815260408083209386168352929052205460001981146111b75781811015612ec95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e6c565b6111b78484848403612a88565b612ee08282613d97565b60008281526097602052604090206111399082613e3a565b6001600160a01b038316612f745760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b038216612ff05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b612ffb838383613e4f565b6001600160a01b038316600090815260c960205260409020548181101561308a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b03808516600081815260c9602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130ea9086815260200190565b60405180910390a36111b7565b60006111c7613e5a565b61310b8282613ece565b60008281526097602052604090206111399082613f6f565b600061126481612bd8565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156131615761113983613f84565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319a57600080fd5b505afa9250505080156131ca575060408051601f3d908101601f191682019092526131c791810190614ff7565b60015b61323c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610e6c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146132d15760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610e6c565b50611139838383614042565b6132e5614067565b61012d805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613319612a5f565b6040516001600160a01b03909116815260200160405180910390a1565b61012d5460ff16156114d95760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e6c565b6001600160a01b0382166133e05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610e6c565b6133ec60008383613e4f565b8060cb60008282546133fe9190614f87565b90915550506001600160a01b038216600081815260c960209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b0382166134d35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6134df82600083613e4f565b6001600160a01b038216600090815260c960205260409020548181101561356e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b6001600160a01b038316600081815260c960209081526040808320868603905560cb80548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600054610100900460ff166136395760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b61364382826140ba565b61364b61414c565b61126482826141c4565b61365d612a5f565b6001600160a01b031661367961022b546001600160a01b031690565b6001600160a01b0316146114d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e6c565b61022b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61372a613336565b61012d805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613319612a5f565b60606101c58054610cf490614f3c565b60606101c68054610cf490614f3c565b6000611eb38383614299565b6000610cdf825490565b6001600160a01b0381166138135760405162461bcd60e51b815260206004820152603260248201527f426c61636b6c69737461626c653a206e657720626c61636b6c6973746572206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610e6c565b61025d80546001600160a01b0319166001600160a01b0383169081179091556040517fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b600054610100900460ff166138c95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b6138d1613918565b613910816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506142c3565b610ee2614368565b600054610100900460ff166114d95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b600054610100900460ff166139ee5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b6114d961441f565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6112648282612ed6565b60008281526065602090815260408083206001600160a01b038516845290915290205460ff1661126457613a7e8161449a565b613a898360206144ac565b604051602001613a9a929190615010565b60408051601f198184030181529082905262461bcd60e51b8252610e6c91600401614b6e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613af75750600090506003613b7b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613b4b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613b7457600060019250925050613b7b565b9150600090505b94509492505050565b6000816004811115613b9857613b98615091565b1415613ba15750565b6001816004811115613bb557613bb5615091565b1415613c035760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610e6c565b6002816004811115613c1757613c17615091565b1415613c655760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610e6c565b6003816004811115613c7957613c79615091565b1415610ee25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610e6c565b600080613cf983611c80565b9050613d058382614f87565b6001600160a01b038516600090815260c960205260409020541015613d6c5760405162461bcd60e51b815260206004820152600e60248201527f4555524f503a20747820666565730000000000000000000000000000000000006044820152606401610e6c565b6102f7546001600160a01b031615610d8f576102f754610d8f9085906001600160a01b031683612d11565b60008281526065602090815260408083206001600160a01b038516845290915290205460ff166112645760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19166001179055613df6612a5f565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611eb3836001600160a01b03841661468d565b6111398383836146dc565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613e856146e7565b613e8d614745565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008281526065602090815260408083206001600160a01b038516845290915290205460ff16156112645760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19169055613f2b612a5f565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6000611eb3836001600160a01b038416614777565b6001600160a01b0381163b6140015760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610e6c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b61404b8361486a565b6000825111806140585750805b15611139576111b783836148aa565b61012d5460ff166114d95760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610e6c565b600054610100900460ff166141255760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b81516141389060cc906020850190614a5c565b5080516111399060cd906020840190614a5c565b600054610100900460ff166141b75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b61012d805460ff19169055565b600054610100900460ff1661422f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b614241600061423c612a5f565b613a41565b61426d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661423c612a5f565b6112647f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61423c612a5f565b60008260000182815481106142b0576142b06150a7565b9060005260206000200154905092915050565b600054610100900460ff1661432e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b8151614342906101c5906020850190614a5c565b508051614357906101c6906020840190614a5c565b505060006101c38190556101c45550565b600054610100900460ff166143d35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96101f8557f72a9ba9d768e35b4ab8761b0abf8d49a4318cec0209bdc7ba8ac6136bf16ec8f6101f955565b600054610100900460ff1661448a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610e6c565b6114d9614495612a5f565b6136cf565b6060610cdf6001600160a01b03831660145b606060006144bb836002614fb6565b6144c6906002614f87565b67ffffffffffffffff8111156144de576144de614cd6565b6040519080825280601f01601f191660200182016040528015614508576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061453f5761453f6150a7565b60200101906001600160f81b031916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061458a5761458a6150a7565b60200101906001600160f81b031916908160001a90535060006145ae846002614fb6565b6145b9906001614f87565b90505b600181111561463e577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106145fa576145fa6150a7565b1a60f81b828281518110614610576146106150a7565b60200101906001600160f81b031916908160001a90535060049490941c93614637816150bd565b90506145bc565b508315611eb35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610e6c565b60008181526001830160205260408120546146d457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610cdf565b506000610cdf565b6111398383836148cf565b6000806146f2613761565b805190915015614709578051602090910120919050565b6101c35480156147195792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5090565b600080614750613771565b805190915015614767578051602090910120919050565b6101c45480156147195792915050565b6000818152600183016020526040812054801561486057600061479b600183614f9f565b85549091506000906147af90600190614f9f565b90508181146148145760008660000182815481106147cf576147cf6150a7565b90600052602060002001549050808760000184815481106147f2576147f26150a7565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614825576148256150d4565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610cdf565b6000915050610cdf565b61487381613f84565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611eb3838360405180606001604052806027815260200161510760279139614949565b61012d5460ff16156111395760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e7366657220776860448201527f696c6520706175736564000000000000000000000000000000000000000000006064820152608401610e6c565b6060600080856001600160a01b03168560405161496691906150ea565b600060405180830381855af49150503d80600081146149a1576040519150601f19603f3d011682016040523d82523d6000602084013e6149a6565b606091505b50915091506149b7868383876149c1565b9695505050505050565b60608315614a2d578251614a26576001600160a01b0385163b614a265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e6c565b5081612d09565b612d098383815115614a425781518083602001fd5b8060405162461bcd60e51b8152600401610e6c9190614b6e565b828054614a6890614f3c565b90600052602060002090601f016020900481019282614a8a5760008555614ad0565b82601f10614aa357805160ff1916838001178555614ad0565b82800160010185558215614ad0579182015b82811115614ad0578251825591602001919060010190614ab5565b506147419291505b808211156147415760008155600101614ad8565b600060208284031215614afe57600080fd5b81356001600160e01b031981168114611eb357600080fd5b60005b83811015614b31578181015183820152602001614b19565b838111156111b75750506000910152565b60008151808452614b5a816020860160208601614b16565b601f01601f19169290920160200192915050565b602081526000611eb36020830184614b42565b80356001600160a01b0381168114614b9857600080fd5b919050565b60008060408385031215614bb057600080fd5b614bb983614b81565b946020939093013593505050565b600060208284031215614bd957600080fd5b611eb382614b81565b600080600080600080600060e0888a031215614bfd57600080fd5b614c0688614b81565b9650614c1460208901614b81565b95506040880135945060608801359350608088013560ff81168114614c3857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215614c6a57600080fd5b614c7384614b81565b9250614c8160208501614b81565b9150604084013590509250925092565b600060208284031215614ca357600080fd5b5035919050565b60008060408385031215614cbd57600080fd5b82359150614ccd60208401614b81565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115614d0757614d07614cd6565b604051601f8501601f19908116603f01168101908282118183101715614d2f57614d2f614cd6565b81604052809350858152868686011115614d4857600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112614d7357600080fd5b611eb383833560208501614cec565b60008060408385031215614d9557600080fd5b823567ffffffffffffffff80821115614dad57600080fd5b614db986838701614d62565b93506020850135915080821115614dcf57600080fd5b50614ddc85828601614d62565b9150509250929050565b60008060408385031215614df957600080fd5b614e0283614b81565b9150602083013567ffffffffffffffff811115614e1e57600080fd5b8301601f81018513614e2f57600080fd5b614ddc85823560208401614cec565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152614e7a60e084018a614b42565b8381036040850152614e8c818a614b42565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015614ede57835183529284019291840191600101614ec2565b50909c9b505050505050505050505050565b60008060408385031215614f0357600080fd5b50508035926020909101359150565b60008060408385031215614f2557600080fd5b614f2e83614b81565b9150614ccd60208401614b81565b600181811c90821680614f5057607f821691505b60208210811415612c9957634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115614f9a57614f9a614f71565b500190565b600082821015614fb157614fb1614f71565b500390565b6000816000190483118215151615614fd057614fd0614f71565b500290565b600082614ff257634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561500957600080fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615048816017850160208801614b16565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351615085816028840160208801614b16565b01602801949350505050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816150cc576150cc614f71565b506000190190565b634e487b7160e01b600052603160045260246000fd5b600082516150fc818460208701614b16565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c48646720b98266809cb66ef40cbb0a4582b3117792b78b696a7e0985d2cba3964736f6c63430008080033
Deployed Bytecode Sourcemap
148883:11711:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66368:225;;;;;;;;;;-1:-1:-1;66368:225:0;;;;;:::i;:::-;;:::i;:::-;;;516:14:1;;509:22;491:41;;479:2;464:18;66368:225:0;;;;;;;;99806:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;102166:201::-;;;;;;;;;;-1:-1:-1;102166:201:0;;;;;:::i;:::-;;:::i;156200:288::-;;;;;;;;;;-1:-1:-1;156200:288:0;;;;;:::i;:::-;;:::i;:::-;;154446:98;;;;;;;;;;-1:-1:-1;154521:15:0;;154446:98;;;1900:25:1;;;1888:2;1873:18;154446:98:0;1754:177:1;151911:357:0;;;;;;;;;;-1:-1:-1;151911:357:0;;;;;:::i;:::-;;:::i;146200:661::-;;;;;;;;;;-1:-1:-1;146200:661:0;;;;;:::i;:::-;;:::i;100935:108::-;;;;;;;;;;-1:-1:-1;101023:12:0;;100935:108;;140398:148;;;;;;;;;;-1:-1:-1;140398:148:0;;;;;:::i;:::-;;:::i;102947:261::-;;;;;;;;;;-1:-1:-1;102947:261:0;;;;;:::i;:::-;;:::i;46470:131::-;;;;;;;;;;-1:-1:-1;46470:131:0;;;;;:::i;:::-;46544:7;46571:12;;;:6;:12;;;;;:22;;;;46470:131;149090:50;;;;;;;;;;;;149122:18;149090:50;;46911:147;;;;;;;;;;-1:-1:-1;46911:147:0;;;;;:::i;:::-;;:::i;151412:76::-;;;;;;;;;;-1:-1:-1;151476:4:0;151412:76;;155833:146;;;;;;;;;;-1:-1:-1;155833:146:0;;;;;:::i;:::-;;:::i;150412:99::-;;;;;;;;;;-1:-1:-1;150412:99:0;;149454:1;3926:36:1;;3914:2;3899:18;150412:99:0;3784:184:1;149147:66:0;;;;;;;;;;;;149187:26;149147:66;;159131:164;;;;;;;;;;-1:-1:-1;159131:164:0;;;;;:::i;:::-;;:::i;147176:106::-;;;;;;;;;;;;;:::i;48055:218::-;;;;;;;;;;-1:-1:-1;48055:218:0;;;;;:::i;:::-;;:::i;88771:198::-;;;;;;;;;;-1:-1:-1;88771:198:0;;;;;:::i;:::-;;:::i;103617:238::-;;;;;;;;;;-1:-1:-1;103617:238:0;;;;;:::i;:::-;;:::i;117942:178::-;;;;;;;;;;;;;:::i;156743:850::-;;;;;;;;;;-1:-1:-1;156743:850:0;;;;;:::i;:::-;;:::i;157895:328::-;;;;;;;;;;-1:-1:-1;157895:328:0;;;;;:::i;:::-;;:::i;149222:48::-;;;;;;;;;;-1:-1:-1;149222:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;116051:152;;;;;;;;;;-1:-1:-1;116051:152:0;;;;;:::i;:::-;;:::i;89300:223::-;;;;;;:::i;:::-;;:::i;88377:133::-;;;;;;;;;;;;;:::i;153194:88::-;;;;;;;;;;-1:-1:-1;153264:10:0;;153194:88;;159871:138;;;;;;;;;;-1:-1:-1;159871:138:0;;;;;:::i;:::-;159984:17;;-1:-1:-1;;;;;159971:30:0;;;159984:17;;159971:30;;159871:138;92265:86;;;;;;;;;;-1:-1:-1;92336:7:0;;;;92265:86;;153407:129;;;;;;;;;;-1:-1:-1;153407:129:0;;;;;:::i;:::-;;:::i;101106:127::-;;;;;;;;;;-1:-1:-1;101106:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;101207:18:0;101180:7;101207:18;;;:9;:18;;;;;;;101106:127;70642:103;;;;;;;;;;;;;:::i;155519:189::-;;;;;;;;;;-1:-1:-1;155519:189:0;;;;;:::i;:::-;;:::i;112374:164::-;;;;;;;;;;-1:-1:-1;112374:164:0;;;;;:::i;:::-;;:::i;146927:119::-;;;;;;;;;;-1:-1:-1;146927:119:0;;;;;:::i;:::-;;:::i;117552:172::-;;;;;;;;;;;;;:::i;133608:889::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;70001:87::-;;;;;;;;;;-1:-1:-1;70074:6:0;;-1:-1:-1;;;;;70074:6:0;70001:87;;;-1:-1:-1;;;;;7792:55:1;;;7774:74;;7762:2;7747:18;70001:87:0;7628:226:1;67192:153:0;;;;;;;;;;-1:-1:-1;67192:153:0;;;;;:::i;:::-;;:::i;44921:147::-;;;;;;;;;;-1:-1:-1;44921:147:0;;;;;:::i;:::-;45007:4;45031:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;45031:29:0;;;;;;;;;;;;;;;44921:147;100025:104;;;;;;;;;;;;;:::i;152530:241::-;;;;;;;;;;-1:-1:-1;152530:241:0;;;;;:::i;:::-;;:::i;154205:170::-;;;;;;;;;;-1:-1:-1;154205:170:0;;;;;:::i;:::-;;:::i;43859:49::-;;;;;;;;;;-1:-1:-1;43859:49:0;43904:4;43859:49;;104358:436;;;;;;;;;;-1:-1:-1;104358:436:0;;;;;:::i;:::-;;:::i;101439:193::-;;;;;;;;;;-1:-1:-1;101439:193:0;;;;;:::i;:::-;;:::i;152892:232::-;;;;;;;;;;-1:-1:-1;152892:232:0;;;;;:::i;:::-;;:::i;138951:26::-;;;;;;;;;;-1:-1:-1;138951:26:0;;;;-1:-1:-1;;;;;138951:26:0;;;67519:142;;;;;;;;;;-1:-1:-1;67519:142:0;;;;;:::i;:::-;;:::i;145543:649::-;;;;;;;;;;-1:-1:-1;145543:649:0;;;;;:::i;:::-;;:::i;115911:62::-;;;;;;;;;;;;115949:24;115911:62;;47351:149;;;;;;;;;;-1:-1:-1;47351:149:0;;;;;:::i;:::-;;:::i;159434:293::-;;;;;;;;;;-1:-1:-1;159434:293:0;;;;;:::i;:::-;;:::i;101695:151::-;;;;;;;;;;-1:-1:-1;101695:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;101811:18:0;;;101784:7;101811:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;101695:151;150628:332;;;;;;;;;;-1:-1:-1;150628:332:0;;;;;:::i;:::-;;:::i;115980:62::-;;;;;;;;;;;;116018:24;115980:62;;149984:420;;;;;;;;;;;;;:::i;154827:490::-;;;;;;;;;;-1:-1:-1;154827:490:0;;;;;:::i;:::-;;:::i;151660:108::-;;;;;;;;;;-1:-1:-1;151660:108:0;;;;;:::i;:::-;;:::i;140121:143::-;;;;;;;;;;-1:-1:-1;140121:143:0;;;;;:::i;:::-;;:::i;151101:207::-;;;;;;;;;;-1:-1:-1;151101:207:0;;;;;:::i;:::-;;:::i;139893:115::-;;;;;;;;;;-1:-1:-1;139893:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;139980:20:0;139956:4;139980:20;;;:11;:20;;;;;;;;;139893:115;66368:225;66453:4;-1:-1:-1;;;;;;66477:68:0;;66492:53;66477:68;;:108;;;66549:36;66573:11;66549:23;:36::i;:::-;66470:115;66368:225;-1:-1:-1;;66368:225:0:o;99806:100::-;99860:13;99893:5;99886:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99806:100;:::o;102166:201::-;102249:4;102266:13;102282:12;:10;:12::i;:::-;102266:28;;102305:32;102314:5;102321:7;102330:6;102305:8;:32::i;:::-;-1:-1:-1;102355:4:0;;102166:201;-1:-1:-1;;;102166:201:0:o;156200:288::-;149187:26;44350:16;44361:4;44350:10;:16::i;:::-;-1:-1:-1;;;;;45031:29:0;;45007:4;45031:29;;;:12;;:29;:12;:29;;;;;156340:86:::1;;;::::0;-1:-1:-1;;;156340:86:0;;9021:2:1;156340:86:0::1;::::0;::::1;9003:21:1::0;9060:2;9040:18;;;9033:30;9099:34;9079:18;;;9072:62;9170:15;9150:18;;;9143:43;9203:19;;156340:86:0::1;;;;;;;;;-1:-1:-1::0;;;;;;156437:21:0;;::::1;;::::0;;;:13:::1;:21;::::0;;;;:43;156200:288::o;151911:357::-;-1:-1:-1;;;;;152016:22:0;;;;:45;;-1:-1:-1;70074:6:0;;-1:-1:-1;;;;;152042:19:0;;;70074:6;;152042:19;152016:45;152013:57;;;151911:357;:::o;152013:57::-;152090:39;43904:4;152120:8;152090:9;:39::i;:::-;152148:68;43904:4;152179:36;43904:4;;152179:13;:36::i;152148:68::-;152227:33;152251:8;152227:23;:33::i;:::-;151911:357;:::o;146200:661::-;146456:8;146437:15;:27;;146429:66;;;;-1:-1:-1;;;146429:66:0;;9435:2:1;146429:66:0;;;9417:21:1;9474:2;9454:18;;;9447:30;9513:28;9493:18;;;9486:56;9559:18;;146429:66:0;9233:350:1;146429:66:0;146508:18;146550:13;;146565:5;146572:7;146581:5;146588:16;146598:5;146588:9;:16::i;:::-;146539:76;;;;;;9875:25:1;;;;-1:-1:-1;;;;;9997:15:1;;;9977:18;;;9970:43;10049:15;;;;10029:18;;;10022:43;10081:18;;;10074:34;10124:19;;;10117:35;10168:19;;;10161:35;;;9847:19;;146539:76:0;;;;;;;;;;;;146529:87;;;;;;146508:108;;146629:12;146644:28;146661:10;146644:16;:28::i;:::-;146629:43;;146685:14;146702:39;146727:4;146733:1;146736;146739;146702:24;:39::i;:::-;146685:56;;146770:5;-1:-1:-1;;;;;146760:15:0;:6;-1:-1:-1;;;;;146760:15:0;;146752:56;;;;-1:-1:-1;;;146752:56:0;;10409:2:1;146752:56:0;;;10391:21:1;10448:2;10428:18;;;10421:30;10487;10467:18;;;10460:58;10535:18;;146752:56:0;10207:352:1;146752:56:0;146821:32;146831:5;146838:7;146847:5;146821:9;:32::i;:::-;146418:443;;;146200:661;;;;;;;:::o;140398:148::-;139369:11;;-1:-1:-1;;;;;139369:11:0;139355:10;:25;139333:119;;;;-1:-1:-1;;;139333:119:0;;10766:2:1;139333:119:0;;;10748:21:1;10805:2;10785:18;;;10778:30;10844:34;10824:18;;;10817:62;-1:-1:-1;;;10895:18:1;;;10888:42;10947:19;;139333:119:0;10564:408:1;139333:119:0;-1:-1:-1;;;;;140472:20:0;::::1;140495:5;140472:20:::0;;;:11:::1;:20;::::0;;;;;:28;;-1:-1:-1;;140472:28:0::1;::::0;;140516:22;::::1;::::0;140495:5;140516:22:::1;140398:148:::0;:::o;102947:261::-;103044:4;103061:15;103079:12;:10;:12::i;:::-;103061:30;;103102:38;103118:4;103124:7;103133:6;103102:15;:38::i;:::-;103151:27;103161:4;103167:2;103171:6;103151:9;:27::i;:::-;-1:-1:-1;103196:4:0;;102947:261;-1:-1:-1;;;;102947:261:0:o;46911:147::-;46544:7;46571:12;;;:6;:12;;;;;:22;;;44350:16;44361:4;44350:10;:16::i;:::-;47025:25:::1;47036:4;47042:7;47025:10;:25::i;:::-;46911:147:::0;;;:::o;155833:146::-;-1:-1:-1;;;;;155904:21:0;;155928:1;155904:21;;;:13;:21;;;;;:25;155940:31;115949:24;155918:6;155940:10;:31::i;159131:164::-;149122:18;44350:16;44361:4;44350:10;:16::i;:::-;159254:33:::1;159270:4;159276:2;159280:6;159254:15;:33::i;:::-;159131:164:::0;;;;:::o;147176:106::-;147227:7;147254:20;:18;:20::i;:::-;147247:27;;147176:106;:::o;48055:218::-;48162:12;:10;:12::i;:::-;-1:-1:-1;;;;;48151:23:0;:7;-1:-1:-1;;;;;48151:23:0;;48143:83;;;;-1:-1:-1;;;48143:83:0;;11179:2:1;48143:83:0;;;11161:21:1;11218:2;11198:18;;;11191:30;11257:34;11237:18;;;11230:62;11328:17;11308:18;;;11301:45;11363:19;;48143:83:0;10977:411:1;48143:83:0;48239:26;48251:4;48257:7;48239:11;:26::i;:::-;48055:218;;:::o;88771:198::-;87078:4;-1:-1:-1;;;;;87087:6:0;87070:23;;;87062:80;;;;-1:-1:-1;;;87062:80:0;;11595:2:1;87062:80:0;;;11577:21:1;11634:2;11614:18;;;11607:30;11673:34;11653:18;;;11646:62;-1:-1:-1;;;11724:18:1;;;11717:42;11776:19;;87062:80:0;11393:408:1;87062:80:0;87185:6;-1:-1:-1;;;;;87161:30:0;:20;79576:66;79964:65;-1:-1:-1;;;;;79964:65:0;;79884:153;87161:20;-1:-1:-1;;;;;87161:30:0;;87153:87;;;;-1:-1:-1;;;87153:87:0;;12008:2:1;87153:87:0;;;11990:21:1;12047:2;12027:18;;;12020:30;12086:34;12066:18;;;12059:62;-1:-1:-1;;;12137:18:1;;;12130:42;12189:19;;87153:87:0;11806:408:1;87153:87:0;88853:36:::1;88871:17;88853;:36::i;:::-;88941:12;::::0;;88951:1:::1;88941:12:::0;;;::::1;::::0;::::1;::::0;;;88900:61:::1;::::0;88922:17;;88941:12;88900:21:::1;:61::i;103617:238::-:0;103705:4;103722:13;103738:12;:10;:12::i;:::-;103722:28;;103761:64;103770:5;103777:7;103814:10;103786:25;103796:5;103803:7;-1:-1:-1;;;;;101811:18:0;;;101784:7;101811:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;101695:151;103786:25;:38;;;;:::i;:::-;103761:8;:64::i;117942:178::-;117995:34;116018:24;118016:12;:10;:12::i;117995:34::-;117987:104;;;;-1:-1:-1;;;117987:104:0;;12743:2:1;117987:104:0;;;12725:21:1;12782:2;12762:18;;;12755:30;12821:34;12801:18;;;12794:62;12892:27;12872:18;;;12865:55;12937:19;;117987:104:0;12541:421:1;117987:104:0;118102:10;:8;:10::i;:::-;117942:178::o;156743:850::-;91870:19;:17;:19::i;:::-;-1:-1:-1;;;;;139672:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;156848:2;;139672:20:::1;;139671:21;139649:108;;;::::0;-1:-1:-1;;;139649:108:0;;13169:2:1;139649:108:0::1;::::0;::::1;13151:21:1::0;13208:2;13188:18;;;13181:30;13247:34;13227:18;;;13220:62;-1:-1:-1;;;13298:18:1;;;13291:35;13343:19;;139649:108:0::1;12967:401:1::0;139649:108:0::1;156895:36:::2;149187:26;156918:12;:10;:12::i;156895:36::-;:92;;;;156953:34;115949:24;156974:12;:10;:12::i;156953:34::-;156886:147;;;::::0;-1:-1:-1;;;156886:147:0;;13575:2:1;156886:147:0::2;::::0;::::2;13557:21:1::0;13614:2;13594:18;;;13587:30;13653:28;13633:18;;;13626:56;13699:18;;156886:147:0::2;13373:350:1::0;156886:147:0::2;157061:1;157052:6;:10;157044:60;;;::::0;-1:-1:-1;;;157044:60:0;;13930:2:1;157044:60:0::2;::::0;::::2;13912:21:1::0;13969:2;13949:18;;;13942:30;14008:34;13988:18;;;13981:62;14079:7;14059:18;;;14052:35;14104:19;;157044:60:0::2;13728:401:1::0;157044:60:0::2;157165:34;115949:24;157186:12;:10;:12::i;157165:34::-;157162:348;;;157216:28;157247:13;:27;157261:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;157247:27:0::2;-1:-1:-1::0;;;;;157247:27:0::2;;;;;;;;;;;;;157216:58;;157325:20;157315:6;:30;;157289:134;;;::::0;-1:-1:-1;;;157289:134:0;;14336:2:1;157289:134:0::2;::::0;::::2;14318:21:1::0;14375:2;14355:18;;;14348:30;14414:34;14394:18;;;14387:62;14485:12;14465:18;;;14458:40;14515:19;;157289:134:0::2;14134:406:1::0;157289:134:0::2;157468:29;157491:6:::0;157468:20;:29:::2;:::i;:::-;157438:13;:27;157452:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;157438:27:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;157438:27:0;:59;-1:-1:-1;157162:348:0::2;157522:17;157528:2;157532:6;157522:5;:17::i;:::-;157574:2;-1:-1:-1::0;;;;;157555:30:0::2;157560:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;157555:30:0::2;;157578:6;157555:30;;;;1900:25:1::0;;1888:2;1873:18;;1754:177;157555:30:0::2;;;;;;;;91900:1:::1;156743:850:::0;;:::o;157895:328::-;91870:19;:17;:19::i;:::-;158005:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;139672:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;139671:21;139649:108;;;::::0;-1:-1:-1;;;139649:108:0;;13169:2:1;139649:108:0::1;::::0;::::1;13151:21:1::0;13208:2;13188:18;;;13181:30;13247:34;13227:18;;;13220:62;-1:-1:-1;;;13298:18:1;;;13291:35;13343:19;;139649:108:0::1;12967:401:1::0;139649:108:0::1;158044:36:::2;149187:26;158067:12;:10;:12::i;158044:36::-;:92;;;;158102:34;115949:24;158123:12;:10;:12::i;158102:34::-;158035:142;;;::::0;-1:-1:-1;;;158035:142:0;;14877:2:1;158035:142:0::2;::::0;::::2;14859:21:1::0;14916:2;14896:18;;;14889:30;14955:28;14935:18;;;14928:56;15001:18;;158035:142:0::2;14675:350:1::0;158035:142:0::2;158188:27;158194:12;:10;:12::i;:::-;158208:6;158188:5;:27::i;116051:152::-:0;16373:19;16396:13;;;;;;16395:14;;16443:34;;;;-1:-1:-1;16461:12:0;;16476:1;16461:12;;;;:16;16443:34;16442:108;;;-1:-1:-1;16522:4:0;5090:19;:23;;;16483:66;;-1:-1:-1;16532:12:0;;;;;:17;16483:66;16420:204;;;;-1:-1:-1;;;16420:204:0;;15232:2:1;16420:204:0;;;15214:21:1;15271:2;15251:18;;;15244:30;15310:34;15290:18;;;15283:62;15381:16;15361:18;;;15354:44;15415:19;;16420:204:0;15030:410:1;16420:204:0;16635:12;:16;;-1:-1:-1;;16635:16:0;16650:1;16635:16;;;16662:67;;;;16697:13;:20;;-1:-1:-1;;16697:20:0;;;;;16662:67;116151:44:::1;116182:4;116188:6;116151:30;:44::i;:::-;16755:14:::0;16751:102;;;16802:5;16786:21;;-1:-1:-1;;16786:21:0;;;16827:14;;-1:-1:-1;3926:36:1;;16827:14:0;;3914:2:1;3899:18;16827:14:0;;;;;;;16362:498;116051:152;;:::o;89300:223::-;87078:4;-1:-1:-1;;;;;87087:6:0;87070:23;;;87062:80;;;;-1:-1:-1;;;87062:80:0;;11595:2:1;87062:80:0;;;11577:21:1;11634:2;11614:18;;;11607:30;11673:34;11653:18;;;11646:62;-1:-1:-1;;;11724:18:1;;;11717:42;11776:19;;87062:80:0;11393:408:1;87062:80:0;87185:6;-1:-1:-1;;;;;87161:30:0;:20;79576:66;79964:65;-1:-1:-1;;;;;79964:65:0;;79884:153;87161:20;-1:-1:-1;;;;;87161:30:0;;87153:87;;;;-1:-1:-1;;;87153:87:0;;12008:2:1;87153:87:0;;;11990:21:1;12047:2;12027:18;;;12020:30;12086:34;12066:18;;;12059:62;-1:-1:-1;;;12137:18:1;;;12130:42;12189:19;;87153:87:0;11806:408:1;87153:87:0;89416:36:::1;89434:17;89416;:36::i;:::-;89463:52;89485:17;89504:4;89510;89463:21;:52::i;88377:133::-:0;88455:7;87523:4;-1:-1:-1;;;;;87532:6:0;87515:23;;87507:92;;;;-1:-1:-1;;;87507:92:0;;15846:2:1;87507:92:0;;;15828:21:1;15885:2;15865:18;;;15858:30;15924:34;15904:18;;;15897:62;15995:26;15975:18;;;15968:54;16039:19;;87507:92:0;15644:420:1;87507:92:0;-1:-1:-1;79576:66:0::1;88377:133:::0;:::o;153407:129::-;153469:7;149491:5;153506:10;;153495:8;:21;;;;:::i;:::-;:33;;;;:::i;70642:103::-;69887:13;:11;:13::i;:::-;70707:30:::1;70734:1;70707:18;:30::i;155519:189::-:0;-1:-1:-1;;;;;155616:21:0;;;;;;:13;:21;;;;;:43;;;155670:30;115949:24;155630:6;155670:9;:30::i;112374:164::-;112451:46;112467:7;112476:12;:10;:12::i;:::-;112490:6;112451:15;:46::i;:::-;112508:22;112514:7;112523:6;112508:5;:22::i;146927:119::-;-1:-1:-1;;;;;147014:14:0;;146987:7;147014:14;;;:7;:14;;;;;141943;147014:24;141851:114;117552:172;117603:34;116018:24;117624:12;:10;:12::i;117603:34::-;117595:102;;;;-1:-1:-1;;;117595:102:0;;16723:2:1;117595:102:0;;;16705:21:1;16762:2;16742:18;;;16735:30;16801:34;16781:18;;;16774:62;16872:25;16852:18;;;16845:53;16915:19;;117595:102:0;16521:419:1;117595:102:0;117708:8;:6;:8::i;133608:889::-;133729:13;133757:18;133790:21;133826:15;133856:25;133896:12;133923:27;134191:11;;134206:1;134191:16;;;:39;;;;-1:-1:-1;134211:14:0;;:19;134191:39;134183:73;;;;-1:-1:-1;;;134183:73:0;;17147:2:1;134183:73:0;;;17129:21:1;17186:2;17166:18;;;17159:30;17225:23;17205:18;;;17198:51;17266:18;;134183:73:0;16945:345:1;134183:73:0;134322:13;:11;:13::i;:::-;134350:16;:14;:16::i;:::-;134462;;;134445:1;134462:16;;;;;;;;;134269:220;;;;-1:-1:-1;134269:220:0;;-1:-1:-1;134381:13:0;;-1:-1:-1;134417:4:0;;-1:-1:-1;134445:1:0;-1:-1:-1;134462:16:0;-1:-1:-1;134269:220:0;-1:-1:-1;133608:889:0:o;67192:153::-;67282:7;67309:18;;;:12;:18;;;;;:28;;67331:5;67309:21;:28::i;:::-;67302:35;67192:153;-1:-1:-1;;;67192:153:0:o;100025:104::-;100081:13;100114:7;100107:14;;;;;:::i;152530:241::-;149122:18;44350:16;44361:4;44350:10;:16::i;:::-;-1:-1:-1;;;;;152615:24:0;::::1;152607:77;;;::::0;-1:-1:-1;;;152607:77:0;;17497:2:1;152607:77:0::1;::::0;::::1;17479:21:1::0;17536:2;17516:18;;;17509:30;17575:34;17555:18;;;17548:62;17646:10;17626:18;;;17619:38;17674:19;;152607:77:0::1;17295:404:1::0;152607:77:0::1;152695:11;:24:::0;;-1:-1:-1;;;;;;152695:24:0::1;-1:-1:-1::0;;;;;152695:24:0;::::1;::::0;;::::1;::::0;;;152735:28:::1;::::0;7774:74:1;;;152735:28:0::1;::::0;7762:2:1;7747:18;152735:28:0::1;;;;;;;;152530:241:::0;;:::o;154205:170::-;149122:18;44350:16;44361:4;44350:10;:16::i;:::-;154290:15:::1;:28:::0;;;154334:33:::1;::::0;1900:25:1;;;154334:33:0::1;::::0;1888:2:1;1873:18;154334:33:0::1;1754:177:1::0;104358:436:0;104451:4;104468:13;104484:12;:10;:12::i;:::-;-1:-1:-1;;;;;101811:18:0;;;104507:24;101811:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;:18;;-1:-1:-1;104578:35:0;;;;104570:85;;;;-1:-1:-1;;;104570:85:0;;17906:2:1;104570:85:0;;;17888:21:1;17945:2;17925:18;;;17918:30;17984:34;17964:18;;;17957:62;18055:7;18035:18;;;18028:35;18080:19;;104570:85:0;17704:401:1;104570:85:0;104691:60;104700:5;104707:7;104735:15;104716:16;:34;104691:8;:60::i;101439:193::-;101518:4;101535:13;101551:12;:10;:12::i;:::-;101535:28;;101574;101584:5;101591:2;101595:6;101574:9;:28::i;152892:232::-;149122:18;44350:16;44361:4;44350:10;:16::i;:::-;149491:5:::1;152977:7;:20;;152969:57;;;::::0;-1:-1:-1;;;152969:57:0;;18312:2:1;152969:57:0::1;::::0;::::1;18294:21:1::0;18351:2;18331:18;;;18324:30;18390:26;18370:18;;;18363:54;18434:18;;152969:57:0::1;18110:348:1::0;152969:57:0::1;153052:10;:20:::0;;;153088:28:::1;::::0;1900:25:1;;;153088:28:0::1;::::0;1888:2:1;1873:18;153088:28:0::1;1754:177:1::0;67519:142:0;67599:7;67626:18;;;:12;:18;;;;;:27;;:25;:27::i;145543:649::-;145780:8;145761:15;:27;;145753:69;;;;-1:-1:-1;;;145753:69:0;;18665:2:1;145753:69:0;;;18647:21:1;18704:2;18684:18;;;18677:30;18743:31;18723:18;;;18716:59;18792:18;;145753:69:0;18463:353:1;145753:69:0;145835:18;145877:16;;145895:5;145902:7;145911:5;145918:16;145928:5;145918:9;:16::i;:::-;145866:79;;;;;;9875:25:1;;;;-1:-1:-1;;;;;9997:15:1;;;9977:18;;;9970:43;10049:15;;;;10029:18;;;10022:43;10081:18;;;10074:34;10124:19;;;10117:35;10168:19;;;10161:35;;;9847:19;;145866:79:0;;;;;;;;;;;;145856:90;;;;;;145835:111;;145959:12;145974:28;145991:10;145974:16;:28::i;:::-;145959:43;;146015:14;146032:39;146057:4;146063:1;146066;146069;146032:24;:39::i;:::-;146015:56;;146100:5;-1:-1:-1;;;;;146090:15:0;:6;-1:-1:-1;;;;;146090:15:0;;146082:58;;;;-1:-1:-1;;;146082:58:0;;19023:2:1;146082:58:0;;;19005:21:1;19062:2;19042:18;;;19035:30;19101:32;19081:18;;;19074:60;19151:18;;146082:58:0;18821:354:1;146082:58:0;146153:31;146162:5;146169:7;146178:5;146153:8;:31::i;47351:149::-;46544:7;46571:12;;;:6;:12;;;;;:22;;;44350:16;44361:4;44350:10;:16::i;:::-;47466:26:::1;47478:4;47484:7;47466:11;:26::i;159434:293::-:0;149122:18;44350:16;44361:4;44350:10;:16::i;:::-;-1:-1:-1;;;;;159533:30:0;::::1;159525:89;;;::::0;-1:-1:-1;;;159525:89:0;;19382:2:1;159525:89:0::1;::::0;::::1;19364:21:1::0;19421:2;19401:18;;;19394:30;19460:34;19440:18;;;19433:62;19531:16;19511:18;;;19504:44;19565:19;;159525:89:0::1;19180:410:1::0;159525:89:0::1;159625:17;:36:::0;;-1:-1:-1;;;;;;159625:36:0::1;-1:-1:-1::0;;;;;159625:36:0;::::1;::::0;;::::1;::::0;;;159677:42:::1;::::0;7774:74:1;;;159677:42:0::1;::::0;7762:2:1;7747:18;159677:42:0::1;7628:226:1::0;150628:332:0;69887:13;:11;:13::i;:::-;150721:42:::1;149122:18;150739:23;149122:18;150760:1;150739:13;:23::i;150721:42::-;150775:54;116018:24;150799:29;116018:24;150826:1;150799:13;:29::i;150775:54::-;150843:26;149122:18;150860:8;150843:9;:26::i;:::-;150881:32;116018:24;150904:8;150881:9;:32::i;:::-;150925:27;150943:8;150925:17;:27::i;149984:420::-:0;16373:19;16396:13;;;;;;16395:14;;16443:34;;;;-1:-1:-1;16461:12:0;;16476:1;16461:12;;;;:16;16443:34;16442:108;;;-1:-1:-1;16522:4:0;5090:19;:23;;;16483:66;;-1:-1:-1;16532:12:0;;;;;:17;16483:66;16420:204;;;;-1:-1:-1;;;16420:204:0;;15232:2:1;16420:204:0;;;15214:21:1;15271:2;15251:18;;;15244:30;15310:34;15290:18;;;15283:62;15381:16;15361:18;;;15354:44;15415:19;;16420:204:0;15030:410:1;16420:204:0;16635:12;:16;;-1:-1:-1;;16635:16:0;16650:1;16635:16;;;16662:67;;;;16697:13;:20;;-1:-1:-1;;16697:20:0;;;;;16662:67;150041:56:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;150041:56:0::1;;::::0;:30:::1;:56::i;:::-;150108:27;;;;;;;;;;;;;;-1:-1:-1::0;;;150108:27:0::1;;::::0;:18:::1;:27::i;:::-;150146:24;:22;:24::i;:::-;150181:16;:14;:16::i;:::-;150210:41;115949:24;149187:26;150210:13;:41::i;:::-;150262:29;149122:18;150288:1;150262:10;:29::i;:::-;150302:37;149187:26;150336:1;150302:10;:37::i;:::-;150365:1;150352:10;:14:::0;;;150377:15:::1;:19:::0;16751:102;;;;16802:5;16786:21;;-1:-1:-1;;16786:21:0;;;16827:14;;-1:-1:-1;3926:36:1;;16827:14:0;;3914:2:1;3899:18;16827:14:0;;;;;;;16362:498;149984:420::o;154827:490::-;159984:17;;-1:-1:-1;;;;;159984:17:0;154935:10;159971:30;154908:125;;;;;-1:-1:-1;;;154908:125:0;;19797:2:1;154908:125:0;;;19779:21:1;19816:18;;;19809:30;;;;19875:34;19855:18;;;19848:62;19946:34;19926:18;;;19919:62;19998:19;;154908:125:0;19595:428:1;154908:125:0;155072:15;;-1:-1:-1;;;;;101207:18:0;;101180:7;101207:18;;;:9;:18;;;;;;155052:35;;155044:115;;;;-1:-1:-1;;;155044:115:0;;20230:2:1;155044:115:0;;;20212:21:1;20269:2;20249:18;;;20242:30;20308:34;20288:18;;;20281:62;20379:19;20359:18;;;20352:47;20416:19;;155044:115:0;20028:413:1;155044:115:0;155188:10;;;155170:15;155209:14;;;155262:15;;155234:44;;155244:5;;155251:9;;155234;:44::i;:::-;155289:10;:20;-1:-1:-1;;154827:490:0:o;151660:108::-;69887:13;:11;:13::i;:::-;151742:18:::1;151751:8;151742;:18::i;140121:143::-:0;139369:11;;-1:-1:-1;;;;;139369:11:0;139355:10;:25;139333:119;;;;-1:-1:-1;;;139333:119:0;;10766:2:1;139333:119:0;;;10748:21:1;10805:2;10785:18;;;10778:30;10844:34;10824:18;;;10817:62;-1:-1:-1;;;10895:18:1;;;10888:42;10947:19;;139333:119:0;10564:408:1;139333:119:0;-1:-1:-1;;;;;140193:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;:27;;-1:-1:-1;;140193:27:0::1;140216:4;140193:27;::::0;;140236:20;::::1;::::0;140193;140236::::1;140121:143:::0;:::o;151101:207::-;151189:58;149187:26;151215:31;149187:26;151244:1;151215:13;:31::i;151189:58::-;151259:41;149187:26;151284:15;151259:9;:41::i;4795:326::-;-1:-1:-1;;;;;5090:19:0;;:23;;;4795:326::o;44614:215::-;44699:4;-1:-1:-1;;;;;;44723:58:0;;44738:43;44723:58;;:98;;-1:-1:-1;23640:36:0;-1:-1:-1;;;;;;23625:51:0;;;44785:36;23516:168;160017:315;159984:17;;160079:14;;-1:-1:-1;;;;;159984:17:0;160129:10;159971:30;160106:219;;;-1:-1:-1;;;160220:14:0;160216:23;160203:37;160199:2;160195:46;88377:133;:::o;160106:219::-;-1:-1:-1;20845:10:0;;147176:106::o;108351:346::-;-1:-1:-1;;;;;108453:19:0;;108445:68;;;;-1:-1:-1;;;108445:68:0;;20648:2:1;108445:68:0;;;20630:21:1;20687:2;20667:18;;;20660:30;20726:34;20706:18;;;20699:62;20797:6;20777:18;;;20770:34;20821:19;;108445:68:0;20446:400:1;108445:68:0;-1:-1:-1;;;;;108532:21:0;;108524:68;;;;-1:-1:-1;;;108524:68:0;;21053:2:1;108524:68:0;;;21035:21:1;21092:2;21072:18;;;21065:30;21131:34;21111:18;;;21104:62;21202:4;21182:18;;;21175:32;21224:19;;108524:68:0;20851:398:1;108524:68:0;-1:-1:-1;;;;;108605:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;108657:32;;1900:25:1;;;108657:32:0;;1873:18:1;108657:32:0;1754:177:1;45372:105:0;45439:30;45450:4;45456:12;:10;:12::i;:::-;45439:10;:30::i;70900:201::-;69887:13;:11;:13::i;:::-;-1:-1:-1;;;;;70989:22:0;::::1;70981:73;;;::::0;-1:-1:-1;;;70981:73:0;;21456:2:1;70981:73:0::1;::::0;::::1;21438:21:1::0;21495:2;21475:18;;;21468:30;21534:34;21514:18;;;21507:62;21605:8;21585:18;;;21578:36;21631:19;;70981:73:0::1;21254:402:1::0;70981:73:0::1;71065:28;71084:8;71065:18;:28::i;147420:218::-:0;-1:-1:-1;;;;;147552:14:0;;147480:15;147552:14;;;:7;:14;;;;;141943;;142080:1;142062:19;;;;141943:14;147613:17;147497:141;147420:218;;;:::o;133335:178::-;133412:7;133439:66;133472:20;:18;:20::i;:::-;133494:10;128403:4;128397:11;128434:10;128422:23;;128475:4;128466:14;;128459:39;;;;128528:4;128519:14;;128512:34;128583:4;128568:20;;;128200:406;126405:236;126490:7;126511:17;126530:18;126552:25;126563:4;126569:1;126572;126575;126552:10;:25::i;:::-;126510:67;;;;126588:18;126600:5;126588:11;:18::i;:::-;-1:-1:-1;126624:9:0;-1:-1:-1;126405:236:0;;;;;;;:::o;158468:347::-;-1:-1:-1;;;;;139672:20:0;;;;;;:11;:20;;;;;;158622:6;;139672:20;;139671:21;139649:108;;;;-1:-1:-1;;;139649:108:0;;13169:2:1;139649:108:0;;;13151:21:1;13208:2;13188:18;;;13181:30;13247:34;13227:18;;;13220:62;-1:-1:-1;;;13298:18:1;;;13291:35;13343:19;;139649:108:0;12967:401:1;139649:108:0;-1:-1:-1;;;;;139672:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;158655:9;;139672:20:::1;;139671:21;139649:108;;;::::0;-1:-1:-1;;;139649:108:0;;13169:2:1;139649:108:0::1;::::0;::::1;13151:21:1::0;13208:2;13188:18;;;13181:30;13247:34;13227:18;;;13220:62;-1:-1:-1;;;13298:18:1;;;13291:35;13343:19;;139649:108:0::1;12967:401:1::0;139649:108:0::1;158698:1:::2;158685:10;;:14;:42;;;;-1:-1:-1::0;158716:11:0::2;::::0;-1:-1:-1;;;;;158703:24:0;;::::2;158716:11:::0;::::2;158703:24;;158685:42;158682:72;;;158729:25;158739:6;158747;158729:9;:25::i;:::-;;158682:72;158765:42;158781:6;158789:9;158800:6;158765:15;:42::i;:::-;139768:1:::1;158468:347:::0;;;;:::o;108988:419::-;-1:-1:-1;;;;;101811:18:0;;;109089:24;101811:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;109156:37:0;;109152:248;;109238:6;109218:16;:26;;109210:68;;;;-1:-1:-1;;;109210:68:0;;21863:2:1;109210:68:0;;;21845:21:1;21902:2;21882:18;;;21875:30;21941:31;21921:18;;;21914:59;21990:18;;109210:68:0;21661:353:1;109210:68:0;109322:51;109331:5;109338:7;109366:6;109347:16;:25;109322:8;:51::i;67754:169::-;67842:31;67859:4;67865:7;67842:16;:31::i;:::-;67884:18;;;;:12;:18;;;;;:31;;67907:7;67884:22;:31::i;105264:806::-;-1:-1:-1;;;;;105361:18:0;;105353:68;;;;-1:-1:-1;;;105353:68:0;;22221:2:1;105353:68:0;;;22203:21:1;22260:2;22240:18;;;22233:30;22299:34;22279:18;;;22272:62;22370:7;22350:18;;;22343:35;22395:19;;105353:68:0;22019:401:1;105353:68:0;-1:-1:-1;;;;;105440:16:0;;105432:64;;;;-1:-1:-1;;;105432:64:0;;22627:2:1;105432:64:0;;;22609:21:1;22666:2;22646:18;;;22639:30;22705:34;22685:18;;;22678:62;22776:5;22756:18;;;22749:33;22799:19;;105432:64:0;22425:399:1;105432:64:0;105509:38;105530:4;105536:2;105540:6;105509:20;:38::i;:::-;-1:-1:-1;;;;;105582:15:0;;105560:19;105582:15;;;:9;:15;;;;;;105616:21;;;;105608:72;;;;-1:-1:-1;;;105608:72:0;;23031:2:1;105608:72:0;;;23013:21:1;23070:2;23050:18;;;23043:30;23109:34;23089:18;;;23082:62;23180:8;23160:18;;;23153:36;23206:19;;105608:72:0;22829:402:1;105608:72:0;-1:-1:-1;;;;;105716:15:0;;;;;;;:9;:15;;;;;;105734:20;;;105716:38;;105934:13;;;;;;;;;;:23;;;;;;105986:26;;;;;;105748:6;1900:25:1;;1888:2;1873:18;;1754:177;105986:26:0;;;;;;;;106025:37;46911:147;132380:111;132433:7;132460:23;:21;:23::i;68017:174::-;68106:32;68124:4;68130:7;68106:17;:32::i;:::-;68149:18;;;;:12;:18;;;;;:34;;68175:7;68149:25;:34::i;152280:135::-;43904:4;44350:16;43904:4;44350:10;:16::i;81286:958::-;79228:66;81706:59;;;81702:535;;;81782:37;81801:17;81782:18;:37::i;81702:535::-;81885:17;-1:-1:-1;;;;;81856:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81856:63:0;;;;;;;;-1:-1:-1;;81856:63:0;;;;;;;;;;;;:::i;:::-;;;81852:306;;82086:56;;-1:-1:-1;;;82086:56:0;;23627:2:1;82086:56:0;;;23609:21:1;23666:2;23646:18;;;23639:30;23705:34;23685:18;;;23678:62;23776:16;23756:18;;;23749:44;23810:19;;82086:56:0;23425:410:1;81852:306:0;79576:66;81970:28;;81962:82;;;;-1:-1:-1;;;81962:82:0;;24042:2:1;81962:82:0;;;24024:21:1;24081:2;24061:18;;;24054:30;24120:34;24100:18;;;24093:62;24191:11;24171:18;;;24164:39;24220:19;;81962:82:0;23840:405:1;81962:82:0;81920:140;82172:53;82190:17;82209:4;82215:9;82172:17;:53::i;93120:120::-;92129:16;:14;:16::i;:::-;93179:7:::1;:15:::0;;-1:-1:-1;;93179:15:0::1;::::0;;93210:22:::1;93219:12;:10;:12::i;:::-;93210:22;::::0;-1:-1:-1;;;;;7792:55:1;;;7774:74;;7762:2;7747:18;93210:22:0::1;;;;;;;93120:120::o:0;92424:108::-;92336:7;;;;92494:9;92486:38;;;;-1:-1:-1;;;92486:38:0;;24452:2:1;92486:38:0;;;24434:21:1;24491:2;24471:18;;;24464:30;24530:18;24510;;;24503:46;24566:18;;92486:38:0;24250:340:1;106357:548:0;-1:-1:-1;;;;;106441:21:0;;106433:65;;;;-1:-1:-1;;;106433:65:0;;24797:2:1;106433:65:0;;;24779:21:1;24836:2;24816:18;;;24809:30;24875:33;24855:18;;;24848:61;24926:18;;106433:65:0;24595:355:1;106433:65:0;106511:49;106540:1;106544:7;106553:6;106511:20;:49::i;:::-;106589:6;106573:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;106744:18:0;;;;;;:9;:18;;;;;;;;:28;;;;;;106799:37;1900:25:1;;;106799:37:0;;1873:18:1;106799:37:0;;;;;;;48055:218;;:::o;107238:675::-;-1:-1:-1;;;;;107322:21:0;;107314:67;;;;-1:-1:-1;;;107314:67:0;;25157:2:1;107314:67:0;;;25139:21:1;25196:2;25176:18;;;25169:30;25235:34;25215:18;;;25208:62;25306:3;25286:18;;;25279:31;25327:19;;107314:67:0;24955:397:1;107314:67:0;107394:49;107415:7;107432:1;107436:6;107394:20;:49::i;:::-;-1:-1:-1;;;;;107481:18:0;;107456:22;107481:18;;;:9;:18;;;;;;107518:24;;;;107510:71;;;;-1:-1:-1;;;107510:71:0;;25559:2:1;107510:71:0;;;25541:21:1;25598:2;25578:18;;;25571:30;25637:34;25617:18;;;25610:62;25708:4;25688:18;;;25681:32;25730:19;;107510:71:0;25357:398:1;107510:71:0;-1:-1:-1;;;;;107617:18:0;;;;;;:9;:18;;;;;;;;107638:23;;;107617:44;;107756:12;:22;;;;;;;107807:37;1900:25:1;;;107617:18:0;;;107807:37;;1873:18:1;107807:37:0;;;;;;;46911:147;;;:::o;116392:266::-;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;18508:69:0;116511:36:::1;116534:4;116540:6;116511:22;:36::i;:::-;116558:27;:25;:27::i;:::-;116596:54;116637:4;116643:6;116596:40;:54::i;70166:132::-:0;70241:12;:10;:12::i;:::-;-1:-1:-1;;;;;70230:23:0;:7;70074:6;;-1:-1:-1;;;;;70074:6:0;;70001:87;70230:7;-1:-1:-1;;;;;70230:23:0;;70222:68;;;;-1:-1:-1;;;70222:68:0;;26374:2:1;70222:68:0;;;26356:21:1;;;26393:18;;;26386:30;26452:34;26432:18;;;26425:62;26504:18;;70222:68:0;26172:356:1;71261:191:0;71354:6;;;-1:-1:-1;;;;;71371:17:0;;;-1:-1:-1;;;;;;71371:17:0;;;;;;;71404:40;;71354:6;;;71371:17;71354:6;;71404:40;;71335:16;;71404:40;71324:128;71261:191;:::o;92861:118::-;91870:19;:17;:19::i;:::-;92921:7:::1;:14:::0;;-1:-1:-1;;92921:14:0::1;92931:4;92921:14;::::0;;92951:20:::1;92958:12;:10;:12::i;134729:100::-:0;134783:13;134816:5;134809:12;;;;;:::i;135064:106::-;135121:13;135154:8;135147:15;;;;;:::i;61955:158::-;62029:7;62080:22;62084:3;62096:5;62080:3;:22::i;61484:117::-;61547:7;61574:19;61582:3;56784:18;;56701:109;140554:293;-1:-1:-1;;;;;140647:28:0;;140625:128;;;;-1:-1:-1;;;140625:128:0;;26735:2:1;140625:128:0;;;26717:21:1;26774:2;26754:18;;;26747:30;26813:34;26793:18;;;26786:62;26884:20;26864:18;;;26857:48;26922:19;;140625:128:0;26533:414:1;140625:128:0;140764:11;:28;;-1:-1:-1;;;;;;140764:28:0;-1:-1:-1;;;;;140764:28:0;;;;;;;;140808:31;;;;-1:-1:-1;;140808:31:0;140554:293;:::o;144876:205::-;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;18508:69:0;144961:26:::1;:24;:26::i;:::-;144998:34;145022:4;144998:34;;;;;;;;;;;;;;;;::::0;:23:::1;:34::i;:::-;145043:30;:28;:30::i;87627:68::-:0;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;69544:97:0;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;18508:69:0;69607:26:::1;:24;:26::i;49224:251::-:0;49308:25;46571:12;;;:6;:12;;;;;;:22;;;;49365:34;;;;49415:52;;46571:22;;49365:34;;46571:22;;:12;;49415:52;;49308:25;49415:52;49297:178;49224:251;;:::o;48980:112::-;49059:25;49070:4;49076:7;49059:10;:25::i;45767:514::-;45007:4;45031:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;45031:29:0;;;;;;;;;;;;45851:423;;46044:39;46075:7;46044:30;:39::i;:::-;46156:49;46195:4;46202:2;46156:30;:49::i;:::-;45949:279;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;45949:279:0;;;;;;;;;;-1:-1:-1;;;45895:367:0;;;;;;;:::i;124789:1477::-;124877:7;;125811:66;125798:79;;125794:163;;;-1:-1:-1;125910:1:0;;-1:-1:-1;125914:30:0;125894:51;;125794:163;126071:24;;;126054:14;126071:24;;;;;;;;;27970:25:1;;;28043:4;28031:17;;28011:18;;;28004:45;;;;28065:18;;;28058:34;;;28108:18;;;28101:34;;;126071:24:0;;27942:19:1;;126071:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;126071:24:0;;-1:-1:-1;;126071:24:0;;;-1:-1:-1;;;;;;;126110:20:0;;126106:103;;126163:1;126167:29;126147:50;;;;;;;126106:103;126229:6;-1:-1:-1;126237:20:0;;-1:-1:-1;124789:1477:0;;;;;;;;:::o;120249:521::-;120327:20;120318:5;:29;;;;;;;;:::i;:::-;;120314:449;;;120249:521;:::o;120314:449::-;120425:29;120416:5;:38;;;;;;;;:::i;:::-;;120412:351;;;120471:34;;-1:-1:-1;;;120471:34:0;;28537:2:1;120471:34:0;;;28519:21:1;28576:2;28556:18;;;28549:30;28615:26;28595:18;;;28588:54;28659:18;;120471:34:0;28335:348:1;120412:351:0;120536:35;120527:5;:44;;;;;;;;:::i;:::-;;120523:240;;;120588:41;;-1:-1:-1;;;120588:41:0;;28890:2:1;120588:41:0;;;28872:21:1;28929:2;28909:18;;;28902:30;28968:33;28948:18;;;28941:61;29019:18;;120588:41:0;28688:355:1;120523:240:0;120660:30;120651:5;:39;;;;;;;;:::i;:::-;;120647:116;;;120707:44;;-1:-1:-1;;;120707:44:0;;29250:2:1;120707:44:0;;;29232:21:1;29289:2;29269:18;;;29262:30;29328:34;29308:18;;;29301:62;29399:4;29379:18;;;29372:32;29421:19;;120707:44:0;29048:398:1;153739:335:0;153807:4;153824:14;153841:24;153856:8;153841:14;:24::i;:::-;153824:41;-1:-1:-1;153903:17:0;153912:8;153824:41;153903:17;:::i;:::-;-1:-1:-1;;;;;101207:18:0;;101180:7;101207:18;;;:9;:18;;;;;;153884:36;;153876:63;;;;-1:-1:-1;;;153876:63:0;;29653:2:1;153876:63:0;;;29635:21:1;29692:2;29672:18;;;29665:30;29731:16;29711:18;;;29704:44;29765:18;;153876:63:0;29451:338:1;153876:63:0;153954:11;;-1:-1:-1;;;;;153954:11:0;:25;153950:94;;154011:11;;153995:36;;154005:4;;-1:-1:-1;;;;;154011:11:0;154024:6;153995:9;:36::i;49652:238::-;45007:4;45031:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;45031:29:0;;;;;;;;;;;;49731:152;;49775:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;49775:29:0;;;;;;;;;:36;;-1:-1:-1;;49775:36:0;49807:4;49775:36;;;49858:12;:10;:12::i;:::-;-1:-1:-1;;;;;49831:40:0;49849:7;-1:-1:-1;;;;;49831:40:0;49843:4;49831:40;;;;;;;;;;49652:238;;:::o;60659:152::-;60729:4;60753:50;60758:3;-1:-1:-1;;;;;60778:23:0;;60753:4;:50::i;158231:229::-;158408:44;158435:4;158441:2;158445:6;158408:26;:44::i;132499:194::-;132554:7;130951:95;132614:17;:15;:17::i;:::-;132633:20;:18;:20::i;:::-;132591:93;;;;;;30053:25:1;;;;30094:18;;30087:34;;;;30137:18;;;30130:34;132655:13:0;30180:18:1;;;30173:34;132678:4:0;30223:19:1;;;30216:84;30025:19;;132591:93:0;;;;;;;;;;;;132581:104;;;;;;132574:111;;132499:194;:::o;50070:239::-;45007:4;45031:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;45031:29:0;;;;;;;;;;;;50150:152;;;50225:5;50193:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;50193:29:0;;;;;;;;;:37;;-1:-1:-1;;50193:37:0;;;50277:12;:10;:12::i;:::-;-1:-1:-1;;;;;50250:40:0;50268:7;-1:-1:-1;;;;;50250:40:0;50262:4;50250:40;;;;;;;;;;50070:239;;:::o;60987:158::-;61060:4;61084:53;61092:3;-1:-1:-1;;;;;61112:23:0;;61084:7;:53::i;80133:284::-;-1:-1:-1;;;;;5090:19:0;;;80207:106;;;;-1:-1:-1;;;80207:106:0;;30513:2:1;80207:106:0;;;30495:21:1;30552:2;30532:18;;;30525:30;30591:34;30571:18;;;30564:62;30662:15;30642:18;;;30635:43;30695:19;;80207:106:0;30311:409:1;80207:106:0;79576:66;80324:85;;-1:-1:-1;;;;;;80324:85:0;-1:-1:-1;;;;;80324:85:0;;;;;;;;;;80133:284::o;80826:281::-;80935:29;80946:17;80935:10;:29::i;:::-;80993:1;80979:4;:11;:15;:28;;;;80998:9;80979:28;80975:125;;;81024:64;81064:17;81083:4;81024:39;:64::i;92609:108::-;92336:7;;;;92668:41;;;;-1:-1:-1;;;92668:41:0;;30927:2:1;92668:41:0;;;30909:21:1;30966:2;30946:18;;;30939:30;31005:22;30985:18;;;30978:50;31045:18;;92668:41:0;30725:344:1;99574:162:0;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;18508:69:0;99687:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;99711:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;91542:97::-:0;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;18508:69:0;91616:7:::1;:15:::0;;-1:-1:-1;;91616:15:0::1;::::0;;91542:97::o;116666:267::-;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;18508:69:0;116783:44:::1;43904:4;116814:12;:10;:12::i;:::-;116783:10;:44::i;:::-;116840:37;115949:24;116864:12;:10;:12::i;116840:37::-;116888;116018:24;116912:12;:10;:12::i;57164:120::-:0;57231:7;57258:3;:11;;57270:5;57258:18;;;;;;;;:::i;:::-;;;;;;;;;57251:25;;57164:120;;;;:::o;132015:274::-;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;18508:69:0;132128:12;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;132151:18:0;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;132251:1:0::1;132237:11;:15:::0;;;132263:14:::1;:18:::0;-1:-1:-1;132015:274:0:o;145089:388::-;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;18508:69:0;145185:119:::1;145166:16;:138:::0;145331::::1;145315:13;:154:::0;145089:388::o;69649:113::-;18516:13;;;;;;;18508:69;;;;-1:-1:-1;;;18508:69:0;;25962:2:1;18508:69:0;;;25944:21:1;26001:2;25981:18;;;25974:30;26040:34;26020:18;;;26013:62;-1:-1:-1;;;26091:18:1;;;26084:41;26142:19;;18508:69:0;25760:407:1;18508:69:0;69722:32:::1;69741:12;:10;:12::i;:::-;69722:18;:32::i;41229:151::-:0;41287:13;41320:52;-1:-1:-1;;;;;41332:22:0;;39071:2;40625:447;40700:13;40726:19;40758:10;40762:6;40758:1;:10;:::i;:::-;:14;;40771:1;40758:14;:::i;:::-;40748:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40748:25:0;;40726:47;;40784:15;:6;40791:1;40784:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;40784:15:0;;;;;;;;;40810;:6;40817:1;40810:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;40810:15:0;;;;;;;;-1:-1:-1;40841:9:0;40853:10;40857:6;40853:1;:10;:::i;:::-;:14;;40866:1;40853:14;:::i;:::-;40841:26;;40836:131;40873:1;40869;:5;40836:131;;;40908:8;40917:5;40925:3;40917:11;40908:21;;;;;;;:::i;:::-;;;;40896:6;40903:1;40896:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;40896:33:0;;;;;;;;-1:-1:-1;40954:1:0;40944:11;;;;;40876:3;;;:::i;:::-;;;40836:131;;;-1:-1:-1;40985:10:0;;40977:55;;;;-1:-1:-1;;;40977:55:0;;31606:2:1;40977:55:0;;;31588:21:1;;;31625:18;;;31618:30;31684:34;31664:18;;;31657:62;31736:18;;40977:55:0;31404:356:1;54390:414:0;54453:4;56583:19;;;:12;;;:19;;;;;;54470:327;;-1:-1:-1;54513:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;54696:18;;54674:19;;;:12;;;:19;;;;;;:40;;;;54729:11;;54470:327;-1:-1:-1;54780:5:0;54773:12;;118128:239;118315:44;118342:4;118348:2;118352:6;118315:26;:44::i;135392:644::-;135442:7;135462:18;135483:13;:11;:13::i;:::-;135511:18;;135462:34;;-1:-1:-1;135511:22:0;135507:522;;135557:22;;;;;;;;135392:644;-1:-1:-1;135392:644:0:o;135507:522::-;135858:11;;135888:15;;135884:134;;135931:10;135392:644;-1:-1:-1;;135392:644:0:o;135884:134::-;135989:13;135982:20;;;;135392:644;:::o;135507:522::-;135451:585;135392:644;:::o;136264:680::-;136317:7;136337:21;136361:16;:14;:16::i;:::-;136392:21;;136337:40;;-1:-1:-1;136392:25:0;136388:549;;136441:25;;;;;;;;136264:680;-1:-1:-1;136264:680:0:o;136388:549::-;136757:14;;136790:18;;136786:140;;136836:13;136264:680;-1:-1:-1;;136264:680:0:o;54980:1420::-;55046:4;55185:19;;;:12;;;:19;;;;;;55221:15;;55217:1176;;55596:21;55620:14;55633:1;55620:10;:14;:::i;:::-;55669:18;;55596:38;;-1:-1:-1;55649:17:0;;55669:22;;55690:1;;55669:22;:::i;:::-;55649:42;;55725:13;55712:9;:26;55708:405;;55759:17;55779:3;:11;;55791:9;55779:22;;;;;;;;:::i;:::-;;;;;;;;;55759:42;;55933:9;55904:3;:11;;55916:13;55904:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;56018:23;;;:12;;;:23;;;;;:36;;;55708:405;56194:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;56289:3;:12;;:19;56302:5;56289:19;;;;;;;;;;;56282:26;;;56332:4;56325:11;;;;;;;55217:1176;56376:5;56369:12;;;;;80530:155;80597:37;80616:17;80597:18;:37::i;:::-;80650:27;;-1:-1:-1;;;;;80650:27:0;;;;;;;;80530:155;:::o;10187:200::-;10270:12;10302:77;10323:6;10331:4;10302:77;;;;;;;;;;;;;;;;;:20;:77::i;114222:238::-;92336:7;;;;114396:9;114388:64;;;;-1:-1:-1;;;114388:64:0;;32156:2:1;114388:64:0;;;32138:21:1;32195:2;32175:18;;;32168:30;32234:34;32214:18;;;32207:62;32305:12;32285:18;;;32278:40;32335:19;;114388:64:0;31954:406:1;10581:332:0;10726:12;10752;10766:23;10793:6;-1:-1:-1;;;;;10793:19:0;10813:4;10793:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10751:67;;;;10836:69;10863:6;10871:7;10880:10;10892:12;10836:26;:69::i;:::-;10829:76;10581:332;-1:-1:-1;;;;;;10581:332:0:o;11209:644::-;11394:12;11423:7;11419:427;;;11451:17;;11447:290;;-1:-1:-1;;;;;5090:19:0;;;11661:60;;;;-1:-1:-1;;;11661:60:0;;32846:2:1;11661:60:0;;;32828:21:1;32885:2;32865:18;;;32858:30;32924:31;32904:18;;;32897:59;32973:18;;11661:60:0;32644:353:1;11661:60:0;-1:-1:-1;11758:10:0;11751:17;;11419:427;11801:33;11809:10;11821:12;12556:17;;:21;12552:388;;12788:10;12782:17;12845:15;12832:10;12828:2;12824:19;12817:44;12552:388;12915:12;12908:20;;-1:-1:-1;;;12908:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:332:1;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;-1:-1:-1;;;;;;223:5:1;219:78;212:5;209:89;199:117;;312:1;309;302:12;543:258;615:1;625:113;639:6;636:1;633:13;625:113;;;715:11;;;709:18;696:11;;;689:39;661:2;654:10;625:113;;;756:6;753:1;750:13;747:48;;;-1:-1:-1;;791:1:1;773:16;;766:27;543:258::o;806:::-;848:3;886:5;880:12;913:6;908:3;901:19;929:63;985:6;978:4;973:3;969:14;962:4;955:5;951:16;929:63;:::i;:::-;1046:2;1025:15;-1:-1:-1;;1021:29:1;1012:39;;;;1053:4;1008:50;;806:258;-1:-1:-1;;806:258:1:o;1069:220::-;1218:2;1207:9;1200:21;1181:4;1238:45;1279:2;1268:9;1264:18;1256:6;1238:45;:::i;1294:196::-;1362:20;;-1:-1:-1;;;;;1411:54:1;;1401:65;;1391:93;;1480:1;1477;1470:12;1391:93;1294:196;;;:::o;1495:254::-;1563:6;1571;1624:2;1612:9;1603:7;1599:23;1595:32;1592:52;;;1640:1;1637;1630:12;1592:52;1663:29;1682:9;1663:29;:::i;:::-;1653:39;1739:2;1724:18;;;;1711:32;;-1:-1:-1;;;1495:254:1:o;1936:186::-;1995:6;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;2127:693::-;2238:6;2246;2254;2262;2270;2278;2286;2339:3;2327:9;2318:7;2314:23;2310:33;2307:53;;;2356:1;2353;2346:12;2307:53;2379:29;2398:9;2379:29;:::i;:::-;2369:39;;2427:38;2461:2;2450:9;2446:18;2427:38;:::i;:::-;2417:48;;2512:2;2501:9;2497:18;2484:32;2474:42;;2563:2;2552:9;2548:18;2535:32;2525:42;;2617:3;2606:9;2602:19;2589:33;2662:4;2655:5;2651:16;2644:5;2641:27;2631:55;;2682:1;2679;2672:12;2631:55;2127:693;;;;-1:-1:-1;2127:693:1;;;;2705:5;2757:3;2742:19;;2729:33;;-1:-1:-1;2809:3:1;2794:19;;;2781:33;;2127:693;-1:-1:-1;;2127:693:1:o;2825:328::-;2902:6;2910;2918;2971:2;2959:9;2950:7;2946:23;2942:32;2939:52;;;2987:1;2984;2977:12;2939:52;3010:29;3029:9;3010:29;:::i;:::-;3000:39;;3058:38;3092:2;3081:9;3077:18;3058:38;:::i;:::-;3048:48;;3143:2;3132:9;3128:18;3115:32;3105:42;;2825:328;;;;;:::o;3158:180::-;3217:6;3270:2;3258:9;3249:7;3245:23;3241:32;3238:52;;;3286:1;3283;3276:12;3238:52;-1:-1:-1;3309:23:1;;3158:180;-1:-1:-1;3158:180:1:o;3525:254::-;3593:6;3601;3654:2;3642:9;3633:7;3629:23;3625:32;3622:52;;;3670:1;3667;3660:12;3622:52;3706:9;3693:23;3683:33;;3735:38;3769:2;3758:9;3754:18;3735:38;:::i;:::-;3725:48;;3525:254;;;;;:::o;4158:184::-;-1:-1:-1;;;4207:1:1;4200:88;4307:4;4304:1;4297:15;4331:4;4328:1;4321:15;4347:632;4412:5;4442:18;4483:2;4475:6;4472:14;4469:40;;;4489:18;;:::i;:::-;4564:2;4558:9;4532:2;4618:15;;-1:-1:-1;;4614:24:1;;;4640:2;4610:33;4606:42;4594:55;;;4664:18;;;4684:22;;;4661:46;4658:72;;;4710:18;;:::i;:::-;4750:10;4746:2;4739:22;4779:6;4770:15;;4809:6;4801;4794:22;4849:3;4840:6;4835:3;4831:16;4828:25;4825:45;;;4866:1;4863;4856:12;4825:45;4916:6;4911:3;4904:4;4896:6;4892:17;4879:44;4971:1;4964:4;4955:6;4947;4943:19;4939:30;4932:41;;;;4347:632;;;;;:::o;4984:222::-;5027:5;5080:3;5073:4;5065:6;5061:17;5057:27;5047:55;;5098:1;5095;5088:12;5047:55;5120:80;5196:3;5187:6;5174:20;5167:4;5159:6;5155:17;5120:80;:::i;5211:543::-;5299:6;5307;5360:2;5348:9;5339:7;5335:23;5331:32;5328:52;;;5376:1;5373;5366:12;5328:52;5416:9;5403:23;5445:18;5486:2;5478:6;5475:14;5472:34;;;5502:1;5499;5492:12;5472:34;5525:50;5567:7;5558:6;5547:9;5543:22;5525:50;:::i;:::-;5515:60;;5628:2;5617:9;5613:18;5600:32;5584:48;;5657:2;5647:8;5644:16;5641:36;;;5673:1;5670;5663:12;5641:36;;5696:52;5740:7;5729:8;5718:9;5714:24;5696:52;:::i;:::-;5686:62;;;5211:543;;;;;:::o;5759:524::-;5836:6;5844;5897:2;5885:9;5876:7;5872:23;5868:32;5865:52;;;5913:1;5910;5903:12;5865:52;5936:29;5955:9;5936:29;:::i;:::-;5926:39;;6016:2;6005:9;6001:18;5988:32;6043:18;6035:6;6032:30;6029:50;;;6075:1;6072;6065:12;6029:50;6098:22;;6151:4;6143:13;;6139:27;-1:-1:-1;6129:55:1;;6180:1;6177;6170:12;6129:55;6203:74;6269:7;6264:2;6251:16;6246:2;6242;6238:11;6203:74;:::i;6288:1335::-;6685:66;6677:6;6673:79;6662:9;6655:98;6636:4;6772:2;6810:3;6805:2;6794:9;6790:18;6783:31;6837:46;6878:3;6867:9;6863:19;6855:6;6837:46;:::i;:::-;6931:9;6923:6;6919:22;6914:2;6903:9;6899:18;6892:50;6965:33;6991:6;6983;6965:33;:::i;:::-;7029:2;7014:18;;7007:34;;;-1:-1:-1;;;;;7078:55:1;;7072:3;7057:19;;7050:84;7165:3;7150:19;;7143:35;;;7215:22;;;7209:3;7194:19;;7187:51;7287:13;;7309:22;;;7385:15;;;;-1:-1:-1;7347:15:1;;;;-1:-1:-1;7428:169:1;7442:6;7439:1;7436:13;7428:169;;;7503:13;;7491:26;;7572:15;;;;7537:12;;;;7464:1;7457:9;7428:169;;;-1:-1:-1;7614:3:1;;6288:1335;-1:-1:-1;;;;;;;;;;;;6288:1335:1:o;7859:248::-;7927:6;7935;7988:2;7976:9;7967:7;7963:23;7959:32;7956:52;;;8004:1;8001;7994:12;7956:52;-1:-1:-1;;8027:23:1;;;8097:2;8082:18;;;8069:32;;-1:-1:-1;7859:248:1:o;8112:260::-;8180:6;8188;8241:2;8229:9;8220:7;8216:23;8212:32;8209:52;;;8257:1;8254;8247:12;8209:52;8280:29;8299:9;8280:29;:::i;:::-;8270:39;;8328:38;8362:2;8351:9;8347:18;8328:38;:::i;8377:437::-;8456:1;8452:12;;;;8499;;;8520:61;;8574:4;8566:6;8562:17;8552:27;;8520:61;8627:2;8619:6;8616:14;8596:18;8593:38;8590:218;;;-1:-1:-1;;;8661:1:1;8654:88;8765:4;8762:1;8755:15;8793:4;8790:1;8783:15;12219:184;-1:-1:-1;;;12268:1:1;12261:88;12368:4;12365:1;12358:15;12392:4;12389:1;12382:15;12408:128;12448:3;12479:1;12475:6;12472:1;12469:13;12466:39;;;12485:18;;:::i;:::-;-1:-1:-1;12521:9:1;;12408:128::o;14545:125::-;14585:4;14613:1;14610;14607:8;14604:34;;;14618:18;;:::i;:::-;-1:-1:-1;14655:9:1;;14545:125::o;16069:168::-;16109:7;16175:1;16171;16167:6;16163:14;16160:1;16157:21;16152:1;16145:9;16138:17;16134:45;16131:71;;;16182:18;;:::i;:::-;-1:-1:-1;16222:9:1;;16069:168::o;16242:274::-;16282:1;16308;16298:189;;-1:-1:-1;;;16340:1:1;16333:88;16444:4;16441:1;16434:15;16472:4;16469:1;16462:15;16298:189;-1:-1:-1;16501:9:1;;16242:274::o;23236:184::-;23306:6;23359:2;23347:9;23338:7;23334:23;23330:32;23327:52;;;23375:1;23372;23365:12;23327:52;-1:-1:-1;23398:16:1;;23236:184;-1:-1:-1;23236:184:1:o;26952:786::-;27363:25;27358:3;27351:38;27333:3;27418:6;27412:13;27434:62;27489:6;27484:2;27479:3;27475:12;27468:4;27460:6;27456:17;27434:62;:::i;:::-;27560:19;27555:2;27515:16;;;27547:11;;;27540:40;27605:13;;27627:63;27605:13;27676:2;27668:11;;27661:4;27649:17;;27627:63;:::i;:::-;27710:17;27729:2;27706:26;;26952:786;-1:-1:-1;;;;26952:786:1:o;28146:184::-;-1:-1:-1;;;28195:1:1;28188:88;28295:4;28292:1;28285:15;28319:4;28316:1;28309:15;31074:184;-1:-1:-1;;;31123:1:1;31116:88;31223:4;31220:1;31213:15;31247:4;31244:1;31237:15;31263:136;31302:3;31330:5;31320:39;;31339:18;;:::i;:::-;-1:-1:-1;;;31375:18:1;;31263:136::o;31765:184::-;-1:-1:-1;;;31814:1:1;31807:88;31914:4;31911:1;31904:15;31938:4;31935:1;31928:15;32365:274;32494:3;32532:6;32526:13;32548:53;32594:6;32589:3;32582:4;32574:6;32570:17;32548:53;:::i;:::-;32617:16;;;;;32365:274;-1:-1:-1;;32365:274:1:o
Swarm Source
ipfs://c48646720b98266809cb66ef40cbb0a4582b3117792b78b696a7e0985d2cba39
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in XPL
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.