Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
293,785.64895 EUV-2
Holders
354
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
UVPool
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-02 */ // File: contracts/interfaces/IUVReserveFactory.sol pragma solidity ^0.8.12; interface IUVReserveFactory { function createReserve( address _fundWallet, address _pool, address _manager ) external; function addPoolRole(uint8 _orderNumber, address _manager) external; function removePoolRole(uint8 _orderNumber, address _manager) external; function addRole(address _addr) external; function removeRole(address _addr) external; function getPoolsLength() external view returns (uint256); function getPoolInfo(uint8 _orderNumber) external view returns ( address _poolReserve, address _poolTP, address _manager, address _fundWallet ); } // File: contracts/interfaces/IUVPool.sol pragma solidity ^0.8.12; interface IUVPool { function deposit(uint256 amount) external; function initialize( uint8 _orderNumber, uint256 _amountLimited, uint256 _minimumDeposit, address _fundWallet, address _factoryReserve, uint64 _poolOpenTime, address _stableCoin ) external; function transferForInvestment( address _tokenAddress, uint256 _amount, address _receiver ) external; function getReserve() external returns (address); function buyToken( uint256 _amountIn, uint256 _amountOutMin, address _tokenIn, bytes calldata _path, uint256 _deadline ) external; function setFundWallet(address _fundWallet) external; function setMinimumDeposit(uint256 _minimumDeposit) external; function openPool() external; function closePool() external; function setFeeCreator(uint256 _feeCreator) external; function addManager(address _manager) external; function removeManager(address _manager) external; function addInvestmentAddress(address _investmentAddress) external; function removeInvestmentAddress(address _investmentAddress) external; function createVote( uint8 _orderNumber, uint64 _startTimestamp, uint64 _endTimestamp ) external payable; function closeVote(uint8 _orderNumber) external; function voting(uint8 _orderNumber, uint8 _optionId) external; event Deposit(address indexed sender, uint256 amount); event BuyToken(address indexed tokenAddress, uint256 amount); event BuyBNB(uint256 amount); event CreateVote(uint8 voteId, uint64 startTimestamp, uint64 endTimestamp); event Voting( address indexed voter, uint256 amount, uint64 timestamp, uint8 optionId, uint64 voteCount ); event CloseVote(uint8 voteId); } // File: @uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol pragma solidity >=0.5.0; /// @title Callback for IUniswapV3PoolActions#swap /// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface interface IUniswapV3SwapCallback { /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap. /// @dev In the implementation you must pay the pool tokens owed for the swap. /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory. /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped. /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call function uniswapV3SwapCallback( int256 amount0Delta, int256 amount1Delta, bytes calldata data ) external; } // File: @uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol pragma solidity >=0.7.5; pragma abicoder v2; /// @title Router token swapping functionality /// @notice Functions for swapping tokens via Uniswap V3 interface ISwapRouter is IUniswapV3SwapCallback { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.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: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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: @uniswap/v3-periphery/contracts/libraries/TransferHelper.sol pragma solidity >=0.6.0; library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // 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 IERC20Metadata is IERC20 { /** * @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/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.8.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]. * * 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 ERC20 is Context, IERC20, IERC20Metadata { 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}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _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 value {ERC20} uses, unless this function is * 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 {} } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // 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 ERC20Burnable is Context, ERC20 { /** * @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); } } // File: contracts/UVPool.sol pragma solidity ^0.8.12; contract UVPool is ERC20, ERC20Burnable, Ownable, AccessControl, IUVPool { using SafeMath for uint256; struct WhiteList { uint256 limitDeposit; uint64 startTimeDeposit; uint64 closeTimeDeposit; } struct Vote { string name; uint64 startTimestamp; uint64 endTimestamp; bool isActive; uint64 voteCount; } struct VoteInfo { uint64 timestamp; uint256 amount; uint8 optionId; address voter; } uint256 public feeCreator = 1 ether; mapping(uint8 => Vote) public allVotes; mapping(uint8 => mapping(address => VoteInfo)) public allVoters; mapping(uint8 => mapping(uint64 => VoteInfo)) public allVotersIndex; uint8 private constant PERCENT_FEE = 250; bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); address public SWAP_ROUTER_ADDRESS = 0xE592427A0AEce92De3Edee1F18E0157C05861564; address public stableCoin = 0xdAC17F958D2ee523a2206206994597C13D831ec7; uint64 public poolOpenTime; mapping(address => WhiteList) public whiteList; mapping(address => uint256) private _balances; mapping(address => bool) public investmentAddreses; ISwapRouter public swapRouter; address public factory; address public factoryReserve; address public fundWallet; uint256 public currentSizePool = 0; uint256 public maxSizePool; uint8 public orderNumber; uint256 public minimumDeposit; bool public isClose = false; bool public pausedTransfer = false; bool public voteCreateable = true; constructor(uint8 _orderNumber) ERC20( string.concat("EUV - ", Strings.toString(_orderNumber)), string.concat("EUV-", Strings.toString(_orderNumber)) ) { factory = msg.sender; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(MANAGER_ROLE, msg.sender); } // called once by the factory at time of deployment function initialize( uint8 _orderNumber, uint256 _amountLimited, uint256 _minimumDeposit, address _fundWallet, address _factoryReserve, uint64 _poolOpenTime, address _stableCoin ) external { require(msg.sender == factory, "FORBIDDEN"); // sufficient check minimumDeposit = _minimumDeposit; maxSizePool = _amountLimited; orderNumber = _orderNumber; swapRouter = ISwapRouter(SWAP_ROUTER_ADDRESS); poolOpenTime = _poolOpenTime; fundWallet = _fundWallet; factoryReserve = _factoryReserve; stableCoin = _stableCoin; } receive() external payable {} fallback() external payable {} // Transfer tokens to fund wallet process projects vesting function transferForInvestment( address _tokenAddress, uint256 _amount, address _receiver ) external onlyRole(MANAGER_ROLE) { require(_receiver != address(0), "receiver address is zero"); require( investmentAddreses[_receiver], "receiver is not investment address" ); if (_tokenAddress == address(0)) { TransferHelper.safeTransferETH(_receiver, _amount); } else { TransferHelper.safeTransfer(_tokenAddress, _receiver, _amount); } } // Add white list for user function addsWhiteList( address[] memory _users, uint256 _limitDeposit, uint64 _startTimeDeposit, uint64 _closeTimeDeposit ) external onlyRole(MANAGER_ROLE) { require(_users.length > 0, "users is empty"); require(_limitDeposit > 0, "limit deposit is zero"); require(_startTimeDeposit > 0, "start time deposit is zero"); require(_closeTimeDeposit > 0, "close time deposit is zero"); require( _closeTimeDeposit > _startTimeDeposit, "close time deposit must be greater than start time deposit" ); for (uint256 index = 0; index < _users.length; index++) { whiteList[_users[index]] = WhiteList({ limitDeposit: _limitDeposit, startTimeDeposit: _startTimeDeposit, closeTimeDeposit: _closeTimeDeposit }); } } // user in white list can deposit before pool open function wlDeposit(uint256 _amount) external { require(!isClose, "Pool is closed"); require(_amount > 0, "Amount must be greater than zero"); require( block.timestamp <= whiteList[msg.sender].closeTimeDeposit, "Deposit time is over" ); require( block.timestamp >= whiteList[msg.sender].startTimeDeposit, "Deposit time is not start" ); require( whiteList[msg.sender].limitDeposit >= _amount, "Deposit amount is over limit" ); require( currentSizePool.add(_amount) <= maxSizePool, "Deposit amount is over limit" ); require(_amount >= minimumDeposit, "Not enough"); uint256 amount6Decimals = _amount.div(10**12); TransferHelper.safeTransferFrom(stableCoin, msg.sender, address(this), amount6Decimals); _mint(msg.sender, _amount); _balances[msg.sender] = _balances[msg.sender].add(_amount); _mint(fundWallet, _amount.mul(PERCENT_FEE).div(1000)); _balances[fundWallet] = _balances[fundWallet].add( _amount.mul(PERCENT_FEE).div(1000) ); currentSizePool = currentSizePool.add(_amount); whiteList[msg.sender].limitDeposit = whiteList[msg.sender] .limitDeposit .sub(_amount); emit Deposit(msg.sender, _amount); } // Deposit stable coin to the pool function deposit(uint256 _amount) public { require(!isClose, "Pool is closed"); require(maxSizePool >= currentSizePool.add(_amount), "Pool is full"); require(_amount >= minimumDeposit, "Not enough"); require( block.timestamp >= poolOpenTime, "Pool is not open yet, please wait" ); uint256 amount6Decimals = _amount.div(10**12); TransferHelper.safeTransferFrom(stableCoin, msg.sender, address(this), amount6Decimals); _mint(msg.sender, _amount); _balances[msg.sender] = _balances[msg.sender].add(_amount); _mint(fundWallet, _amount.mul(PERCENT_FEE).div(1000)); _balances[fundWallet] = _balances[fundWallet].add( _amount.mul(PERCENT_FEE).div(1000) ); currentSizePool += _amount; emit Deposit(msg.sender, _amount); } // Get pool reserved function getReserve() public view returns (address) { (address _poolReserved, , , ) = IUVReserveFactory(factoryReserve) .getPoolInfo(orderNumber); return _poolReserved; } // swap any token on uniswap function buyToken( uint256 _amountIn, uint256 _amountOutMin, address _tokenIn, bytes calldata _path, uint256 _deadline ) public onlyRole(MANAGER_ROLE) { require(isClose, "Pool is not closed"); address _poolReserved = getReserve(); TransferHelper.safeApprove(_tokenIn, address(swapRouter), _amountIn); ISwapRouter.ExactInputParams memory params = ISwapRouter .ExactInputParams({ path: _path, recipient: _poolReserved, deadline: _deadline, amountIn: _amountIn, amountOutMinimum: _amountOutMin }); // Executes the swap. uint256 realAmount = swapRouter.exactInput(params); emit BuyToken(_tokenIn, realAmount); } // toggles the paused state of the transfer function function togglePausedTransfer() public onlyRole(MANAGER_ROLE) { pausedTransfer = !pausedTransfer; } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); return true; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual override { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(pausedTransfer == false, "ERC20: transfer is paused"); require(amount > 0, "Transfer amount must be greater than zero"); require( amount <= _balances[sender], "ERC20: amount must be less or equal to balance" ); _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function balanceOf(address owner) public view override returns (uint256) { return _balances[owner]; } // Add investment address function addInvestmentAddress(address _investmentAddress) public onlyOwner { investmentAddreses[_investmentAddress] = true; } // Remove investment address function removeInvestmentAddress(address _investmentAddress) public onlyOwner { investmentAddreses[_investmentAddress] = false; } // Set the fund wallet function setFundWallet(address _fundWallet) public onlyOwner { fundWallet = _fundWallet; } // Set the factory Reserve function setFactoryReserve(address _factoryReserve) public onlyRole(MANAGER_ROLE) { factoryReserve = _factoryReserve; } // Set minimum deposit amount function setMinimumDeposit(uint256 _minimumDeposit) public onlyRole(MANAGER_ROLE) { minimumDeposit = _minimumDeposit; } // open the pool function openPool() public onlyRole(MANAGER_ROLE) { isClose = false; } // close the pool function closePool() public onlyRole(MANAGER_ROLE) { isClose = true; } // get detail Vote function getVote(uint8 _orderNumber) public view returns (Vote memory) { return allVotes[_orderNumber]; } // Set fee creator function setFeeCreator(uint256 _feeCreator) public onlyRole(MANAGER_ROLE) { feeCreator = _feeCreator; } // Add wallet to manager role function addManager(address _manager) public onlyOwner { _setupRole(MANAGER_ROLE, _manager); } // Remove wallet from manager role function removeManager(address _manager) public onlyOwner { revokeRole(MANAGER_ROLE, _manager); } // get detail VoteInfo by orderNumber function getVoteInfo(uint8 _orderNumber, address _user) public view returns (VoteInfo memory) { return allVoters[_orderNumber][_user]; } // create a new vote function createVote( uint8 _orderNumber, uint64 _startTimestamp, uint64 _endTimestamp ) public payable { require(voteCreateable, "Vote is not createable"); require(isClose, "Pool is not closed"); if (hasRole(MANAGER_ROLE, msg.sender)) {} else { require( msg.value >= feeCreator, "You need to pay fee to create vote" ); uint256 balance = balanceOf(msg.sender); require( balance >= totalSupply().div(10) || hasRole(MANAGER_ROLE, msg.sender), "You need to have 10% of total supply" ); } allVotes[_orderNumber].startTimestamp = _startTimestamp; allVotes[_orderNumber].endTimestamp = _endTimestamp; allVotes[_orderNumber].isActive = true; voteCreateable = false; emit CreateVote(_orderNumber, _startTimestamp, _endTimestamp); } // close a vote function closeVote(uint8 _orderNumber) public onlyRole(MANAGER_ROLE) { allVotes[_orderNumber].isActive = false; voteCreateable = true; emit CloseVote(_orderNumber); } // voting for a option function voting(uint8 _orderNumber, uint8 _optionId) public { require(isClose, "This Pool is closed"); require(allVotes[_orderNumber].isActive, "This Vote is closed"); require( allVoters[_orderNumber][msg.sender].timestamp == 0, "You have voted" ); require( allVoters[_orderNumber][msg.sender].amount == 0, "You have voted" ); uint256 _amountBalance = balanceOf(msg.sender); transferFrom(msg.sender, address(this), _amountBalance); allVotes[_orderNumber].voteCount += 1; allVoters[_orderNumber][msg.sender] = VoteInfo({ amount: _amountBalance, timestamp: uint64(block.timestamp), optionId: _optionId, voter: msg.sender }); allVotersIndex[_orderNumber][ allVotes[_orderNumber].voteCount ] = VoteInfo({ amount: _amountBalance, timestamp: uint64(block.timestamp), optionId: _optionId, voter: msg.sender }); emit Voting( msg.sender, _amountBalance, uint64(block.timestamp), _optionId, allVotes[_orderNumber].voteCount ); } // internal release token after vote closed function releaseTokenAfterVote( uint8 _orderNumber, uint64 _from, uint64 _to ) external onlyRole(MANAGER_ROLE) { require(!allVotes[_orderNumber].isActive, "This Vote is still active"); for (uint64 i = _from; i < _to; i++) { _transfer( address(this), allVotersIndex[_orderNumber][i].voter, allVotersIndex[_orderNumber][i].amount ); } } // Set swap router function setSwapRouter(address _swapRouter) public onlyRole(MANAGER_ROLE) { SWAP_ROUTER_ADDRESS = _swapRouter; swapRouter = ISwapRouter(_swapRouter); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBNB","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"voteId","type":"uint8"}],"name":"CloseVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"voteId","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endTimestamp","type":"uint64"}],"name":"CreateVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"},{"indexed":false,"internalType":"uint8","name":"optionId","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"voteCount","type":"uint64"}],"name":"Voting","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_ROUTER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_investmentAddress","type":"address"}],"name":"addInvestmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256","name":"_limitDeposit","type":"uint256"},{"internalType":"uint64","name":"_startTimeDeposit","type":"uint64"},{"internalType":"uint64","name":"_closeTimeDeposit","type":"uint64"}],"name":"addsWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"allVoters","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"allVotersIndex","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"allVotes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint64","name":"voteCount","type":"uint64"}],"stateMutability":"view","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":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"bytes","name":"_path","type":"bytes"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"buyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"}],"name":"closeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint64","name":"_startTimestamp","type":"uint64"},{"internalType":"uint64","name":"_endTimestamp","type":"uint64"}],"name":"createVote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentSizePool","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":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCreator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint8","name":"_orderNumber","type":"uint8"}],"name":"getVote","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint64","name":"voteCount","type":"uint64"}],"internalType":"struct UVPool.Vote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"address","name":"_user","type":"address"}],"name":"getVoteInfo","outputs":[{"components":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"internalType":"struct UVPool.VoteInfo","name":"","type":"tuple"}],"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":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint256","name":"_amountLimited","type":"uint256"},{"internalType":"uint256","name":"_minimumDeposit","type":"uint256"},{"internalType":"address","name":"_fundWallet","type":"address"},{"internalType":"address","name":"_factoryReserve","type":"address"},{"internalType":"uint64","name":"_poolOpenTime","type":"uint64"},{"internalType":"address","name":"_stableCoin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"investmentAddreses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClose","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSizePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"orderNumber","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolOpenTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint64","name":"_from","type":"uint64"},{"internalType":"uint64","name":"_to","type":"uint64"}],"name":"releaseTokenAfterVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investmentAddress","type":"address"}],"name":"removeInvestmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"removeManager","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":"_factoryReserve","type":"address"}],"name":"setFactoryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeCreator","type":"uint256"}],"name":"setFeeCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundWallet","type":"address"}],"name":"setFundWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumDeposit","type":"uint256"}],"name":"setMinimumDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapRouter","type":"address"}],"name":"setSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stableCoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePausedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"transferForInvestment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":[],"name":"voteCreateable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint8","name":"_optionId","type":"uint8"}],"name":"voting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"uint256","name":"limitDeposit","type":"uint256"},{"internalType":"uint64","name":"startTimeDeposit","type":"uint64"},{"internalType":"uint64","name":"closeTimeDeposit","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"wlDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052670de0b6b3a7640000600755600b80546001600160a01b031990811673e592427a0aece92de3edee1f18e0157c0586156417909155600c805490911673dac17f958d2ee523a2206206994597c13d831ec717905560006014556018805462ffffff1916620100001790553480156200007b57600080fd5b506040516200494d3803806200494d8339810160408190526200009e916200043b565b620000b78160ff16620001a360201b62002b091760201c565b604051602001620000c9919062000499565b604051602081830303815290604052620000f18260ff16620001a360201b62002b091760201c565b604051602001620001039190620004b6565b60408051601f19818403018152919052600362000121838262000576565b50600462000130828262000576565b5050506200014d620001476200024760201b60201c565b6200024b565b601180546001600160a01b0319163390811790915562000170906000906200029d565b6200019c7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08336200029d565b5062000642565b60606000620001bd83620002ad60201b62002b9b1760201c565b60010190506000816001600160401b03811115620001df57620001df620004d1565b6040519080825280601f01601f1916602001820160405280156200020a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846200021457509392505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002a9828262000397565b5050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310620002f7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831062000324576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106200034357662386f26fc10000830492506010015b6305f5e10083106200035c576305f5e100830492506008015b61271083106200037157612710830492506004015b6064831062000384576064830492506002015b600a831062000391576001015b92915050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff16620002a95760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620003f73390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000602082840312156200044e57600080fd5b815160ff811681146200046057600080fd5b9392505050565b6000815160005b818110156200048a57602081850181015186830152016200046e565b50600093019283525090919050565b65022aaab1016960d51b8152600062000460600683018462000467565b634555562d60e01b8152600062000460600483018462000467565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004fc57607f821691505b6020821081036200051d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200057157600081815260208120601f850160051c810160208610156200054c5750805b601f850160051c820191505b818110156200056d5782815560010162000558565b5050505b505050565b81516001600160401b03811115620005925762000592620004d1565b620005aa81620005a38454620004e7565b8462000523565b602080601f831160018114620005e25760008415620005c95750858301515b600019600386901b1c1916600185901b1785556200056d565b600085815260208120601f198616915b828110156200061357888601518255948401946001909101908401620005f2565b5085821015620006325787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6142fb80620006526000396000f3fe6080604052600436106103ce5760003560e01c80636d2dd6ba116101fb578063b04dd81b11610117578063df752540116100a5578063eb5797a411610077578063eb5797a414610dd3578063ec87621c14610de8578063f2fde38b14610e0a578063fcf4850414610e2a578063febc6c4d14610e4a57005b8063df75254014610d4e578063e40366c814610d63578063e6d9123c14610d93578063e78ec42e14610db357005b8063c45a0155116100e9578063c45a015514610caf578063cdae110414610ccf578063d547741f14610cee578063dd62ed3e14610d0e578063de09ee2414610d2e57005b8063b04dd81b14610c35578063b6b55f2514610c4f578063c31c9c0714610c6f578063c345cafd14610c8f57005b80639194da63116101945780639e0b65a6116101665780639e0b65a614610ba0578063a217fddf14610bc0578063a457c2d714610bd5578063a9059cbb14610bf5578063ac18de4314610c1557005b80639194da6314610b2b57806391d1485414610b4b57806395d89b4114610b6b578063992642e514610b8057005b80638635a570116101cd5780638635a57014610aa657806387e49c1514610ad75780638da5cb5b14610af75780639040d55314610b1557005b80636d2dd6ba14610a2557806370a0823114610a3b578063715018a614610a7157806379cc679014610a8657005b8063373b4979116102ea57806355ce3b9a116102835780636376539f116102555780636376539f146108d7578063664a1ad6146108ed57806366805de51461090d5780636943ca2b146109225780636ae17b1b146109c157005b806355ce3b9a1461086c578063589666f91461088c57806359bf5d39146108ac578063636bfbab146108c157005b806341273657116102bc57806341273657146107cd57806342966c68146107ed5780634777dbfe1461080d57806350885acc1461084c57005b8063373b4979146107355780633805ab8314610755578063395093511461078d5780633fa8ffa6146107ad57005b806319157eaa116103675780632d06177a116103395780632d06177a146106465780632f2ff15d14610666578063313ce5671461068657806336568abe146106a8578063372c12b1146106c857005b806319157eaa146104f45780631c52d6b61461050757806323b872dd146105f6578063248a9ca31461061657005b80630d54538c116103a05780630d54538c1461046e578063124474a71461048e5780631338f493146104bb57806318160ddd146104d557005b806301ffc9a7146103d757806306fdde031461040c578063095ea7b31461042e5780630bd541241461044e57005b366103d557005b005b3480156103e357600080fd5b506103f76103f2366004613a1f565b610e6a565b60405190151581526020015b60405180910390f35b34801561041857600080fd5b50610421610ea1565b6040516104039190613a99565b34801561043a57600080fd5b506103f7610449366004613ad1565b610f33565b34801561045a57600080fd5b506103d5610469366004613afd565b610f4b565b34801561047a57600080fd5b506103d5610489366004613b42565b610f77565b34801561049a57600080fd5b506104ae6104a9366004613b85565b611081565b6040516104039190613ba0565b3480156104c757600080fd5b506018546103f79060ff1681565b3480156104e157600080fd5b506002545b604051908152602001610403565b6103d5610502366004613b42565b6111a4565b34801561051357600080fd5b506105ae610522366004613c03565b6040805160808101825260008082526020820181905291810182905260608101919091525060ff91821660009081526009602090815260408083206001600160a01b039485168452825291829020825160808101845281546001600160401b03168152600182015492810192909252600201549384169181019190915261010090920416606082015290565b604051610403919081516001600160401b031681526020808301519082015260408083015160ff16908201526060918201516001600160a01b03169181019190915260800190565b34801561060257600080fd5b506103f7610611366004613c3a565b6113f0565b34801561062257600080fd5b506104e6610631366004613c7b565b60009081526006602052604090206001015490565b34801561065257600080fd5b506103d5610661366004613afd565b6113fd565b34801561067257600080fd5b506103d5610681366004613c94565b611420565b34801561069257600080fd5b5060125b60405160ff9091168152602001610403565b3480156106b457600080fd5b506103d56106c3366004613c94565b61144a565b3480156106d457600080fd5b506107106106e3366004613afd565b600d60205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610403565b34801561074157600080fd5b506103d5610750366004613ccf565b6114c8565b34801561076157600080fd5b50601254610775906001600160a01b031681565b6040516001600160a01b039091168152602001610403565b34801561079957600080fd5b506103f76107a8366004613ad1565b61176f565b3480156107b957600080fd5b506103d56107c8366004613c7b565b611791565b3480156107d957600080fd5b506103d56107e8366004613afd565b611b47565b3480156107f957600080fd5b506103d5610808366004613c7b565b611b8c565b34801561081957600080fd5b50600c5461083490600160a01b90046001600160401b031681565b6040516001600160401b039091168152602001610403565b34801561085857600080fd5b506103d5610867366004613c7b565b611b96565b34801561087857600080fd5b506103d5610887366004613afd565b611bb4565b34801561089857600080fd5b506103d56108a7366004613dbe565b611bde565b3480156108b857600080fd5b50610775611d88565b3480156108cd57600080fd5b506104e660175481565b3480156108e357600080fd5b506104e660155481565b3480156108f957600080fd5b50601354610775906001600160a01b031681565b34801561091957600080fd5b506103d5611e0a565b34801561092e57600080fd5b5061098661093d366004613c03565b60096020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b604080516001600160401b039095168552602085019390935260ff909116918301919091526001600160a01b03166060820152608001610403565b3480156109cd57600080fd5b506109866109dc366004613e5e565b600a6020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b348015610a3157600080fd5b506104e660145481565b348015610a4757600080fd5b506104e6610a56366004613afd565b6001600160a01b03166000908152600e602052604090205490565b348015610a7d57600080fd5b506103d5611e32565b348015610a9257600080fd5b506103d5610aa1366004613ad1565b611e46565b348015610ab257600080fd5b50610ac6610ac1366004613b85565b611e5b565b604051610403959493929190613e91565b348015610ae357600080fd5b506103d5610af2366004613afd565b611f28565b348015610b0357600080fd5b506005546001600160a01b0316610775565b348015610b2157600080fd5b506104e660075481565b348015610b3757600080fd5b50600b54610775906001600160a01b031681565b348015610b5757600080fd5b506103f7610b66366004613c94565b611f63565b348015610b7757600080fd5b50610421611f8e565b348015610b8c57600080fd5b50600c54610775906001600160a01b031681565b348015610bac57600080fd5b506103d5610bbb366004613ed6565b611f9d565b348015610bcc57600080fd5b506104e6600081565b348015610be157600080fd5b506103f7610bf0366004613ad1565b6120ac565b348015610c0157600080fd5b506103f7610c10366004613ad1565b612132565b348015610c2157600080fd5b506103d5610c30366004613afd565b612148565b348015610c4157600080fd5b506016546106969060ff1681565b348015610c5b57600080fd5b506103d5610c6a366004613c7b565b612168565b348015610c7b57600080fd5b50601054610775906001600160a01b031681565b348015610c9b57600080fd5b506103d5610caa366004613f18565b6123a0565b348015610cbb57600080fd5b50601154610775906001600160a01b031681565b348015610cdb57600080fd5b506018546103f790610100900460ff1681565b348015610cfa57600080fd5b506103d5610d09366004613c94565b612848565b348015610d1a57600080fd5b506104e6610d29366004613f42565b61286d565b348015610d3a57600080fd5b506103d5610d49366004613afd565b612898565b348015610d5a57600080fd5b506103d56128c1565b348015610d6f57600080fd5b506103f7610d7e366004613afd565b600f6020526000908152604090205460ff1681565b348015610d9f57600080fd5b506103d5610dae366004613f60565b6128f7565b348015610dbf57600080fd5b506103d5610dce366004613c7b565b6129cf565b348015610ddf57600080fd5b506103d56129ed565b348015610df457600080fd5b506104e66000805160206142a683398151915281565b348015610e1657600080fd5b506103d5610e25366004613afd565b612a12565b348015610e3657600080fd5b506103d5610e45366004613b85565b612a88565b348015610e5657600080fd5b506018546103f79062010000900460ff1681565b60006001600160e01b03198216637965db0b60e01b1480610e9b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610eb090613fe0565b80601f0160208091040260200160405190810160405280929190818152602001828054610edc90613fe0565b8015610f295780601f10610efe57610100808354040283529160200191610f29565b820191906000526020600020905b815481529060010190602001808311610f0c57829003601f168201915b5050505050905090565b600033610f41818585612c73565b5060019392505050565b610f53612d98565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b6000805160206142a6833981519152610f8f81612df2565b60ff808516600090815260086020526040902060010154600160801b900416156110005760405162461bcd60e51b815260206004820152601960248201527f5468697320566f7465206973207374696c6c206163746976650000000000000060448201526064015b60405180910390fd5b825b826001600160401b0316816001600160401b0316101561107a5760ff85166000908152600a602090815260408083206001600160401b0385168452909152902060028101546001909101546110689130916101009091046001600160a01b031690612dfc565b8061107281614030565b915050611002565b5050505050565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260ff821660009081526008602052604090819020815160a081019092528054829082906110d890613fe0565b80601f016020809104026020016040519081016040528092919081815260200182805461110490613fe0565b80156111515780601f1061112657610100808354040283529160200191611151565b820191906000526020600020905b81548152906001019060200180831161113457829003601f168201915b5050509183525050600191909101546001600160401b038082166020840152600160401b82048116604084015260ff600160801b83041615156060840152600160881b9091041660809091015292915050565b60185462010000900460ff166111f55760405162461bcd60e51b8152602060048201526016602482015275566f7465206973206e6f742063726561746561626c6560501b6044820152606401610ff7565b60185460ff1661123c5760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610ff7565b6112546000805160206142a683398151915233611f63565b611351576007543410156112b55760405162461bcd60e51b815260206004820152602260248201527f596f75206e65656420746f207061792066656520746f2063726561746520766f604482015261746560f01b6064820152608401610ff7565b336000908152600e60205260409020546002546112d690600a905b906130a1565b811015806112f757506112f76000805160206142a683398151915233611f63565b61134f5760405162461bcd60e51b8152602060048201526024808201527f596f75206e65656420746f206861766520313025206f6620746f74616c20737560448201526370706c7960e01b6064820152608401610ff7565b505b60ff8316600081815260086020908152604091829020600101805460ff60801b196001600160401b03878116600160401b81026001600160801b0319909416918a169182179390931791909116600160801b179092556018805462ff00001916905583519485529184015282820152517f1d66141808fec33c82bd035e01d0a193ead5ead8504b58ac0bbc032fb22bae909181900360600190a1505050565b6000610f41848484612dfc565b611405612d98565b61141d6000805160206142a6833981519152826130b4565b50565b60008281526006602052604090206001015461143b81612df2565b61144583836130ba565b505050565b6001600160a01b03811633146114ba5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610ff7565b6114c48282613140565b5050565b6000805160206142a68339815191526114e081612df2565b60008551116115225760405162461bcd60e51b815260206004820152600e60248201526d757365727320697320656d70747960901b6044820152606401610ff7565b6000841161156a5760405162461bcd60e51b81526020600482015260156024820152746c696d6974206465706f736974206973207a65726f60581b6044820152606401610ff7565b6000836001600160401b0316116115c35760405162461bcd60e51b815260206004820152601a60248201527f73746172742074696d65206465706f736974206973207a65726f0000000000006044820152606401610ff7565b6000826001600160401b03161161161c5760405162461bcd60e51b815260206004820152601a60248201527f636c6f73652074696d65206465706f736974206973207a65726f0000000000006044820152606401610ff7565b826001600160401b0316826001600160401b0316116116a35760405162461bcd60e51b815260206004820152603a60248201527f636c6f73652074696d65206465706f736974206d75737420626520677265617460448201527f6572207468616e2073746172742074696d65206465706f7369740000000000006064820152608401610ff7565b60005b8551811015611767576040518060600160405280868152602001856001600160401b03168152602001846001600160401b0316815250600d60008884815181106116f2576116f2614056565b6020908102919091018101516001600160a01b0316825281810192909252604090810160002083518155918301516001909201805493909101516001600160401b03908116600160401b026001600160801b03199094169216919091179190911790558061175f8161406c565b9150506116a6565b505050505050565b600033610f41818585611782838361286d565b61178c9190614085565b612c73565b60185460ff16156117d55760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610ff7565b600081116118255760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610ff7565b336000908152600d6020526040902060010154600160401b90046001600160401b031642111561188e5760405162461bcd60e51b81526020600482015260146024820152732232b837b9b4ba103a34b6b29034b99037bb32b960611b6044820152606401610ff7565b336000908152600d60205260409020600101546001600160401b03164210156118f95760405162461bcd60e51b815260206004820152601960248201527f4465706f7369742074696d65206973206e6f74207374617274000000000000006044820152606401610ff7565b336000908152600d60205260409020548111156119585760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610ff7565b60155460145461196890836131a7565b11156119b65760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610ff7565b6017548110156119f55760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610ff7565b6000611a068264e8d4a510006130a1565b600c54909150611a21906001600160a01b03163330846131b3565b611a2b33836132b5565b336000908152600e6020526040902054611a4590836131a7565b336000908152600e6020526040902055601354611a7b906001600160a01b0316611a766103e86112d08660fa613374565b6132b5565b611ab0611a8f6103e86112d08560fa613374565b6013546001600160a01b03166000908152600e6020526040902054906131a7565b6013546001600160a01b03166000908152600e6020526040902055601454611ad890836131a7565b601455336000908152600d6020526040902054611af59083613380565b336000818152600d6020526040908190209290925590517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90611b3b9085815260200190565b60405180910390a25050565b6000805160206142a6833981519152611b5f81612df2565b50600b80546001600160a01b039092166001600160a01b0319928316811790915560108054909216179055565b61141d338261338c565b6000805160206142a6833981519152611bae81612df2565b50600755565b611bbc612d98565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206142a6833981519152611bf681612df2565b60185460ff16611c3d5760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610ff7565b6000611c47611d88565b601054909150611c629087906001600160a01b03168a6134be565b6040805160c06020601f8801819004028201810190925260a08101868152600092829190899089908190850183828082843760009201829052509385525050506001600160a01b0380861660208401526040808401899052606084018e905260809093018c9052601054925163c04b8d5960e01b8152939450909291169063c04b8d5990611cf4908590600401614098565b6020604051808303816000875af1158015611d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3791906140f0565b9050876001600160a01b03167fdd06b66c3ba8126086cd863137d6f3b86ce5bcf4309cac390cc265e39194d0b282604051611d7491815260200190565b60405180910390a250505050505050505050565b6012546016546040516375ed572560e11b815260ff909116600482015260009182916001600160a01b039091169063ebdaae4a90602401608060405180830381865afa158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e009190614109565b5091949350505050565b6000805160206142a6833981519152611e2281612df2565b506018805460ff19166001179055565b611e3a612d98565b611e4460006135b7565b565b611e51823383613609565b6114c4828261338c565b600860205260009081526040902080548190611e7690613fe0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ea290613fe0565b8015611eef5780601f10611ec457610100808354040283529160200191611eef565b820191906000526020600020905b815481529060010190602001808311611ed257829003601f168201915b505050600190930154919250506001600160401b0380821691600160401b810482169160ff600160801b83041691600160881b90041685565b6000805160206142a6833981519152611f4081612df2565b50601280546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610eb090613fe0565b6000805160206142a6833981519152611fb581612df2565b6001600160a01b03821661200b5760405162461bcd60e51b815260206004820152601860248201527f72656365697665722061646472657373206973207a65726f00000000000000006044820152606401610ff7565b6001600160a01b0382166000908152600f602052604090205460ff1661207e5760405162461bcd60e51b815260206004820152602260248201527f7265636569766572206973206e6f7420696e766573746d656e74206164647265604482015261737360f01b6064820152608401610ff7565b6001600160a01b03841661209b57612096828461367d565b6120a6565b6120a6848385613720565b50505050565b600033816120ba828661286d565b90508381101561211a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ff7565b6121278286868403612c73565b506001949350505050565b600061213f338484612dfc565b50600192915050565b612150612d98565b61141d6000805160206142a683398151915282612848565b60185460ff16156121ac5760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610ff7565b6014546121b990826131a7565b60155410156121f95760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b6044820152606401610ff7565b6017548110156122385760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610ff7565b600c54600160a01b90046001600160401b03164210156122a45760405162461bcd60e51b815260206004820152602160248201527f506f6f6c206973206e6f74206f70656e207965742c20706c65617365207761696044820152601d60fa1b6064820152608401610ff7565b60006122b58264e8d4a510006130a1565b600c549091506122d0906001600160a01b03163330846131b3565b6122da33836132b5565b336000908152600e60205260409020546122f490836131a7565b336000908152600e6020526040902055601354612325906001600160a01b0316611a766103e86112d08660fa613374565b612339611a8f6103e86112d08560fa613374565b6013546001600160a01b03166000908152600e602052604081209190915560148054849290612369908490614085565b909155505060405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611b3b565b60185460ff166123e85760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8141bdbdb081a5cc818db1bdcd959606a1b6044820152606401610ff7565b60ff808316600090815260086020526040902060010154600160801b9004166124495760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8159bdd19481a5cc818db1bdcd959606a1b6044820152606401610ff7565b60ff821660009081526009602090815260408083203384529091529020546001600160401b0316156124ae5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610ff7565b60ff821660009081526009602090815260408083203384529091529020600101541561250d5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610ff7565b336000818152600e6020526040902054906125299030836113f0565b5060ff8316600090815260086020526040902060019081018054601190612561908490600160881b90046001600160401b0316614168565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600960008560ff1660ff1681526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600a60008560ff1660ff1681526020019081526020016000206000600860008760ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f35d237ec79045d79173411929e0c49b6089611517881c6f075c0bec2f32b2073824285600860008960ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b031660405161283b94939291909384526001600160401b03928316602085015260ff91909116604084015216606082015260800190565b60405180910390a2505050565b60008281526006602052604090206001015461286381612df2565b6114458383613140565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6128a0612d98565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000805160206142a68339815191526128d981612df2565b506018805461ff001981166101009182900460ff1615909102179055565b6011546001600160a01b0316331461293d5760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b6044820152606401610ff7565b6017949094556015949094556016805460ff90961660ff1990961695909517909455600b54601080546001600160a01b03199081166001600160a01b0393841617909155600c80546013805495851695841695909517909455601280549784169783169790971790965592166001600160401b03909316600160a01b029091166001600160e01b031990911617179055565b6000805160206142a68339815191526129e781612df2565b50601755565b6000805160206142a6833981519152612a0581612df2565b506018805460ff19169055565b612a1a612d98565b6001600160a01b038116612a7f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ff7565b61141d816135b7565b6000805160206142a6833981519152612aa081612df2565b60ff8216600081815260086020908152604091829020600101805460ff60801b191690556018805462ff000019166201000017905590519182527f4329ff635fb60bac41e85195468d8998fac762dabf4ffde9a7cfb9ec0d22d897910160405180910390a15050565b60606000612b1683612b9b565b60010190506000816001600160401b03811115612b3557612b35613cb9565b6040519080825280601f01601f191660200182016040528015612b5f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612b6957509392505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612bda5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612c06576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612c2457662386f26fc10000830492506010015b6305f5e1008310612c3c576305f5e100830492506008015b6127108310612c5057612710830492506004015b60648310612c62576064830492506002015b600a8310610e9b5760010192915050565b6001600160a01b038316612cd55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ff7565b6001600160a01b038216612d365760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ff7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314611e445760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ff7565b61141d8133613819565b6001600160a01b038316612e605760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ff7565b6001600160a01b038216612ec25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ff7565b601854610100900460ff1615612f1a5760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e7366657220697320706175736564000000000000006044820152606401610ff7565b60008111612f7c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ff7565b6001600160a01b0383166000908152600e6020526040902054811115612ffb5760405162461bcd60e51b815260206004820152602e60248201527f45524332303a20616d6f756e74206d757374206265206c657373206f7220657160448201526d75616c20746f2062616c616e636560901b6064820152608401610ff7565b6001600160a01b0383166000908152600e602052604090205461301e9082613380565b6001600160a01b038085166000908152600e6020526040808220939093559084168152205461304d90826131a7565b6001600160a01b038084166000818152600e602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d8b9085815260200190565b60006130ad828461418f565b9392505050565b6114c482825b6130c48282611f63565b6114c45760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556130fc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61314a8282611f63565b156114c45760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006130ad8284614085565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161321791906141b1565b6000604051808303816000865af19150503d8060008114613254576040519150601f19603f3d011682016040523d82523d6000602084013e613259565b606091505b509150915081801561328357508051158061328357508080602001905181019061328391906141cd565b6117675760405162461bcd60e51b815260206004820152600360248201526229aa2360e91b6044820152606401610ff7565b6001600160a01b03821661330b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ff7565b806002600082825461331d9190614085565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60006130ad82846141ef565b60006130ad8284614206565b6001600160a01b0382166133ec5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ff7565b6001600160a01b038216600090815260208190526040902054818110156134605760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ff7565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161351a91906141b1565b6000604051808303816000865af19150503d8060008114613557576040519150601f19603f3d011682016040523d82523d6000602084013e61355c565b606091505b509150915081801561358657508051158061358657508080602001905181019061358691906141cd565b61107a5760405162461bcd60e51b8152602060048201526002602482015261534160f01b6044820152606401610ff7565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000613615848461286d565b905060001981146120a657818110156136705760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ff7565b6120a68484848403612c73565b604080516000808252602082019092526001600160a01b0384169083906040516136a791906141b1565b60006040518083038185875af1925050503d80600081146136e4576040519150601f19603f3d011682016040523d82523d6000602084013e6136e9565b606091505b50509050806114455760405162461bcd60e51b815260206004820152600360248201526253544560e81b6044820152606401610ff7565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161377c91906141b1565b6000604051808303816000865af19150503d80600081146137b9576040519150601f19603f3d011682016040523d82523d6000602084013e6137be565b606091505b50915091508180156137e85750805115806137e85750808060200190518101906137e891906141cd565b61107a5760405162461bcd60e51b815260206004820152600260248201526114d560f21b6044820152606401610ff7565b6138238282611f63565b6114c45761383081613872565b61383b836020613884565b60405160200161384c929190614219565b60408051601f198184030181529082905262461bcd60e51b8252610ff791600401613a99565b6060610e9b6001600160a01b03831660145b606060006138938360026141ef565b61389e906002614085565b6001600160401b038111156138b5576138b5613cb9565b6040519080825280601f01601f1916602001820160405280156138df576020820181803683370190505b509050600360fc1b816000815181106138fa576138fa614056565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061392957613929614056565b60200101906001600160f81b031916908160001a905350600061394d8460026141ef565b613958906001614085565b90505b60018111156139d0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061398c5761398c614056565b1a60f81b8282815181106139a2576139a2614056565b60200101906001600160f81b031916908160001a90535060049490941c936139c98161428e565b905061395b565b5083156130ad5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ff7565b600060208284031215613a3157600080fd5b81356001600160e01b0319811681146130ad57600080fd5b60005b83811015613a64578181015183820152602001613a4c565b50506000910152565b60008151808452613a85816020860160208601613a49565b601f01601f19169290920160200192915050565b6020815260006130ad6020830184613a6d565b6001600160a01b038116811461141d57600080fd5b8035613acc81613aac565b919050565b60008060408385031215613ae457600080fd5b8235613aef81613aac565b946020939093013593505050565b600060208284031215613b0f57600080fd5b81356130ad81613aac565b803560ff81168114613acc57600080fd5b80356001600160401b0381168114613acc57600080fd5b600080600060608486031215613b5757600080fd5b613b6084613b1a565b9250613b6e60208501613b2b565b9150613b7c60408501613b2b565b90509250925092565b600060208284031215613b9757600080fd5b6130ad82613b1a565b602081526000825160a06020840152613bbc60c0840182613a6d565b905060208401516001600160401b0380821660408601528060408701511660608601526060860151151560808601528060808701511660a086015250508091505092915050565b60008060408385031215613c1657600080fd5b613c1f83613b1a565b91506020830135613c2f81613aac565b809150509250929050565b600080600060608486031215613c4f57600080fd5b8335613c5a81613aac565b92506020840135613c6a81613aac565b929592945050506040919091013590565b600060208284031215613c8d57600080fd5b5035919050565b60008060408385031215613ca757600080fd5b823591506020830135613c2f81613aac565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613ce557600080fd5b84356001600160401b0380821115613cfc57600080fd5b818701915087601f830112613d1057600080fd5b8135602082821115613d2457613d24613cb9565b8160051b604051601f19603f83011681018181108682111715613d4957613d49613cb9565b60405292835281830193508481018201928b841115613d6757600080fd5b948201945b83861015613d8c57613d7d86613ac1565b85529482019493820193613d6c565b9850508801359550613da5925050604087019050613b2b565b9150613db360608601613b2b565b905092959194509250565b60008060008060008060a08789031215613dd757600080fd5b86359550602087013594506040870135613df081613aac565b935060608701356001600160401b0380821115613e0c57600080fd5b818901915089601f830112613e2057600080fd5b813581811115613e2f57600080fd5b8a6020828501011115613e4157600080fd5b602083019550809450505050608087013590509295509295509295565b60008060408385031215613e7157600080fd5b613e7a83613b1a565b9150613e8860208401613b2b565b90509250929050565b60a081526000613ea460a0830188613a6d565b6001600160401b0396871660208401529486166040830152509115156060830152909216608090920191909152919050565b600080600060608486031215613eeb57600080fd5b8335613ef681613aac565b9250602084013591506040840135613f0d81613aac565b809150509250925092565b60008060408385031215613f2b57600080fd5b613f3483613b1a565b9150613e8860208401613b1a565b60008060408385031215613f5557600080fd5b8235613c1f81613aac565b600080600080600080600060e0888a031215613f7b57600080fd5b613f8488613b1a565b965060208801359550604088013594506060880135613fa281613aac565b93506080880135613fb281613aac565b9250613fc060a08901613b2b565b915060c0880135613fd081613aac565b8091505092959891949750929550565b600181811c90821680613ff457607f821691505b60208210810361401457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b0380831681810361404c5761404c61401a565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161407e5761407e61401a565b5060010190565b80820180821115610e9b57610e9b61401a565b602081526000825160a060208401526140b460c0840182613a6d565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b60006020828403121561410257600080fd5b5051919050565b6000806000806080858703121561411f57600080fd5b845161412a81613aac565b602086015190945061413b81613aac565b604086015190935061414c81613aac565b606086015190925061415d81613aac565b939692955090935050565b6001600160401b038181168382160190808211156141885761418861401a565b5092915050565b6000826141ac57634e487b7160e01b600052601260045260246000fd5b500490565b600082516141c3818460208701613a49565b9190910192915050565b6000602082840312156141df57600080fd5b815180151581146130ad57600080fd5b8082028115828204841417610e9b57610e9b61401a565b81810381811115610e9b57610e9b61401a565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614251816017850160208801613a49565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614282816028840160208801613a49565b01602801949350505050565b60008161429d5761429d61401a565b50600019019056fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a2646970667358221220f6f25c638521e4cb15f49188528f73779d9d3a8848f186f6890c2e3c271dc0b264736f6c634300081100330000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode
0x6080604052600436106103ce5760003560e01c80636d2dd6ba116101fb578063b04dd81b11610117578063df752540116100a5578063eb5797a411610077578063eb5797a414610dd3578063ec87621c14610de8578063f2fde38b14610e0a578063fcf4850414610e2a578063febc6c4d14610e4a57005b8063df75254014610d4e578063e40366c814610d63578063e6d9123c14610d93578063e78ec42e14610db357005b8063c45a0155116100e9578063c45a015514610caf578063cdae110414610ccf578063d547741f14610cee578063dd62ed3e14610d0e578063de09ee2414610d2e57005b8063b04dd81b14610c35578063b6b55f2514610c4f578063c31c9c0714610c6f578063c345cafd14610c8f57005b80639194da63116101945780639e0b65a6116101665780639e0b65a614610ba0578063a217fddf14610bc0578063a457c2d714610bd5578063a9059cbb14610bf5578063ac18de4314610c1557005b80639194da6314610b2b57806391d1485414610b4b57806395d89b4114610b6b578063992642e514610b8057005b80638635a570116101cd5780638635a57014610aa657806387e49c1514610ad75780638da5cb5b14610af75780639040d55314610b1557005b80636d2dd6ba14610a2557806370a0823114610a3b578063715018a614610a7157806379cc679014610a8657005b8063373b4979116102ea57806355ce3b9a116102835780636376539f116102555780636376539f146108d7578063664a1ad6146108ed57806366805de51461090d5780636943ca2b146109225780636ae17b1b146109c157005b806355ce3b9a1461086c578063589666f91461088c57806359bf5d39146108ac578063636bfbab146108c157005b806341273657116102bc57806341273657146107cd57806342966c68146107ed5780634777dbfe1461080d57806350885acc1461084c57005b8063373b4979146107355780633805ab8314610755578063395093511461078d5780633fa8ffa6146107ad57005b806319157eaa116103675780632d06177a116103395780632d06177a146106465780632f2ff15d14610666578063313ce5671461068657806336568abe146106a8578063372c12b1146106c857005b806319157eaa146104f45780631c52d6b61461050757806323b872dd146105f6578063248a9ca31461061657005b80630d54538c116103a05780630d54538c1461046e578063124474a71461048e5780631338f493146104bb57806318160ddd146104d557005b806301ffc9a7146103d757806306fdde031461040c578063095ea7b31461042e5780630bd541241461044e57005b366103d557005b005b3480156103e357600080fd5b506103f76103f2366004613a1f565b610e6a565b60405190151581526020015b60405180910390f35b34801561041857600080fd5b50610421610ea1565b6040516104039190613a99565b34801561043a57600080fd5b506103f7610449366004613ad1565b610f33565b34801561045a57600080fd5b506103d5610469366004613afd565b610f4b565b34801561047a57600080fd5b506103d5610489366004613b42565b610f77565b34801561049a57600080fd5b506104ae6104a9366004613b85565b611081565b6040516104039190613ba0565b3480156104c757600080fd5b506018546103f79060ff1681565b3480156104e157600080fd5b506002545b604051908152602001610403565b6103d5610502366004613b42565b6111a4565b34801561051357600080fd5b506105ae610522366004613c03565b6040805160808101825260008082526020820181905291810182905260608101919091525060ff91821660009081526009602090815260408083206001600160a01b039485168452825291829020825160808101845281546001600160401b03168152600182015492810192909252600201549384169181019190915261010090920416606082015290565b604051610403919081516001600160401b031681526020808301519082015260408083015160ff16908201526060918201516001600160a01b03169181019190915260800190565b34801561060257600080fd5b506103f7610611366004613c3a565b6113f0565b34801561062257600080fd5b506104e6610631366004613c7b565b60009081526006602052604090206001015490565b34801561065257600080fd5b506103d5610661366004613afd565b6113fd565b34801561067257600080fd5b506103d5610681366004613c94565b611420565b34801561069257600080fd5b5060125b60405160ff9091168152602001610403565b3480156106b457600080fd5b506103d56106c3366004613c94565b61144a565b3480156106d457600080fd5b506107106106e3366004613afd565b600d60205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610403565b34801561074157600080fd5b506103d5610750366004613ccf565b6114c8565b34801561076157600080fd5b50601254610775906001600160a01b031681565b6040516001600160a01b039091168152602001610403565b34801561079957600080fd5b506103f76107a8366004613ad1565b61176f565b3480156107b957600080fd5b506103d56107c8366004613c7b565b611791565b3480156107d957600080fd5b506103d56107e8366004613afd565b611b47565b3480156107f957600080fd5b506103d5610808366004613c7b565b611b8c565b34801561081957600080fd5b50600c5461083490600160a01b90046001600160401b031681565b6040516001600160401b039091168152602001610403565b34801561085857600080fd5b506103d5610867366004613c7b565b611b96565b34801561087857600080fd5b506103d5610887366004613afd565b611bb4565b34801561089857600080fd5b506103d56108a7366004613dbe565b611bde565b3480156108b857600080fd5b50610775611d88565b3480156108cd57600080fd5b506104e660175481565b3480156108e357600080fd5b506104e660155481565b3480156108f957600080fd5b50601354610775906001600160a01b031681565b34801561091957600080fd5b506103d5611e0a565b34801561092e57600080fd5b5061098661093d366004613c03565b60096020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b604080516001600160401b039095168552602085019390935260ff909116918301919091526001600160a01b03166060820152608001610403565b3480156109cd57600080fd5b506109866109dc366004613e5e565b600a6020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b348015610a3157600080fd5b506104e660145481565b348015610a4757600080fd5b506104e6610a56366004613afd565b6001600160a01b03166000908152600e602052604090205490565b348015610a7d57600080fd5b506103d5611e32565b348015610a9257600080fd5b506103d5610aa1366004613ad1565b611e46565b348015610ab257600080fd5b50610ac6610ac1366004613b85565b611e5b565b604051610403959493929190613e91565b348015610ae357600080fd5b506103d5610af2366004613afd565b611f28565b348015610b0357600080fd5b506005546001600160a01b0316610775565b348015610b2157600080fd5b506104e660075481565b348015610b3757600080fd5b50600b54610775906001600160a01b031681565b348015610b5757600080fd5b506103f7610b66366004613c94565b611f63565b348015610b7757600080fd5b50610421611f8e565b348015610b8c57600080fd5b50600c54610775906001600160a01b031681565b348015610bac57600080fd5b506103d5610bbb366004613ed6565b611f9d565b348015610bcc57600080fd5b506104e6600081565b348015610be157600080fd5b506103f7610bf0366004613ad1565b6120ac565b348015610c0157600080fd5b506103f7610c10366004613ad1565b612132565b348015610c2157600080fd5b506103d5610c30366004613afd565b612148565b348015610c4157600080fd5b506016546106969060ff1681565b348015610c5b57600080fd5b506103d5610c6a366004613c7b565b612168565b348015610c7b57600080fd5b50601054610775906001600160a01b031681565b348015610c9b57600080fd5b506103d5610caa366004613f18565b6123a0565b348015610cbb57600080fd5b50601154610775906001600160a01b031681565b348015610cdb57600080fd5b506018546103f790610100900460ff1681565b348015610cfa57600080fd5b506103d5610d09366004613c94565b612848565b348015610d1a57600080fd5b506104e6610d29366004613f42565b61286d565b348015610d3a57600080fd5b506103d5610d49366004613afd565b612898565b348015610d5a57600080fd5b506103d56128c1565b348015610d6f57600080fd5b506103f7610d7e366004613afd565b600f6020526000908152604090205460ff1681565b348015610d9f57600080fd5b506103d5610dae366004613f60565b6128f7565b348015610dbf57600080fd5b506103d5610dce366004613c7b565b6129cf565b348015610ddf57600080fd5b506103d56129ed565b348015610df457600080fd5b506104e66000805160206142a683398151915281565b348015610e1657600080fd5b506103d5610e25366004613afd565b612a12565b348015610e3657600080fd5b506103d5610e45366004613b85565b612a88565b348015610e5657600080fd5b506018546103f79062010000900460ff1681565b60006001600160e01b03198216637965db0b60e01b1480610e9b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610eb090613fe0565b80601f0160208091040260200160405190810160405280929190818152602001828054610edc90613fe0565b8015610f295780601f10610efe57610100808354040283529160200191610f29565b820191906000526020600020905b815481529060010190602001808311610f0c57829003601f168201915b5050505050905090565b600033610f41818585612c73565b5060019392505050565b610f53612d98565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b6000805160206142a6833981519152610f8f81612df2565b60ff808516600090815260086020526040902060010154600160801b900416156110005760405162461bcd60e51b815260206004820152601960248201527f5468697320566f7465206973207374696c6c206163746976650000000000000060448201526064015b60405180910390fd5b825b826001600160401b0316816001600160401b0316101561107a5760ff85166000908152600a602090815260408083206001600160401b0385168452909152902060028101546001909101546110689130916101009091046001600160a01b031690612dfc565b8061107281614030565b915050611002565b5050505050565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260ff821660009081526008602052604090819020815160a081019092528054829082906110d890613fe0565b80601f016020809104026020016040519081016040528092919081815260200182805461110490613fe0565b80156111515780601f1061112657610100808354040283529160200191611151565b820191906000526020600020905b81548152906001019060200180831161113457829003601f168201915b5050509183525050600191909101546001600160401b038082166020840152600160401b82048116604084015260ff600160801b83041615156060840152600160881b9091041660809091015292915050565b60185462010000900460ff166111f55760405162461bcd60e51b8152602060048201526016602482015275566f7465206973206e6f742063726561746561626c6560501b6044820152606401610ff7565b60185460ff1661123c5760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610ff7565b6112546000805160206142a683398151915233611f63565b611351576007543410156112b55760405162461bcd60e51b815260206004820152602260248201527f596f75206e65656420746f207061792066656520746f2063726561746520766f604482015261746560f01b6064820152608401610ff7565b336000908152600e60205260409020546002546112d690600a905b906130a1565b811015806112f757506112f76000805160206142a683398151915233611f63565b61134f5760405162461bcd60e51b8152602060048201526024808201527f596f75206e65656420746f206861766520313025206f6620746f74616c20737560448201526370706c7960e01b6064820152608401610ff7565b505b60ff8316600081815260086020908152604091829020600101805460ff60801b196001600160401b03878116600160401b81026001600160801b0319909416918a169182179390931791909116600160801b179092556018805462ff00001916905583519485529184015282820152517f1d66141808fec33c82bd035e01d0a193ead5ead8504b58ac0bbc032fb22bae909181900360600190a1505050565b6000610f41848484612dfc565b611405612d98565b61141d6000805160206142a6833981519152826130b4565b50565b60008281526006602052604090206001015461143b81612df2565b61144583836130ba565b505050565b6001600160a01b03811633146114ba5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610ff7565b6114c48282613140565b5050565b6000805160206142a68339815191526114e081612df2565b60008551116115225760405162461bcd60e51b815260206004820152600e60248201526d757365727320697320656d70747960901b6044820152606401610ff7565b6000841161156a5760405162461bcd60e51b81526020600482015260156024820152746c696d6974206465706f736974206973207a65726f60581b6044820152606401610ff7565b6000836001600160401b0316116115c35760405162461bcd60e51b815260206004820152601a60248201527f73746172742074696d65206465706f736974206973207a65726f0000000000006044820152606401610ff7565b6000826001600160401b03161161161c5760405162461bcd60e51b815260206004820152601a60248201527f636c6f73652074696d65206465706f736974206973207a65726f0000000000006044820152606401610ff7565b826001600160401b0316826001600160401b0316116116a35760405162461bcd60e51b815260206004820152603a60248201527f636c6f73652074696d65206465706f736974206d75737420626520677265617460448201527f6572207468616e2073746172742074696d65206465706f7369740000000000006064820152608401610ff7565b60005b8551811015611767576040518060600160405280868152602001856001600160401b03168152602001846001600160401b0316815250600d60008884815181106116f2576116f2614056565b6020908102919091018101516001600160a01b0316825281810192909252604090810160002083518155918301516001909201805493909101516001600160401b03908116600160401b026001600160801b03199094169216919091179190911790558061175f8161406c565b9150506116a6565b505050505050565b600033610f41818585611782838361286d565b61178c9190614085565b612c73565b60185460ff16156117d55760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610ff7565b600081116118255760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610ff7565b336000908152600d6020526040902060010154600160401b90046001600160401b031642111561188e5760405162461bcd60e51b81526020600482015260146024820152732232b837b9b4ba103a34b6b29034b99037bb32b960611b6044820152606401610ff7565b336000908152600d60205260409020600101546001600160401b03164210156118f95760405162461bcd60e51b815260206004820152601960248201527f4465706f7369742074696d65206973206e6f74207374617274000000000000006044820152606401610ff7565b336000908152600d60205260409020548111156119585760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610ff7565b60155460145461196890836131a7565b11156119b65760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d6974000000006044820152606401610ff7565b6017548110156119f55760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610ff7565b6000611a068264e8d4a510006130a1565b600c54909150611a21906001600160a01b03163330846131b3565b611a2b33836132b5565b336000908152600e6020526040902054611a4590836131a7565b336000908152600e6020526040902055601354611a7b906001600160a01b0316611a766103e86112d08660fa613374565b6132b5565b611ab0611a8f6103e86112d08560fa613374565b6013546001600160a01b03166000908152600e6020526040902054906131a7565b6013546001600160a01b03166000908152600e6020526040902055601454611ad890836131a7565b601455336000908152600d6020526040902054611af59083613380565b336000818152600d6020526040908190209290925590517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90611b3b9085815260200190565b60405180910390a25050565b6000805160206142a6833981519152611b5f81612df2565b50600b80546001600160a01b039092166001600160a01b0319928316811790915560108054909216179055565b61141d338261338c565b6000805160206142a6833981519152611bae81612df2565b50600755565b611bbc612d98565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206142a6833981519152611bf681612df2565b60185460ff16611c3d5760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b6044820152606401610ff7565b6000611c47611d88565b601054909150611c629087906001600160a01b03168a6134be565b6040805160c06020601f8801819004028201810190925260a08101868152600092829190899089908190850183828082843760009201829052509385525050506001600160a01b0380861660208401526040808401899052606084018e905260809093018c9052601054925163c04b8d5960e01b8152939450909291169063c04b8d5990611cf4908590600401614098565b6020604051808303816000875af1158015611d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3791906140f0565b9050876001600160a01b03167fdd06b66c3ba8126086cd863137d6f3b86ce5bcf4309cac390cc265e39194d0b282604051611d7491815260200190565b60405180910390a250505050505050505050565b6012546016546040516375ed572560e11b815260ff909116600482015260009182916001600160a01b039091169063ebdaae4a90602401608060405180830381865afa158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e009190614109565b5091949350505050565b6000805160206142a6833981519152611e2281612df2565b506018805460ff19166001179055565b611e3a612d98565b611e4460006135b7565b565b611e51823383613609565b6114c4828261338c565b600860205260009081526040902080548190611e7690613fe0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ea290613fe0565b8015611eef5780601f10611ec457610100808354040283529160200191611eef565b820191906000526020600020905b815481529060010190602001808311611ed257829003601f168201915b505050600190930154919250506001600160401b0380821691600160401b810482169160ff600160801b83041691600160881b90041685565b6000805160206142a6833981519152611f4081612df2565b50601280546001600160a01b0319166001600160a01b0392909216919091179055565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610eb090613fe0565b6000805160206142a6833981519152611fb581612df2565b6001600160a01b03821661200b5760405162461bcd60e51b815260206004820152601860248201527f72656365697665722061646472657373206973207a65726f00000000000000006044820152606401610ff7565b6001600160a01b0382166000908152600f602052604090205460ff1661207e5760405162461bcd60e51b815260206004820152602260248201527f7265636569766572206973206e6f7420696e766573746d656e74206164647265604482015261737360f01b6064820152608401610ff7565b6001600160a01b03841661209b57612096828461367d565b6120a6565b6120a6848385613720565b50505050565b600033816120ba828661286d565b90508381101561211a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ff7565b6121278286868403612c73565b506001949350505050565b600061213f338484612dfc565b50600192915050565b612150612d98565b61141d6000805160206142a683398151915282612848565b60185460ff16156121ac5760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b6044820152606401610ff7565b6014546121b990826131a7565b60155410156121f95760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b6044820152606401610ff7565b6017548110156122385760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610ff7565b600c54600160a01b90046001600160401b03164210156122a45760405162461bcd60e51b815260206004820152602160248201527f506f6f6c206973206e6f74206f70656e207965742c20706c65617365207761696044820152601d60fa1b6064820152608401610ff7565b60006122b58264e8d4a510006130a1565b600c549091506122d0906001600160a01b03163330846131b3565b6122da33836132b5565b336000908152600e60205260409020546122f490836131a7565b336000908152600e6020526040902055601354612325906001600160a01b0316611a766103e86112d08660fa613374565b612339611a8f6103e86112d08560fa613374565b6013546001600160a01b03166000908152600e602052604081209190915560148054849290612369908490614085565b909155505060405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001611b3b565b60185460ff166123e85760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8141bdbdb081a5cc818db1bdcd959606a1b6044820152606401610ff7565b60ff808316600090815260086020526040902060010154600160801b9004166124495760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8159bdd19481a5cc818db1bdcd959606a1b6044820152606401610ff7565b60ff821660009081526009602090815260408083203384529091529020546001600160401b0316156124ae5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610ff7565b60ff821660009081526009602090815260408083203384529091529020600101541561250d5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b6044820152606401610ff7565b336000818152600e6020526040902054906125299030836113f0565b5060ff8316600090815260086020526040902060019081018054601190612561908490600160881b90046001600160401b0316614168565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600960008560ff1660ff1681526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600a60008560ff1660ff1681526020019081526020016000206000600860008760ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f35d237ec79045d79173411929e0c49b6089611517881c6f075c0bec2f32b2073824285600860008960ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b031660405161283b94939291909384526001600160401b03928316602085015260ff91909116604084015216606082015260800190565b60405180910390a2505050565b60008281526006602052604090206001015461286381612df2565b6114458383613140565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6128a0612d98565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000805160206142a68339815191526128d981612df2565b506018805461ff001981166101009182900460ff1615909102179055565b6011546001600160a01b0316331461293d5760405162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b6044820152606401610ff7565b6017949094556015949094556016805460ff90961660ff1990961695909517909455600b54601080546001600160a01b03199081166001600160a01b0393841617909155600c80546013805495851695841695909517909455601280549784169783169790971790965592166001600160401b03909316600160a01b029091166001600160e01b031990911617179055565b6000805160206142a68339815191526129e781612df2565b50601755565b6000805160206142a6833981519152612a0581612df2565b506018805460ff19169055565b612a1a612d98565b6001600160a01b038116612a7f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ff7565b61141d816135b7565b6000805160206142a6833981519152612aa081612df2565b60ff8216600081815260086020908152604091829020600101805460ff60801b191690556018805462ff000019166201000017905590519182527f4329ff635fb60bac41e85195468d8998fac762dabf4ffde9a7cfb9ec0d22d897910160405180910390a15050565b60606000612b1683612b9b565b60010190506000816001600160401b03811115612b3557612b35613cb9565b6040519080825280601f01601f191660200182016040528015612b5f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612b6957509392505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612bda5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612c06576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612c2457662386f26fc10000830492506010015b6305f5e1008310612c3c576305f5e100830492506008015b6127108310612c5057612710830492506004015b60648310612c62576064830492506002015b600a8310610e9b5760010192915050565b6001600160a01b038316612cd55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ff7565b6001600160a01b038216612d365760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ff7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314611e445760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ff7565b61141d8133613819565b6001600160a01b038316612e605760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ff7565b6001600160a01b038216612ec25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ff7565b601854610100900460ff1615612f1a5760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e7366657220697320706175736564000000000000006044820152606401610ff7565b60008111612f7c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ff7565b6001600160a01b0383166000908152600e6020526040902054811115612ffb5760405162461bcd60e51b815260206004820152602e60248201527f45524332303a20616d6f756e74206d757374206265206c657373206f7220657160448201526d75616c20746f2062616c616e636560901b6064820152608401610ff7565b6001600160a01b0383166000908152600e602052604090205461301e9082613380565b6001600160a01b038085166000908152600e6020526040808220939093559084168152205461304d90826131a7565b6001600160a01b038084166000818152600e602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d8b9085815260200190565b60006130ad828461418f565b9392505050565b6114c482825b6130c48282611f63565b6114c45760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556130fc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61314a8282611f63565b156114c45760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006130ad8284614085565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161321791906141b1565b6000604051808303816000865af19150503d8060008114613254576040519150601f19603f3d011682016040523d82523d6000602084013e613259565b606091505b509150915081801561328357508051158061328357508080602001905181019061328391906141cd565b6117675760405162461bcd60e51b815260206004820152600360248201526229aa2360e91b6044820152606401610ff7565b6001600160a01b03821661330b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ff7565b806002600082825461331d9190614085565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60006130ad82846141ef565b60006130ad8284614206565b6001600160a01b0382166133ec5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ff7565b6001600160a01b038216600090815260208190526040902054818110156134605760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ff7565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161351a91906141b1565b6000604051808303816000865af19150503d8060008114613557576040519150601f19603f3d011682016040523d82523d6000602084013e61355c565b606091505b509150915081801561358657508051158061358657508080602001905181019061358691906141cd565b61107a5760405162461bcd60e51b8152602060048201526002602482015261534160f01b6044820152606401610ff7565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000613615848461286d565b905060001981146120a657818110156136705760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ff7565b6120a68484848403612c73565b604080516000808252602082019092526001600160a01b0384169083906040516136a791906141b1565b60006040518083038185875af1925050503d80600081146136e4576040519150601f19603f3d011682016040523d82523d6000602084013e6136e9565b606091505b50509050806114455760405162461bcd60e51b815260206004820152600360248201526253544560e81b6044820152606401610ff7565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161377c91906141b1565b6000604051808303816000865af19150503d80600081146137b9576040519150601f19603f3d011682016040523d82523d6000602084013e6137be565b606091505b50915091508180156137e85750805115806137e85750808060200190518101906137e891906141cd565b61107a5760405162461bcd60e51b815260206004820152600260248201526114d560f21b6044820152606401610ff7565b6138238282611f63565b6114c45761383081613872565b61383b836020613884565b60405160200161384c929190614219565b60408051601f198184030181529082905262461bcd60e51b8252610ff791600401613a99565b6060610e9b6001600160a01b03831660145b606060006138938360026141ef565b61389e906002614085565b6001600160401b038111156138b5576138b5613cb9565b6040519080825280601f01601f1916602001820160405280156138df576020820181803683370190505b509050600360fc1b816000815181106138fa576138fa614056565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061392957613929614056565b60200101906001600160f81b031916908160001a905350600061394d8460026141ef565b613958906001614085565b90505b60018111156139d0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061398c5761398c614056565b1a60f81b8282815181106139a2576139a2614056565b60200101906001600160f81b031916908160001a90535060049490941c936139c98161428e565b905061395b565b5083156130ad5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ff7565b600060208284031215613a3157600080fd5b81356001600160e01b0319811681146130ad57600080fd5b60005b83811015613a64578181015183820152602001613a4c565b50506000910152565b60008151808452613a85816020860160208601613a49565b601f01601f19169290920160200192915050565b6020815260006130ad6020830184613a6d565b6001600160a01b038116811461141d57600080fd5b8035613acc81613aac565b919050565b60008060408385031215613ae457600080fd5b8235613aef81613aac565b946020939093013593505050565b600060208284031215613b0f57600080fd5b81356130ad81613aac565b803560ff81168114613acc57600080fd5b80356001600160401b0381168114613acc57600080fd5b600080600060608486031215613b5757600080fd5b613b6084613b1a565b9250613b6e60208501613b2b565b9150613b7c60408501613b2b565b90509250925092565b600060208284031215613b9757600080fd5b6130ad82613b1a565b602081526000825160a06020840152613bbc60c0840182613a6d565b905060208401516001600160401b0380821660408601528060408701511660608601526060860151151560808601528060808701511660a086015250508091505092915050565b60008060408385031215613c1657600080fd5b613c1f83613b1a565b91506020830135613c2f81613aac565b809150509250929050565b600080600060608486031215613c4f57600080fd5b8335613c5a81613aac565b92506020840135613c6a81613aac565b929592945050506040919091013590565b600060208284031215613c8d57600080fd5b5035919050565b60008060408385031215613ca757600080fd5b823591506020830135613c2f81613aac565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613ce557600080fd5b84356001600160401b0380821115613cfc57600080fd5b818701915087601f830112613d1057600080fd5b8135602082821115613d2457613d24613cb9565b8160051b604051601f19603f83011681018181108682111715613d4957613d49613cb9565b60405292835281830193508481018201928b841115613d6757600080fd5b948201945b83861015613d8c57613d7d86613ac1565b85529482019493820193613d6c565b9850508801359550613da5925050604087019050613b2b565b9150613db360608601613b2b565b905092959194509250565b60008060008060008060a08789031215613dd757600080fd5b86359550602087013594506040870135613df081613aac565b935060608701356001600160401b0380821115613e0c57600080fd5b818901915089601f830112613e2057600080fd5b813581811115613e2f57600080fd5b8a6020828501011115613e4157600080fd5b602083019550809450505050608087013590509295509295509295565b60008060408385031215613e7157600080fd5b613e7a83613b1a565b9150613e8860208401613b2b565b90509250929050565b60a081526000613ea460a0830188613a6d565b6001600160401b0396871660208401529486166040830152509115156060830152909216608090920191909152919050565b600080600060608486031215613eeb57600080fd5b8335613ef681613aac565b9250602084013591506040840135613f0d81613aac565b809150509250925092565b60008060408385031215613f2b57600080fd5b613f3483613b1a565b9150613e8860208401613b1a565b60008060408385031215613f5557600080fd5b8235613c1f81613aac565b600080600080600080600060e0888a031215613f7b57600080fd5b613f8488613b1a565b965060208801359550604088013594506060880135613fa281613aac565b93506080880135613fb281613aac565b9250613fc060a08901613b2b565b915060c0880135613fd081613aac565b8091505092959891949750929550565b600181811c90821680613ff457607f821691505b60208210810361401457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b0380831681810361404c5761404c61401a565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161407e5761407e61401a565b5060010190565b80820180821115610e9b57610e9b61401a565b602081526000825160a060208401526140b460c0840182613a6d565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b60006020828403121561410257600080fd5b5051919050565b6000806000806080858703121561411f57600080fd5b845161412a81613aac565b602086015190945061413b81613aac565b604086015190935061414c81613aac565b606086015190925061415d81613aac565b939692955090935050565b6001600160401b038181168382160190808211156141885761418861401a565b5092915050565b6000826141ac57634e487b7160e01b600052601260045260246000fd5b500490565b600082516141c3818460208701613a49565b9190910192915050565b6000602082840312156141df57600080fd5b815180151581146130ad57600080fd5b8082028115828204841417610e9b57610e9b61401a565b81810381811115610e9b57610e9b61401a565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614251816017850160208801613a49565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614282816028840160208801613a49565b01602801949350505050565b60008161429d5761429d61401a565b50600019019056fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a2646970667358221220f6f25c638521e4cb15f49188528f73779d9d3a8848f186f6890c2e3c271dc0b264736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000002
-----Decoded View---------------
Arg [0] : _orderNumber (uint8): 2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode Sourcemap
66776:14852:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37643:204;;;;;;;;;;-1:-1:-1;37643:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;37643:204:0;;;;;;;;54341:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;56692:201::-;;;;;;;;;;-1:-1:-1;56692:201:0;;;;;:::i;:::-;;:::i;76331:139::-;;;;;;;;;;-1:-1:-1;76331:139:0;;;;;:::i;:::-;;:::i;80944:475::-;;;;;;;;;;-1:-1:-1;80944:475:0;;;;;:::i;:::-;;:::i;77474:119::-;;;;;;;;;;-1:-1:-1;77474:119:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;68332:27::-;;;;;;;;;;-1:-1:-1;68332:27:0;;;;;;;;55461:108;;;;;;;;;;-1:-1:-1;55549:12:0;;55461:108;;;3834:25:1;;;3822:2;3807:18;55461:108:0;3688:177:1;78319:998:0;;;;;;:::i;:::-;;:::i;78103:182::-;;;;;;;;;;-1:-1:-1;78103:182:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78247:23:0;;;;;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;78247:30:0;;;;;;;;;;;78240:37;;;;;;;;;-1:-1:-1;;;;;78240:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78103:182;;;;;;;4413:13:1;;-1:-1:-1;;;;;4409:38:1;4391:57;;4504:4;4492:17;;;4486:24;4464:20;;;4457:54;4571:4;4559:17;;;4553:24;4579:4;4549:35;4527:20;;;4520:65;4645:4;4633:17;;;4627:24;-1:-1:-1;;;;;4623:50:1;4601:20;;;4594:80;;;;4378:3;4363:19;;4192:488;75175:225:0;;;;;;;;;;-1:-1:-1;75175:225:0;;;;;:::i;:::-;;:::i;39466:131::-;;;;;;;;;;-1:-1:-1;39466:131:0;;;;;:::i;:::-;39540:7;39567:12;;;:6;:12;;;;;:22;;;;39466:131;77785:108;;;;;;;;;;-1:-1:-1;77785:108:0;;;;;:::i;:::-;;:::i;39907:147::-;;;;;;;;;;-1:-1:-1;39907:147:0;;;;;:::i;:::-;;:::i;55303:93::-;;;;;;;;;;-1:-1:-1;55386:2:0;55303:93;;;6005:4:1;5993:17;;;5975:36;;5963:2;5948:18;55303:93:0;5833:184:1;41051:218:0;;;;;;;;;;-1:-1:-1;41051:218:0;;;;;:::i;:::-;;:::i;67894:46::-;;;;;;;;;;-1:-1:-1;67894:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67894:46:0;;;;-1:-1:-1;;;67894:46:0;;;;;;;;;6220:25:1;;;-1:-1:-1;;;;;6318:15:1;;;6313:2;6298:18;;6291:43;6370:15;;6350:18;;;6343:43;6208:2;6193:18;67894:46:0;6022:370:1;70281:921:0;;;;;;;;;;-1:-1:-1;70281:921:0;;;;;:::i;:::-;;:::i;68123:29::-;;;;;;;;;;-1:-1:-1;68123:29:0;;;;-1:-1:-1;;;;;68123:29:0;;;;;;-1:-1:-1;;;;;8034:32:1;;;8016:51;;8004:2;7989:18;68123:29:0;7870:203:1;58177:238:0;;;;;;;;;;-1:-1:-1;58177:238:0;;;;;:::i;:::-;;:::i;71266:1452::-;;;;;;;;;;-1:-1:-1;71266:1452:0;;;;;:::i;:::-;;:::i;81451:174::-;;;;;;;;;;-1:-1:-1;81451:174:0;;;;;:::i;:::-;;:::i;66112:91::-;;;;;;;;;;-1:-1:-1;66112:91:0;;;;;:::i;:::-;;:::i;67861:26::-;;;;;;;;;;-1:-1:-1;67861:26:0;;;;-1:-1:-1;;;67861:26:0;;-1:-1:-1;;;;;67861:26:0;;;;;;-1:-1:-1;;;;;8425:31:1;;;8407:50;;8395:2;8380:18;67861:26:0;8263:200:1;77625:117:0;;;;;;;;;;-1:-1:-1;77625:117:0;;;;;:::i;:::-;;:::i;76714:104::-;;;;;;;;;;-1:-1:-1;76714:104:0;;;;;:::i;:::-;;:::i;73937:844::-;;;;;;;;;;-1:-1:-1;73937:844:0;;;;;:::i;:::-;;:::i;73689:206::-;;;;;;;;;;;;;:::i;68296:29::-;;;;;;;;;;;;;;;;68232:26;;;;;;;;;;;;;;;;68159:25;;;;;;;;;;-1:-1:-1;68159:25:0;;;;-1:-1:-1;;;;;68159:25:0;;;77358:84;;;;;;;;;;;;;:::i;67406:63::-;;;;;;;;;;-1:-1:-1;67406:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67406:63:0;;;;;;;;;;;;-1:-1:-1;;;;;67406:63:0;;;;;;;-1:-1:-1;;;;;9648:31:1;;;9630:50;;9711:2;9696:18;;9689:34;;;;9771:4;9759:17;;;9739:18;;;9732:45;;;;-1:-1:-1;;;;;9813:32:1;9808:2;9793:18;;9786:60;9617:3;9602:19;67406:63:0;9405:447:1;67476:67:0;;;;;;;;;;-1:-1:-1;67476:67:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67476:67:0;;;;;;;;;;;;-1:-1:-1;;;;;67476:67:0;;;68191:34;;;;;;;;;;;;;;;;76177:115;;;;;;;;;;-1:-1:-1;76177:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;76268:16:0;76241:7;76268:16;;;:9;:16;;;;;;;76177:115;45195:103;;;;;;;;;;;;;:::i;66522:164::-;;;;;;;;;;-1:-1:-1;66522:164:0;;;;;:::i;:::-;;:::i;67361:38::-;;;;;;;;;;-1:-1:-1;67361:38:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;76858:156::-;;;;;;;;;;-1:-1:-1;76858:156:0;;;;;:::i;:::-;;:::i;44547:87::-;;;;;;;;;;-1:-1:-1;44620:6:0;;-1:-1:-1;;;;;44620:6:0;44547:87;;67319:35;;;;;;;;;;;;;;;;67678:88;;;;;;;;;;-1:-1:-1;67678:88:0;;;;-1:-1:-1;;;;;67678:88:0;;;37939:147;;;;;;;;;;-1:-1:-1;37939:147:0;;;;;:::i;:::-;;:::i;54560:104::-;;;;;;;;;;;;;:::i;67773:79::-;;;;;;;;;;-1:-1:-1;67773:79:0;;;;-1:-1:-1;;;;;67773:79:0;;;69667:574;;;;;;;;;;-1:-1:-1;69667:574:0;;;;;:::i;:::-;;:::i;37044:49::-;;;;;;;;;;-1:-1:-1;37044:49:0;37089:4;37044:49;;58918:436;;;;;;;;;;-1:-1:-1;58918:436:0;;;;;:::i;:::-;;:::i;74968:199::-;;;;;;;;;;-1:-1:-1;74968:199:0;;;;;:::i;:::-;;:::i;77941:111::-;;;;;;;;;;-1:-1:-1;77941:111:0;;;;;:::i;:::-;;:::i;68265:24::-;;;;;;;;;;-1:-1:-1;68265:24:0;;;;;;;;72766:889;;;;;;;;;;-1:-1:-1;72766:889:0;;;;;:::i;:::-;;:::i;68058:29::-;;;;;;;;;;-1:-1:-1;68058:29:0;;;;-1:-1:-1;;;;;68058:29:0;;;79580:1307;;;;;;;;;;-1:-1:-1;79580:1307:0;;;;;:::i;:::-;;:::i;68094:22::-;;;;;;;;;;-1:-1:-1;68094:22:0;;;;-1:-1:-1;;;;;68094:22:0;;;68366:34;;;;;;;;;;-1:-1:-1;68366:34:0;;;;;;;;;;;40347:149;;;;;;;;;;-1:-1:-1;40347:149:0;;;;;:::i;:::-;;:::i;56221:151::-;;;;;;;;;;-1:-1:-1;56221:151:0;;;;;:::i;:::-;;:::i;76512:166::-;;;;;;;;;;-1:-1:-1;76512:166:0;;;;;:::i;:::-;;:::i;74847:113::-;;;;;;;;;;;;;:::i;68001:50::-;;;;;;;;;;-1:-1:-1;68001:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;68854:666;;;;;;;;;;-1:-1:-1;68854:666:0;;;;;:::i;:::-;;:::i;77057:156::-;;;;;;;;;;-1:-1:-1;77057:156:0;;;;;:::i;:::-;;:::i;77243:84::-;;;;;;;;;;;;;:::i;67601:64::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;67601:64:0;;45453:201;;;;;;;;;;-1:-1:-1;45453:201:0;;;;;:::i;:::-;;:::i;79346:198::-;;;;;;;;;;-1:-1:-1;79346:198:0;;;;;:::i;:::-;;:::i;68407:33::-;;;;;;;;;;-1:-1:-1;68407:33:0;;;;;;;;;;;37643:204;37728:4;-1:-1:-1;;;;;;37752:47:0;;-1:-1:-1;;;37752:47:0;;:87;;-1:-1:-1;;;;;;;;;;15878:40:0;;;37803:36;37745:94;37643:204;-1:-1:-1;;37643:204:0:o;54341:100::-;54395:13;54428:5;54421:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54341:100;:::o;56692:201::-;56775:4;34932:10;56831:32;34932:10;56847:7;56856:6;56831:8;:32::i;:::-;-1:-1:-1;56881:4:0;;56692:201;-1:-1:-1;;;56692:201:0:o;76331:139::-;44433:13;:11;:13::i;:::-;-1:-1:-1;;;;;76417:38:0::1;;::::0;;;:18:::1;:38;::::0;;;;:45;;-1:-1:-1;;76417:45:0::1;76458:4;76417:45;::::0;;76331:139::o;80944:475::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;81107:22:::1;::::0;;::::1;;::::0;;;:8:::1;:22;::::0;;;;:31:::1;;::::0;-1:-1:-1;;;81107:31:0;::::1;;81106:32;81098:70;;;::::0;-1:-1:-1;;;81098:70:0;;13437:2:1;81098:70:0::1;::::0;::::1;13419:21:1::0;13476:2;13456:18;;;13449:30;13515:27;13495:18;;;13488:55;13560:18;;81098:70:0::1;;;;;;;;;81195:5:::0;81179:233:::1;81206:3;-1:-1:-1::0;;;;;81202:7:0::1;:1;-1:-1:-1::0;;;;;81202:7:0::1;;81179:233;;;81291:28;::::0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;81291:31:0;::::1;::::0;;;;;;;:37:::1;::::0;::::1;::::0;::::1;81347:38:::0;;::::1;::::0;81231:169:::1;::::0;81267:4:::1;::::0;81291:37:::1;::::0;;::::1;-1:-1:-1::0;;;;;81291:37:0::1;::::0;81231:9:::1;:169::i;:::-;81211:3:::0;::::1;::::0;::::1;:::i;:::-;;;;81179:233;;;;80944:475:::0;;;;:::o;77474:119::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77563:22:0;;;;;;;:8;:22;;;;;;;77556:29;;;;;;;;;;;;77563:22;;77556:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77556:29:0;;;-1:-1:-1;;77556:29:0;;;;;;-1:-1:-1;;;;;77556:29:0;;;;;;;-1:-1:-1;;;77556:29:0;;;;;;;;;-1:-1:-1;;;77556:29:0;;;;;;;;;-1:-1:-1;;;77556:29:0;;;;;;;;;;77474:119;-1:-1:-1;;77474:119:0:o;78319:998::-;78473:14;;;;;;;78465:49;;;;-1:-1:-1;;;78465:49:0;;14137:2:1;78465:49:0;;;14119:21:1;14176:2;14156:18;;;14149:30;-1:-1:-1;;;14195:18:1;;;14188:52;14257:18;;78465:49:0;13935:346:1;78465:49:0;78533:7;;;;78525:38;;;;-1:-1:-1;;;78525:38:0;;14488:2:1;78525:38:0;;;14470:21:1;14527:2;14507:18;;;14500:30;-1:-1:-1;;;14546:18:1;;;14539:48;14604:18;;78525:38:0;14286:342:1;78525:38:0;78578:33;-1:-1:-1;;;;;;;;;;;78600:10:0;78578:7;:33::i;:::-;78574:450;;78675:10;;78662:9;:23;;78636:119;;;;-1:-1:-1;;;78636:119:0;;14835:2:1;78636:119:0;;;14817:21:1;14874:2;14854:18;;;14847:30;14913:34;14893:18;;;14886:62;-1:-1:-1;;;14964:18:1;;;14957:32;15006:19;;78636:119:0;14633:398:1;78636:119:0;78798:10;78770:15;76268:16;;;:9;:16;;;;;;55549:12;;78861:21;;78879:2;;78861:13;:17;;:21::i;:::-;78850:7;:32;;:90;;;;78907:33;-1:-1:-1;;;;;;;;;;;78929:10:0;78907:7;:33::i;:::-;78824:188;;;;-1:-1:-1;;;78824:188:0;;15238:2:1;78824:188:0;;;15220:21:1;15277:2;15257:18;;;15250:30;15316:34;15296:18;;;15289:62;-1:-1:-1;;;15367:18:1;;;15360:34;15411:19;;78824:188:0;15036:400:1;78824:188:0;78621:403;78574:450;79036:22;;;;;;;:8;:22;;;;;;;;;:37;;:55;;-1:-1:-1;;;;;;;;;79102:51:0;;;-1:-1:-1;;;79102:51:0;;-1:-1:-1;;;;;;79102:51:0;;;79036:55;;;79102:51;;;;;;;79164:38;;;;-1:-1:-1;;;79164:38:0;;;;79213:14;:22;;-1:-1:-1;;79213:22:0;;;79253:56;;15635:36:1;;;15724:18;;;15717:43;15776:18;;;15769:43;79253:56:0;;;;;;15623:2:1;79253:56:0;;;78319:998;;;:::o;75175:225::-;75315:4;75332:36;75342:6;75350:9;75361:6;75332:9;:36::i;77785:108::-;44433:13;:11;:13::i;:::-;77851:34:::1;-1:-1:-1::0;;;;;;;;;;;77876:8:0::1;77851:10;:34::i;:::-;77785:108:::0;:::o;39907:147::-;39540:7;39567:12;;;:6;:12;;;;;:22;;;37535:16;37546:4;37535:10;:16::i;:::-;40021:25:::1;40032:4;40038:7;40021:10;:25::i;:::-;39907:147:::0;;;:::o;41051:218::-;-1:-1:-1;;;;;41147:23:0;;34932:10;41147:23;41139:83;;;;-1:-1:-1;;;41139:83:0;;16025:2:1;41139:83:0;;;16007:21:1;16064:2;16044:18;;;16037:30;16103:34;16083:18;;;16076:62;-1:-1:-1;;;16154:18:1;;;16147:45;16209:19;;41139:83:0;15823:411:1;41139:83:0;41235:26;41247:4;41253:7;41235:11;:26::i;:::-;41051:218;;:::o;70281:921::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;70514:1:::1;70498:6;:13;:17;70490:44;;;::::0;-1:-1:-1;;;70490:44:0;;16441:2:1;70490:44:0::1;::::0;::::1;16423:21:1::0;16480:2;16460:18;;;16453:30;-1:-1:-1;;;16499:18:1;;;16492:44;16553:18;;70490:44:0::1;16239:338:1::0;70490:44:0::1;70569:1;70553:13;:17;70545:51;;;::::0;-1:-1:-1;;;70545:51:0;;16784:2:1;70545:51:0::1;::::0;::::1;16766:21:1::0;16823:2;16803:18;;;16796:30;-1:-1:-1;;;16842:18:1;;;16835:51;16903:18;;70545:51:0::1;16582:345:1::0;70545:51:0::1;70635:1;70615:17;-1:-1:-1::0;;;;;70615:21:0::1;;70607:60;;;::::0;-1:-1:-1;;;70607:60:0;;17134:2:1;70607:60:0::1;::::0;::::1;17116:21:1::0;17173:2;17153:18;;;17146:30;17212:28;17192:18;;;17185:56;17258:18;;70607:60:0::1;16932:350:1::0;70607:60:0::1;70706:1;70686:17;-1:-1:-1::0;;;;;70686:21:0::1;;70678:60;;;::::0;-1:-1:-1;;;70678:60:0;;17489:2:1;70678:60:0::1;::::0;::::1;17471:21:1::0;17528:2;17508:18;;;17501:30;17567:28;17547:18;;;17540:56;17613:18;;70678:60:0::1;17287:350:1::0;70678:60:0::1;70791:17;-1:-1:-1::0;;;;;70771:37:0::1;:17;-1:-1:-1::0;;;;;70771:37:0::1;;70749:145;;;::::0;-1:-1:-1;;;70749:145:0;;17844:2:1;70749:145:0::1;::::0;::::1;17826:21:1::0;17883:2;17863:18;;;17856:30;17922:34;17902:18;;;17895:62;17993:28;17973:18;;;17966:56;18039:19;;70749:145:0::1;17642:422:1::0;70749:145:0::1;70910:13;70905:290;70937:6;:13;70929:5;:21;70905:290;;;71003:180;;;;;;;;71046:13;71003:180;;;;71096:17;-1:-1:-1::0;;;;;71003:180:0::1;;;;;71150:17;-1:-1:-1::0;;;;;71003:180:0::1;;;::::0;70976:9:::1;:24;70986:6;70993:5;70986:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;70976:24:0::1;::::0;;;;::::1;::::0;;;;;;;;-1:-1:-1;70976:24:0;:207;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;70976:207:0;;::::1;-1:-1:-1::0;;;70976:207:0::1;-1:-1:-1::0;;;;;;70976:207:0;;;;::::1;::::0;;;;;;;::::1;::::0;;70952:7;::::1;::::0;::::1;:::i;:::-;;;;70905:290;;;;70281:921:::0;;;;;:::o;58177:238::-;58265:4;34932:10;58321:64;34932:10;58337:7;58374:10;58346:25;34932:10;58337:7;58346:9;:25::i;:::-;:38;;;;:::i;:::-;58321:8;:64::i;71266:1452::-;71331:7;;;;71330:8;71322:35;;;;-1:-1:-1;;;71322:35:0;;18673:2:1;71322:35:0;;;18655:21:1;18712:2;18692:18;;;18685:30;-1:-1:-1;;;18731:18:1;;;18724:44;18785:18;;71322:35:0;18471:338:1;71322:35:0;71386:1;71376:7;:11;71368:56;;;;-1:-1:-1;;;71368:56:0;;19016:2:1;71368:56:0;;;18998:21:1;;;19035:18;;;19028:30;19094:34;19074:18;;;19067:62;19146:18;;71368:56:0;18814:356:1;71368:56:0;71486:10;71476:21;;;;:9;:21;;;;;:38;;;-1:-1:-1;;;71476:38:0;;-1:-1:-1;;;;;71476:38:0;71457:15;:57;;71435:127;;;;-1:-1:-1;;;71435:127:0;;19377:2:1;71435:127:0;;;19359:21:1;19416:2;19396:18;;;19389:30;-1:-1:-1;;;19435:18:1;;;19428:50;19495:18;;71435:127:0;19175:344:1;71435:127:0;71624:10;71614:21;;;;:9;:21;;;;;:38;;;-1:-1:-1;;;;;71614:38:0;71595:15;:57;;71573:132;;;;-1:-1:-1;;;71573:132:0;;19726:2:1;71573:132:0;;;19708:21:1;19765:2;19745:18;;;19738:30;19804:27;19784:18;;;19777:55;19849:18;;71573:132:0;19524:349:1;71573:132:0;71748:10;71738:21;;;;:9;:21;;;;;:34;:45;-1:-1:-1;71738:45:0;71716:123;;;;-1:-1:-1;;;71716:123:0;;20080:2:1;71716:123:0;;;20062:21:1;20119:2;20099:18;;;20092:30;20158;20138:18;;;20131:58;20206:18;;71716:123:0;19878:352:1;71716:123:0;71904:11;;71872:15;;:28;;71892:7;71872:19;:28::i;:::-;:43;;71850:121;;;;-1:-1:-1;;;71850:121:0;;20080:2:1;71850:121:0;;;20062:21:1;20119:2;20099:18;;;20092:30;20158;20138:18;;;20131:58;20206:18;;71850:121:0;19878:352:1;71850:121:0;72001:14;;71990:7;:25;;71982:48;;;;-1:-1:-1;;;71982:48:0;;20437:2:1;71982:48:0;;;20419:21:1;20476:2;20456:18;;;20449:30;-1:-1:-1;;;20495:18:1;;;20488:40;20545:18;;71982:48:0;20235:334:1;71982:48:0;72051:23;72077:19;:7;72089:6;72077:11;:19::i;:::-;72139:10;;72051:45;;-1:-1:-1;72107:87:0;;-1:-1:-1;;;;;72139:10:0;72151;72171:4;72051:45;72107:31;:87::i;:::-;72205:26;72211:10;72223:7;72205:5;:26::i;:::-;72276:10;72266:21;;;;:9;:21;;;;;;:34;;72292:7;72266:25;:34::i;:::-;72252:10;72242:21;;;;:9;:21;;;;;:58;72317:10;;72311:53;;-1:-1:-1;;;;;72317:10:0;72329:34;72358:4;72329:24;:7;67589:3;72329:11;:24::i;:34::-;72311:5;:53::i;:::-;72399:85;72439:34;72468:4;72439:24;:7;67589:3;72439:11;:24::i;:34::-;72409:10;;-1:-1:-1;;;;;72409:10:0;72399:21;;;;:9;:21;;;;;;;:25;:85::i;:::-;72385:10;;-1:-1:-1;;;;;72385:10:0;72375:21;;;;:9;:21;;;;;:109;72513:15;;:28;;72533:7;72513:19;:28::i;:::-;72495:15;:46;72599:10;72589:21;;;;:9;:21;;;;;:48;:75;;72656:7;72589:66;:75::i;:::-;72562:10;72552:21;;;;:9;:21;;;;;;;:112;;;;72682:28;;;;;;72702:7;3834:25:1;;3822:2;3807:18;;3688:177;72682:28:0;;;;;;;;71311:1407;71266:1452;:::o;81451:174::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;-1:-1:-1;81536:19:0::1;:33:::0;;-1:-1:-1;;;;;81536:33:0;;::::1;-1:-1:-1::0;;;;;;81536:33:0;;::::1;::::0;::::1;::::0;;;81580:10:::1;:37:::0;;;;::::1;;::::0;;81451:174::o;66112:91::-;66168:27;34932:10;66188:6;66168:5;:27::i;77625:117::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;-1:-1:-1;77710:10:0::1;:24:::0;77625:117::o;76714:104::-;44433:13;:11;:13::i;:::-;76786:10:::1;:24:::0;;-1:-1:-1;;;;;;76786:24:0::1;-1:-1:-1::0;;;;;76786:24:0;;;::::1;::::0;;;::::1;::::0;;76714:104::o;73937:844::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;74157:7:::1;::::0;::::1;;74149:38;;;::::0;-1:-1:-1;;;74149:38:0;;14488:2:1;74149:38:0::1;::::0;::::1;14470:21:1::0;14527:2;14507:18;;;14500:30;-1:-1:-1;;;14546:18:1;;;14539:48;14604:18;;74149:38:0::1;14286:342:1::0;74149:38:0::1;74198:21;74222:12;:10;:12::i;:::-;74292:10;::::0;74198:36;;-1:-1:-1;74247:68:0::1;::::0;74274:8;;-1:-1:-1;;;;;74292:10:0::1;74305:9:::0;74247:26:::1;:68::i;:::-;74373:258;::::0;;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;74328:42:::1;::::0;74373:258;;;74441:5;;;;;;74373:258;;74441:5;;;;74373:258;::::1;;::::0;::::1;::::0;;;-1:-1:-1;74373:258:0;;;-1:-1:-1;;;;;;;;74373:258:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;74696:10:::1;::::0;:29;;-1:-1:-1;;;74696:29:0;;74328:303;;-1:-1:-1;74373:258:0;;74696:10;::::1;::::0;:21:::1;::::0;:29:::1;::::0;74328:303;;74696:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74675:50;;74752:8;-1:-1:-1::0;;;;;74743:30:0::1;;74762:10;74743:30;;;;3834:25:1::0;;3822:2;3807:18;;3688:177;74743:30:0::1;;;;;;;;74138:643;;;73937:844:::0;;;;;;;:::o;73689:206::-;73802:14;;73844:11;;73784:72;;-1:-1:-1;;;73784:72:0;;73844:11;;;;73784:72;;;5975:36:1;73732:7:0;;;;-1:-1:-1;;;;;73802:14:0;;;;73784:59;;5948:18:1;;73784:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;73752:104:0;;73689:206;-1:-1:-1;;;;73689:206:0:o;77358:84::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;-1:-1:-1;77420:7:0::1;:14:::0;;-1:-1:-1;;77420:14:0::1;77430:4;77420:14;::::0;;77358:84::o;45195:103::-;44433:13;:11;:13::i;:::-;45260:30:::1;45287:1;45260:18;:30::i;:::-;45195:103::o:0;66522:164::-;66599:46;66615:7;34932:10;66638:6;66599:15;:46::i;:::-;66656:22;66662:7;66671:6;66656:5;:22::i;67361:38::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67361:38:0;;;;;;;-1:-1:-1;;;;;;;67361:38:0;;;;-1:-1:-1;;;67361:38:0;;;;;;-1:-1:-1;;;67361:38:0;;;;-1:-1:-1;;;67361:38:0;;;;:::o;76858:156::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;-1:-1:-1;76974:14:0::1;:32:::0;;-1:-1:-1;;;;;;76974:32:0::1;-1:-1:-1::0;;;;;76974:32:0;;;::::1;::::0;;;::::1;::::0;;76858:156::o;37939:147::-;38025:4;38049:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;38049:29:0;;;;;;;;;;;;;;;37939:147::o;54560:104::-;54616:13;54649:7;54642:14;;;;;:::i;69667:574::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;-1:-1:-1;;;;;69842:23:0;::::1;69834:60;;;::::0;-1:-1:-1;;;69834:60:0;;22280:2:1;69834:60:0::1;::::0;::::1;22262:21:1::0;22319:2;22299:18;;;22292:30;22358:26;22338:18;;;22331:54;22402:18;;69834:60:0::1;22078:348:1::0;69834:60:0::1;-1:-1:-1::0;;;;;69927:29:0;::::1;;::::0;;;:18:::1;:29;::::0;;;;;::::1;;69905:113;;;::::0;-1:-1:-1;;;69905:113:0;;22633:2:1;69905:113:0::1;::::0;::::1;22615:21:1::0;22672:2;22652:18;;;22645:30;22711:34;22691:18;;;22684:62;-1:-1:-1;;;22762:18:1;;;22755:32;22804:19;;69905:113:0::1;22431:398:1::0;69905:113:0::1;-1:-1:-1::0;;;;;70033:27:0;::::1;70029:205;;70077:50;70108:9;70119:7;70077:30;:50::i;:::-;70029:205;;;70160:62;70188:13;70203:9;70214:7;70160:27;:62::i;:::-;69667:574:::0;;;;:::o;58918:436::-;59011:4;34932:10;59011:4;59094:25;34932:10;59111:7;59094:9;:25::i;:::-;59067:52;;59158:15;59138:16;:35;;59130:85;;;;-1:-1:-1;;;59130:85:0;;23036:2:1;59130:85:0;;;23018:21:1;23075:2;23055:18;;;23048:30;23114:34;23094:18;;;23087:62;-1:-1:-1;;;23165:18:1;;;23158:35;23210:19;;59130:85:0;22834:401:1;59130:85:0;59251:60;59260:5;59267:7;59295:15;59276:16;:34;59251:8;:60::i;:::-;-1:-1:-1;59342:4:0;;58918:436;-1:-1:-1;;;;58918:436:0:o;74968:199::-;75073:4;75095:42;34932:10;75119:9;75130:6;75095:9;:42::i;:::-;-1:-1:-1;75155:4:0;74968:199;;;;:::o;77941:111::-;44433:13;:11;:13::i;:::-;78010:34:::1;-1:-1:-1::0;;;;;;;;;;;78035:8:0::1;78010:10;:34::i;72766:889::-:0;72827:7;;;;72826:8;72818:35;;;;-1:-1:-1;;;72818:35:0;;18673:2:1;72818:35:0;;;18655:21:1;18712:2;18692:18;;;18685:30;-1:-1:-1;;;18731:18:1;;;18724:44;18785:18;;72818:35:0;18471:338:1;72818:35:0;72887:15;;:28;;72907:7;72887:19;:28::i;:::-;72872:11;;:43;;72864:68;;;;-1:-1:-1;;;72864:68:0;;23442:2:1;72864:68:0;;;23424:21:1;23481:2;23461:18;;;23454:30;-1:-1:-1;;;23500:18:1;;;23493:42;23552:18;;72864:68:0;23240:336:1;72864:68:0;72962:14;;72951:7;:25;;72943:48;;;;-1:-1:-1;;;72943:48:0;;20437:2:1;72943:48:0;;;20419:21:1;20476:2;20456:18;;;20449:30;-1:-1:-1;;;20495:18:1;;;20488:40;20545:18;;72943:48:0;20235:334:1;72943:48:0;73043:12;;-1:-1:-1;;;73043:12:0;;-1:-1:-1;;;;;73043:12:0;73024:15;:31;;73002:114;;;;-1:-1:-1;;;73002:114:0;;23783:2:1;73002:114:0;;;23765:21:1;23822:2;23802:18;;;23795:30;23861:34;23841:18;;;23834:62;-1:-1:-1;;;23912:18:1;;;23905:31;23953:19;;73002:114:0;23581:397:1;73002:114:0;73129:23;73155:19;:7;73167:6;73155:11;:19::i;:::-;73217:10;;73129:45;;-1:-1:-1;73185:87:0;;-1:-1:-1;;;;;73217:10:0;73229;73249:4;73129:45;73185:31;:87::i;:::-;73283:26;73289:10;73301:7;73283:5;:26::i;:::-;73354:10;73344:21;;;;:9;:21;;;;;;:34;;73370:7;73344:25;:34::i;:::-;73330:10;73320:21;;;;:9;:21;;;;;:58;73395:10;;73389:53;;-1:-1:-1;;;;;73395:10:0;73407:34;73436:4;73407:24;:7;67589:3;73407:11;:24::i;73389:53::-;73477:85;73517:34;73546:4;73517:24;:7;67589:3;73517:11;:24::i;73477:85::-;73463:10;;-1:-1:-1;;;;;73463:10:0;73453:21;;;;:9;:21;;;;;:109;;;;73575:15;:26;;73594:7;;73453:21;73575:26;;73594:7;;73575:26;:::i;:::-;;;;-1:-1:-1;;73619:28:0;;3834:25:1;;;73627:10:0;;73619:28;;3822:2:1;3807:18;73619:28:0;3688:177:1;79580:1307:0;79659:7;;;;79651:39;;;;-1:-1:-1;;;79651:39:0;;24185:2:1;79651:39:0;;;24167:21:1;24224:2;24204:18;;;24197:30;-1:-1:-1;;;24243:18:1;;;24236:49;24302:18;;79651:39:0;23983:343:1;79651:39:0;79709:22;;;;;;;;:8;:22;;;;;:31;;;-1:-1:-1;;;79709:31:0;;;79701:63;;;;-1:-1:-1;;;79701:63:0;;24533:2:1;79701:63:0;;;24515:21:1;24572:2;24552:18;;;24545:30;-1:-1:-1;;;24591:18:1;;;24584:49;24650:18;;79701:63:0;24331:343:1;79701:63:0;79797:23;;;;;;;:9;:23;;;;;;;;79821:10;79797:35;;;;;;;:45;-1:-1:-1;;;;;79797:45:0;:50;79775:114;;;;-1:-1:-1;;;79775:114:0;;24881:2:1;79775:114:0;;;24863:21:1;24920:2;24900:18;;;24893:30;-1:-1:-1;;;24939:18:1;;;24932:44;24993:18;;79775:114:0;24679:338:1;79775:114:0;79922:23;;;;;;;:9;:23;;;;;;;;79946:10;79922:35;;;;;;;:42;;;:47;79900:111;;;;-1:-1:-1;;;79900:111:0;;24881:2:1;79900:111:0;;;24863:21:1;24920:2;24900:18;;;24893:30;-1:-1:-1;;;24939:18:1;;;24932:44;24993:18;;79900:111:0;24679:338:1;79900:111:0;80057:10;80022:22;76268:16;;;:9;:16;;;;;;;80081:55;;80114:4;76268:16;80081:12;:55::i;:::-;-1:-1:-1;80147:22:0;;;;;;;:8;:22;;;;;80183:1;80147:32;;;:37;;:32;;:37;;80183:1;;-1:-1:-1;;;80147:37:0;;-1:-1:-1;;;;;80147:37:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;80147:37:0;;;;;-1:-1:-1;;;;;80147:37:0;;;;;;80235:173;;;;;;;;80314:15;-1:-1:-1;;;;;80235:173:0;;;;;80267:14;80235:173;;;;80355:9;80235:173;;;;;;80386:10;-1:-1:-1;;;;;80235:173:0;;;;80197:9;:23;80207:12;80197:23;;;;;;;;;;;;;;;:35;80221:10;-1:-1:-1;;;;;80197:35:0;-1:-1:-1;;;;;80197:35:0;;;;;;;;;;;;:211;;;;;;;;;;;;;-1:-1:-1;;;;;80197:211:0;;;;;-1:-1:-1;;;;;80197:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;80197:211:0;;;;;-1:-1:-1;;;;;80197:211:0;;;;;;;;;80508:173;;;;;;;;80587:15;-1:-1:-1;;;;;80508:173:0;;;;;80540:14;80508:173;;;;80628:9;80508:173;;;;;;80659:10;-1:-1:-1;;;;;80508:173:0;;;;80419:14;:28;80434:12;80419:28;;;;;;;;;;;;;;;:86;80462:8;:22;80471:12;80462:22;;;;;;;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;80462:32:0;-1:-1:-1;;;;;80419:86:0;-1:-1:-1;;;;;80419:86:0;;;;;;;;;;;;:262;;;;;;;;;;;;;-1:-1:-1;;;;;80419:262:0;;;;;-1:-1:-1;;;;;80419:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;80419:262:0;;;;;-1:-1:-1;;;;;80419:262:0;;;;;;;;;80720:10;-1:-1:-1;;;;;80699:180:0;;80745:14;80781:15;80812:9;80836:8;:22;80845:12;80836:22;;;;;;;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;80836:32:0;80699:180;;;;;;;;25430:25:1;;;-1:-1:-1;;;;;25528:15:1;;;25523:2;25508:18;;25501:43;25592:4;25580:17;;;;25575:2;25560:18;;25553:45;25634:15;25629:2;25614:18;;25607:43;25417:3;25402:19;;25207:449;80699:180:0;;;;;;;;79640:1247;79580:1307;;:::o;40347:149::-;39540:7;39567:12;;;:6;:12;;;;;:22;;;37535:16;37546:4;37535:10;:16::i;:::-;40462:26:::1;40474:4;40480:7;40462:11;:26::i;56221:151::-:0;-1:-1:-1;;;;;56337:18:0;;;56310:7;56337:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;56221:151::o;76512:166::-;44433:13;:11;:13::i;:::-;-1:-1:-1;;;;;76624:38:0::1;76665:5;76624:38:::0;;;:18:::1;:38;::::0;;;;:46;;-1:-1:-1;;76624:46:0::1;::::0;;76512:166::o;74847:113::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;-1:-1:-1;74938:14:0::1;::::0;;-1:-1:-1;;74920:32:0;::::1;74938:14;::::0;;;::::1;;;74937:15;74920:32:::0;;::::1;;::::0;;74847:113::o;68854:666::-;69144:7;;-1:-1:-1;;;;;69144:7:0;69130:10;:21;69122:43;;;;-1:-1:-1;;;69122:43:0;;25863:2:1;69122:43:0;;;25845:21:1;25902:1;25882:18;;;25875:29;-1:-1:-1;;;25920:18:1;;;25913:39;25969:18;;69122:43:0;25661:332:1;69122:43:0;69196:14;:32;;;;69239:11;:28;;;;69278:11;:26;;;;;;-1:-1:-1;;69278:26:0;;;;;;;;;;69340:19;;69315:10;:45;;-1:-1:-1;;;;;;69315:45:0;;;-1:-1:-1;;;;;69340:19:0;;;69315:45;;;;69371:12;:28;;69410:10;:24;;;;;;;;;;;;;;;69445:14;:32;;;;;;;;;;;;;;;69488:24;;-1:-1:-1;;;;;69371:28:0;;;-1:-1:-1;;;69371:28:0;69488:24;;;-1:-1:-1;;;;;;69488:24:0;;;;;;;68854:666::o;77057:156::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;-1:-1:-1;77173:14:0::1;:32:::0;77057:156::o;77243:84::-;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;-1:-1:-1;77304:7:0::1;:15:::0;;-1:-1:-1;;77304:15:0::1;::::0;;77243:84::o;45453:201::-;44433:13;:11;:13::i;:::-;-1:-1:-1;;;;;45542:22:0;::::1;45534:73;;;::::0;-1:-1:-1;;;45534:73:0;;26200:2:1;45534:73:0::1;::::0;::::1;26182:21:1::0;26239:2;26219:18;;;26212:30;26278:34;26258:18;;;26251:62;-1:-1:-1;;;26329:18:1;;;26322:36;26375:19;;45534:73:0::1;25998:402:1::0;45534:73:0::1;45618:28;45637:8;45618:18;:28::i;79346:198::-:0;-1:-1:-1;;;;;;;;;;;37535:16:0;37546:4;37535:10;:16::i;:::-;79426:22:::1;::::0;::::1;79460:5;79426:22:::0;;;:8:::1;:22;::::0;;;;;;;;:31:::1;;:39:::0;;-1:-1:-1;;;;79426:39:0::1;::::0;;79476:14:::1;:21:::0;;-1:-1:-1;;79476:21:0::1;::::0;::::1;::::0;;79513:23;;5975:36:1;;;79513:23:0::1;::::0;5948:18:1;79513:23:0::1;;;;;;;79346:198:::0;;:::o;29238:716::-;29294:13;29345:14;29362:17;29373:5;29362:10;:17::i;:::-;29382:1;29362:21;29345:38;;29398:20;29432:6;-1:-1:-1;;;;;29421:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29421:18:0;-1:-1:-1;29398:41:0;-1:-1:-1;29563:28:0;;;29579:2;29563:28;29620:288;-1:-1:-1;;29652:5:0;-1:-1:-1;;;29789:2:0;29778:14;;29773:30;29652:5;29760:44;29850:2;29841:11;;;-1:-1:-1;29871:21:0;29620:288;29871:21;-1:-1:-1;29929:6:0;29238:716;-1:-1:-1;;;29238:716:0:o;26104:922::-;26157:7;;-1:-1:-1;;;26235:15:0;;26231:102;;-1:-1:-1;;;26271:15:0;;;-1:-1:-1;26315:2:0;26305:12;26231:102;26360:6;26351:5;:15;26347:102;;26396:6;26387:15;;;-1:-1:-1;26431:2:0;26421:12;26347:102;26476:6;26467:5;:15;26463:102;;26512:6;26503:15;;;-1:-1:-1;26547:2:0;26537:12;26463:102;26592:5;26583;:14;26579:99;;26627:5;26618:14;;;-1:-1:-1;26661:1:0;26651:11;26579:99;26705:5;26696;:14;26692:99;;26740:5;26731:14;;;-1:-1:-1;26774:1:0;26764:11;26692:99;26818:5;26809;:14;26805:99;;26853:5;26844:14;;;-1:-1:-1;26887:1:0;26877:11;26805:99;26931:5;26922;:14;26918:66;;26967:1;26957:11;27012:6;26104:922;-1:-1:-1;;26104:922:0:o;62945:380::-;-1:-1:-1;;;;;63081:19:0;;63073:68;;;;-1:-1:-1;;;63073:68:0;;26739:2:1;63073:68:0;;;26721:21:1;26778:2;26758:18;;;26751:30;26817:34;26797:18;;;26790:62;-1:-1:-1;;;26868:18:1;;;26861:34;26912:19;;63073:68:0;26537:400:1;63073:68:0;-1:-1:-1;;;;;63160:21:0;;63152:68;;;;-1:-1:-1;;;63152:68:0;;27144:2:1;63152:68:0;;;27126:21:1;27183:2;27163:18;;;27156:30;27222:34;27202:18;;;27195:62;-1:-1:-1;;;27273:18:1;;;27266:32;27315:19;;63152:68:0;26942:398:1;63152:68:0;-1:-1:-1;;;;;63233:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;63285:32;;3834:25:1;;;63285:32:0;;3807:18:1;63285:32:0;;;;;;;;62945:380;;;:::o;44712:132::-;44620:6;;-1:-1:-1;;;;;44620:6:0;34932:10;44776:23;44768:68;;;;-1:-1:-1;;;44768:68:0;;27547:2:1;44768:68:0;;;27529:21:1;;;27566:18;;;27559:30;27625:34;27605:18;;;27598:62;27677:18;;44768:68:0;27345:356:1;38390:105:0;38457:30;38468:4;34932:10;38457;:30::i;75408:761::-;-1:-1:-1;;;;;75557:20:0;;75549:70;;;;-1:-1:-1;;;75549:70:0;;27908:2:1;75549:70:0;;;27890:21:1;27947:2;27927:18;;;27920:30;27986:34;27966:18;;;27959:62;-1:-1:-1;;;28037:18:1;;;28030:35;28082:19;;75549:70:0;27706:401:1;75549:70:0;-1:-1:-1;;;;;75638:23:0;;75630:71;;;;-1:-1:-1;;;75630:71:0;;28314:2:1;75630:71:0;;;28296:21:1;28353:2;28333:18;;;28326:30;28392:34;28372:18;;;28365:62;-1:-1:-1;;;28443:18:1;;;28436:33;28486:19;;75630:71:0;28112:399:1;75630:71:0;75720:14;;;;;;;:23;75712:61;;;;-1:-1:-1;;;75712:61:0;;28718:2:1;75712:61:0;;;28700:21:1;28757:2;28737:18;;;28730:30;28796:27;28776:18;;;28769:55;28841:18;;75712:61:0;28516:349:1;75712:61:0;75801:1;75792:6;:10;75784:64;;;;-1:-1:-1;;;75784:64:0;;29072:2:1;75784:64:0;;;29054:21:1;29111:2;29091:18;;;29084:30;29150:34;29130:18;;;29123:62;-1:-1:-1;;;29201:18:1;;;29194:39;29250:19;;75784:64:0;28870:405:1;75784:64:0;-1:-1:-1;;;;;75891:17:0;;;;;;:9;:17;;;;;;75881:27;;;75859:123;;;;-1:-1:-1;;;75859:123:0;;29482:2:1;75859:123:0;;;29464:21:1;29521:2;29501:18;;;29494:30;29560:34;29540:18;;;29533:62;-1:-1:-1;;;29611:18:1;;;29604:44;29665:19;;75859:123:0;29280:410:1;75859:123:0;-1:-1:-1;;;;;76015:17:0;;;;;;:9;:17;;;;;;:29;;76037:6;76015:21;:29::i;:::-;-1:-1:-1;;;;;75995:17:0;;;;;;;:9;:17;;;;;;:49;;;;76078:20;;;;;;;:32;;76103:6;76078:24;:32::i;:::-;-1:-1:-1;;;;;76055:20:0;;;;;;;:9;:20;;;;;;;:55;;;;76126:35;;;;;;;;;;76154:6;3834:25:1;;3822:2;3807:18;;3688:177;10959:98:0;11017:7;11044:5;11048:1;11044;:5;:::i;:::-;11037:12;10959:98;-1:-1:-1;;;10959:98:0:o;41976:112::-;42055:25;42066:4;42072:7;42648:238;42732:22;42740:4;42746:7;42732;:22::i;:::-;42727:152;;42771:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;42771:29:0;;;;;;;;;:36;;-1:-1:-1;;42771:36:0;42803:4;42771:36;;;42854:12;34932:10;;34852:98;42854:12;-1:-1:-1;;;;;42827:40:0;42845:7;-1:-1:-1;;;;;42827:40:0;42839:4;42827:40;;;;;;;;;;42648:238;;:::o;43066:239::-;43150:22;43158:4;43164:7;43150;:22::i;:::-;43146:152;;;43221:5;43189:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;43189:29:0;;;;;;;;;;:37;;-1:-1:-1;;43189:37:0;;;43246:40;34932:10;;43189:12;;43246:40;;43221:5;43246:40;43066:239;;:::o;9822:98::-;9880:7;9907:5;9911:1;9907;:5;:::i;49435:367::-;49640:69;;;-1:-1:-1;;;;;30175:15:1;;;49640:69:0;;;30157:34:1;30227:15;;;30207:18;;;30200:43;30259:18;;;;30252:34;;;49640:69:0;;;;;;;;;;30092:18:1;;;;49640:69:0;;;;;;;-1:-1:-1;;;;;49640:69:0;-1:-1:-1;;;49640:69:0;;;49629:81;;-1:-1:-1;;;;49629:10:0;;;;:81;;49640:69;49629:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49580:130;;;;49729:7;:57;;;;-1:-1:-1;49741:11:0;;:16;;:44;;;49772:4;49761:24;;;;;;;;;;;;:::i;:::-;49721:73;;;;-1:-1:-1;;;49721:73:0;;31073:2:1;49721:73:0;;;31055:21:1;31112:1;31092:18;;;31085:29;-1:-1:-1;;;31130:18:1;;;31123:33;31173:18;;49721:73:0;30871:326:1;60951:548:0;-1:-1:-1;;;;;61035:21:0;;61027:65;;;;-1:-1:-1;;;61027:65:0;;31404:2:1;61027:65:0;;;31386:21:1;31443:2;31423:18;;;31416:30;31482:33;31462:18;;;31455:61;31533:18;;61027:65:0;31202:355:1;61027:65:0;61183:6;61167:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;61338:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;61393:37;3834:25:1;;;61393:37:0;;3807:18:1;61393:37:0;;;;;;;41051:218;;:::o;10560:98::-;10618:7;10645:5;10649:1;10645;:5;:::i;10203:98::-;10261:7;10288:5;10292:1;10288;:5;:::i;61832:675::-;-1:-1:-1;;;;;61916:21:0;;61908:67;;;;-1:-1:-1;;;61908:67:0;;32070:2:1;61908:67:0;;;32052:21:1;32109:2;32089:18;;;32082:30;32148:34;32128:18;;;32121:62;-1:-1:-1;;;32199:18:1;;;32192:31;32240:19;;61908:67:0;31868:397:1;61908:67:0;-1:-1:-1;;;;;62075:18:0;;62050:22;62075:18;;;;;;;;;;;62112:24;;;;62104:71;;;;-1:-1:-1;;;62104:71:0;;32472:2:1;62104:71:0;;;32454:21:1;32511:2;32491:18;;;32484:30;32550:34;32530:18;;;32523:62;-1:-1:-1;;;32601:18:1;;;32594:32;32643:19;;62104:71:0;32270:398:1;62104:71:0;-1:-1:-1;;;;;62211:18:0;;:9;:18;;;;;;;;;;;62232:23;;;62211:44;;62350:12;:22;;;;;;;62401:37;3834:25:1;;;62211:9:0;;:18;62401:37;;3807:18:1;62401:37:0;;;;;;;39907:147;;;:::o;50777:314::-;50941:58;;;-1:-1:-1;;;;;32865:32:1;;;50941:58:0;;;32847:51:1;32914:18;;;;32907:34;;;50941:58:0;;;;;;;;;;32820:18:1;;;;50941:58:0;;;;;;;-1:-1:-1;;;;;50941:58:0;-1:-1:-1;;;50941:58:0;;;50930:70;;-1:-1:-1;;;;50930:10:0;;;;:70;;50941:58;50930:70;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50894:106;;;;51019:7;:57;;;;-1:-1:-1;51031:11:0;;:16;;:44;;;51062:4;51051:24;;;;;;;;;;;;:::i;:::-;51011:72;;;;-1:-1:-1;;;51011:72:0;;33154:2:1;51011:72:0;;;33136:21:1;33193:1;33173:18;;;33166:29;-1:-1:-1;;;33211:18:1;;;33204:32;33253:18;;51011:72:0;32952:325:1;45814:191:0;45907:6;;;-1:-1:-1;;;;;45924:17:0;;;-1:-1:-1;;;;;;45924:17:0;;;;;;;45957:40;;45907:6;;;45924:17;45907:6;;45957:40;;45888:16;;45957:40;45877:128;45814:191;:::o;63616:453::-;63751:24;63778:25;63788:5;63795:7;63778:9;:25::i;:::-;63751:52;;-1:-1:-1;;63818:16:0;:37;63814:248;;63900:6;63880:16;:26;;63872:68;;;;-1:-1:-1;;;63872:68:0;;33484:2:1;63872:68:0;;;33466:21:1;33523:2;33503:18;;;33496:30;33562:31;33542:18;;;33535:59;33611:18;;63872:68:0;33282:353:1;63872:68:0;63984:51;63993:5;64000:7;64028:6;64009:16;:25;63984:8;:51::i;51287:168::-;51400:12;;;51360;51400;;;;;;;;;-1:-1:-1;;;;;51378:7:0;;;51393:5;;51378:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51359:54;;;51432:7;51424:23;;;;-1:-1:-1;;;51424:23:0;;33842:2:1;51424:23:0;;;33824:21:1;33881:1;33861:18;;;33854:29;-1:-1:-1;;;33899:18:1;;;33892:33;33942:18;;51424:23:0;33640:326:1;50101:316:0;50266:59;;;-1:-1:-1;;;;;32865:32:1;;;50266:59:0;;;32847:51:1;32914:18;;;;32907:34;;;50266:59:0;;;;;;;;;;32820:18:1;;;;50266:59:0;;;;;;;-1:-1:-1;;;;;50266:59:0;-1:-1:-1;;;50266:59:0;;;50255:71;;-1:-1:-1;;;;50255:10:0;;;;:71;;50266:59;50255:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50219:107;;;;50345:7;:57;;;;-1:-1:-1;50357:11:0;;:16;;:44;;;50388:4;50377:24;;;;;;;;;;;;:::i;:::-;50337:72;;;;-1:-1:-1;;;50337:72:0;;34173:2:1;50337:72:0;;;34155:21:1;34212:1;34192:18;;;34185:29;-1:-1:-1;;;34230:18:1;;;34223:32;34272:18;;50337:72:0;33971:325:1;38785:492:0;38874:22;38882:4;38888:7;38874;:22::i;:::-;38869:401;;39062:28;39082:7;39062:19;:28::i;:::-;39163:38;39191:4;39198:2;39163:19;:38::i;:::-;38967:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;38967:257:0;;;;;;;;;;-1:-1:-1;;;38913:345:0;;;;;;;:::i;30974:151::-;31032:13;31065:52;-1:-1:-1;;;;;31077:22:0;;29129:2;30370:447;30445:13;30471:19;30503:10;30507:6;30503:1;:10;:::i;:::-;:14;;30516:1;30503:14;:::i;:::-;-1:-1:-1;;;;;30493:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30493:25:0;;30471:47;;-1:-1:-1;;;30529:6:0;30536:1;30529:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;30529:15:0;;;;;;;;;-1:-1:-1;;;30555:6:0;30562:1;30555:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;30555:15:0;;;;;;;;-1:-1:-1;30586:9:0;30598:10;30602:6;30598:1;:10;:::i;:::-;:14;;30611:1;30598:14;:::i;:::-;30586:26;;30581:131;30618:1;30614;:5;30581:131;;;-1:-1:-1;;;30662:5:0;30670:3;30662:11;30653:21;;;;;;;:::i;:::-;;;;30641:6;30648:1;30641:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;30641:33:0;;;;;;;;-1:-1:-1;30699:1:0;30689:11;;;;;30621:3;;;:::i;:::-;;;30581:131;;;-1:-1:-1;30730:10:0;;30722:55;;;;-1:-1:-1;;;30722:55:0;;35461:2:1;30722:55:0;;;35443:21:1;;;35480:18;;;35473:30;35539:34;35519:18;;;35512:62;35591:18;;30722:55:0;35259:356:1;14:286;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:250;582:1;592:113;606:6;603:1;600:13;592:113;;;682:11;;;676:18;663:11;;;656:39;628:2;621:10;592:113;;;-1:-1:-1;;739:1:1;721:16;;714:27;497:250::o;752:271::-;794:3;832:5;826:12;859:6;854:3;847:19;875:76;944:6;937:4;932:3;928:14;921:4;914:5;910:16;875:76;:::i;:::-;1005:2;984:15;-1:-1:-1;;980:29:1;971:39;;;;1012:4;967:50;;752:271;-1:-1:-1;;752:271:1:o;1028:220::-;1177:2;1166:9;1159:21;1140:4;1197:45;1238:2;1227:9;1223:18;1215:6;1197:45;:::i;1253:131::-;-1:-1:-1;;;;;1328:31:1;;1318:42;;1308:70;;1374:1;1371;1364:12;1389:134;1457:20;;1486:31;1457:20;1486:31;:::i;:::-;1389:134;;;:::o;1528:315::-;1596:6;1604;1657:2;1645:9;1636:7;1632:23;1628:32;1625:52;;;1673:1;1670;1663:12;1625:52;1712:9;1699:23;1731:31;1756:5;1731:31;:::i;:::-;1781:5;1833:2;1818:18;;;;1805:32;;-1:-1:-1;;;1528:315:1:o;1848:247::-;1907:6;1960:2;1948:9;1939:7;1935:23;1931:32;1928:52;;;1976:1;1973;1966:12;1928:52;2015:9;2002:23;2034:31;2059:5;2034:31;:::i;2100:156::-;2166:20;;2226:4;2215:16;;2205:27;;2195:55;;2246:1;2243;2236:12;2261:171;2328:20;;-1:-1:-1;;;;;2377:30:1;;2367:41;;2357:69;;2422:1;2419;2412:12;2437:326;2510:6;2518;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:27;2635:9;2618:27;:::i;:::-;2608:37;;2664;2697:2;2686:9;2682:18;2664:37;:::i;:::-;2654:47;;2720:37;2753:2;2742:9;2738:18;2720:37;:::i;:::-;2710:47;;2437:326;;;;;:::o;2768:182::-;2825:6;2878:2;2866:9;2857:7;2853:23;2849:32;2846:52;;;2894:1;2891;2884:12;2846:52;2917:27;2934:9;2917:27;:::i;2955:728::-;3128:2;3117:9;3110:21;3091:4;3166:6;3160:13;3209:4;3204:2;3193:9;3189:18;3182:32;3237:52;3284:3;3273:9;3269:19;3255:12;3237:52;:::i;:::-;3223:66;;3338:2;3330:6;3326:15;3320:22;-1:-1:-1;;;;;3435:2:1;3419:14;3415:23;3410:2;3399:9;3395:18;3388:51;3503:2;3497;3489:6;3485:15;3479:22;3475:31;3470:2;3459:9;3455:18;3448:59;3576:2;3568:6;3564:15;3558:22;3551:30;3544:38;3538:3;3527:9;3523:19;3516:67;3650:2;3643:3;3635:6;3631:16;3625:23;3621:32;3614:4;3603:9;3599:20;3592:62;;;3671:6;3663:14;;;2955:728;;;;:::o;3870:317::-;3936:6;3944;3997:2;3985:9;3976:7;3972:23;3968:32;3965:52;;;4013:1;4010;4003:12;3965:52;4036:27;4053:9;4036:27;:::i;:::-;4026:37;;4113:2;4102:9;4098:18;4085:32;4126:31;4151:5;4126:31;:::i;:::-;4176:5;4166:15;;;3870:317;;;;;:::o;4685:456::-;4762:6;4770;4778;4831:2;4819:9;4810:7;4806:23;4802:32;4799:52;;;4847:1;4844;4837:12;4799:52;4886:9;4873:23;4905:31;4930:5;4905:31;:::i;:::-;4955:5;-1:-1:-1;5012:2:1;4997:18;;4984:32;5025:33;4984:32;5025:33;:::i;:::-;4685:456;;5077:7;;-1:-1:-1;;;5131:2:1;5116:18;;;;5103:32;;4685:456::o;5146:180::-;5205:6;5258:2;5246:9;5237:7;5233:23;5229:32;5226:52;;;5274:1;5271;5264:12;5226:52;-1:-1:-1;5297:23:1;;5146:180;-1:-1:-1;5146:180:1:o;5513:315::-;5581:6;5589;5642:2;5630:9;5621:7;5617:23;5613:32;5610:52;;;5658:1;5655;5648:12;5610:52;5694:9;5681:23;5671:33;;5754:2;5743:9;5739:18;5726:32;5767:31;5792:5;5767:31;:::i;6397:127::-;6458:10;6453:3;6449:20;6446:1;6439:31;6489:4;6486:1;6479:15;6513:4;6510:1;6503:15;6529:1336;6638:6;6646;6654;6662;6715:3;6703:9;6694:7;6690:23;6686:33;6683:53;;;6732:1;6729;6722:12;6683:53;6772:9;6759:23;-1:-1:-1;;;;;6842:2:1;6834:6;6831:14;6828:34;;;6858:1;6855;6848:12;6828:34;6896:6;6885:9;6881:22;6871:32;;6941:7;6934:4;6930:2;6926:13;6922:27;6912:55;;6963:1;6960;6953:12;6912:55;6999:2;6986:16;7021:4;7044:2;7040;7037:10;7034:36;;;7050:18;;:::i;:::-;7096:2;7093:1;7089:10;7128:2;7122:9;7191:2;7187:7;7182:2;7178;7174:11;7170:25;7162:6;7158:38;7246:6;7234:10;7231:22;7226:2;7214:10;7211:18;7208:46;7205:72;;;7257:18;;:::i;:::-;7293:2;7286:22;7343:18;;;7377:15;;;;-1:-1:-1;7419:11:1;;;7415:20;;;7447:19;;;7444:39;;;7479:1;7476;7469:12;7444:39;7503:11;;;;7523:148;7539:6;7534:3;7531:15;7523:148;;;7605:23;7624:3;7605:23;:::i;:::-;7593:36;;7556:12;;;;7649;;;;7523:148;;;7690:6;-1:-1:-1;;7728:18:1;;7715:32;;-1:-1:-1;7766:37:1;;-1:-1:-1;;7799:2:1;7784:18;;;-1:-1:-1;7766:37:1;:::i;:::-;7756:47;;7822:37;7855:2;7844:9;7840:18;7822:37;:::i;:::-;7812:47;;6529:1336;;;;;;;:::o;8468:932::-;8574:6;8582;8590;8598;8606;8614;8667:3;8655:9;8646:7;8642:23;8638:33;8635:53;;;8684:1;8681;8674:12;8635:53;8720:9;8707:23;8697:33;;8777:2;8766:9;8762:18;8749:32;8739:42;;8831:2;8820:9;8816:18;8803:32;8844:31;8869:5;8844:31;:::i;:::-;8894:5;-1:-1:-1;8950:2:1;8935:18;;8922:32;-1:-1:-1;;;;;9003:14:1;;;9000:34;;;9030:1;9027;9020:12;9000:34;9068:6;9057:9;9053:22;9043:32;;9113:7;9106:4;9102:2;9098:13;9094:27;9084:55;;9135:1;9132;9125:12;9084:55;9175:2;9162:16;9201:2;9193:6;9190:14;9187:34;;;9217:1;9214;9207:12;9187:34;9262:7;9257:2;9248:6;9244:2;9240:15;9236:24;9233:37;9230:57;;;9283:1;9280;9273:12;9230:57;9314:2;9310;9306:11;9296:21;;9336:6;9326:16;;;;;9389:3;9378:9;9374:19;9361:33;9351:43;;8468:932;;;;;;;;:::o;9857:254::-;9922:6;9930;9983:2;9971:9;9962:7;9958:23;9954:32;9951:52;;;9999:1;9996;9989:12;9951:52;10022:27;10039:9;10022:27;:::i;:::-;10012:37;;10068;10101:2;10090:9;10086:18;10068:37;:::i;:::-;10058:47;;9857:254;;;;;:::o;10116:575::-;10365:3;10354:9;10347:22;10328:4;10386:46;10427:3;10416:9;10412:19;10404:6;10386:46;:::i;:::-;-1:-1:-1;;;;;10505:15:1;;;10500:2;10485:18;;10478:43;10557:15;;;10552:2;10537:18;;10530:43;-1:-1:-1;10616:14:1;;10609:22;10604:2;10589:18;;10582:50;10669:15;;;10663:3;10648:19;;;10641:44;;;;10378:54;10116:575;-1:-1:-1;10116:575:1:o;10696:456::-;10773:6;10781;10789;10842:2;10830:9;10821:7;10817:23;10813:32;10810:52;;;10858:1;10855;10848:12;10810:52;10897:9;10884:23;10916:31;10941:5;10916:31;:::i;:::-;10966:5;-1:-1:-1;11018:2:1;11003:18;;10990:32;;-1:-1:-1;11074:2:1;11059:18;;11046:32;11087:33;11046:32;11087:33;:::i;:::-;11139:7;11129:17;;;10696:456;;;;;:::o;11384:252::-;11448:6;11456;11509:2;11497:9;11488:7;11484:23;11480:32;11477:52;;;11525:1;11522;11515:12;11477:52;11548:27;11565:9;11548:27;:::i;:::-;11538:37;;11594:36;11626:2;11615:9;11611:18;11594:36;:::i;11641:388::-;11709:6;11717;11770:2;11758:9;11749:7;11745:23;11741:32;11738:52;;;11786:1;11783;11776:12;11738:52;11825:9;11812:23;11844:31;11869:5;11844:31;:::i;12034:811::-;12144:6;12152;12160;12168;12176;12184;12192;12245:3;12233:9;12224:7;12220:23;12216:33;12213:53;;;12262:1;12259;12252:12;12213:53;12285:27;12302:9;12285:27;:::i;:::-;12275:37;;12359:2;12348:9;12344:18;12331:32;12321:42;;12410:2;12399:9;12395:18;12382:32;12372:42;;12464:2;12453:9;12449:18;12436:32;12477:31;12502:5;12477:31;:::i;:::-;12527:5;-1:-1:-1;12584:3:1;12569:19;;12556:33;12598;12556;12598;:::i;:::-;12650:7;-1:-1:-1;12676:38:1;12709:3;12694:19;;12676:38;:::i;:::-;12666:48;;12766:3;12755:9;12751:19;12738:33;12780;12805:7;12780:33;:::i;:::-;12832:7;12822:17;;;12034:811;;;;;;;;;;:::o;12850:380::-;12929:1;12925:12;;;;12972;;;12993:61;;13047:4;13039:6;13035:17;13025:27;;12993:61;13100:2;13092:6;13089:14;13069:18;13066:38;13063:161;;13146:10;13141:3;13137:20;13134:1;13127:31;13181:4;13178:1;13171:15;13209:4;13206:1;13199:15;13063:161;;12850:380;;;:::o;13589:127::-;13650:10;13645:3;13641:20;13638:1;13631:31;13681:4;13678:1;13671:15;13705:4;13702:1;13695:15;13721:209;13759:3;-1:-1:-1;;;;;13840:2:1;13833:5;13829:14;13867:2;13858:7;13855:15;13852:41;;13873:18;;:::i;:::-;13922:1;13909:15;;13721:209;-1:-1:-1;;;13721:209:1:o;18069:127::-;18130:10;18125:3;18121:20;18118:1;18111:31;18161:4;18158:1;18151:15;18185:4;18182:1;18175:15;18201:135;18240:3;18261:17;;;18258:43;;18281:18;;:::i;:::-;-1:-1:-1;18328:1:1;18317:13;;18201:135::o;18341:125::-;18406:9;;;18427:10;;;18424:36;;;18440:18;;:::i;20574:651::-;20769:2;20758:9;20751:21;20732:4;20807:6;20801:13;20850:4;20845:2;20834:9;20830:18;20823:32;20878:52;20925:3;20914:9;20910:19;20896:12;20878:52;:::i;:::-;20864:66;;21011:1;21007;21002:3;20998:11;20994:19;20988:2;20980:6;20976:15;20970:22;20966:48;20961:2;20950:9;20946:18;20939:76;21069:2;21061:6;21057:15;21051:22;21046:2;21035:9;21031:18;21024:50;21129:2;21121:6;21117:15;21111:22;21105:3;21094:9;21090:19;21083:51;21190:3;21182:6;21178:16;21172:23;21165:4;21154:9;21150:20;21143:53;21213:6;21205:14;;;20574:651;;;;:::o;21230:184::-;21300:6;21353:2;21341:9;21332:7;21328:23;21324:32;21321:52;;;21369:1;21366;21359:12;21321:52;-1:-1:-1;21392:16:1;;21230:184;-1:-1:-1;21230:184:1:o;21419:654::-;21516:6;21524;21532;21540;21593:3;21581:9;21572:7;21568:23;21564:33;21561:53;;;21610:1;21607;21600:12;21561:53;21642:9;21636:16;21661:31;21686:5;21661:31;:::i;:::-;21761:2;21746:18;;21740:25;21711:5;;-1:-1:-1;21774:33:1;21740:25;21774:33;:::i;:::-;21878:2;21863:18;;21857:25;21826:7;;-1:-1:-1;21891:33:1;21857:25;21891:33;:::i;:::-;21995:2;21980:18;;21974:25;21943:7;;-1:-1:-1;22008:33:1;21974:25;22008:33;:::i;:::-;21419:654;;;;-1:-1:-1;21419:654:1;;-1:-1:-1;;21419:654:1:o;25022:180::-;-1:-1:-1;;;;;25127:10:1;;;25139;;;25123:27;;25162:11;;;25159:37;;;25176:18;;:::i;:::-;25159:37;25022:180;;;;:::o;29695:217::-;29735:1;29761;29751:132;;29805:10;29800:3;29796:20;29793:1;29786:31;29840:4;29837:1;29830:15;29868:4;29865:1;29858:15;29751:132;-1:-1:-1;29897:9:1;;29695:217::o;30297:287::-;30426:3;30464:6;30458:13;30480:66;30539:6;30534:3;30527:4;30519:6;30515:17;30480:66;:::i;:::-;30562:16;;;;;30297:287;-1:-1:-1;;30297:287:1:o;30589:277::-;30656:6;30709:2;30697:9;30688:7;30684:23;30680:32;30677:52;;;30725:1;30722;30715:12;30677:52;30757:9;30751:16;30810:5;30803:13;30796:21;30789:5;30786:32;30776:60;;30832:1;30829;30822:12;31562:168;31635:9;;;31666;;31683:15;;;31677:22;;31663:37;31653:71;;31704:18;;:::i;31735:128::-;31802:9;;;31823:11;;;31820:37;;;31837:18;;:::i;34301:812::-;34712:25;34707:3;34700:38;34682:3;34767:6;34761:13;34783:75;34851:6;34846:2;34841:3;34837:12;34830:4;34822:6;34818:17;34783:75;:::i;:::-;-1:-1:-1;;;34917:2:1;34877:16;;;34909:11;;;34902:40;34967:13;;34989:76;34967:13;35051:2;35043:11;;35036:4;35024:17;;34989:76;:::i;:::-;35085:17;35104:2;35081:26;;34301:812;-1:-1:-1;;;;34301:812:1:o;35118:136::-;35157:3;35185:5;35175:39;;35194:18;;:::i;:::-;-1:-1:-1;;;35230:18:1;;35118:136::o
Swarm Source
ipfs://f6f25c638521e4cb15f49188528f73779d9d3a8848f186f6890c2e3c271dc0b2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.