Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Strategy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-30 */ // SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // Global Enums and Structs struct StrategyParams { uint256 performanceFee; uint256 activation; uint256 debtRatio; uint256 minDebtPerHarvest; uint256 maxDebtPerHarvest; uint256 lastReport; uint256 totalDebt; uint256 totalGain; uint256 totalLoss; } // Part: Booster interface Booster { struct PoolInfo { address lptoken; address token; address gauge; address crvRewards; address stash; bool shutdown; } function poolInfo(uint256) external view returns(address,address,address,address,address, bool); // deposit lp tokens and stake function deposit(uint256 _pid, uint256 _amount, bool _stake) external returns(bool); // deposit all lp tokens and stake function depositAll(uint256 _pid, bool _stake) external returns(bool); // withdraw lp tokens function withdraw(uint256 _pid, uint256 _amount) external returns(bool); // withdraw all lp tokens function withdrawAll(uint256 _pid) external returns(bool); // claim crv + extra rewards function earmarkRewards(uint256 _pid) external returns(bool); // claim rewards on stash (msg.sender == stash) function claimRewards(uint256 _pid, address _gauge) external returns(bool); // delegate address votes on dao (needs to be voteDelegate) function vote(uint256 _voteId, address _votingAddress, bool _support) external returns(bool); function voteGaugeWeight(address[] calldata _gauge, uint256[] calldata _weight ) external returns(bool); } // Part: ICurveFi interface ICurveFi { function add_liquidity( uint256[2] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( uint256[3] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( uint256[4] calldata amounts, uint256 min_mint_amount, bool _use_underlying ) external payable returns (uint256); function add_liquidity( uint256[2] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( uint256[3] calldata amounts, uint256 min_mint_amount ) external payable; function add_liquidity( uint256[4] calldata amounts, uint256 min_mint_amount ) external payable; // crv.finance: Curve.fi Factory USD Metapool v2 function add_liquidity( address pool, uint256[4] calldata amounts, uint256 min_mint_amount ) external; function exchange( int128 i, int128 j, uint256 dx, uint256 min_dy ) external; function exchange_underlying( int128 i, int128 j, uint256 dx, uint256 min_dy ) external; function get_dy( int128 i, int128 j, uint256 dx ) external view returns (uint256); function balances(int128) external view returns (uint256); function get_virtual_price() external view returns (uint256); } // Part: IERC20Metadata interface IERC20Metadata { /** * @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); } // Part: Math /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @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, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); } // Part: OpenZeppelin/[email protected]/SafeMath /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Part: Rewards interface Rewards{ function pid() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function earned(address account) external view returns (uint256); function extraRewardsLength() external view returns (uint256); function extraRewards(uint256) external view returns (address); function rewardPerToken() external view returns (uint256); function rewardPerTokenStored() external view returns (uint256); function rewardRate() external view returns (uint256); function rewardToken() external view returns (address); function rewards(address) external view returns (uint256); function userRewardPerTokenPaid(address) external view returns (uint256); function stakingToken() external view returns (address); function stake(uint256) external returns (bool); function stakeAll() external returns (bool); function stakeFor(address, uint256) external returns (bool); function withdraw(uint256 amount, bool claim) external returns (bool); function withdrawAll(bool claim) external returns (bool); function withdrawAndUnwrap(uint256 amount, bool claim) external returns(bool); function withdrawAllAndUnwrap(bool claim) external; function getReward() external returns(bool); function getReward(address _account, bool _claimExtras) external returns(bool); function donate(uint256 _amount) external returns(bool); } // Part: Uni interface Uni { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); /* Uniswap V3 */ struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } function exactInput( ExactInputParams calldata params ) external payable returns (uint256 amountOut); function quoteExactInput( bytes calldata path, uint256 amountIn ) external view returns (uint256 amountOut); } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Part: iearn-finance/[email protected]/VaultAPI interface VaultAPI is IERC20 { function name() external view returns (string calldata); function symbol() external view returns (string calldata); function decimals() external view returns (uint256); function apiVersion() external pure returns (string memory); function permit( address owner, address spender, uint256 amount, uint256 expiry, bytes calldata signature ) external returns (bool); // NOTE: Vyper produces multiple signatures for a given function with "default" args function deposit() external returns (uint256); function deposit(uint256 amount) external returns (uint256); function deposit(uint256 amount, address recipient) external returns (uint256); // NOTE: Vyper produces multiple signatures for a given function with "default" args function withdraw() external returns (uint256); function withdraw(uint256 maxShares) external returns (uint256); function withdraw(uint256 maxShares, address recipient) external returns (uint256); function token() external view returns (address); function strategies(address _strategy) external view returns (StrategyParams memory); function pricePerShare() external view returns (uint256); function totalAssets() external view returns (uint256); function depositLimit() external view returns (uint256); function maxAvailableShares() external view returns (uint256); /** * View how much the Vault would increase this Strategy's borrow limit, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function creditAvailable() external view returns (uint256); /** * View how much the Vault would like to pull back from the Strategy, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function debtOutstanding() external view returns (uint256); /** * View how much the Vault expect this Strategy to return at the current * block, based on its present performance (since its last report). Can be * used to determine expectedReturn in your Strategy. */ function expectedReturn() external view returns (uint256); /** * This is the main contact point where the Strategy interacts with the * Vault. It is critical that this call is handled as intended by the * Strategy. Therefore, this function will be called by BaseStrategy to * make sure the integration is correct. */ function report( uint256 _gain, uint256 _loss, uint256 _debtPayment ) external returns (uint256); /** * This function should only be used in the scenario where the Strategy is * being retired but no migration of the positions are possible, or in the * extreme scenario that the Strategy needs to be put into "Emergency Exit" * mode in order for it to exit as quickly as possible. The latter scenario * could be for any reason that is considered "critical" that the Strategy * exits its position as fast as possible, such as a sudden change in * market conditions leading to losses, or an imminent failure in an * external dependency. */ function revokeStrategy() external; /** * View the governance address of the Vault to assert privileged functions * can only be called by governance. The Strategy serves the Vault, so it * is subject to governance defined by the Vault. */ function governance() external view returns (address); /** * View the management address of the Vault to assert privileged functions * can only be called by management. The Strategy serves the Vault, so it * is subject to management defined by the Vault. */ function management() external view returns (address); /** * View the guardian address of the Vault to assert privileged functions * can only be called by guardian. The Strategy serves the Vault, so it * is subject to guardian defined by the Vault. */ function guardian() external view returns (address); } // Part: iearn-finance/[email protected]/BaseStrategy /** * @title Yearn Base Strategy * @author yearn.finance * @notice * BaseStrategy implements all of the required functionality to interoperate * closely with the Vault contract. This contract should be inherited and the * abstract methods implemented to adapt the Strategy to the particular needs * it has to create a return. * * Of special interest is the relationship between `harvest()` and * `vault.report()'. `harvest()` may be called simply because enough time has * elapsed since the last report, and not because any funds need to be moved * or positions adjusted. This is critical so that the Vault may maintain an * accurate picture of the Strategy's performance. See `vault.report()`, * `harvest()`, and `harvestTrigger()` for further details. */ abstract contract BaseStrategy { using SafeMath for uint256; using SafeERC20 for IERC20; string public metadataURI; /** * @notice * Used to track which version of `StrategyAPI` this Strategy * implements. * @dev The Strategy's version must match the Vault's `API_VERSION`. * @return A string which holds the current API version of this contract. */ function apiVersion() public pure returns (string memory) { return "0.3.5"; } /** * @notice This Strategy's name. * @dev * You can use this field to manage the "version" of this Strategy, e.g. * `StrategySomethingOrOtherV1`. However, "API Version" is managed by * `apiVersion()` function above. * @return This Strategy's name. */ function name() external virtual view returns (string memory); /** * @notice * The amount (priced in want) of the total assets managed by this strategy should not count * towards Yearn's TVL calculations. * @dev * You can override this field to set it to a non-zero value if some of the assets of this * Strategy is somehow delegated inside another part of of Yearn's ecosystem e.g. another Vault. * Note that this value must be strictly less than or equal to the amount provided by * `estimatedTotalAssets()` below, as the TVL calc will be total assets minus delegated assets. * Also note that this value is used to determine the total assets under management by this * strategy, for the purposes of computing the management fee in `Vault` * @return * The amount of assets this strategy manages that should not be included in Yearn's Total Value * Locked (TVL) calculation across it's ecosystem. */ function delegatedAssets() external virtual view returns (uint256) { return 0; } VaultAPI public vault; address public strategist; address public rewards; address public keeper; IERC20 public want; // So indexers can keep track of this event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding); event UpdatedStrategist(address newStrategist); event UpdatedKeeper(address newKeeper); event UpdatedRewards(address rewards); event UpdatedMinReportDelay(uint256 delay); event UpdatedMaxReportDelay(uint256 delay); event UpdatedProfitFactor(uint256 profitFactor); event UpdatedDebtThreshold(uint256 debtThreshold); event EmergencyExitEnabled(); event UpdatedMetadataURI(string metadataURI); // The minimum number of seconds between harvest calls. See // `setMinReportDelay()` for more details. uint256 public minReportDelay; // The maximum number of seconds between harvest calls. See // `setMaxReportDelay()` for more details. uint256 public maxReportDelay; // The minimum multiple that `callCost` must be above the credit/profit to // be "justifiable". See `setProfitFactor()` for more details. uint256 public profitFactor; // Use this to adjust the threshold at which running a debt causes a // harvest trigger. See `setDebtThreshold()` for more details. uint256 public debtThreshold; // See note on `setEmergencyExit()`. bool public emergencyExit; // modifiers modifier onlyAuthorized() { require(msg.sender == strategist || msg.sender == governance(), "!authorized"); _; } modifier onlyStrategist() { require(msg.sender == strategist, "!strategist"); _; } modifier onlyGovernance() { require(msg.sender == governance(), "!authorized"); _; } modifier onlyKeepers() { require( msg.sender == keeper || msg.sender == strategist || msg.sender == governance() || msg.sender == vault.guardian() || msg.sender == vault.management(), "!authorized" ); _; } constructor(address _vault) public { _initialize(_vault, msg.sender, msg.sender, msg.sender); } /** * @notice * Initializes the Strategy, this is called only once, when the * contract is deployed. * @dev `_vault` should implement `VaultAPI`. * @param _vault The address of the Vault responsible for this Strategy. */ function _initialize( address _vault, address _strategist, address _rewards, address _keeper ) internal { require(address(want) == address(0), "Strategy already initialized"); vault = VaultAPI(_vault); want = IERC20(vault.token()); want.safeApprove(_vault, uint256(-1)); // Give Vault unlimited access (might save gas) strategist = _strategist; rewards = _rewards; keeper = _keeper; // initialize variables minReportDelay = 0; maxReportDelay = 86400; profitFactor = 100; debtThreshold = 0; vault.approve(rewards, uint256(-1)); // Allow rewards to be pulled } /** * @notice * Used to change `strategist`. * * This may only be called by governance or the existing strategist. * @param _strategist The new address to assign as `strategist`. */ function setStrategist(address _strategist) external onlyAuthorized { require(_strategist != address(0)); strategist = _strategist; emit UpdatedStrategist(_strategist); } /** * @notice * Used to change `keeper`. * * `keeper` is the only address that may call `tend()` or `harvest()`, * other than `governance()` or `strategist`. However, unlike * `governance()` or `strategist`, `keeper` may *only* call `tend()` * and `harvest()`, and no other authorized functions, following the * principle of least privilege. * * This may only be called by governance or the strategist. * @param _keeper The new address to assign as `keeper`. */ function setKeeper(address _keeper) external onlyAuthorized { require(_keeper != address(0)); keeper = _keeper; emit UpdatedKeeper(_keeper); } /** * @notice * Used to change `rewards`. EOA or smart contract which has the permission * to pull rewards from the vault. * * This may only be called by the strategist. * @param _rewards The address to use for pulling rewards. */ function setRewards(address _rewards) external onlyStrategist { require(_rewards != address(0)); vault.approve(rewards, 0); rewards = _rewards; vault.approve(rewards, uint256(-1)); emit UpdatedRewards(_rewards); } /** * @notice * Used to change `minReportDelay`. `minReportDelay` is the minimum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the minimum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The minimum number of seconds to wait between harvests. */ function setMinReportDelay(uint256 _delay) external onlyAuthorized { minReportDelay = _delay; emit UpdatedMinReportDelay(_delay); } /** * @notice * Used to change `maxReportDelay`. `maxReportDelay` is the maximum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the maximum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The maximum number of seconds to wait between harvests. */ function setMaxReportDelay(uint256 _delay) external onlyAuthorized { maxReportDelay = _delay; emit UpdatedMaxReportDelay(_delay); } /** * @notice * Used to change `profitFactor`. `profitFactor` is used to determine * if it's worthwhile to harvest, given gas costs. (See `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _profitFactor A ratio to multiply anticipated * `harvest()` gas cost against. */ function setProfitFactor(uint256 _profitFactor) external onlyAuthorized { profitFactor = _profitFactor; emit UpdatedProfitFactor(_profitFactor); } /** * @notice * Sets how far the Strategy can go into loss without a harvest and report * being required. * * By default this is 0, meaning any losses would cause a harvest which * will subsequently report the loss to the Vault for tracking. (See * `harvestTrigger()` for more details.) * * This may only be called by governance or the strategist. * @param _debtThreshold How big of a loss this Strategy may carry without * being required to report to the Vault. */ function setDebtThreshold(uint256 _debtThreshold) external onlyAuthorized { debtThreshold = _debtThreshold; emit UpdatedDebtThreshold(_debtThreshold); } /** * @notice * Used to change `metadataURI`. `metadataURI` is used to store the URI * of the file describing the strategy. * * This may only be called by governance or the strategist. * @param _metadataURI The URI that describe the strategy. */ function setMetadataURI(string calldata _metadataURI) external onlyAuthorized { metadataURI = _metadataURI; emit UpdatedMetadataURI(_metadataURI); } /** * Resolve governance address from Vault contract, used to make assertions * on protected functions in the Strategy. */ function governance() internal view returns (address) { return vault.governance(); } /** * @notice * Provide an accurate estimate for the total amount of assets * (principle + return) that this Strategy is currently managing, * denominated in terms of `want` tokens. * * This total should be "realizable" e.g. the total value that could * *actually* be obtained from this Strategy if it were to divest its * entire position based on current on-chain conditions. * @dev * Care must be taken in using this function, since it relies on external * systems, which could be manipulated by the attacker to give an inflated * (or reduced) value produced by this function, based on current on-chain * conditions (e.g. this function is possible to influence through * flashloan attacks, oracle manipulations, or other DeFi attack * mechanisms). * * It is up to governance to use this function to correctly order this * Strategy relative to its peers in the withdrawal queue to minimize * losses for the Vault based on sudden withdrawals. This value should be * higher than the total debt of the Strategy and higher than its expected * value to be "safe". * @return The estimated total assets in this Strategy. */ function estimatedTotalAssets() public virtual view returns (uint256); /* * @notice * Provide an indication of whether this strategy is currently "active" * in that it is managing an active position, or will manage a position in * the future. This should correlate to `harvest()` activity, so that Harvest * events can be tracked externally by indexing agents. * @return True if the strategy is actively managing a position. */ function isActive() public view returns (bool) { return vault.strategies(address(this)).debtRatio > 0 || estimatedTotalAssets() > 0; } /** * Perform any Strategy unwinding or other calls necessary to capture the * "free return" this Strategy has generated since the last time its core * position(s) were adjusted. Examples include unwrapping extra rewards. * This call is only used during "normal operation" of a Strategy, and * should be optimized to minimize losses as much as possible. * * This method returns any realized profits and/or realized losses * incurred, and should return the total amounts of profits/losses/debt * payments (in `want` tokens) for the Vault's accounting (e.g. * `want.balanceOf(this) >= _debtPayment + _profit - _loss`). * * `_debtOutstanding` will be 0 if the Strategy is not past the configured * debt limit, otherwise its value will be how far past the debt limit * the Strategy is. The Strategy's debt limit is configured in the Vault. * * NOTE: `_debtPayment` should be less than or equal to `_debtOutstanding`. * It is okay for it to be less than `_debtOutstanding`, as that * should only used as a guide for how much is left to pay back. * Payments should be made to minimize loss from slippage, debt, * withdrawal fees, etc. * * See `vault.debtOutstanding()`. */ function prepareReturn(uint256 _debtOutstanding) internal virtual returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ); /** * Perform any adjustments to the core position(s) of this Strategy given * what change the Vault made in the "investable capital" available to the * Strategy. Note that all "free capital" in the Strategy after the report * was made is available for reinvestment. Also note that this number * could be 0, and you should handle that scenario accordingly. * * See comments regarding `_debtOutstanding` on `prepareReturn()`. */ function adjustPosition(uint256 _debtOutstanding) internal virtual; /** * Liquidate up to `_amountNeeded` of `want` of this strategy's positions, * irregardless of slippage. Any excess will be re-invested with `adjustPosition()`. * This function should return the amount of `want` tokens made available by the * liquidation. If there is a difference between them, `_loss` indicates whether the * difference is due to a realized loss, or if there is some other sitution at play * (e.g. locked funds) where the amount made available is less than what is needed. * This function is used during emergency exit instead of `prepareReturn()` to * liquidate all of the Strategy's positions back to the Vault. * * NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained */ function liquidatePosition(uint256 _amountNeeded) internal virtual returns (uint256 _liquidatedAmount, uint256 _loss); /** * @notice * Provide a signal to the keeper that `tend()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `tend()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `tend()` is not called * shortly, then this can return `true` even if the keeper might be * "at a loss" (keepers are always reimbursed by Yearn). * @dev * `callCost` must be priced in terms of `want`. * * This call and `harvestTrigger()` should never return `true` at the same * time. * @param callCost The keeper's estimated cast cost to call `tend()`. * @return `true` if `tend()` should be called, `false` otherwise. */ function tendTrigger(uint256 callCost) public virtual view returns (bool) { // We usually don't need tend, but if there are positions that need // active maintainence, overriding this function is how you would // signal for that. return false; } /** * @notice * Adjust the Strategy's position. The purpose of tending isn't to * realize gains, but to maximize yield by reinvesting any returns. * * See comments on `adjustPosition()`. * * This may only be called by governance, the strategist, or the keeper. */ function tend() external onlyKeepers { // Don't take profits with this call, but adjust for better gains adjustPosition(vault.debtOutstanding()); } /** * @notice * Provide a signal to the keeper that `harvest()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `harvest()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `harvest()` is not called * shortly, then this can return `true` even if the keeper might be "at a * loss" (keepers are always reimbursed by Yearn). * @dev * `callCost` must be priced in terms of `want`. * * This call and `tendTrigger` should never return `true` at the * same time. * * See `min/maxReportDelay`, `profitFactor`, `debtThreshold` to adjust the * strategist-controlled parameters that will influence whether this call * returns `true` or not. These parameters will be used in conjunction * with the parameters reported to the Vault (see `params`) to determine * if calling `harvest()` is merited. * * It is expected that an external system will check `harvestTrigger()`. * This could be a script run off a desktop or cloud bot (e.g. * https://github.com/iearn-finance/yearn-vaults/blob/master/scripts/keep.py), * or via an integration with the Keep3r network (e.g. * https://github.com/Macarse/GenericKeep3rV2/blob/master/contracts/keep3r/GenericKeep3rV2.sol). * @param callCost The keeper's estimated cast cost to call `harvest()`. * @return `true` if `harvest()` should be called, `false` otherwise. */ function harvestTrigger(uint256 callCost) public virtual view returns (bool) { StrategyParams memory params = vault.strategies(address(this)); // Should not trigger if Strategy is not activated if (params.activation == 0) return false; // Should not trigger if we haven't waited long enough since previous harvest if (block.timestamp.sub(params.lastReport) < minReportDelay) return false; // Should trigger if hasn't been called in a while if (block.timestamp.sub(params.lastReport) >= maxReportDelay) return true; // If some amount is owed, pay it back // NOTE: Since debt is based on deposits, it makes sense to guard against large // changes to the value from triggering a harvest directly through user // behavior. This should ensure reasonable resistance to manipulation // from user-initiated withdrawals as the outstanding debt fluctuates. uint256 outstanding = vault.debtOutstanding(); if (outstanding > debtThreshold) return true; // Check for profits and losses uint256 total = estimatedTotalAssets(); // Trigger if we have a loss to report if (total.add(debtThreshold) < params.totalDebt) return true; uint256 profit = 0; if (total > params.totalDebt) profit = total.sub(params.totalDebt); // We've earned a profit! // Otherwise, only trigger if it "makes sense" economically (gas cost // is <N% of value moved) uint256 credit = vault.creditAvailable(); return (profitFactor.mul(callCost) < credit.add(profit)); } /** * @notice * Harvests the Strategy, recognizing any profits or losses and adjusting * the Strategy's position. * * In the rare case the Strategy is in emergency shutdown, this will exit * the Strategy's position. * * This may only be called by governance, the strategist, or the keeper. * @dev * When `harvest()` is called, the Strategy reports to the Vault (via * `vault.report()`), so in some cases `harvest()` must be called in order * to take in profits, to borrow newly available funds from the Vault, or * otherwise adjust its position. In other cases `harvest()` must be * called to report to the Vault on the Strategy's position, especially if * any losses have occurred. */ function harvest() external onlyKeepers { uint256 profit = 0; uint256 loss = 0; uint256 debtOutstanding = vault.debtOutstanding(); uint256 debtPayment = 0; if (emergencyExit) { // Free up as much capital as possible uint256 totalAssets = estimatedTotalAssets(); // NOTE: use the larger of total assets or debt outstanding to book losses properly (debtPayment, loss) = liquidatePosition(totalAssets > debtOutstanding ? totalAssets : debtOutstanding); // NOTE: take up any remainder here as profit if (debtPayment > debtOutstanding) { profit = debtPayment.sub(debtOutstanding); debtPayment = debtOutstanding; } } else { // Free up returns for Vault to pull (profit, loss, debtPayment) = prepareReturn(debtOutstanding); } // Allow Vault to take up to the "harvested" balance of this contract, // which is the amount it has earned since the last time it reported to // the Vault. debtOutstanding = vault.report(profit, loss, debtPayment); // Check if free returns are left, and re-invest them adjustPosition(debtOutstanding); emit Harvested(profit, loss, debtPayment, debtOutstanding); } /** * @notice * Withdraws `_amountNeeded` to `vault`. * * This may only be called by the Vault. * @param _amountNeeded How much `want` to withdraw. * @return _loss Any realized losses */ function withdraw(uint256 _amountNeeded) external returns (uint256 _loss) { require(msg.sender == address(vault), "!vault"); // Liquidate as much as possible to `want`, up to `_amountNeeded` uint256 amountFreed; (amountFreed, _loss) = liquidatePosition(_amountNeeded); // Send it directly back (NOTE: Using `msg.sender` saves some gas here) want.safeTransfer(msg.sender, amountFreed); // NOTE: Reinvest anything leftover on next `tend`/`harvest` } /** * Do anything necessary to prepare this Strategy for migration, such as * transferring any reserve or LP tokens, CDPs, or other tokens or stores of * value. */ function prepareMigration(address _newStrategy) internal virtual; /** * @notice * Transfers all `want` from this Strategy to `_newStrategy`. * * This may only be called by governance or the Vault. * @dev * The new Strategy's Vault must be the same as this Strategy's Vault. * @param _newStrategy The Strategy to migrate to. */ function migrate(address _newStrategy) external { require(msg.sender == address(vault) || msg.sender == governance()); require(BaseStrategy(_newStrategy).vault() == vault); prepareMigration(_newStrategy); want.safeTransfer(_newStrategy, want.balanceOf(address(this))); } /** * @notice * Activates emergency exit. Once activated, the Strategy will exit its * position upon the next harvest, depositing all funds into the Vault as * quickly as is reasonable given on-chain conditions. * * This may only be called by governance or the strategist. * @dev * See `vault.setEmergencyShutdown()` and `harvest()` for further details. */ function setEmergencyExit() external onlyAuthorized { emergencyExit = true; vault.revokeStrategy(); emit EmergencyExitEnabled(); } /** * Override this to add all tokens/tokenized positions this contract * manages on a *persistent* basis (e.g. not just for swapping back to * want ephemerally). * * NOTE: Do *not* include `want`, already included in `sweep` below. * * Example: * * function protectedTokens() internal override view returns (address[] memory) { * address[] memory protected = new address[](3); * protected[0] = tokenA; * protected[1] = tokenB; * protected[2] = tokenC; * return protected; * } */ function protectedTokens() internal virtual view returns (address[] memory); /** * @notice * Removes tokens from this Strategy that are not the type of tokens * managed by this Strategy. This may be used in case of accidentally * sending the wrong kind of token to this Strategy. * * Tokens will be sent to `governance()`. * * This will fail if an attempt is made to sweep `want`, or any tokens * that are protected by this Strategy. * * This may only be called by governance. * @dev * Implement `protectedTokens()` to specify any additional tokens that * should be protected from sweeping in addition to `want`. * @param _token The token to transfer out of this vault. */ function sweep(address _token) external onlyGovernance { require(_token != address(want), "!want"); require(_token != address(vault), "!shares"); address[] memory _protectedTokens = protectedTokens(); for (uint256 i; i < _protectedTokens.length; i++) require(_token != _protectedTokens[i], "!protected"); IERC20(_token).safeTransfer(governance(), IERC20(_token).balanceOf(address(this))); } } // Part: ConvexStable abstract contract ConvexStable is BaseStrategy { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; address public constant voter = address(0xF147b8125d2ef93FB6965Db97D6746952a133934); address public constant booster = address(0xF403C135812408BFbE8713b5A23a04b3D48AAE31); address public constant cvx = address(0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B); address public constant crv = address(0xD533a949740bb3306d119CC777fa900bA034cd52); address public constant weth = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); address public constant dai = address(0x6B175474E89094C44Da98b954EedeAC495271d0F); address public constant usdc = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); address public constant usdt = address(0xdAC17F958D2ee523a2206206994597C13D831ec7); address public constant quoter = address(0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6); address public constant uniswapv3 = address(0xE592427A0AEce92De3Edee1F18E0157C05861564); address public constant uniswap = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address public constant sushiswap = address(0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); uint256 public constant DENOMINATOR = 10000; bool public isClaimRewards; bool public isClaimExtras; uint256 public id; address public rewardContract; address public curve; address[] public dex; uint256 public keepCRV; constructor(address _vault) public BaseStrategy(_vault) { minReportDelay = 12 hours; maxReportDelay = 3 days; profitFactor = 1000; debtThreshold = 1e24; keepCRV = 1000; } function _approveBasic() internal { want.approve(booster, 0); want.approve(booster, type(uint256).max); IERC20(dai).safeApprove(curve, 0); IERC20(dai).safeApprove(curve, type(uint256).max); IERC20(usdc).safeApprove(curve, 0); IERC20(usdc).safeApprove(curve, type(uint256).max); IERC20(usdt).safeApprove(curve, 0); IERC20(usdt).safeApprove(curve, type(uint256).max); } function _approveDex() internal virtual { IERC20(crv).approve(dex[0], 0); IERC20(crv).approve(dex[0], type(uint256).max); IERC20(cvx).approve(dex[1], 0); IERC20(cvx).approve(dex[1], type(uint256).max); } function approveAll() external onlyAuthorized { _approveBasic(); _approveDex(); } function setKeepCRV(uint256 _keepCRV) external onlyAuthorized { keepCRV = _keepCRV; } function switchDex(uint256 _id, address _dex) external onlyAuthorized { dex[_id] = _dex; _approveDex(); } function setIsClaimRewards(bool _isClaimRewards) external onlyAuthorized { isClaimRewards = _isClaimRewards; } function setIsClaimExtras(bool _isClaimExtras) external onlyAuthorized { isClaimExtras = _isClaimExtras; } function withdrawToConvexDepositTokens() external onlyAuthorized { uint256 staked = Rewards(rewardContract).balanceOf(address(this)); Rewards(rewardContract).withdraw(staked, isClaimRewards); } function name() external view override returns (string memory) { return string(abi.encodePacked("Convex", IERC20Metadata(address(want)).symbol())); } function balanceOfWant() public view returns (uint256) { return want.balanceOf(address(this)); } function balanceOfPool() public view returns (uint256) { return Rewards(rewardContract).balanceOf(address(this)); } function estimatedTotalAssets() public view override returns (uint256) { return balanceOfWant().add(balanceOfPool()); } function adjustPosition(uint256 _debtOutstanding) internal override { if (emergencyExit) return; uint256 _want = want.balanceOf(address(this)); if (_want > 0) { Booster(booster).deposit(id, _want, true); } } function _withdrawSome(uint256 _amount) internal returns (uint256) { _amount = Math.min(_amount, balanceOfPool()); uint _before = balanceOfWant(); Rewards(rewardContract).withdrawAndUnwrap(_amount, false); return balanceOfWant().sub(_before); } function liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _liquidatedAmount, uint256 _loss) { uint256 _balance = balanceOfWant(); if (_balance < _amountNeeded) { _liquidatedAmount = _withdrawSome(_amountNeeded.sub(_balance)); _liquidatedAmount = _liquidatedAmount.add(_balance); _loss = _amountNeeded.sub(_liquidatedAmount); // this should be 0. o/w there must be an error } else { _liquidatedAmount = _amountNeeded; } } function prepareMigration(address _newStrategy) internal override { Rewards(rewardContract).withdrawAllAndUnwrap(isClaimRewards); _migrateRewards(_newStrategy); } function _migrateRewards(address _newStrategy) internal virtual { IERC20(crv).safeTransfer(_newStrategy, IERC20(crv).balanceOf(address(this))); IERC20(cvx).safeTransfer(_newStrategy, IERC20(cvx).balanceOf(address(this))); } function _adjustCRV(uint256 _crv) internal returns (uint256) { uint256 _keepCRV = _crv.mul(keepCRV).div(DENOMINATOR); if (_keepCRV > 0) IERC20(crv).safeTransfer(voter, _keepCRV); return _crv.sub(_keepCRV); } function _claimableBasicInETH() internal view returns (uint256) { uint256 _crv = Rewards(rewardContract).earned(address(this)); // calculations pulled directly from CVX's contract for minting CVX per CRV claimed uint256 totalCliffs = 1000; uint256 maxSupply = 1e8 * 1e18; // 100m uint256 reductionPerCliff = 1e5 * 1e18; // 100k uint256 supply = IERC20(cvx).totalSupply(); uint256 _cvx; uint256 cliff = supply.div(reductionPerCliff); // mint if below total cliffs if (cliff < totalCliffs) { // for reduction% take inverse of current cliff uint256 reduction = totalCliffs.sub(cliff); // reduce _cvx = _crv.mul(reduction).div(totalCliffs); // supply cap check uint256 amtTillMax = maxSupply.sub(supply); if (_cvx > amtTillMax) { _cvx = amtTillMax; } } uint256 crvValue; if (_crv > 0) { address[] memory path = new address[](2); path[0] = crv; path[1] = weth; uint256[] memory crvSwap = Uni(dex[0]).getAmountsOut(_crv, path); crvValue = crvSwap[1]; } uint256 cvxValue; if (_cvx > 0) { address[] memory path = new address[](2); path[0] = cvx; path[1] = weth; uint256[] memory cvxSwap = Uni(dex[1]).getAmountsOut(_cvx, path); cvxValue = cvxSwap[1]; } return crvValue.add(cvxValue); } function _claimableInETH() internal virtual view returns (uint256 _claimable) { _claimable = _claimableBasicInETH(); } // NOTE: Can override `tendTrigger` and `harvestTrigger` if necessary function harvestTrigger(uint256 callCost) public override view returns (bool) { StrategyParams memory params = vault.strategies(address(this)); if (params.activation == 0) return false; if (block.timestamp.sub(params.lastReport) < minReportDelay) return false; if (block.timestamp.sub(params.lastReport) >= maxReportDelay) return true; uint256 outstanding = vault.debtOutstanding(); if (outstanding > debtThreshold) return true; uint256 total = estimatedTotalAssets(); if (total.add(debtThreshold) < params.totalDebt) return true; return (profitFactor.mul(callCost) < _claimableInETH()); } } // File: frax.sol contract Strategy is ConvexStable { address public constant pool = address(0xd632f22692FaC7611d2AA1C0D552930D43CAEd3B); address public constant fxs = address(0x3432B6A60D23Ca0dFCa7761B7ab56459D9C964D0); address[] public pathTarget; constructor(address _vault) public ConvexStable(_vault) { curve = address(0xA79828DF1850E8a3A3064576f380D90aECDD3359); id = 32; isClaimRewards = true; // default is true, turn off in emergency isClaimExtras = true; // add this if there are extra rewards (address _lp,,,address _reward,,) = Booster(booster).poolInfo(id); require(_lp == address(want), "constructor: incorrect lp token"); rewardContract = _reward; _approveBasic(); pathTarget = new address[](3); _setPathTarget(0, 0); // crv path target _setPathTarget(1, 0); // cvx path target _setPathTarget(2, 0); // fxs path target dex = new address[](3); dex[0] = sushiswap; // crv dex[1] = sushiswap; // cvx dex[2] = uniswap; // fxs _approveDex(); } // >>> approve other rewards on dex function _approveDex() internal override { super._approveDex(); IERC20(fxs).approve(dex[2], 0); IERC20(fxs).approve(dex[2], type(uint256).max); } // >>> include other rewards function _migrateRewards(address _newStrategy) internal override { super._migrateRewards(_newStrategy); IERC20(fxs).safeTransfer(_newStrategy, IERC20(fxs).balanceOf(address(this))); } // >>> include all other rewards in eth besides _claimableBasicInETH() function _claimableInETH() internal override view returns (uint256 _claimable) { _claimable = super._claimableInETH(); uint256 _fxs = IERC20(fxs).balanceOf(address(this)); if (_fxs > 0) { address[] memory path = new address[](2); path[0] = fxs; path[1] = weth; uint256[] memory swap = Uni(dex[2]).getAmountsOut(_fxs, path); _claimable = _claimable.add(swap[1]); } } function _setPathTarget(uint _tokenId, uint _id) internal { if (_id == 0) { pathTarget[_tokenId] = dai; } else if (_id == 1) { pathTarget[_tokenId] = usdc; } else { pathTarget[_tokenId] = usdt; } } function setPathTarget(uint _tokenId, uint _id) external onlyAuthorized { _setPathTarget(_tokenId, _id); } function prepareReturn(uint256 _debtOutstanding) internal override returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ) { uint before = balanceOfWant(); Rewards(rewardContract).getReward(address(this), isClaimExtras); uint256 _crv = IERC20(crv).balanceOf(address(this)); if (_crv > 0) { _crv = _adjustCRV(_crv); address[] memory path = new address[](3); path[0] = crv; path[1] = weth; path[2] = pathTarget[0]; Uni(dex[0]).swapExactTokensForTokens(_crv, uint256(0), path, address(this), now); } uint256 _cvx = IERC20(cvx).balanceOf(address(this)); if (_cvx > 0) { address[] memory path = new address[](3); path[0] = cvx; path[1] = weth; path[2] = pathTarget[1]; Uni(dex[1]).swapExactTokensForTokens(_cvx, uint256(0), path, address(this), now); } uint256 _fxs = IERC20(fxs).balanceOf(address(this)); if (_fxs > 0) { address[] memory path = new address[](3); path[0] = fxs; path[1] = weth; path[2] = pathTarget[2]; Uni(dex[2]).swapExactTokensForTokens(_fxs, uint256(0), path, address(this), now); } uint256 _dai = IERC20(dai).balanceOf(address(this)); uint256 _usdc = IERC20(usdc).balanceOf(address(this)); uint256 _usdt = IERC20(usdt).balanceOf(address(this)); if (_dai > 0 || _usdc > 0 || _usdt > 0) { ICurveFi(curve).add_liquidity(pool, [0, _dai, _usdc, _usdt], 0); } _profit = want.balanceOf(address(this)).sub(before); uint _total = estimatedTotalAssets(); uint _debt = vault.strategies(address(this)).totalDebt; if(_total < _debt) { _loss = _debt - _total; _profit = 0; } if (_debtOutstanding > 0) { _withdrawSome(_debtOutstanding); _debtPayment = Math.min(_debtOutstanding, balanceOfWant().sub(_profit)); } } function protectedTokens() internal view override returns (address[] memory) { address[] memory protected = new address[](3); protected[0] = crv; protected[1] = cvx; protected[2] = fxs; return protected; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"EmergencyExitEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtPayment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtOutstanding","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"debtThreshold","type":"uint256"}],"name":"UpdatedDebtThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"UpdatedKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMaxReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"metadataURI","type":"string"}],"name":"UpdatedMetadataURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMinReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profitFactor","type":"uint256"}],"name":"UpdatedProfitFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewards","type":"address"}],"name":"UpdatedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategist","type":"address"}],"name":"UpdatedStrategist","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apiVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"approveAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"booster","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegatedAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimatedTotalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCost","type":"uint256"}],"name":"harvestTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimExtras","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepCRV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pathTarget","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtThreshold","type":"uint256"}],"name":"setDebtThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isClaimExtras","type":"bool"}],"name":"setIsClaimExtras","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isClaimRewards","type":"bool"}],"name":"setIsClaimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepCRV","type":"uint256"}],"name":"setKeepCRV","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMaxReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataURI","type":"string"}],"name":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMinReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setPathTarget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_profitFactor","type":"uint256"}],"name":"setProfitFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiswap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_dex","type":"address"}],"name":"switchDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCost","type":"uint256"}],"name":"tendTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapv3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract VaultAPI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountNeeded","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"_loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawToConvexDepositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620060c1380380620060c1833981016040819052620000349162001038565b8080620000448133808062000340565b505061a8c06006556203f4806007556103e8600881905569d3c21bcecceda1000000600955600f55600d80546001600160a01b03191673a79828df1850e8a3a3064576f380d90aecdd33591790556020600b819055600a805462ff00001961ff0019909116610100171662010000179055604051631526fe2760e01b8152600091829173f403c135812408bfbe8713b5a23a04b3d48aae3191631526fe2791620000f29190600401620012f6565b60c06040518083038186803b1580156200010b57600080fd5b505afa15801562000120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014691906200105d565b5050600554939550935050506001600160a01b03808416911614620001885760405162461bcd60e51b81526004016200017f90620011aa565b60405180910390fd5b600c80546001600160a01b0319166001600160a01b038316179055620001ad6200051c565b60408051600380825260808201909252906020820160608036833750508151620001df92601092506020019062000f8f565b50620001ed600080620007c4565b620001fb60016000620007c4565b6200020960026000620007c4565b604080516003808252608082019092529060208201606080368337505081516200023b92600e92506020019062000f8f565b5073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f600e6000815481106200026057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f600e600181548110620002b257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600e6002815481106200030457fe5b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905562000337620008a4565b50505062001332565b6005546001600160a01b0316156200036c5760405162461bcd60e51b81526004016200017f90620011e1565b600180546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b158015620003c957600080fd5b505afa158015620003de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000404919062001038565b600580546001600160a01b0319166001600160a01b0392831617908190556200043e91168560001962000a43602090811b6200211217901c565b600280546001600160a01b038086166001600160a01b0319928316179092556003805485841690831617908190556004805485851693169290921782556000600681905562015180600755606460085560095560015460405163095ea7b360e01b81529084169363095ea7b393620004bf939091169160001991016200115c565b602060405180830381600087803b158015620004da57600080fd5b505af1158015620004ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005159190620010e9565b5050505050565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620005659073f403c135812408bfbe8713b5a23a04b3d48aae31906000906004016200115c565b602060405180830381600087803b1580156200058057600080fd5b505af115801562000595573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005bb9190620010e9565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620006069073f403c135812408bfbe8713b5a23a04b3d48aae3190600019906004016200115c565b602060405180830381600087803b1580156200062157600080fd5b505af115801562000636573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200065c9190620010e9565b50600d546200069890736b175474e89094c44da98b954eedeac495271d0f906001600160a01b0316600062000a43602090811b6200211217901c565b600d54620006d490736b175474e89094c44da98b954eedeac495271d0f906001600160a01b031660001962000a43602090811b6200211217901c565b600d546200070f9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b0316600062000a43602090811b6200211217901c565b600d546200074b9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b031660001962000a43602090811b6200211217901c565b600d54620007869073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316600062000a43602090811b6200211217901c565b600d54620007c29073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b031660001962000a43602090811b6200211217901c565b565b806200082157736b175474e89094c44da98b954eedeac495271d0f60108381548110620007ed57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550620008a0565b80600114156200084e5773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860108381548110620007ed57fe5b73dac17f958d2ee523a2206206994597c13d831ec7601083815481106200087157fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b5050565b620008b962000b5160201b620022111760201c565b733432b6a60d23ca0dfca7761b7ab56459d9c964d06001600160a01b031663095ea7b3600e600281548110620008eb57fe5b60009182526020822001546040516001600160e01b031960e085901b16815262000925926001600160a01b0390921691906004016200115c565b602060405180830381600087803b1580156200094057600080fd5b505af115801562000955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200097b9190620010e9565b50733432b6a60d23ca0dfca7761b7ab56459d9c964d06001600160a01b031663095ea7b3600e600281548110620009ae57fe5b6000918252602090912001546040516001600160e01b031960e084901b168152620009ea916001600160a01b031690600019906004016200115c565b602060405180830381600087803b15801562000a0557600080fd5b505af115801562000a1a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a409190620010e9565b50565b80158062000ad25750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9062000a7c903090869060040162001142565b60206040518083038186803b15801562000a9557600080fd5b505afa15801562000aaa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ad091906200110b565b155b62000af15760405162461bcd60e51b81526004016200017f9062001299565b62000b4c8363095ea7b360e01b848460405160240162000b139291906200115c565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529062000dce16565b505050565b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811062000b8357fe5b60009182526020822001546040516001600160e01b031960e085901b16815262000bbd926001600160a01b0390921691906004016200115c565b602060405180830381600087803b15801562000bd857600080fd5b505af115801562000bed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c139190620010e9565b5073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811062000c4657fe5b6000918252602090912001546040516001600160e01b031960e084901b16815262000c82916001600160a01b031690600019906004016200115c565b602060405180830381600087803b15801562000c9d57600080fd5b505af115801562000cb2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cd89190620010e9565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e60018154811062000d0b57fe5b60009182526020822001546040516001600160e01b031960e085901b16815262000d45926001600160a01b0390921691906004016200115c565b602060405180830381600087803b15801562000d6057600080fd5b505af115801562000d75573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d9b9190620010e9565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e600181548110620009ae57fe5b606062000e2a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000e6a60201b62002504179092919060201c565b80519091501562000b4c578080602001905181019062000e4b9190620010e9565b62000b4c5760405162461bcd60e51b81526004016200017f906200124f565b606062000e7b848460008562000e83565b949350505050565b606062000e908562000f55565b62000eaf5760405162461bcd60e51b81526004016200017f9062001218565b60006060866001600160a01b0316858760405162000ece919062001124565b60006040518083038185875af1925050503d806000811462000f0d576040519150601f19603f3d011682016040523d82523d6000602084013e62000f12565b606091505b5091509150811562000f2857915062000e7b9050565b80511562000f395780518082602001fd5b8360405162461bcd60e51b81526004016200017f919062001175565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000e7b575050151592915050565b82805482825590600052602060002090810192821562000fe7579160200282015b8281111562000fe757825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000fb0565b5062000ff592915062000ff9565b5090565b5b8082111562000ff55780546001600160a01b031916815560010162000ffa565b80516001600160a01b03811681146200103257600080fd5b92915050565b6000602082840312156200104a578081fd5b6200105683836200101a565b9392505050565b60008060008060008060c0878903121562001076578182fd5b6200108288886200101a565b95506200109388602089016200101a565b9450620010a488604089016200101a565b9350620010b588606089016200101a565b9250620010c688608089016200101a565b915060a08701518015158114620010db578182fd5b809150509295509295509295565b600060208284031215620010fb578081fd5b8151801515811462001056578182fd5b6000602082840312156200111d578081fd5b5051919050565b6000825162001138818460208701620012ff565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015262001196816040850160208701620012ff565b601f01601f19169190910160400192915050565b6020808252601f908201527f636f6e7374727563746f723a20696e636f7272656374206c7020746f6b656e00604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b90815260200190565b60005b838110156200131c57818101518382015260200162001302565b838111156200132c576000848401525b50505050565b614d7f80620013426000396000f3fe608060405234801561001057600080fd5b50600436106103d05760003560e01c80636ea69d62116101ff5780639ec5a8941161011a578063ce5494bb116100ad578063f017c92f1161007c578063f017c92f146106c5578063f4b9fa75146106d8578063fbfa77cf146106e0578063fcf2d0ad146106e8576103d0565b8063ce5494bb14610684578063ec38a86214610697578063ed882c2b146106aa578063efbb5cb0146106bd576103d0565b8063c6bbd5a7116100e9578063c6bbd5a71461064e578063c6def07614610656578063c76878031461065e578063c7b9d53014610671576103d0565b80639ec5a8941461062e578063aced166114610636578063af640d0f1461063e578063c1a3d44c14610646576103d0565b80638cdfe16611610192578063923c1d6111610161578063923c1d6114610603578063955383bd1461060b57806395e80c501461061e5780639be2878514610626576103d0565b80638cdfe166146105d85780638e6350e2146105e057806391397ab4146105e8578063918f8674146105fb576103d0565b80637d423446116101ce5780637d423446146105a25780637fef901a146105aa57806381639eda146105b25780638516c2c8146105c5576103d0565b80636ea69d621461056c5780637165485d14610574578063748747e61461057c578063750521f51461058f576103d0565b80632e1a7d4d116102ef578063440368a311610282578063565399a011610251578063565399a01461052b5780636095dd7b1461053e578063650d1880146105515780636a4874a114610564576103d0565b8063440368a31461050b5780634641257d1461051357806346c96aac1461051b5780635641ec0314610523576103d0565b806339a172a8116102be57806339a172a8146104e05780633e413bee146104f35780633fc8cef3146104fb57806342f6a5c914610503576103d0565b80632e1a7d4d146104b55780632f48ab7d146104c857806334659dc5146104d0578063380d0c08146104d8576103d0565b80631d12f28b1161036757806324d16c1a1161033657806324d16c1a1461048a578063258294101461049d5780632681f7e4146104a557806328b7ccf7146104ad576103d0565b80631d12f28b1461046a5780631f1fcd51146104725780631fe4a6861461047a57806322f3e2d414610482576103d0565b80630f969b87116103a35780630f969b8714610425578063115880861461043857806316f0115b1461044d5780631c459a7f14610462576103d0565b806301681a62146103d557806303ee438c146103ea57806306fdde03146104085780630acd095b14610410575b600080fd5b6103e86103e336600461453b565b6106f0565b005b6103f261088f565b6040516103ff91906149a8565b60405180910390f35b6103f261091d565b6104186109c2565b6040516103ff919061496e565b6103e86104333660046147b7565b6109d0565b610440610a5d565b6040516103ff9190614bf8565b610455610ae3565b6040516103ff91906148c4565b610418610afb565b610440610b0a565b610455610b10565b610455610b1f565b610418610b2e565b6104556104983660046147b7565b610bcf565b6103f2610bf6565b610455610c15565b610440610c2d565b6104406104c33660046147b7565b610c33565b610455610c8e565b6103e8610ca6565b6103e8610e05565b6103e86104ee3660046147b7565b610e64565b610455610ee6565b610455610efe565b610455610f16565b6103e8610f2e565b6103e8611155565b6104556114bf565b6104186114d7565b6104556105393660046147b7565b6114e0565b6103e861054c366004614816565b6114ed565b61041861055f3660046147b7565b611544565b61045561154c565b610455611564565b610455611573565b6103e861058a36600461453b565b611582565b6103e861059d366004614640565b61162d565b6104556116c4565b6104406116dc565b6103e86105c03660046147e7565b6116e2565b6103e86105d3366004614608565b611773565b6104406117dc565b6104406117e2565b6103e86105f63660046147b7565b6117e7565b610440611869565b61045561186f565b6103e86106193660046147b7565b611887565b6104406118d9565b6104556118df565b6104556118f7565b610455611906565b610440611915565b61044061191b565b61045561194c565b610455611964565b6103e861066c366004614608565b61197c565b6103e861067f36600461453b565b6119e3565b6103e861069236600461453b565b611a8e565b6103e86106a536600461453b565b611bff565b6104186106b83660046147b7565b611d96565b610440611f6a565b6103e86106d33660046147b7565b611f85565b610455612007565b61045561201f565b6103e861202e565b6106f861251b565b6001600160a01b0316336001600160a01b0316146107315760405162461bcd60e51b815260040161072890614b0f565b60405180910390fd5b6005546001600160a01b038281169116141561075f5760405162461bcd60e51b815260040161072890614a00565b6001546001600160a01b038281169116141561078d5760405162461bcd60e51b815260040161072890614ab7565b6060610797612598565b905060005b81518110156107f2578181815181106107b157fe5b60200260200101516001600160a01b0316836001600160a01b031614156107ea5760405162461bcd60e51b815260040161072890614b7e565b60010161079c565b5061088b6107fe61251b565b6040516370a0823160e01b81526001600160a01b038516906370a082319061082a9030906004016148c4565b60206040518083038186803b15801561084257600080fd5b505afa158015610856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087a91906147cf565b6001600160a01b0385169190612680565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109155780601f106108ea57610100808354040283529160200191610915565b820191906000526020600020905b8154815290600101906020018083116108f857829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261099e91908101906146ad565b6040516020016109ae9190614896565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b0316331480610a0157506109ec61251b565b6001600160a01b0316336001600160a01b0316145b610a1d5760405162461bcd60e51b815260040161072890614b0f565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610a52908390614bf8565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a8e9030906004016148c4565b60206040518083038186803b158015610aa657600080fd5b505afa158015610aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ade91906147cf565b905090565b73d632f22692fac7611d2aa1c0d552930d43caed3b81565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610b639030906004016148c4565b6101206040518083038186803b158015610b7c57600080fd5b505afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb49190614739565b604001511180610ade57506000610bc9611f6a565b11905090565b600e8181548110610bdc57fe5b6000918252602090912001546001600160a01b0316905081565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610c605760405162461bcd60e51b815260040161072890614a97565b6000610c6b8361269f565b600554909350909150610c88906001600160a01b03163383612680565b50919050565b73dac17f958d2ee523a2206206994597c13d831ec781565b6002546001600160a01b0316331480610cd75750610cc261251b565b6001600160a01b0316336001600160a01b0316145b610cf35760405162461bcd60e51b815260040161072890614b0f565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d249030906004016148c4565b60206040518083038186803b158015610d3c57600080fd5b505afa158015610d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7491906147cf565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610db3918591610100900460ff1690600401614c1a565b602060405180830381600087803b158015610dcd57600080fd5b505af1158015610de1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088b9190614624565b6002546001600160a01b0316331480610e365750610e2161251b565b6001600160a01b0316336001600160a01b0316145b610e525760405162461bcd60e51b815260040161072890614b0f565b610e5a6126f1565b610e62612937565b565b6002546001600160a01b0316331480610e955750610e8061251b565b6001600160a01b0316336001600160a01b0316145b610eb15760405162461bcd60e51b815260040161072890614b0f565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610a52908390614bf8565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b73e592427a0aece92de3edee1f18e0157c0586156481565b6004546001600160a01b0316331480610f5157506002546001600160a01b031633145b80610f745750610f5f61251b565b6001600160a01b0316336001600160a01b0316145b806110155750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc857600080fd5b505afa158015610fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110009190614557565b6001600160a01b0316336001600160a01b0316145b806110b65750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561106957600080fd5b505afa15801561107d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a19190614557565b6001600160a01b0316336001600160a01b0316145b6110d25760405162461bcd60e51b815260040161072890614b0f565b6001546040805163bf3759b560e01b81529051610e62926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115091906147cf565b612a2c565b6004546001600160a01b031633148061117857506002546001600160a01b031633145b8061119b575061118661251b565b6001600160a01b0316336001600160a01b0316145b8061123c5750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ef57600080fd5b505afa158015611203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112279190614557565b6001600160a01b0316336001600160a01b0316145b806112dd5750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561129057600080fd5b505afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190614557565b6001600160a01b0316336001600160a01b0316145b6112f95760405162461bcd60e51b815260040161072890614b0f565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561134c57600080fd5b505afa158015611360573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138491906147cf565b600a5490915060009060ff16156113da57600061139f611f6a565b90506113b88382116113b157836113b3565b815b61269f565b94509150828211156113d4576113ce8284612b55565b94508291505b506113eb565b6113e382612ba0565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc9061141f90879087908690600401614c7e565b602060405180830381600087803b15801561143957600080fd5b505af115801561144d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147191906147cf565b915061147c82612a2c565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516114b19493929190614c94565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b600a5460ff1681565b60108181548110610bdc57fe5b6002546001600160a01b031633148061151e575061150961251b565b6001600160a01b0316336001600160a01b0316145b61153a5760405162461bcd60e51b815260040161072890614b0f565b61088b82826136c0565b60005b919050565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b03163314806115b3575061159e61251b565b6001600160a01b0316336001600160a01b0316145b6115cf5760405162461bcd60e51b815260040161072890614b0f565b6001600160a01b0381166115e257600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610a529083906148c4565b6002546001600160a01b031633148061165e575061164961251b565b6001600160a01b0316336001600160a01b0316145b61167a5760405162461bcd60e51b815260040161072890614b0f565b61168660008383614460565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda682826040516116b8929190614979565b60405180910390a15050565b733432b6a60d23ca0dfca7761b7ab56459d9c964d081565b600f5481565b6002546001600160a01b031633148061171357506116fe61251b565b6001600160a01b0316336001600160a01b0316145b61172f5760405162461bcd60e51b815260040161072890614b0f565b80600e838154811061173d57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061088b612937565b6002546001600160a01b03163314806117a4575061178f61251b565b6001600160a01b0316336001600160a01b0316145b6117c05760405162461bcd60e51b815260040161072890614b0f565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b0316331480611818575061180361251b565b6001600160a01b0316336001600160a01b0316145b6118345760405162461bcd60e51b815260040161072890614b0f565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610a52908390614bf8565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b03163314806118b857506118a361251b565b6001600160a01b0316336001600160a01b0316145b6118d45760405162461bcd60e51b815260040161072890614b0f565b600f55565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a8e9030906004016148c4565b73b27308f9f90d607463bb33ea1bebb41c27ce5ab681565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b03163314806119ad575061199861251b565b6001600160a01b0316336001600160a01b0316145b6119c95760405162461bcd60e51b815260040161072890614b0f565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611a1457506119ff61251b565b6001600160a01b0316336001600160a01b0316145b611a305760405162461bcd60e51b815260040161072890614b0f565b6001600160a01b038116611a4357600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610a529083906148c4565b6001546001600160a01b0316331480611abf5750611aaa61251b565b6001600160a01b0316336001600160a01b0316145b611ac857600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611b0f57600080fd5b505afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b479190614557565b6001600160a01b031614611b5a57600080fd5b611b6381613799565b6005546040516370a0823160e01b8152611bfc9183916001600160a01b03909116906370a0823190611b999030906004016148c4565b60206040518083038186803b158015611bb157600080fd5b505afa158015611bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be991906147cf565b6005546001600160a01b03169190612680565b50565b6002546001600160a01b03163314611c295760405162461bcd60e51b8152600401610728906149db565b6001600160a01b038116611c3c57600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611c7392911690600090600401614955565b602060405180830381600087803b158015611c8d57600080fd5b505af1158015611ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc59190614624565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611d149291169060001990600401614955565b602060405180830381600087803b158015611d2e57600080fd5b505af1158015611d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d669190614624565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610a5291906148c4565b6000611da06144da565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611dd09030906004016148c4565b6101206040518083038186803b158015611de957600080fd5b505afa158015611dfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e219190614739565b9050806020015160001415611e3a576000915050611547565b60065460a0820151611e4d904290612b55565b1015611e5d576000915050611547565b60075460a0820151611e70904290612b55565b10611e7f576001915050611547565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015611ec457600080fd5b505afa158015611ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efc91906147cf565b9050600954811115611f1357600192505050611547565b6000611f1d611f6a565b90508260c00151611f396009548361380f90919063ffffffff16565b1015611f4b5760019350505050611547565b611f53613834565b600854611f609087613a48565b1095945050505050565b6000610ade611f77610a5d565b611f7f61191b565b9061380f565b6002546001600160a01b0316331480611fb65750611fa161251b565b6001600160a01b0316336001600160a01b0316145b611fd25760405162461bcd60e51b815260040161072890614b0f565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610a52908390614bf8565b736b175474e89094c44da98b954eedeac495271d0f81565b6001546001600160a01b031681565b6002546001600160a01b031633148061205f575061204a61251b565b6001600160a01b0316336001600160a01b0316145b61207b5760405162461bcd60e51b815260040161072890614b0f565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b1580156120cf57600080fd5b505af11580156120e3573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b80158061219a5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061214890309086906004016148d8565b60206040518083038186803b15801561216057600080fd5b505afa158015612174573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219891906147cf565b155b6121b65760405162461bcd60e51b815260040161072890614ba2565b61220c8363095ea7b360e01b84846040516024016121d5929190614955565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a82565b505050565b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811061224257fe5b60009182526020822001546040516001600160e01b031960e085901b16815261227a926001600160a01b039092169190600401614955565b602060405180830381600087803b15801561229457600080fd5b505af11580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc9190614624565b5073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e6000815481106122fe57fe5b6000918252602090912001546040516001600160e01b031960e084901b168152612338916001600160a01b03169060001990600401614955565b602060405180830381600087803b15801561235257600080fd5b505af1158015612366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238a9190614624565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e6001815481106123bc57fe5b60009182526020822001546040516001600160e01b031960e085901b1681526123f4926001600160a01b039092169190600401614955565b602060405180830381600087803b15801561240e57600080fd5b505af1158015612422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124469190614624565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e60018154811061247857fe5b6000918252602090912001546040516001600160e01b031960e084901b1681526124b2916001600160a01b03169060001990600401614955565b602060405180830381600087803b1580156124cc57600080fd5b505af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190614624565b60606125138484600085613b11565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561256057600080fd5b505afa158015612574573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ade9190614557565b6040805160038082526080820190925260609182919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd52816000815181106125df57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160018151811061262157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050733432b6a60d23ca0dfca7761b7ab56459d9c964d08160028151811061266357fe5b6001600160a01b0390921660209283029190910190910152905090565b61220c8363a9059cbb60e01b84846040516024016121d5929190614955565b60008060006126ac61191b565b9050838110156126e7576126c86126c38583612b55565b613bd5565b92506126d4838261380f565b92506126e08484612b55565b91506126eb565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906127389073f403c135812408bfbe8713b5a23a04b3d48aae3190600090600401614955565b602060405180830381600087803b15801561275257600080fd5b505af1158015612766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278a9190614624565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906127d39073f403c135812408bfbe8713b5a23a04b3d48aae319060001990600401614955565b602060405180830381600087803b1580156127ed57600080fd5b505af1158015612801573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128259190614624565b50600d5461285390736b175474e89094c44da98b954eedeac495271d0f906001600160a01b03166000612112565b600d5461288190736b175474e89094c44da98b954eedeac495271d0f906001600160a01b0316600019612112565b600d546128ae9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b03166000612112565b600d546128dc9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b0316600019612112565b600d546129099073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b03166000612112565b600d54610e629073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316600019612112565b61293f612211565b733432b6a60d23ca0dfca7761b7ab56459d9c964d06001600160a01b031663095ea7b3600e60028154811061297057fe5b60009182526020822001546040516001600160e01b031960e085901b1681526129a8926001600160a01b039092169190600401614955565b602060405180830381600087803b1580156129c257600080fd5b505af11580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fa9190614624565b50733432b6a60d23ca0dfca7761b7ab56459d9c964d06001600160a01b031663095ea7b3600e60028154811061247857fe5b600a5460ff1615612a3c57611bfc565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612a6d9030906004016148c4565b60206040518083038186803b158015612a8557600080fd5b505afa158015612a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abd91906147cf565b9050801561088b57600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d06691612b0391908590600190600401614c66565b602060405180830381600087803b158015612b1d57600080fd5b505af1158015612b31573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220c9190614624565b6000612b9783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c89565b90505b92915050565b600080600080612bae61191b565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd991612bee91309162010000900460ff169060040161493a565b602060405180830381600087803b158015612c0857600080fd5b505af1158015612c1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c409190614624565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612c7b9030906004016148c4565b60206040518083038186803b158015612c9357600080fd5b505afa158015612ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccb91906147cf565b90508015612e8457612cdc81613cb5565b604080516003808252608082019092529192506060919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612d2457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612d6657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600081548110612d9457fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612dbf57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e600081548110612ded57fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991612e2b918691869030904290600401614c2a565b600060405180830381600087803b158015612e4557600080fd5b505af1158015612e59573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e819190810190614573565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612ebe9030906004016148c4565b60206040518083038186803b158015612ed657600080fd5b505afa158015612eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0e91906147cf565b905080156130ba5760408051600380825260808201909252606091602082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110612f5a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612f9c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600181548110612fca57fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612ff557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e60018154811061302357fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991613061918691869030904290600401614c2a565b600060405180830381600087803b15801561307b57600080fd5b505af115801561308f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130b79190810190614573565b50505b6040516370a0823160e01b8152600090733432b6a60d23ca0dfca7761b7ab56459d9c964d0906370a08231906130f49030906004016148c4565b60206040518083038186803b15801561310c57600080fd5b505afa158015613120573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314491906147cf565b905080156132f05760408051600380825260808201909252606091602082018380368337019050509050733432b6a60d23ca0dfca7761b7ab56459d9c964d08160008151811061319057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106131d257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050601060028154811061320057fe5b9060005260206000200160009054906101000a90046001600160a01b03168160028151811061322b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e60028154811061325957fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991613297918691869030904290600401614c2a565b600060405180830381600087803b1580156132b157600080fd5b505af11580156132c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132ed9190810190614573565b50505b6040516370a0823160e01b8152600090736b175474e89094c44da98b954eedeac495271d0f906370a082319061332a9030906004016148c4565b60206040518083038186803b15801561334257600080fd5b505afa158015613356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061337a91906147cf565b6040516370a0823160e01b815290915060009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a08231906133b79030906004016148c4565b60206040518083038186803b1580156133cf57600080fd5b505afa1580156133e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340791906147cf565b6040516370a0823160e01b815290915060009073dac17f958d2ee523a2206206994597c13d831ec7906370a08231906134449030906004016148c4565b60206040518083038186803b15801561345c57600080fd5b505afa158015613470573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349491906147cf565b905060008311806134a55750600082115b806134b05750600081115b1561355157600d546040805160808101825260008082526020820187905281830186905260608201859052915163384e03db60e01b81526001600160a01b039093169263384e03db9261351e9273d632f22692fac7611d2aa1c0d552930d43caed3b929091906004016148f2565b600060405180830381600087803b15801561353857600080fd5b505af115801561354c573d6000803e3d6000fd5b505050505b6005546040516370a0823160e01b81526135dd9189916001600160a01b03909116906370a08231906135879030906004016148c4565b60206040518083038186803b15801561359f57600080fd5b505afa1580156135b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d791906147cf565b90612b55565b995060006135e9611f6a565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf8239061361f9030906004016148c4565b6101206040518083038186803b15801561363857600080fd5b505afa15801561364c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136709190614739565b60c00151905080821015613688578181039a5060009b505b8c156136b0576136978d613bd5565b506136ad8d6136a88e6135d761191b565b613d1e565b99505b5050505050505050509193909250565b8061371a57736b175474e89094c44da98b954eedeac495271d0f601083815481106136e757fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061088b565b80600114156137455773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601083815481106136e757fe5b73dac17f958d2ee523a2206206994597c13d831ec76010838154811061376757fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a2916137d49161010090910460ff169060040161496e565b600060405180830381600087803b1580156137ee57600080fd5b505af1158015613802573d6000803e3d6000fd5b50505050611bfc81613d34565b600082820183811015612b975760405162461bcd60e51b815260040161072890614a1f565b600061383e613de6565b6040516370a0823160e01b8152909150600090733432b6a60d23ca0dfca7761b7ab56459d9c964d0906370a082319061387b9030906004016148c4565b60206040518083038186803b15801561389357600080fd5b505afa1580156138a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cb91906147cf565b90508015613a44576040805160028082526060808301845292602083019080368337019050509050733432b6a60d23ca0dfca7761b7ab56459d9c964d08160008151811061391557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061395757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e60028154811061398757fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f906139c29086908690600401614c01565b60006040518083038186803b1580156139da57600080fd5b505afa1580156139ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a169190810190614573565b9050613a3f81600181518110613a2857fe5b60200260200101518561380f90919063ffffffff16565b935050505b5090565b600082613a5757506000612b9a565b82820282848281613a6457fe5b0414612b975760405162461bcd60e51b815260040161072890614a56565b6060613ad7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125049092919063ffffffff16565b80519091501561220c5780806020019051810190613af59190614624565b61220c5760405162461bcd60e51b815260040161072890614b34565b6060613b1c85613df0565b613b385760405162461bcd60e51b815260040161072890614ad8565b60006060866001600160a01b03168587604051613b55919061487a565b60006040518083038185875af1925050503d8060008114613b92576040519150601f19603f3d011682016040523d82523d6000602084013e613b97565b606091505b50915091508115613bab5791506125139050565b805115613bbb5780518082602001fd5b8360405162461bcd60e51b815260040161072891906149a8565b6000613be3826136a8610a5d565b91506000613bef61191b565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e720290613c23908690600090600401614c1a565b602060405180830381600087803b158015613c3d57600080fd5b505af1158015613c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c759190614624565b50613c82816135d761191b565b9392505050565b60008184841115613cad5760405162461bcd60e51b815260040161072891906149a8565b505050900390565b600080613cd9612710613cd3600f5486613a4890919063ffffffff16565b90613e29565b90508015613d1457613d1473d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483612680565b613c828382612b55565b6000818310613d2d5781612b97565b5090919050565b613d3d81613e6b565b6040516370a0823160e01b8152611bfc908290733432b6a60d23ca0dfca7761b7ab56459d9c964d0906370a0823190613d7a9030906004016148c4565b60206040518083038186803b158015613d9257600080fd5b505afa158015613da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dca91906147cf565b733432b6a60d23ca0dfca7761b7ab56459d9c964d09190612680565b6000610ade613fbd565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612513575050151592915050565b6000612b9783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614429565b6040516370a0823160e01b8152613f1490829073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190613ea89030906004016148c4565b60206040518083038186803b158015613ec057600080fd5b505afa158015613ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ef891906147cf565b73d533a949740bb3306d119cc777fa900ba034cd529190612680565b6040516370a0823160e01b8152611bfc908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190613f519030906004016148c4565b60206040518083038186803b158015613f6957600080fd5b505afa158015613f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa191906147cf565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612680565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc26290613ff09030906004016148c4565b60206040518083038186803b15801561400857600080fd5b505afa15801561401c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061404091906147cf565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156140b757600080fd5b505afa1580156140cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ef91906147cf565b90506000806140fe8385613e29565b9050858110156141435760006141148783612b55565b905061412487613cd38a84613a48565b925060006141328786612b55565b905080841115614140578093505b50505b600087156142aa57604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061418d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106141cf57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e6000815481106141ff57fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f9061423a908d908690600401614c01565b60006040518083038186803b15801561425257600080fd5b505afa158015614266573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261428e9190810190614573565b90508060018151811061429d57fe5b6020026020010151925050505b60008315614411576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b816000815181106142f457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061433657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e60018154811061436657fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f906143a19089908690600401614c01565b60006040518083038186803b1580156143b957600080fd5b505afa1580156143cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143f59190810190614573565b90508060018151811061440457fe5b6020026020010151925050505b61441b828261380f565b995050505050505050505090565b6000818361444a5760405162461bcd60e51b815260040161072891906149a8565b50600083858161445657fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106144a15782800160ff198235161785556144ce565b828001600101855582156144ce579182015b828111156144ce5782358255916020019190600101906144b3565b50613a44929150614526565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613a445760008155600101614527565b60006020828403121561454c578081fd5b8135612b9781614d26565b600060208284031215614568578081fd5b8151612b9781614d26565b60006020808385031215614585578182fd5b825167ffffffffffffffff81111561459b578283fd5b8301601f810185136145ab578283fd5b80516145be6145b982614cd6565b614caf565b81815283810190838501858402850186018910156145da578687fd5b8694505b838510156145fc5780518352600194909401939185019185016145de565b50979650505050505050565b600060208284031215614619578081fd5b8135612b9781614d3b565b600060208284031215614635578081fd5b8151612b9781614d3b565b60008060208385031215614652578081fd5b823567ffffffffffffffff80821115614669578283fd5b818501915085601f83011261467c578283fd5b81358181111561468a578384fd5b86602082850101111561469b578384fd5b60209290920196919550909350505050565b6000602082840312156146be578081fd5b815167ffffffffffffffff808211156146d5578283fd5b818401915084601f8301126146e8578283fd5b8151818111156146f6578384fd5b614709601f8201601f1916602001614caf565b915080825285602082850101111561471f578384fd5b614730816020840160208601614cf6565b50949350505050565b600061012080838503121561474c578182fd5b61475581614caf565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156147c8578081fd5b5035919050565b6000602082840312156147e0578081fd5b5051919050565b600080604083850312156147f9578182fd5b82359150602083013561480b81614d26565b809150509250929050565b60008060408385031215614828578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561486f5781516001600160a01b03168752958201959082019060010161484a565b509495945050505050565b6000825161488c818460208701614cf6565b9190910192915050565b600065086dedceccaf60d31b825282516148b7816006850160208701614cf6565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038416815260c0810160208083018560005b60048110156149285781518352918301919083019060010161490b565b505050508260a0830152949350505050565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b60006020825282518060208401526149c7816040850160208701614cf6565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b6000838252604060208301526125136040830184614837565b9182521515602082015260400190565b600086825285602083015260a06040830152614c4960a0830186614837565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715614cce57600080fd5b604052919050565b600067ffffffffffffffff821115614cec578081fd5b5060209081020190565b60005b83811015614d11578181015183820152602001614cf9565b83811115614d20576000848401525b50505050565b6001600160a01b0381168114611bfc57600080fd5b8015158114611bfc57600080fdfea2646970667358221220a1802815c471e395d6f08c607426e1094e151e336954978d7f2caad7348292c864736f6c634300060c0033000000000000000000000000b4ada607b9d6b2c9ee07a275e9616b84ac560139
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103d05760003560e01c80636ea69d62116101ff5780639ec5a8941161011a578063ce5494bb116100ad578063f017c92f1161007c578063f017c92f146106c5578063f4b9fa75146106d8578063fbfa77cf146106e0578063fcf2d0ad146106e8576103d0565b8063ce5494bb14610684578063ec38a86214610697578063ed882c2b146106aa578063efbb5cb0146106bd576103d0565b8063c6bbd5a7116100e9578063c6bbd5a71461064e578063c6def07614610656578063c76878031461065e578063c7b9d53014610671576103d0565b80639ec5a8941461062e578063aced166114610636578063af640d0f1461063e578063c1a3d44c14610646576103d0565b80638cdfe16611610192578063923c1d6111610161578063923c1d6114610603578063955383bd1461060b57806395e80c501461061e5780639be2878514610626576103d0565b80638cdfe166146105d85780638e6350e2146105e057806391397ab4146105e8578063918f8674146105fb576103d0565b80637d423446116101ce5780637d423446146105a25780637fef901a146105aa57806381639eda146105b25780638516c2c8146105c5576103d0565b80636ea69d621461056c5780637165485d14610574578063748747e61461057c578063750521f51461058f576103d0565b80632e1a7d4d116102ef578063440368a311610282578063565399a011610251578063565399a01461052b5780636095dd7b1461053e578063650d1880146105515780636a4874a114610564576103d0565b8063440368a31461050b5780634641257d1461051357806346c96aac1461051b5780635641ec0314610523576103d0565b806339a172a8116102be57806339a172a8146104e05780633e413bee146104f35780633fc8cef3146104fb57806342f6a5c914610503576103d0565b80632e1a7d4d146104b55780632f48ab7d146104c857806334659dc5146104d0578063380d0c08146104d8576103d0565b80631d12f28b1161036757806324d16c1a1161033657806324d16c1a1461048a578063258294101461049d5780632681f7e4146104a557806328b7ccf7146104ad576103d0565b80631d12f28b1461046a5780631f1fcd51146104725780631fe4a6861461047a57806322f3e2d414610482576103d0565b80630f969b87116103a35780630f969b8714610425578063115880861461043857806316f0115b1461044d5780631c459a7f14610462576103d0565b806301681a62146103d557806303ee438c146103ea57806306fdde03146104085780630acd095b14610410575b600080fd5b6103e86103e336600461453b565b6106f0565b005b6103f261088f565b6040516103ff91906149a8565b60405180910390f35b6103f261091d565b6104186109c2565b6040516103ff919061496e565b6103e86104333660046147b7565b6109d0565b610440610a5d565b6040516103ff9190614bf8565b610455610ae3565b6040516103ff91906148c4565b610418610afb565b610440610b0a565b610455610b10565b610455610b1f565b610418610b2e565b6104556104983660046147b7565b610bcf565b6103f2610bf6565b610455610c15565b610440610c2d565b6104406104c33660046147b7565b610c33565b610455610c8e565b6103e8610ca6565b6103e8610e05565b6103e86104ee3660046147b7565b610e64565b610455610ee6565b610455610efe565b610455610f16565b6103e8610f2e565b6103e8611155565b6104556114bf565b6104186114d7565b6104556105393660046147b7565b6114e0565b6103e861054c366004614816565b6114ed565b61041861055f3660046147b7565b611544565b61045561154c565b610455611564565b610455611573565b6103e861058a36600461453b565b611582565b6103e861059d366004614640565b61162d565b6104556116c4565b6104406116dc565b6103e86105c03660046147e7565b6116e2565b6103e86105d3366004614608565b611773565b6104406117dc565b6104406117e2565b6103e86105f63660046147b7565b6117e7565b610440611869565b61045561186f565b6103e86106193660046147b7565b611887565b6104406118d9565b6104556118df565b6104556118f7565b610455611906565b610440611915565b61044061191b565b61045561194c565b610455611964565b6103e861066c366004614608565b61197c565b6103e861067f36600461453b565b6119e3565b6103e861069236600461453b565b611a8e565b6103e86106a536600461453b565b611bff565b6104186106b83660046147b7565b611d96565b610440611f6a565b6103e86106d33660046147b7565b611f85565b610455612007565b61045561201f565b6103e861202e565b6106f861251b565b6001600160a01b0316336001600160a01b0316146107315760405162461bcd60e51b815260040161072890614b0f565b60405180910390fd5b6005546001600160a01b038281169116141561075f5760405162461bcd60e51b815260040161072890614a00565b6001546001600160a01b038281169116141561078d5760405162461bcd60e51b815260040161072890614ab7565b6060610797612598565b905060005b81518110156107f2578181815181106107b157fe5b60200260200101516001600160a01b0316836001600160a01b031614156107ea5760405162461bcd60e51b815260040161072890614b7e565b60010161079c565b5061088b6107fe61251b565b6040516370a0823160e01b81526001600160a01b038516906370a082319061082a9030906004016148c4565b60206040518083038186803b15801561084257600080fd5b505afa158015610856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087a91906147cf565b6001600160a01b0385169190612680565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109155780601f106108ea57610100808354040283529160200191610915565b820191906000526020600020905b8154815290600101906020018083116108f857829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261099e91908101906146ad565b6040516020016109ae9190614896565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b0316331480610a0157506109ec61251b565b6001600160a01b0316336001600160a01b0316145b610a1d5760405162461bcd60e51b815260040161072890614b0f565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610a52908390614bf8565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a8e9030906004016148c4565b60206040518083038186803b158015610aa657600080fd5b505afa158015610aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ade91906147cf565b905090565b73d632f22692fac7611d2aa1c0d552930d43caed3b81565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610b639030906004016148c4565b6101206040518083038186803b158015610b7c57600080fd5b505afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb49190614739565b604001511180610ade57506000610bc9611f6a565b11905090565b600e8181548110610bdc57fe5b6000918252602090912001546001600160a01b0316905081565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610c605760405162461bcd60e51b815260040161072890614a97565b6000610c6b8361269f565b600554909350909150610c88906001600160a01b03163383612680565b50919050565b73dac17f958d2ee523a2206206994597c13d831ec781565b6002546001600160a01b0316331480610cd75750610cc261251b565b6001600160a01b0316336001600160a01b0316145b610cf35760405162461bcd60e51b815260040161072890614b0f565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d249030906004016148c4565b60206040518083038186803b158015610d3c57600080fd5b505afa158015610d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7491906147cf565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610db3918591610100900460ff1690600401614c1a565b602060405180830381600087803b158015610dcd57600080fd5b505af1158015610de1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088b9190614624565b6002546001600160a01b0316331480610e365750610e2161251b565b6001600160a01b0316336001600160a01b0316145b610e525760405162461bcd60e51b815260040161072890614b0f565b610e5a6126f1565b610e62612937565b565b6002546001600160a01b0316331480610e955750610e8061251b565b6001600160a01b0316336001600160a01b0316145b610eb15760405162461bcd60e51b815260040161072890614b0f565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610a52908390614bf8565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b73e592427a0aece92de3edee1f18e0157c0586156481565b6004546001600160a01b0316331480610f5157506002546001600160a01b031633145b80610f745750610f5f61251b565b6001600160a01b0316336001600160a01b0316145b806110155750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc857600080fd5b505afa158015610fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110009190614557565b6001600160a01b0316336001600160a01b0316145b806110b65750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561106957600080fd5b505afa15801561107d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a19190614557565b6001600160a01b0316336001600160a01b0316145b6110d25760405162461bcd60e51b815260040161072890614b0f565b6001546040805163bf3759b560e01b81529051610e62926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115091906147cf565b612a2c565b6004546001600160a01b031633148061117857506002546001600160a01b031633145b8061119b575061118661251b565b6001600160a01b0316336001600160a01b0316145b8061123c5750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ef57600080fd5b505afa158015611203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112279190614557565b6001600160a01b0316336001600160a01b0316145b806112dd5750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561129057600080fd5b505afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190614557565b6001600160a01b0316336001600160a01b0316145b6112f95760405162461bcd60e51b815260040161072890614b0f565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561134c57600080fd5b505afa158015611360573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138491906147cf565b600a5490915060009060ff16156113da57600061139f611f6a565b90506113b88382116113b157836113b3565b815b61269f565b94509150828211156113d4576113ce8284612b55565b94508291505b506113eb565b6113e382612ba0565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc9061141f90879087908690600401614c7e565b602060405180830381600087803b15801561143957600080fd5b505af115801561144d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147191906147cf565b915061147c82612a2c565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516114b19493929190614c94565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b600a5460ff1681565b60108181548110610bdc57fe5b6002546001600160a01b031633148061151e575061150961251b565b6001600160a01b0316336001600160a01b0316145b61153a5760405162461bcd60e51b815260040161072890614b0f565b61088b82826136c0565b60005b919050565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b03163314806115b3575061159e61251b565b6001600160a01b0316336001600160a01b0316145b6115cf5760405162461bcd60e51b815260040161072890614b0f565b6001600160a01b0381166115e257600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610a529083906148c4565b6002546001600160a01b031633148061165e575061164961251b565b6001600160a01b0316336001600160a01b0316145b61167a5760405162461bcd60e51b815260040161072890614b0f565b61168660008383614460565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda682826040516116b8929190614979565b60405180910390a15050565b733432b6a60d23ca0dfca7761b7ab56459d9c964d081565b600f5481565b6002546001600160a01b031633148061171357506116fe61251b565b6001600160a01b0316336001600160a01b0316145b61172f5760405162461bcd60e51b815260040161072890614b0f565b80600e838154811061173d57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061088b612937565b6002546001600160a01b03163314806117a4575061178f61251b565b6001600160a01b0316336001600160a01b0316145b6117c05760405162461bcd60e51b815260040161072890614b0f565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b0316331480611818575061180361251b565b6001600160a01b0316336001600160a01b0316145b6118345760405162461bcd60e51b815260040161072890614b0f565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610a52908390614bf8565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b03163314806118b857506118a361251b565b6001600160a01b0316336001600160a01b0316145b6118d45760405162461bcd60e51b815260040161072890614b0f565b600f55565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a8e9030906004016148c4565b73b27308f9f90d607463bb33ea1bebb41c27ce5ab681565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b03163314806119ad575061199861251b565b6001600160a01b0316336001600160a01b0316145b6119c95760405162461bcd60e51b815260040161072890614b0f565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611a1457506119ff61251b565b6001600160a01b0316336001600160a01b0316145b611a305760405162461bcd60e51b815260040161072890614b0f565b6001600160a01b038116611a4357600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610a529083906148c4565b6001546001600160a01b0316331480611abf5750611aaa61251b565b6001600160a01b0316336001600160a01b0316145b611ac857600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611b0f57600080fd5b505afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b479190614557565b6001600160a01b031614611b5a57600080fd5b611b6381613799565b6005546040516370a0823160e01b8152611bfc9183916001600160a01b03909116906370a0823190611b999030906004016148c4565b60206040518083038186803b158015611bb157600080fd5b505afa158015611bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be991906147cf565b6005546001600160a01b03169190612680565b50565b6002546001600160a01b03163314611c295760405162461bcd60e51b8152600401610728906149db565b6001600160a01b038116611c3c57600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611c7392911690600090600401614955565b602060405180830381600087803b158015611c8d57600080fd5b505af1158015611ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc59190614624565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611d149291169060001990600401614955565b602060405180830381600087803b158015611d2e57600080fd5b505af1158015611d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d669190614624565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610a5291906148c4565b6000611da06144da565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611dd09030906004016148c4565b6101206040518083038186803b158015611de957600080fd5b505afa158015611dfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e219190614739565b9050806020015160001415611e3a576000915050611547565b60065460a0820151611e4d904290612b55565b1015611e5d576000915050611547565b60075460a0820151611e70904290612b55565b10611e7f576001915050611547565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015611ec457600080fd5b505afa158015611ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efc91906147cf565b9050600954811115611f1357600192505050611547565b6000611f1d611f6a565b90508260c00151611f396009548361380f90919063ffffffff16565b1015611f4b5760019350505050611547565b611f53613834565b600854611f609087613a48565b1095945050505050565b6000610ade611f77610a5d565b611f7f61191b565b9061380f565b6002546001600160a01b0316331480611fb65750611fa161251b565b6001600160a01b0316336001600160a01b0316145b611fd25760405162461bcd60e51b815260040161072890614b0f565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610a52908390614bf8565b736b175474e89094c44da98b954eedeac495271d0f81565b6001546001600160a01b031681565b6002546001600160a01b031633148061205f575061204a61251b565b6001600160a01b0316336001600160a01b0316145b61207b5760405162461bcd60e51b815260040161072890614b0f565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b1580156120cf57600080fd5b505af11580156120e3573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b80158061219a5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061214890309086906004016148d8565b60206040518083038186803b15801561216057600080fd5b505afa158015612174573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219891906147cf565b155b6121b65760405162461bcd60e51b815260040161072890614ba2565b61220c8363095ea7b360e01b84846040516024016121d5929190614955565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a82565b505050565b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811061224257fe5b60009182526020822001546040516001600160e01b031960e085901b16815261227a926001600160a01b039092169190600401614955565b602060405180830381600087803b15801561229457600080fd5b505af11580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc9190614624565b5073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e6000815481106122fe57fe5b6000918252602090912001546040516001600160e01b031960e084901b168152612338916001600160a01b03169060001990600401614955565b602060405180830381600087803b15801561235257600080fd5b505af1158015612366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238a9190614624565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e6001815481106123bc57fe5b60009182526020822001546040516001600160e01b031960e085901b1681526123f4926001600160a01b039092169190600401614955565b602060405180830381600087803b15801561240e57600080fd5b505af1158015612422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124469190614624565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e60018154811061247857fe5b6000918252602090912001546040516001600160e01b031960e084901b1681526124b2916001600160a01b03169060001990600401614955565b602060405180830381600087803b1580156124cc57600080fd5b505af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190614624565b60606125138484600085613b11565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561256057600080fd5b505afa158015612574573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ade9190614557565b6040805160038082526080820190925260609182919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd52816000815181106125df57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160018151811061262157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050733432b6a60d23ca0dfca7761b7ab56459d9c964d08160028151811061266357fe5b6001600160a01b0390921660209283029190910190910152905090565b61220c8363a9059cbb60e01b84846040516024016121d5929190614955565b60008060006126ac61191b565b9050838110156126e7576126c86126c38583612b55565b613bd5565b92506126d4838261380f565b92506126e08484612b55565b91506126eb565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906127389073f403c135812408bfbe8713b5a23a04b3d48aae3190600090600401614955565b602060405180830381600087803b15801561275257600080fd5b505af1158015612766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278a9190614624565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906127d39073f403c135812408bfbe8713b5a23a04b3d48aae319060001990600401614955565b602060405180830381600087803b1580156127ed57600080fd5b505af1158015612801573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128259190614624565b50600d5461285390736b175474e89094c44da98b954eedeac495271d0f906001600160a01b03166000612112565b600d5461288190736b175474e89094c44da98b954eedeac495271d0f906001600160a01b0316600019612112565b600d546128ae9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b03166000612112565b600d546128dc9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b0316600019612112565b600d546129099073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b03166000612112565b600d54610e629073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316600019612112565b61293f612211565b733432b6a60d23ca0dfca7761b7ab56459d9c964d06001600160a01b031663095ea7b3600e60028154811061297057fe5b60009182526020822001546040516001600160e01b031960e085901b1681526129a8926001600160a01b039092169190600401614955565b602060405180830381600087803b1580156129c257600080fd5b505af11580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fa9190614624565b50733432b6a60d23ca0dfca7761b7ab56459d9c964d06001600160a01b031663095ea7b3600e60028154811061247857fe5b600a5460ff1615612a3c57611bfc565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612a6d9030906004016148c4565b60206040518083038186803b158015612a8557600080fd5b505afa158015612a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abd91906147cf565b9050801561088b57600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d06691612b0391908590600190600401614c66565b602060405180830381600087803b158015612b1d57600080fd5b505af1158015612b31573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220c9190614624565b6000612b9783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c89565b90505b92915050565b600080600080612bae61191b565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd991612bee91309162010000900460ff169060040161493a565b602060405180830381600087803b158015612c0857600080fd5b505af1158015612c1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c409190614624565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612c7b9030906004016148c4565b60206040518083038186803b158015612c9357600080fd5b505afa158015612ca7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccb91906147cf565b90508015612e8457612cdc81613cb5565b604080516003808252608082019092529192506060919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612d2457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612d6657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600081548110612d9457fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612dbf57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e600081548110612ded57fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991612e2b918691869030904290600401614c2a565b600060405180830381600087803b158015612e4557600080fd5b505af1158015612e59573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e819190810190614573565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612ebe9030906004016148c4565b60206040518083038186803b158015612ed657600080fd5b505afa158015612eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0e91906147cf565b905080156130ba5760408051600380825260808201909252606091602082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110612f5a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612f9c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600181548110612fca57fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612ff557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e60018154811061302357fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991613061918691869030904290600401614c2a565b600060405180830381600087803b15801561307b57600080fd5b505af115801561308f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130b79190810190614573565b50505b6040516370a0823160e01b8152600090733432b6a60d23ca0dfca7761b7ab56459d9c964d0906370a08231906130f49030906004016148c4565b60206040518083038186803b15801561310c57600080fd5b505afa158015613120573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314491906147cf565b905080156132f05760408051600380825260808201909252606091602082018380368337019050509050733432b6a60d23ca0dfca7761b7ab56459d9c964d08160008151811061319057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106131d257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050601060028154811061320057fe5b9060005260206000200160009054906101000a90046001600160a01b03168160028151811061322b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e60028154811061325957fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991613297918691869030904290600401614c2a565b600060405180830381600087803b1580156132b157600080fd5b505af11580156132c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132ed9190810190614573565b50505b6040516370a0823160e01b8152600090736b175474e89094c44da98b954eedeac495271d0f906370a082319061332a9030906004016148c4565b60206040518083038186803b15801561334257600080fd5b505afa158015613356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061337a91906147cf565b6040516370a0823160e01b815290915060009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a08231906133b79030906004016148c4565b60206040518083038186803b1580156133cf57600080fd5b505afa1580156133e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340791906147cf565b6040516370a0823160e01b815290915060009073dac17f958d2ee523a2206206994597c13d831ec7906370a08231906134449030906004016148c4565b60206040518083038186803b15801561345c57600080fd5b505afa158015613470573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349491906147cf565b905060008311806134a55750600082115b806134b05750600081115b1561355157600d546040805160808101825260008082526020820187905281830186905260608201859052915163384e03db60e01b81526001600160a01b039093169263384e03db9261351e9273d632f22692fac7611d2aa1c0d552930d43caed3b929091906004016148f2565b600060405180830381600087803b15801561353857600080fd5b505af115801561354c573d6000803e3d6000fd5b505050505b6005546040516370a0823160e01b81526135dd9189916001600160a01b03909116906370a08231906135879030906004016148c4565b60206040518083038186803b15801561359f57600080fd5b505afa1580156135b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d791906147cf565b90612b55565b995060006135e9611f6a565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf8239061361f9030906004016148c4565b6101206040518083038186803b15801561363857600080fd5b505afa15801561364c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136709190614739565b60c00151905080821015613688578181039a5060009b505b8c156136b0576136978d613bd5565b506136ad8d6136a88e6135d761191b565b613d1e565b99505b5050505050505050509193909250565b8061371a57736b175474e89094c44da98b954eedeac495271d0f601083815481106136e757fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061088b565b80600114156137455773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601083815481106136e757fe5b73dac17f958d2ee523a2206206994597c13d831ec76010838154811061376757fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a2916137d49161010090910460ff169060040161496e565b600060405180830381600087803b1580156137ee57600080fd5b505af1158015613802573d6000803e3d6000fd5b50505050611bfc81613d34565b600082820183811015612b975760405162461bcd60e51b815260040161072890614a1f565b600061383e613de6565b6040516370a0823160e01b8152909150600090733432b6a60d23ca0dfca7761b7ab56459d9c964d0906370a082319061387b9030906004016148c4565b60206040518083038186803b15801561389357600080fd5b505afa1580156138a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cb91906147cf565b90508015613a44576040805160028082526060808301845292602083019080368337019050509050733432b6a60d23ca0dfca7761b7ab56459d9c964d08160008151811061391557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061395757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e60028154811061398757fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f906139c29086908690600401614c01565b60006040518083038186803b1580156139da57600080fd5b505afa1580156139ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a169190810190614573565b9050613a3f81600181518110613a2857fe5b60200260200101518561380f90919063ffffffff16565b935050505b5090565b600082613a5757506000612b9a565b82820282848281613a6457fe5b0414612b975760405162461bcd60e51b815260040161072890614a56565b6060613ad7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125049092919063ffffffff16565b80519091501561220c5780806020019051810190613af59190614624565b61220c5760405162461bcd60e51b815260040161072890614b34565b6060613b1c85613df0565b613b385760405162461bcd60e51b815260040161072890614ad8565b60006060866001600160a01b03168587604051613b55919061487a565b60006040518083038185875af1925050503d8060008114613b92576040519150601f19603f3d011682016040523d82523d6000602084013e613b97565b606091505b50915091508115613bab5791506125139050565b805115613bbb5780518082602001fd5b8360405162461bcd60e51b815260040161072891906149a8565b6000613be3826136a8610a5d565b91506000613bef61191b565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e720290613c23908690600090600401614c1a565b602060405180830381600087803b158015613c3d57600080fd5b505af1158015613c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c759190614624565b50613c82816135d761191b565b9392505050565b60008184841115613cad5760405162461bcd60e51b815260040161072891906149a8565b505050900390565b600080613cd9612710613cd3600f5486613a4890919063ffffffff16565b90613e29565b90508015613d1457613d1473d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483612680565b613c828382612b55565b6000818310613d2d5781612b97565b5090919050565b613d3d81613e6b565b6040516370a0823160e01b8152611bfc908290733432b6a60d23ca0dfca7761b7ab56459d9c964d0906370a0823190613d7a9030906004016148c4565b60206040518083038186803b158015613d9257600080fd5b505afa158015613da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dca91906147cf565b733432b6a60d23ca0dfca7761b7ab56459d9c964d09190612680565b6000610ade613fbd565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612513575050151592915050565b6000612b9783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614429565b6040516370a0823160e01b8152613f1490829073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190613ea89030906004016148c4565b60206040518083038186803b158015613ec057600080fd5b505afa158015613ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ef891906147cf565b73d533a949740bb3306d119cc777fa900ba034cd529190612680565b6040516370a0823160e01b8152611bfc908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190613f519030906004016148c4565b60206040518083038186803b158015613f6957600080fd5b505afa158015613f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa191906147cf565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612680565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc26290613ff09030906004016148c4565b60206040518083038186803b15801561400857600080fd5b505afa15801561401c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061404091906147cf565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156140b757600080fd5b505afa1580156140cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ef91906147cf565b90506000806140fe8385613e29565b9050858110156141435760006141148783612b55565b905061412487613cd38a84613a48565b925060006141328786612b55565b905080841115614140578093505b50505b600087156142aa57604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061418d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106141cf57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e6000815481106141ff57fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f9061423a908d908690600401614c01565b60006040518083038186803b15801561425257600080fd5b505afa158015614266573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261428e9190810190614573565b90508060018151811061429d57fe5b6020026020010151925050505b60008315614411576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b816000815181106142f457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061433657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e60018154811061436657fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f906143a19089908690600401614c01565b60006040518083038186803b1580156143b957600080fd5b505afa1580156143cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143f59190810190614573565b90508060018151811061440457fe5b6020026020010151925050505b61441b828261380f565b995050505050505050505090565b6000818361444a5760405162461bcd60e51b815260040161072891906149a8565b50600083858161445657fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106144a15782800160ff198235161785556144ce565b828001600101855582156144ce579182015b828111156144ce5782358255916020019190600101906144b3565b50613a44929150614526565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613a445760008155600101614527565b60006020828403121561454c578081fd5b8135612b9781614d26565b600060208284031215614568578081fd5b8151612b9781614d26565b60006020808385031215614585578182fd5b825167ffffffffffffffff81111561459b578283fd5b8301601f810185136145ab578283fd5b80516145be6145b982614cd6565b614caf565b81815283810190838501858402850186018910156145da578687fd5b8694505b838510156145fc5780518352600194909401939185019185016145de565b50979650505050505050565b600060208284031215614619578081fd5b8135612b9781614d3b565b600060208284031215614635578081fd5b8151612b9781614d3b565b60008060208385031215614652578081fd5b823567ffffffffffffffff80821115614669578283fd5b818501915085601f83011261467c578283fd5b81358181111561468a578384fd5b86602082850101111561469b578384fd5b60209290920196919550909350505050565b6000602082840312156146be578081fd5b815167ffffffffffffffff808211156146d5578283fd5b818401915084601f8301126146e8578283fd5b8151818111156146f6578384fd5b614709601f8201601f1916602001614caf565b915080825285602082850101111561471f578384fd5b614730816020840160208601614cf6565b50949350505050565b600061012080838503121561474c578182fd5b61475581614caf565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156147c8578081fd5b5035919050565b6000602082840312156147e0578081fd5b5051919050565b600080604083850312156147f9578182fd5b82359150602083013561480b81614d26565b809150509250929050565b60008060408385031215614828578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561486f5781516001600160a01b03168752958201959082019060010161484a565b509495945050505050565b6000825161488c818460208701614cf6565b9190910192915050565b600065086dedceccaf60d31b825282516148b7816006850160208701614cf6565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038416815260c0810160208083018560005b60048110156149285781518352918301919083019060010161490b565b505050508260a0830152949350505050565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b60006020825282518060208401526149c7816040850160208701614cf6565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b6000838252604060208301526125136040830184614837565b9182521515602082015260400190565b600086825285602083015260a06040830152614c4960a0830186614837565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715614cce57600080fd5b604052919050565b600067ffffffffffffffff821115614cec578081fd5b5060209081020190565b60005b83811015614d11578181015183820152602001614cf9565b83811115614d20576000848401525b50505050565b6001600160a01b0381168114611bfc57600080fd5b8015158114611bfc57600080fdfea2646970667358221220a1802815c471e395d6f08c607426e1094e151e336954978d7f2caad7348292c864736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b4ada607b9d6b2c9ee07a275e9616b84ac560139
-----Decoded View---------------
Arg [0] : _vault (address): 0xB4AdA607B9d6b2c9Ee07A275e9616B84AC560139
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b4ada607b9d6b2c9ee07a275e9616b84ac560139
Deployed Bytecode Sourcemap
65506:5100:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56794:444;;;;;;:::i;:::-;;:::i;:::-;;30618:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60549:163;;;:::i;58566:26::-;;;:::i;:::-;;;;;;;:::i;39940:175::-;;;;;;:::i;:::-;;:::i;60838:129::-;;;:::i;:::-;;;;;;;:::i;65547:82::-;;;:::i;:::-;;;;;;;:::i;58599:25::-;;;:::i;33808:28::-;;;:::i;32556:18::-;;;:::i;32465:25::-;;;:::i;42613:148::-;;;:::i;58720:20::-;;;;;;:::i;:::-;;:::i;30928:91::-;;;:::i;58326:85::-;;;:::i;33444:29::-;;;:::i;53374:515::-;;;;;;:::i;:::-;;:::i;58050:82::-;;;:::i;60325:216::-;;;:::i;59710:104::-;;;:::i;37989:154::-;;;;;;:::i;:::-;;:::i;57961:82::-;;;:::i;57784:::-;;;:::i;58232:87::-;;;:::i;47366:170::-;;;:::i;51759:1371::-;;;:::i;57424:83::-;;;:::i;33887:25::-;;;:::i;65724:27::-;;;;;;:::i;:::-;;:::i;67970:120::-;;;;;;:::i;:::-;;:::i;46751:286::-;;;;;;:::i;:::-;;:::i;57696:81::-;;;:::i;58655:29::-;;;:::i;58691:20::-;;;:::i;36746:174::-;;;;;;:::i;:::-;;:::i;40418:171::-;;;;;;:::i;:::-;;:::i;65636:81::-;;;:::i;58747:22::-;;;:::i;59929:128::-;;;;;;:::i;:::-;;:::i;60197:120::-;;;;;;:::i;:::-;;:::i;33630:27::-;;;:::i;32335:94::-;;;:::i;39214:169::-;;;;;;:::i;:::-;;:::i;58514:43::-;;;:::i;57608:81::-;;;:::i;59822:99::-;;;;;;:::i;:::-;;:::i;33293:29::-;;;:::i;58418:87::-;;;:::i;32497:22::-;;;:::i;32526:21::-;;;:::i;58631:17::-;;;:::i;60720:110::-;;;:::i;58141:84::-;;;:::i;57514:85::-;;;:::i;60065:124::-;;;;;;:::i;:::-;;:::i;35990:202::-;;;;;;:::i;:::-;;:::i;54480:311::-;;;;;;:::i;:::-;;:::i;37209:263::-;;;;;;:::i;:::-;;:::i;64791:687::-;;;;;;:::i;:::-;;:::i;60975:133::-;;;:::i;38660:154::-;;;;;;:::i;:::-;;:::i;57873:81::-;;;:::i;32437:21::-;;;:::i;55220:164::-;;;:::i;56794:444::-;34254:12;:10;:12::i;:::-;-1:-1:-1;;;;;34240:26:0;:10;-1:-1:-1;;;;;34240:26:0;;34232:50;;;;-1:-1:-1;;;34232:50:0;;;;;;;:::i;:::-;;;;;;;;;56886:4:::1;::::0;-1:-1:-1;;;;;56868:23:0;;::::1;56886:4:::0;::::1;56868:23;;56860:41;;;;-1:-1:-1::0;;;56860:41:0::1;;;;;;;:::i;:::-;56938:5;::::0;-1:-1:-1;;;;;56920:24:0;;::::1;56938:5:::0;::::1;56920:24;;56912:44;;;;-1:-1:-1::0;;;56912:44:0::1;;;;;;;:::i;:::-;56969:33;57005:17;:15;:17::i;:::-;56969:53;;57038:9;57033:102;57053:16;:23;57049:1;:27;57033:102;;;57101:16;57118:1;57101:19;;;;;;;;;;;;;;-1:-1:-1::0;;;;;57091:29:0::1;:6;-1:-1:-1::0;;;;;57091:29:0::1;;;57083:52;;;;-1:-1:-1::0;;;57083:52:0::1;;;;;;;:::i;:::-;57078:3;;57033:102;;;;57148:82;57176:12;:10;:12::i;:::-;57190:39;::::0;-1:-1:-1;;;57190:39:0;;-1:-1:-1;;;;;57190:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;57223:4:::1;::::0;57190:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57148:27:0;::::1;::::0;:82;:27:::1;:82::i;:::-;34293:1;56794:444:::0;:::o;30618:25::-;;;;;;;;;;;;;;;-1:-1:-1;;30618:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60549:163::-;60687:4;;60664:38;;;-1:-1:-1;;;60664:38:0;;;;60597:13;;-1:-1:-1;;;;;60687:4:0;;60664:36;;:38;;;;;60687:4;;60664:38;;;;;;;60687:4;60664:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60664:38:0;;;;;;;;;;;;:::i;:::-;60637:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;60623:81;;60549:163;:::o;58566:26::-;;;;;;;;;:::o;39940:175::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;40025:13:::1;:30:::0;;;40071:36:::1;::::0;::::1;::::0;::::1;::::0;40041:14;;40071:36:::1;:::i;:::-;;;;;;;;39940:175:::0;:::o;60838:129::-;60919:14;;60911:48;;-1:-1:-1;;;60911:48:0;;60884:7;;-1:-1:-1;;;;;60919:14:0;;60911:33;;:48;;60953:4;;60911:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60904:55;;60838:129;:::o;65547:82::-;65586:42;65547:82;:::o;58599:25::-;;;;;;;;;:::o;33808:28::-;;;;:::o;32556:18::-;;;-1:-1:-1;;;;;32556:18:0;;:::o;32465:25::-;;;-1:-1:-1;;;;;32465:25:0;;:::o;42613:148::-;42678:5;;:31;;-1:-1:-1;;;42678:31:0;;42654:4;;;;-1:-1:-1;;;;;42678:5:0;;;;:16;;:31;;42703:4;;42678:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;:45;:75;;;;42752:1;42727:22;:20;:22::i;:::-;:26;42671:82;;42613:148;:::o;58720:20::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58720:20:0;;-1:-1:-1;58720:20:0;:::o;30928:91::-;30997:14;;;;;;;;;;;;-1:-1:-1;;;30997:14:0;;;;30928:91;:::o;58326:85::-;58368:42;58326:85;:::o;33444:29::-;;;;:::o;53374:515::-;53489:5;;53433:13;;-1:-1:-1;;;;;53489:5:0;53467:10;:28;53459:47;;;;-1:-1:-1;;;53459:47:0;;;;;;;:::i;:::-;53592:19;53645:32;53663:13;53645:17;:32::i;:::-;53769:4;;53622:55;;-1:-1:-1;53622:55:0;;-1:-1:-1;53769:42:0;;-1:-1:-1;;;;;53769:4:0;53787:10;53622:55;53769:17;:42::i;:::-;53374:515;;;;:::o;58050:82::-;58089:42;58050:82;:::o;60325:216::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;60426:14:::1;::::0;60418:48:::1;::::0;-1:-1:-1;;;60418:48:0;;60401:14:::1;::::0;-1:-1:-1;;;;;60426:14:0::1;::::0;60418:33:::1;::::0;:48:::1;::::0;60460:4:::1;::::0;60418:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60485:14;::::0;60518::::1;::::0;60477:56:::1;::::0;-1:-1:-1;;;60477:56:0;;60401:65;;-1:-1:-1;;;;;;60485:14:0;;::::1;::::0;60477:32:::1;::::0;:56:::1;::::0;60401:65;;60485:14:::1;60518::::0;::::1;;;::::0;60477:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;59710:104::-:0;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;59767:15:::1;:13;:15::i;:::-;59793:13;:11;:13::i;:::-;59710:104::o:0;37989:154::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;38067:14:::1;:23:::0;;;38106:29:::1;::::0;::::1;::::0;::::1;::::0;38084:6;;38106:29:::1;:::i;57961:82::-:0;58000:42;57961:82;:::o;57784:::-;57823:42;57784:82;:::o;58232:87::-;58276:42;58232:87;:::o;47366:170::-;34380:6;;-1:-1:-1;;;;;34380:6:0;34366:10;:20;;:65;;-1:-1:-1;34421:10:0;;-1:-1:-1;;;;;34421:10:0;34407;:24;34366:65;:112;;;;34466:12;:10;:12::i;:::-;-1:-1:-1;;;;;34452:26:0;:10;-1:-1:-1;;;;;34452:26:0;;34366:112;:163;;;;34513:5;;;;;;;;;-1:-1:-1;;;;;34513:5:0;-1:-1:-1;;;;;34513:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34499:30:0;:10;-1:-1:-1;;;;;34499:30:0;;34366:163;:216;;;;34564:5;;;;;;;;;-1:-1:-1;;;;;34564:5:0;-1:-1:-1;;;;;34564:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34550:32:0;:10;-1:-1:-1;;;;;34550:32:0;;34366:216;34344:277;;;;-1:-1:-1;;;34344:277:0;;;;;;;:::i;:::-;47504:5:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;47504:23:0;;;;47489:39:::1;::::0;-1:-1:-1;;;;;47504:5:0::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47489:14;:39::i;51759:1371::-:0;34380:6;;-1:-1:-1;;;;;34380:6:0;34366:10;:20;;:65;;-1:-1:-1;34421:10:0;;-1:-1:-1;;;;;34421:10:0;34407;:24;34366:65;:112;;;;34466:12;:10;:12::i;:::-;-1:-1:-1;;;;;34452:26:0;:10;-1:-1:-1;;;;;34452:26:0;;34366:112;:163;;;;34513:5;;;;;;;;;-1:-1:-1;;;;;34513:5:0;-1:-1:-1;;;;;34513:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34499:30:0;:10;-1:-1:-1;;;;;34499:30:0;;34366:163;:216;;;;34564:5;;;;;;;;;-1:-1:-1;;;;;34564:5:0;-1:-1:-1;;;;;34564:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34550:32:0;:10;-1:-1:-1;;;;;34550:32:0;;34366:216;34344:277;;;;-1:-1:-1;;;34344:277:0;;;;;;;:::i;:::-;51810:14:::1;51839:12:::0;51866:23:::1;51892:5;;;;;;;;;-1:-1:-1::0;;;;;51892:5:0::1;-1:-1:-1::0;;;;;51892:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51964:13;::::0;51866:49;;-1:-1:-1;51926:19:0::1;::::0;51964:13:::1;;51960:731;;;52046:19;52068:22;:20;:22::i;:::-;52046:44;;52224:80;52256:15;52242:11;:29;:61;;52288:15;52242:61;;;52274:11;52242:61;52224:17;:80::i;:::-;52202:102:::0;-1:-1:-1;52202:102:0;-1:-1:-1;52382:29:0;;::::1;52378:159;;;52441:32;:11:::0;52457:15;52441::::1;:32::i;:::-;52432:41;;52506:15;52492:29;;52378:159;51960:731;;;;52649:30;52663:15;52649:13;:30::i;:::-;52619:60:::0;;-1:-1:-1;52619:60:0;-1:-1:-1;52619:60:0;-1:-1:-1;51960:731:0::1;52905:5;::::0;:39:::1;::::0;-1:-1:-1;;;52905:39:0;;-1:-1:-1;;;;;52905:5:0;;::::1;::::0;:12:::1;::::0;:39:::1;::::0;52918:6;;52926:4;;52932:11;;52905:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52887:57;;53020:31;53035:15;53020:14;:31::i;:::-;53069:53;53079:6;53087:4;53093:11;53106:15;53069:53;;;;;;;;;:::i;:::-;;;;;;;;34632:1;;;;51759:1371::o:0;57424:83::-;57464:42;57424:83;:::o;33887:25::-;;;;;;:::o;65724:27::-;;;;;;;;;;67970:120;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;68053:29:::1;68068:8;68078:3;68053:14;:29::i;46751:286::-:0;46819:4;46751:286;;;;:::o;57696:81::-;57734:42;57696:81;:::o;58655:29::-;;;-1:-1:-1;;;;;58655:29:0;;:::o;58691:20::-;;;-1:-1:-1;;;;;58691:20:0;;:::o;36746:174::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36825:21:0;::::1;36817:30;;;::::0;::::1;;36858:6;:16:::0;;-1:-1:-1;;;;;;36858:16:0::1;-1:-1:-1::0;;;;;36858:16:0;::::1;;::::0;;36890:22:::1;::::0;::::1;::::0;::::1;::::0;36858:16;;36890:22:::1;:::i;40418:171::-:0;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;40507:26:::1;:11;40521:12:::0;;40507:26:::1;:::i;:::-;;40549:32;40568:12;;40549:32;;;;;;;:::i;:::-;;;;;;;;40418:171:::0;;:::o;65636:81::-;65674:42;65636:81;:::o;58747:22::-;;;;:::o;59929:128::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;60021:4:::1;60010:3;60014;60010:8;;;;;;;;;;;;;;;;:15;;;;;-1:-1:-1::0;;;;;60010:15:0::1;;;;;-1:-1:-1::0;;;;;60010:15:0::1;;;;;;60036:13;:11;:13::i;60197:120::-:0;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;60279:13:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;60279:30:0;;::::1;::::0;;;::::1;::::0;;60197:120::o;33630:27::-;;;;:::o;32335:94::-;32393:7;32335:94;:::o;39214:169::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;39297:12:::1;:28:::0;;;39341:34:::1;::::0;::::1;::::0;::::1;::::0;39312:13;;39341:34:::1;:::i;58514:43::-:0;58552:5;58514:43;:::o;57608:81::-;57646:42;57608:81;:::o;59822:99::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;59895:7:::1;:18:::0;59822:99::o;33293:29::-;;;;:::o;58418:87::-;58462:42;58418:87;:::o;32497:22::-;;;-1:-1:-1;;;;;32497:22:0;;:::o;32526:21::-;;;-1:-1:-1;;;;;32526:21:0;;:::o;58631:17::-;;;;:::o;60720:110::-;60793:4;;:29;;-1:-1:-1;;;60793:29:0;;60766:7;;-1:-1:-1;;;;;60793:4:0;;:14;;:29;;60816:4;;60793:29;;;:::i;58141:84::-;58182:42;58141:84;:::o;57514:85::-;57556:42;57514:85;:::o;60065:124::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;60149:14:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;60149:32:0;;::::1;::::0;;;::::1;::::0;;60065:124::o;35990:202::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36077:25:0;::::1;36069:34;;;::::0;::::1;;36114:10;:24:::0;;-1:-1:-1;;;;;;36114:24:0::1;-1:-1:-1::0;;;;;36114:24:0;::::1;;::::0;;36154:30:::1;::::0;::::1;::::0;::::1;::::0;36114:24;;36154:30:::1;:::i;54480:311::-:0;54569:5;;-1:-1:-1;;;;;54569:5:0;54547:10;:28;;:58;;;54593:12;:10;:12::i;:::-;-1:-1:-1;;;;;54579:26:0;:10;-1:-1:-1;;;;;54579:26:0;;54547:58;54539:67;;;;;;54663:5;;54625:34;;;-1:-1:-1;;;54625:34:0;;;;-1:-1:-1;;;;;54663:5:0;;;;54625:32;;;;;:34;;;;;;;;;;;;;;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54625:43:0;;54617:52;;;;;;54680:30;54697:12;54680:16;:30::i;:::-;54753:4;;:29;;-1:-1:-1;;;54753:29:0;;54721:62;;54739:12;;-1:-1:-1;;;;;54753:4:0;;;;:14;;:29;;54776:4;;54753:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54721:4;;-1:-1:-1;;;;;54721:4:0;;:62;:17;:62::i;:::-;54480:311;:::o;37209:263::-;34141:10;;-1:-1:-1;;;;;34141:10:0;34127;:24;34119:48;;;;-1:-1:-1;;;34119:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37290:22:0;::::1;37282:31;;;::::0;::::1;;37324:5;::::0;37338:7:::1;::::0;37324:25:::1;::::0;-1:-1:-1;;;37324:25:0;;-1:-1:-1;;;;;37324:5:0;;::::1;::::0;:13:::1;::::0;:25:::1;::::0;37338:7;::::1;::::0;37324:5:::1;::::0;:25:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;37360:7:0::1;:18:::0;;-1:-1:-1;;;;;;37360:18:0::1;-1:-1:-1::0;;;;;37360:18:0;;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;37389:5:0;:35:::1;::::0;-1:-1:-1;;;37389:35:0;;:5;;::::1;::::0;:13:::1;::::0;:35:::1;::::0;37403:7;::::1;::::0;-1:-1:-1;;37420:2:0;37389:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37440:24;37455:8;37440:24;;;;;;:::i;64791:687::-:0;64863:4;64880:28;;:::i;:::-;64911:5;;:31;;-1:-1:-1;;;64911:31:0;;-1:-1:-1;;;;;64911:5:0;;;;:16;;:31;;64936:4;;64911:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64880:62;;64959:6;:17;;;64980:1;64959:22;64955:40;;;64990:5;64983:12;;;;;64955:40;65053:14;;65032:17;;;;65012:38;;:15;;:19;:38::i;:::-;:55;65008:73;;;65076:5;65069:12;;;;;65008:73;65140:14;;65118:17;;;;65098:38;;:15;;:19;:38::i;:::-;:56;65094:73;;65163:4;65156:11;;;;;65094:73;65202:5;;:23;;;-1:-1:-1;;;65202:23:0;;;;65180:19;;-1:-1:-1;;;;;65202:5:0;;:21;;:23;;;;;;;;;;;;;;:5;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65180:45;;65254:13;;65240:11;:27;65236:44;;;65276:4;65269:11;;;;;;65236:44;65293:13;65309:22;:20;:22::i;:::-;65293:38;;65373:6;:16;;;65346:24;65356:13;;65346:5;:9;;:24;;;;:::i;:::-;:43;65342:60;;;65398:4;65391:11;;;;;;;65342:60;65452:17;:15;:17::i;:::-;65423:12;;:26;;65440:8;65423:16;:26::i;:::-;:46;;64791:687;-1:-1:-1;;;;;64791:687:0:o;60975:133::-;61037:7;61064:36;61084:15;:13;:15::i;:::-;61064;:13;:15::i;:::-;:19;;:36::i;38660:154::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;38738:14:::1;:23:::0;;;38777:29:::1;::::0;::::1;::::0;::::1;::::0;38755:6;;38777:29:::1;:::i;57873:81::-:0;57911:42;57873:81;:::o;32437:21::-;;;-1:-1:-1;;;;;32437:21:0;;:::o;55220:164::-;33998:10;;-1:-1:-1;;;;;33998:10:0;33984;:24;;:54;;;34026:12;:10;:12::i;:::-;-1:-1:-1;;;;;34012:26:0;:10;-1:-1:-1;;;;;34012:26:0;;33984:54;33976:78;;;;-1:-1:-1;;;33976:78:0;;;;;;;:::i;:::-;55283:13:::1;:20:::0;;-1:-1:-1;;55283:20:0::1;55299:4;55283:20:::0;;::::1;::::0;;;55314:5;:22:::1;::::0;;-1:-1:-1;;;55314:22:0;;;;-1:-1:-1;;;;;55314:5:0;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;55283:13:::1;::::0;55314:22;;;;;;;;55283:13;55314:5;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55354:22:0::1;::::0;::::1;::::0;-1:-1:-1;55354:22:0;;-1:-1:-1;55354:22:0::1;55220:164::o:0;22855:622::-;23225:10;;;23224:62;;-1:-1:-1;23241:39:0;;-1:-1:-1;;;23241:39:0;;-1:-1:-1;;;;;23241:15:0;;;;;:39;;23265:4;;23272:7;;23241:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23224:62;23216:152;;;;-1:-1:-1;;;23216:152:0;;;;;;;:::i;:::-;23379:90;23399:5;23429:22;;;23453:7;23462:5;23406:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23406:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;23406:62:0;-1:-1:-1;;;;;;23406:62:0;;;;;;;;;;23379:19;:90::i;:::-;22855:622;;;:::o;59458:244::-;57734:42;-1:-1:-1;;;;;59509:19:0;;59529:3;59533:1;59529:6;;;;;;;;;;;;;;;;;59509:30;;-1:-1:-1;;;;;;59509:30:0;;;;;;;;;-1:-1:-1;;;;;59529:6:0;;;;;59509:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57734:42;-1:-1:-1;;;;;59550:19:0;;59570:3;59574:1;59570:6;;;;;;;;;;;;;;;;;;59550:46;;-1:-1:-1;;;;;;59550:46:0;;;;;;;;;-1:-1:-1;;;;;59570:6:0;;-1:-1:-1;;59578:17:0;59550:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57646:42;-1:-1:-1;;;;;59607:19:0;;59627:3;59631:1;59627:6;;;;;;;;;;;;;;;;;59607:30;;-1:-1:-1;;;;;;59607:30:0;;;;;;;;;-1:-1:-1;;;;;59627:6:0;;;;;59607:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57646:42;-1:-1:-1;;;;;59648:19:0;;59668:3;59672:1;59668:6;;;;;;;;;;;;;;;;;;59648:46;;-1:-1:-1;;;;;;59648:46:0;;;;;;;;;-1:-1:-1;;;;;59668:6:0;;-1:-1:-1;;59676:17:0;59648:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8462:196::-;8565:12;8597:53;8620:6;8628:4;8634:1;8637:12;8597:22;:53::i;:::-;8590:60;8462:196;-1:-1:-1;;;;8462:196:0:o;40743:98::-;40815:5;;:18;;;-1:-1:-1;;;40815:18:0;;;;40788:7;;-1:-1:-1;;;;;40815:5:0;;:16;;:18;;;;;;;;;;;;;;:5;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70307:296::-;70465:16;;;70479:1;70465:16;;;;;;;;;70402;;;;70465;;;;70402;;70465;;;;;-1:-1:-1;70465:16:0;70436:45;;57734:42;70492:9;70502:1;70492:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;70492:18:0;;;-1:-1:-1;;;;;70492:18:0;;;;;57646:42;70521:9;70531:1;70521:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;70521:18:0;;;-1:-1:-1;;;;;70521:18:0;;;;;65674:42;70550:9;70560:1;70550:12;;;;;;;;-1:-1:-1;;;;;70550:18:0;;;:12;;;;;;;;;;;:18;70586:9;-1:-1:-1;70307:296:0;:::o;22196:177::-;22279:86;22299:5;22329:23;;;22354:2;22358:5;22306:58;;;;;;;;;:::i;61678:581::-;61782:25;61809:13;61840:16;61859:15;:13;:15::i;:::-;61840:34;;61900:13;61889:8;:24;61885:367;;;61950:42;61964:27;:13;61982:8;61964:17;:27::i;:::-;61950:13;:42::i;:::-;61930:62;-1:-1:-1;62027:31:0;61930:62;62049:8;62027:21;:31::i;:::-;62007:51;-1:-1:-1;62081:36:0;:13;62007:51;62081:17;:36::i;:::-;62073:44;;61885:367;;;62227:13;62207:33;;61885:367;61678:581;;;;:::o;59006:444::-;59051:4;;:24;;-1:-1:-1;;;59051:24:0;;-1:-1:-1;;;;;59051:4:0;;;;:12;;:24;;57556:42;;59051:4;;:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59086:4:0;;:40;;-1:-1:-1;;;59086:40:0;;-1:-1:-1;;;;;59086:4:0;;;;:12;;:40;;57556:42;;-1:-1:-1;;59108:17:0;59086:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59161:5:0;;59137:33;;57911:42;;-1:-1:-1;;;;;59161:5:0;;59137:23;:33::i;:::-;59205:5;;59181:49;;57911:42;;-1:-1:-1;;;;;59205:5:0;-1:-1:-1;;59181:23:0;:49::i;:::-;59266:5;;59241:34;;58000:42;;-1:-1:-1;;;;;59266:5:0;;59241:24;:34::i;:::-;59311:5;;59286:50;;58000:42;;-1:-1:-1;;;;;59311:5:0;-1:-1:-1;;59286:24:0;:50::i;:::-;59372:5;;59347:34;;58089:42;;-1:-1:-1;;;;;59372:5:0;;59347:24;:34::i;:::-;59417:5;;59392:50;;58089:42;;-1:-1:-1;;;;;59417:5:0;-1:-1:-1;;59392:24:0;:50::i;66676:177::-;66728:19;:17;:19::i;:::-;65674:42;-1:-1:-1;;;;;66758:19:0;;66778:3;66782:1;66778:6;;;;;;;;;;;;;;;;;66758:30;;-1:-1:-1;;;;;;66758:30:0;;;;;;;;;-1:-1:-1;;;;;66778:6:0;;;;;66758:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;65674:42;-1:-1:-1;;;;;66799:19:0;;66819:3;66823:1;66819:6;;;;;;;61116:261;61199:13;;;;61195:26;;;61214:7;;61195:26;61247:4;;:29;;-1:-1:-1;;;61247:29:0;;61231:13;;-1:-1:-1;;;;;61247:4:0;;:14;;:29;;61270:4;;61247:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61231:45;-1:-1:-1;61291:9:0;;61287:83;;61342:2;;61317:41;;-1:-1:-1;;;61317:41:0;;57556:42;;61317:24;;:41;;61342:2;61346:5;;61353:4;;61317:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14966:136::-;15024:7;15051:43;15055:1;15058;15051:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;15044:50;;14966:136;;;;;:::o;68098:2201::-;68215:15;68245:13;68273:20;68321:11;68335:15;:13;:15::i;:::-;68369:14;;68410:13;;68361:63;;-1:-1:-1;;;68361:63:0;;68321:29;;-1:-1:-1;;;;;;68369:14:0;;;;68361:33;;:63;;68403:4;;68410:13;;;;;;68361:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;68450:36:0;;-1:-1:-1;;;68450:36:0;;68435:12;;57734:42;;68450:21;;:36;;68480:4;;68450:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68435:51;-1:-1:-1;68501:8:0;;68497:313;;68533:16;68544:4;68533:10;:16::i;:::-;68590;;;68604:1;68590:16;;;;;;;;;68526:23;;-1:-1:-1;68566:21:0;;68590:16;;;;68566:21;;68590:16;;;;;-1:-1:-1;68590:16:0;68566:40;;57734:42;68621:4;68626:1;68621:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;68621:13:0;;;-1:-1:-1;;;;;68621:13:0;;;;;57823:42;68649:4;68654:1;68649:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;68649:14:0;;;-1:-1:-1;;;;;68649:14:0;;;;;68688:10;68699:1;68688:13;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68688:13:0;68678:4;68683:1;68678:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;68678:23:0;;;-1:-1:-1;;;;;68678:23:0;;;;;68722:3;68726:1;68722:6;;;;;;;;;;;;;;;;;68718:80;;-1:-1:-1;;;68718:80:0;;-1:-1:-1;;;;;68722:6:0;;;;68718:36;;:80;;68755:4;;68773;;68787;;68794:3;;68718:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68718:80:0;;;;;;;;;;;;:::i;:::-;;68497:313;;68835:36;;-1:-1:-1;;;68835:36:0;;68820:12;;57646:42;;68835:21;;:36;;68865:4;;68835:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68820:51;-1:-1:-1;68886:8:0;;68882:273;;68935:16;;;68949:1;68935:16;;;;;;;;;68911:21;;68935:16;;;68911:21;;68935:16;;;;;-1:-1:-1;68935:16:0;68911:40;;57646:42;68966:4;68971:1;68966:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;68966:13:0;;;-1:-1:-1;;;;;68966:13:0;;;;;57823:42;68994:4;68999:1;68994:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;68994:14:0;;;-1:-1:-1;;;;;68994:14:0;;;;;69033:10;69044:1;69033:13;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69033:13:0;69023:4;69028:1;69023:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;69023:23:0;;;-1:-1:-1;;;;;69023:23:0;;;;;69067:3;69071:1;69067:6;;;;;;;;;;;;;;;;;69063:80;;-1:-1:-1;;;69063:80:0;;-1:-1:-1;;;;;69067:6:0;;;;69063:36;;:80;;69100:4;;69118;;69132;;69139:3;;69063:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69063:80:0;;;;;;;;;;;;:::i;:::-;;68882:273;;69180:36;;-1:-1:-1;;;69180:36:0;;69165:12;;65674:42;;69180:21;;:36;;69210:4;;69180:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69165:51;-1:-1:-1;69231:8:0;;69227:273;;69280:16;;;69294:1;69280:16;;;;;;;;;69256:21;;69280:16;;;69256:21;;69280:16;;;;;-1:-1:-1;69280:16:0;69256:40;;65674:42;69311:4;69316:1;69311:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;69311:13:0;;;-1:-1:-1;;;;;69311:13:0;;;;;57823:42;69339:4;69344:1;69339:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;69339:14:0;;;-1:-1:-1;;;;;69339:14:0;;;;;69378:10;69389:1;69378:13;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69378:13:0;69368:4;69373:1;69368:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;69368:23:0;;;-1:-1:-1;;;;;69368:23:0;;;;;69412:3;69416:1;69412:6;;;;;;;;;;;;;;;;;69408:80;;-1:-1:-1;;;69408:80:0;;-1:-1:-1;;;;;69412:6:0;;;;69408:36;;:80;;69445:4;;69463;;69477;;69484:3;;69408:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69408:80:0;;;;;;;;;;;;:::i;:::-;;69227:273;;69525:36;;-1:-1:-1;;;69525:36:0;;69510:12;;57911:42;;69525:21;;:36;;69555:4;;69525:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69588:37;;-1:-1:-1;;;69588:37:0;;69510:51;;-1:-1:-1;69572:13:0;;58000:42;;69588:22;;:37;;69619:4;;69588:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69652;;-1:-1:-1;;;69652:37:0;;69572:53;;-1:-1:-1;69636:13:0;;58089:42;;69652:22;;:37;;69683:4;;69652:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69636:53;;69711:1;69704:4;:8;:21;;;;69724:1;69716:5;:9;69704:21;:34;;;;69737:1;69729:5;:9;69704:34;69700:130;;;69764:5;;69755:63;;;;;;;;69764:5;69755:63;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69755:63:0;;-1:-1:-1;;;;;69764:5:0;;;;69755:29;;:63;;65586:42;;69755:63;;69764:5;69755:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69700:130;69850:4;;:29;;-1:-1:-1;;;69850:29:0;;:41;;69884:6;;-1:-1:-1;;;;;69850:4:0;;;;:14;;:29;;69873:4;;69850:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;:41::i;:::-;69840:51;;69904:11;69918:22;:20;:22::i;:::-;69964:5;;:31;;-1:-1:-1;;;69964:31:0;;69904:36;;-1:-1:-1;69951:10:0;;-1:-1:-1;;;;;69964:5:0;;;;:16;;:31;;69989:4;;69964:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;69951:54;;70028:5;70019:6;:14;70016:94;;;70066:6;70058:5;:14;70050:22;;70097:1;70087:11;;70016:94;70126:20;;70122:170;;70163:31;70177:16;70163:13;:31::i;:::-;;70224:56;70233:16;70251:28;70271:7;70251:15;:13;:15::i;:28::-;70224:8;:56::i;:::-;70209:71;;70122:170;68098:2201;;;;;;;;;;;;;;:::o;67666:296::-;67739:8;67735:220;;57911:42;67765:10;67776:8;67765:20;;;;;;;;;;;;;;;;:26;;;;;-1:-1:-1;;;;;67765:26:0;;;;;-1:-1:-1;;;;;67765:26:0;;;;;;67735:220;;;67822:3;67829:1;67822:8;67818:137;;;58000:42;67847:10;67858:8;67847:20;;;;;;;67818:137;58089:42;67916:10;67927:8;67916:20;;;;;;;;;;;;;;;;:27;;;;;-1:-1:-1;;;;;67916:27:0;;;;;-1:-1:-1;;;;;67916:27:0;;;;;;67666:296;;:::o;62267:185::-;62352:14;;62389;;62344:60;;-1:-1:-1;;;62344:60:0;;-1:-1:-1;;;;;62352:14:0;;;;62344:44;;:60;;62352:14;62389;;;;;;62344:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62415:29;62431:12;62415:15;:29::i;14502:181::-;14560:7;14592:5;;;14616:6;;;;14608:46;;;;-1:-1:-1;;;14608:46:0;;;;;;;:::i;67185:473::-;67244:18;67288:23;:21;:23::i;:::-;67339:36;;-1:-1:-1;;;67339:36:0;;67275;;-1:-1:-1;67324:12:0;;65674:42;;67339:21;;:36;;67369:4;;67339:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67324:51;-1:-1:-1;67390:8:0;;67386:265;;67439:16;;;67453:1;67439:16;;;67415:21;67439:16;;;;;67415:21;67439:16;;;;;;;;;;-1:-1:-1;67439:16:0;67415:40;;65674:42;67470:4;67475:1;67470:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;67470:13:0;;;-1:-1:-1;;;;;67470:13:0;;;;;57823:42;67498:4;67503:1;67498:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;67498:14:0;;;-1:-1:-1;;;;;67498:14:0;;;;;67527:21;67555:3;67559:1;67555:6;;;;;;;;;;;;;;;;;;67551:37;;-1:-1:-1;;;67551:37:0;;-1:-1:-1;;;;;67555:6:0;;;;67551:25;;:37;;67577:4;;67583;;67551:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67551:37:0;;;;;;;;;;;;:::i;:::-;67527:61;;67616:23;67631:4;67636:1;67631:7;;;;;;;;;;;;;;67616:10;:14;;:23;;;;:::i;:::-;67603:36;;67386:265;;;67185:473;;:::o;15856:471::-;15914:7;16159:6;16155:47;;-1:-1:-1;16189:1:0;16182:8;;16155:47;16226:5;;;16230:1;16226;:5;:1;16250:5;;;;;:10;16242:56;;;;-1:-1:-1;;;16242:56:0;;;;;;;:::i;24501:761::-;24925:23;24951:69;24979:4;24951:69;;;;;;;;;;;;;;;;;24959:5;-1:-1:-1;;;;;24951:27:0;;;:69;;;;;:::i;:::-;25035:17;;24925:95;;-1:-1:-1;25035:21:0;25031:224;;25177:10;25166:30;;;;;;;;;;;;:::i;:::-;25158:85;;;;-1:-1:-1;;;25158:85:0;;;;;;;:::i;9839:979::-;9969:12;10002:18;10013:6;10002:10;:18::i;:::-;9994:60;;;;-1:-1:-1;;;9994:60:0;;;;;;;:::i;:::-;10128:12;10142:23;10169:6;-1:-1:-1;;;;;10169:11:0;10189:8;10200:4;10169:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10127:78;;;;10220:7;10216:595;;;10251:10;-1:-1:-1;10244:17:0;;-1:-1:-1;10244:17:0;10216:595;10365:17;;:21;10361:439;;10628:10;10622:17;10689:15;10676:10;10672:2;10668:19;10661:44;10576:148;10771:12;10764:20;;-1:-1:-1;;;10764:20:0;;;;;;;;:::i;61385:285::-;61443:7;61473:34;61482:7;61491:15;:13;:15::i;61473:34::-;61463:44;;61518:12;61533:15;:13;:15::i;:::-;61567:14;;61559:57;;-1:-1:-1;;;61559:57:0;;61518:30;;-1:-1:-1;;;;;;61567:14:0;;61559:41;;:57;;61601:7;;61567:14;;61559:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61634:28;61654:7;61634:15;:13;:15::i;:28::-;61627:35;61385:285;-1:-1:-1;;;61385:285:0:o;15405:192::-;15491:7;15527:12;15519:6;;;;15511:29;;;;-1:-1:-1;;;15511:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;15563:5:0;;;15405:192::o;62714:239::-;62766:7;62786:16;62805:34;58552:5;62805:17;62814:7;;62805:4;:8;;:17;;;;:::i;:::-;:21;;:34::i;:::-;62786:53;-1:-1:-1;62854:12:0;;62850:59;;62868:41;57734:42;57464;62900:8;62868:24;:41::i;:::-;62927:18;:4;62936:8;62927;:18::i;4179:106::-;4237:7;4268:1;4264;:5;:13;;4276:1;4264:13;;;-1:-1:-1;4272:1:0;;4179:106;-1:-1:-1;4179:106:0:o;66895:206::-;66971:35;66993:12;66971:21;:35::i;:::-;67056:36;;-1:-1:-1;;;67056:36:0;;67017:76;;67042:12;;65674:42;;67056:21;;:36;;67086:4;;67056:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65674:42;;67017:76;:24;:76::i;64576:132::-;64634:18;64678:22;:20;:22::i;5347:619::-;5407:4;5875:20;;5718:66;5915:23;;;;;;:42;;-1:-1:-1;;5942:15:0;;;5907:51;-1:-1:-1;;5347:619:0:o;16803:132::-;16861:7;16888:39;16892:1;16895;16888:39;;;;;;;;;;;;;;;;;:3;:39::i;62460:246::-;62574:36;;-1:-1:-1;;;62574:36:0;;62535:76;;62560:12;;57734:42;;62574:21;;:36;;62604:4;;62574:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57734:42;;62535:76;:24;:76::i;:::-;62661:36;;-1:-1:-1;;;62661:36:0;;62622:76;;62647:12;;57646:42;;62661:21;;:36;;62691:4;;62661:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57646:42;;62622:76;:24;:76::i;62961:1607::-;63059:14;;63051:45;;-1:-1:-1;;;63051:45:0;;63016:7;;;;-1:-1:-1;;;;;63059:14:0;;;;63051:30;;:45;;63090:4;;63051:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63036:60;;63202:19;63224:4;63202:26;;63239:17;63259:10;63239:30;;63288:25;63316:10;63288:38;;63345:14;57646:42;-1:-1:-1;;;;;63362:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63345:42;-1:-1:-1;63398:12:0;;63439:29;63345:42;63450:17;63439:10;:29::i;:::-;63423:45;;63530:11;63522:5;:19;63518:417;;;63619:17;63639:22;:11;63655:5;63639:15;:22::i;:::-;63619:42;-1:-1:-1;63706:36:0;63730:11;63706:19;:4;63619:42;63706:8;:19::i;:36::-;63699:43;-1:-1:-1;63792:18:0;63813:21;:9;63827:6;63813:13;:21::i;:::-;63792:42;;63860:10;63853:4;:17;63849:75;;;63898:10;63891:17;;63849:75;63518:417;;;63947:16;63978:8;;63974:253;;64027:16;;;64041:1;64027:16;;;64003:21;64027:16;;;;;64003:21;64027:16;;;;;;;;;;-1:-1:-1;64027:16:0;64003:40;;57734:42;64058:4;64063:1;64058:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;64058:13:0;;;-1:-1:-1;;;;;64058:13:0;;;;;57823:42;64086:4;64091:1;64086:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;64086:14:0;;;-1:-1:-1;;;;;64086:14:0;;;;;64115:24;64146:3;64150:1;64146:6;;;;;;;;;;;;;;;;;;64142:37;;-1:-1:-1;;;64142:37:0;;-1:-1:-1;;;;;64146:6:0;;;;64142:25;;:37;;64168:4;;64174;;64142:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64142:37:0;;;;;;;;;;;;:::i;:::-;64115:64;;64205:7;64213:1;64205:10;;;;;;;;;;;;;;64194:21;;63974:253;;;64239:16;64270:8;;64266:253;;64319:16;;;64333:1;64319:16;;;64295:21;64319:16;;;;;64295:21;64319:16;;;;;;;;;;-1:-1:-1;64319:16:0;64295:40;;57646:42;64350:4;64355:1;64350:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;64350:13:0;;;-1:-1:-1;;;;;64350:13:0;;;;;57823:42;64378:4;64383:1;64378:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;64378:14:0;;;-1:-1:-1;;;;;64378:14:0;;;;;64407:24;64438:3;64442:1;64438:6;;;;;;;;;;;;;;;;;;64434:37;;-1:-1:-1;;;64434:37:0;;-1:-1:-1;;;;;64438:6:0;;;;64434:25;;:37;;64460:4;;64466;;64434:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64434:37:0;;;;;;;;;;;;:::i;:::-;64407:64;;64497:7;64505:1;64497:10;;;;;;;;;;;;;;64486:21;;64266:253;;;64538:22;:8;64551;64538:12;:22::i;:::-;64531:29;;;;;;;;;;;62961:1607;:::o;17431:278::-;17517:7;17552:12;17545:5;17537:28;;;;-1:-1:-1;;;17537:28:0;;;;;;;;:::i;:::-;;17576:9;17592:1;17588;:5;;;;;;;17431:278;-1:-1:-1;;;;;17431:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;4267:241;;4371:2;4359:9;4350:7;4346:23;4342:32;4339:2;;;-1:-1;;4377:12;4339:2;85:6;72:20;97:33;124:5;97:33;:::i;4515:263::-;;4630:2;4618:9;4609:7;4605:23;4601:32;4598:2;;;-1:-1;;4636:12;4598:2;226:6;220:13;238:33;265:5;238:33;:::i;4785:392::-;;4925:2;;4913:9;4904:7;4900:23;4896:32;4893:2;;;-1:-1;;4931:12;4893:2;4982:17;4976:24;5020:18;5012:6;5009:30;5006:2;;;-1:-1;;5042:12;5006:2;5129:22;;422:4;410:17;;406:27;-1:-1;396:2;;-1:-1;;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;:::i;:::-;499:80;:::i;:::-;607:21;;;664:14;;;;639:17;;;753;;;744:27;;;;741:36;-1:-1;738:2;;;-1:-1;;780:12;738:2;-1:-1;806:10;;800:217;825:6;822:1;819:13;800:217;;;4204:13;;893:61;;847:1;840:9;;;;;968:14;;;;996;;800:217;;;-1:-1;5062:99;4887:290;-1:-1;;;;;;;4887:290::o;5184:235::-;;5285:2;5273:9;5264:7;5260:23;5256:32;5253:2;;;-1:-1;;5291:12;5253:2;1108:6;1095:20;1120:30;1144:5;1120:30;:::i;5426:257::-;;5538:2;5526:9;5517:7;5513:23;5509:32;5506:2;;;-1:-1;;5544:12;5506:2;1243:6;1237:13;1255:30;1279:5;1255:30;:::i;5994:367::-;;;6118:2;6106:9;6097:7;6093:23;6089:32;6086:2;;;-1:-1;;6124:12;6086:2;6182:17;6169:31;6220:18;;6212:6;6209:30;6206:2;;;-1:-1;;6242:12;6206:2;6328:6;6317:9;6313:22;;;1602:3;1595:4;1587:6;1583:17;1579:27;1569:2;;-1:-1;;1610:12;1569:2;1653:6;1640:20;6220:18;1672:6;1669:30;1666:2;;;-1:-1;;1702:12;1666:2;1797:3;6118:2;1777:17;1738:6;1763:32;;1760:41;1757:2;;;-1:-1;;1804:12;1757:2;6118;1734:17;;;;;6262:83;;-1:-1;6080:281;;-1:-1;;;;6080:281::o;6368:362::-;;6493:2;6481:9;6472:7;6468:23;6464:32;6461:2;;;-1:-1;;6499:12;6461:2;6550:17;6544:24;6588:18;;6580:6;6577:30;6574:2;;;-1:-1;;6610:12;6574:2;6697:6;6686:9;6682:22;;;1946:3;1939:4;1931:6;1927:17;1923:27;1913:2;;-1:-1;;1954:12;1913:2;1994:6;1988:13;6588:18;29738:6;29735:30;29732:2;;;-1:-1;;29768:12;29732:2;2016:65;29841:9;29822:17;;-1:-1;;29818:33;6493:2;29899:15;2016:65;:::i;:::-;2007:74;;2101:6;2094:5;2087:21;2205:3;6493:2;2196:6;2129;2187:16;;2184:25;2181:2;;;-1:-1;;2212:12;2181:2;2232:39;2264:6;6493:2;2163:5;2159:16;6493:2;2129:6;2125:17;2232:39;:::i;:::-;-1:-1;6630:84;6455:275;-1:-1;;;;6455:275::o;6737:324::-;;6882:3;;6870:9;6861:7;6857:23;6853:33;6850:2;;;-1:-1;;6889:12;6850:2;2481:22;6882:3;2481:22;:::i;:::-;2472:31;;2627:22;4204:13;2577:16;2570:86;2723:2;2792:9;2788:22;4204:13;2723:2;2742:5;2738:16;2731:86;2883:2;2952:9;2948:22;4204:13;2883:2;2902:5;2898:16;2891:86;3051:2;3120:9;3116:22;4204:13;3051:2;3070:5;3066:16;3059:86;3219:3;3289:9;3285:22;4204:13;3219:3;3239:5;3235:16;3228:86;3381:3;3451:9;3447:22;4204:13;3381:3;3401:5;3397:16;3390:86;3542:3;3612:9;3608:22;4204:13;3542:3;3562:5;3558:16;3551:86;3703:3;3773:9;3769:22;4204:13;3703:3;3723:5;3719:16;3712:86;3864:3;;3936:9;3932:22;4204:13;3864:3;3884:5;3880:18;3873:88;;6941:104;;;;6844:217;;;;:::o;7068:241::-;;7172:2;7160:9;7151:7;7147:23;7143:32;7140:2;;;-1:-1;;7178:12;7140:2;-1:-1;4056:20;;7134:175;-1:-1;7134:175::o;7316:263::-;;7431:2;7419:9;7410:7;7406:23;7402:32;7399:2;;;-1:-1;;7437:12;7399:2;-1:-1;4204:13;;7393:186;-1:-1;7393:186::o;7586:366::-;;;7707:2;7695:9;7686:7;7682:23;7678:32;7675:2;;;-1:-1;;7713:12;7675:2;4069:6;4056:20;7765:63;;7865:2;7908:9;7904:22;72:20;97:33;124:5;97:33;:::i;:::-;7873:63;;;;7669:283;;;;;:::o;7959:366::-;;;8080:2;8068:9;8059:7;8055:23;8051:32;8048:2;;;-1:-1;;8086:12;8048:2;-1:-1;;4056:20;;;8238:2;8277:22;;;4056:20;;-1:-1;8042:283::o;8957:690::-;;9150:5;30296:12;31068:6;31063:3;31056:19;31105:4;;31100:3;31096:14;9162:93;;31105:4;9326:5;30046:14;-1:-1;9365:260;9390:6;9387:1;9384:13;9365:260;;;9451:13;;-1:-1;;;;;32119:54;8757:37;;8486:14;;;;30798;;;;5020:18;9405:9;9365:260;;;-1:-1;9631:10;;9081:566;-1:-1;;;;;9081:566::o;16682:271::-;;10627:5;30296:12;10738:52;10783:6;10778:3;10771:4;10764:5;10760:16;10738:52;:::i;:::-;10802:16;;;;;16816:137;-1:-1;;16816:137::o;16960:542::-;;-1:-1;;;13613:11;13606:29;10627:5;30296:12;10738:52;10783:6;13591:1;13658:3;13654:11;10771:4;10764:5;10760:16;10738:52;:::i;:::-;10802:16;;;;13591:1;10802:16;;17197:305;-1:-1;;17197:305::o;17509:222::-;-1:-1;;;;;32119:54;;;;8757:37;;17636:2;17621:18;;17607:124::o;17738:333::-;-1:-1;;;;;32119:54;;;8757:37;;32119:54;;18057:2;18042:18;;8757:37;17893:2;17878:18;;17864:207::o;18078:554::-;-1:-1;;;;;32119:54;;8757:37;;18315:3;18300:19;;18526:2;18511:18;;;10051:21;18078:554;10078:258;30431:4;10100:1;10097:13;10078:258;;;10164:13;;16513:37;;8668:14;;;;30798;;;;10125:1;10118:9;10078:258;;;10082:14;;;;11288:5;18617:3;18606:9;18602:19;11237:58;18286:346;;;;;;:::o;18639:321::-;-1:-1;;;;;32119:54;;;;8757:37;;31916:13;31909:21;18946:2;18931:18;;10421:34;18788:2;18773:18;;18759:201::o;18967:349::-;-1:-1;;;;;32119:54;;;;8757:37;;19302:2;19287:18;;11237:58;19130:2;19115:18;;19101:215::o;19663:210::-;31916:13;;31909:21;10421:34;;19784:2;19769:18;;19755:118::o;20400:330::-;;20557:2;20578:17;20571:47;31068:6;20557:2;20546:9;20542:18;31056:19;33048:6;33043:3;31096:14;20546:9;31096:14;33025:30;33086:16;;;31096:14;33086:16;;;33079:27;;;;29841:9;33465:14;;;-1:-1;;33461:28;11587:39;;;20528:202;-1:-1;20528:202::o;20737:310::-;;20884:2;20905:17;20898:47;11785:5;30296:12;31068:6;20884:2;20873:9;20869:18;31056:19;11879:52;11924:6;31096:14;20873:9;31096:14;20884:2;11905:5;11901:16;11879:52;:::i;:::-;29841:9;33465:14;-1:-1;;33461:28;11943:39;;;;31096:14;11943:39;;20855:192;-1:-1;;20855:192::o;21054:416::-;21254:2;21268:47;;;12586:2;21239:18;;;31056:19;-1:-1;;;31096:14;;;12602:34;12655:12;;;21225:245::o;21477:416::-;21677:2;21691:47;;;12906:1;21662:18;;;31056:19;-1:-1;;;31096:14;;;12921:28;12968:12;;;21648:245::o;21900:416::-;22100:2;22114:47;;;13219:2;22085:18;;;31056:19;13255:29;31096:14;;;13235:50;13304:12;;;22071:245::o;22323:416::-;22523:2;22537:47;;;13904:2;22508:18;;;31056:19;13940:34;31096:14;;;13920:55;-1:-1;;;13995:12;;;13988:25;14032:12;;;22494:245::o;22746:416::-;22946:2;22960:47;;;14283:1;22931:18;;;31056:19;-1:-1;;;31096:14;;;14298:29;14346:12;;;22917:245::o;23169:416::-;23369:2;23383:47;;;14597:1;23354:18;;;31056:19;-1:-1;;;31096:14;;;14612:30;14661:12;;;23340:245::o;23592:416::-;23792:2;23806:47;;;14912:2;23777:18;;;31056:19;14948:31;31096:14;;;14928:52;14999:12;;;23763:245::o;24015:416::-;24215:2;24229:47;;;15250:2;24200:18;;;31056:19;-1:-1;;;31096:14;;;15266:34;15319:12;;;24186:245::o;24438:416::-;24638:2;24652:47;;;15570:2;24623:18;;;31056:19;15606:34;31096:14;;;15586:55;-1:-1;;;15661:12;;;15654:34;15707:12;;;24609:245::o;24861:416::-;25061:2;25075:47;;;15958:2;25046:18;;;31056:19;-1:-1;;;31096:14;;;15974:33;16026:12;;;25032:245::o;25284:416::-;25484:2;25498:47;;;16277:2;25469:18;;;31056:19;16313:34;31096:14;;;16293:55;-1:-1;;;16368:12;;;16361:46;16426:12;;;25455:245::o;25707:222::-;16513:37;;;25834:2;25819:18;;25805:124::o;25936:481::-;;16543:5;16520:3;16513:37;26141:2;26259;26248:9;26244:18;26237:48;26299:108;26141:2;26130:9;26126:18;26393:6;26299:108;:::i;26424:321::-;16513:37;;;31916:13;31909:21;26731:2;26716:18;;10421:34;26573:2;26558:18;;26544:201::o;26752:816::-;;16543:5;16520:3;16513:37;16543:5;27206:2;27195:9;27191:18;16513:37;27041:3;27243:2;27232:9;27228:18;27221:48;27283:108;27041:3;27030:9;27026:19;27377:6;27283:108;:::i;:::-;-1:-1;;;;;32119:54;;;;27470:2;27455:18;;8757:37;-1:-1;27553:3;27538:19;16513:37;27275:116;27012:556;-1:-1;;;27012:556::o;27575:432::-;16513:37;;;27916:2;27901:18;;16513:37;;;;31916:13;31909:21;27993:2;27978:18;;10421:34;27752:2;27737:18;;27723:284::o;28014:444::-;16513:37;;;28361:2;28346:18;;16513:37;;;;28444:2;28429:18;;16513:37;28197:2;28182:18;;28168:290::o;28465:556::-;16513:37;;;28841:2;28826:18;;16513:37;;;;28924:2;28909:18;;16513:37;29007:2;28992:18;;16513:37;28676:3;28661:19;;28647:374::o;29028:256::-;29090:2;29084:9;29116:17;;;29191:18;29176:34;;29212:22;;;29173:62;29170:2;;;29248:1;;29238:12;29170:2;29090;29257:22;29068:216;;-1:-1;29068:216::o;29291:304::-;;29450:18;29442:6;29439:30;29436:2;;;-1:-1;;29472:12;29436:2;-1:-1;29517:4;29505:17;;;29570:15;;29373:222::o;33121:268::-;33186:1;33193:101;33207:6;33204:1;33201:13;33193:101;;;33274:11;;;33268:18;33255:11;;;33248:39;33229:2;33222:10;33193:101;;;33309:6;33306:1;33303:13;33300:2;;;33186:1;33365:6;33360:3;33356:16;33349:27;33300:2;;33170:219;;;:::o;33502:117::-;-1:-1;;;;;32119:54;;33561:35;;33551:2;;33610:1;;33600:12;33626:111;33707:5;31916:13;31909:21;33685:5;33682:32;33672:2;;33728:1;;33718:12
Swarm Source
ipfs://a1802815c471e395d6f08c607426e1094e151e336954978d7f2caad7348292c8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.