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: ybusd.sol contract Strategy is ConvexStable { address[] public pathTarget; constructor(address _vault) public ConvexStable(_vault) { curve = address(0xb6c057591E073249F2D9D88Ba59a46CFC9B59EdB); id = 3; 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[](2); _setPathTarget(0, 0); // crv path target _setPathTarget(1, 0); // cvx path target dex = new address[](2); dex[0] = sushiswap; // crv dex[1] = sushiswap; // cvx _approveDex(); } // >>> approve other rewards on dex // function _approveDex() internal override { super._approveDex(); } // >>> include other rewards // function _migrateRewards(address _newStrategy) internal override { super._migrateRewards(_newStrategy); } // >>> include all other rewards in eth besides _claimableBasicInETH() // function _claimableInETH() internal override view returns (uint256 _claimable) { _claimable = super._claimableInETH(); } 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 _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([_dai, _usdc, _usdt, 0], 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[](2); protected[0] = crv; protected[1] = cvx; 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":"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":"profitFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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
60806040523480156200001157600080fd5b506040516200583d3803806200583d833981016040819052620000349162000ebf565b80806200004481338080620002d1565b505061a8c06006556203f4806007556103e8600881905569d3c21bcecceda1000000600955600f55600d80546001600160a01b03191673b6c057591e073249f2d9d88ba59a46cfc9b59edb1790556003600b819055600a805461ff001916610100179055604051631526fe2760e01b8152600091829173f403c135812408bfbe8713b5a23a04b3d48aae3191631526fe2791620000e591906004016200117d565b60c06040518083038186803b158015620000fe57600080fd5b505afa15801562000113573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000139919062000ee4565b5050600554939550935050506001600160a01b038084169116146200017b5760405162461bcd60e51b8152600401620001729062001031565b60405180910390fd5b600c80546001600160a01b0319166001600160a01b038316179055620001a0620004ad565b604080516002808252606082018352909160208301908036833750508151620001d192601092506020019062000e16565b50620001df60008062000755565b620001ed6001600062000755565b6040805160028082526060820183529091602083019080368337505081516200021e92600e92506020019062000e16565b5073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f600e6000815481106200024357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f600e6001815481106200029557fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055620002c862000835565b505050620011b9565b6005546001600160a01b031615620002fd5760405162461bcd60e51b8152600401620001729062001068565b600180546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b1580156200035a57600080fd5b505afa1580156200036f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000395919062000ebf565b600580546001600160a01b0319166001600160a01b039283161790819055620003cf91168560001962000b47602090811b6200206617901c565b600280546001600160a01b038086166001600160a01b0319928316179092556003805485841690831617908190556004805485851693169290921782556000600681905562015180600755606460085560095560015460405163095ea7b360e01b81529084169363095ea7b393620004509390911691600019910162000fe3565b602060405180830381600087803b1580156200046b57600080fd5b505af115801562000480573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a6919062000f70565b5050505050565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620004f69073f403c135812408bfbe8713b5a23a04b3d48aae319060009060040162000fe3565b602060405180830381600087803b1580156200051157600080fd5b505af115801562000526573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200054c919062000f70565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620005979073f403c135812408bfbe8713b5a23a04b3d48aae31906000199060040162000fe3565b602060405180830381600087803b158015620005b257600080fd5b505af1158015620005c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ed919062000f70565b50600d546200062990736b175474e89094c44da98b954eedeac495271d0f906001600160a01b0316600062000b47602090811b6200206617901c565b600d546200066590736b175474e89094c44da98b954eedeac495271d0f906001600160a01b031660001962000b47602090811b6200206617901c565b600d54620006a09073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b0316600062000b47602090811b6200206617901c565b600d54620006dc9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b031660001962000b47602090811b6200206617901c565b600d54620007179073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316600062000b47602090811b6200206617901c565b600d54620007539073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b031660001962000b47602090811b6200206617901c565b565b80620007b257736b175474e89094c44da98b954eedeac495271d0f601083815481106200077e57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555062000831565b8060011415620007df5773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601083815481106200077e57fe5b73dac17f958d2ee523a2206206994597c13d831ec7601083815481106200080257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b5050565b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e6000815481106200086757fe5b60009182526020822001546040516001600160e01b031960e085901b168152620008a1926001600160a01b03909216919060040162000fe3565b602060405180830381600087803b158015620008bc57600080fd5b505af1158015620008d1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008f7919062000f70565b5073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e6000815481106200092a57fe5b6000918252602090912001546040516001600160e01b031960e084901b16815262000966916001600160a01b0316906000199060040162000fe3565b602060405180830381600087803b1580156200098157600080fd5b505af115801562000996573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009bc919062000f70565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e600181548110620009ef57fe5b60009182526020822001546040516001600160e01b031960e085901b16815262000a29926001600160a01b03909216919060040162000fe3565b602060405180830381600087803b15801562000a4457600080fd5b505af115801562000a59573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a7f919062000f70565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e60018154811062000ab257fe5b6000918252602090912001546040516001600160e01b031960e084901b16815262000aee916001600160a01b0316906000199060040162000fe3565b602060405180830381600087803b15801562000b0957600080fd5b505af115801562000b1e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b44919062000f70565b50565b80158062000bd65750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9062000b80903090869060040162000fc9565b60206040518083038186803b15801562000b9957600080fd5b505afa15801562000bae573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bd4919062000f92565b155b62000bf55760405162461bcd60e51b8152600401620001729062001120565b62000c508363095ea7b360e01b848460405160240162000c1792919062000fe3565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529062000c5516565b505050565b606062000cb1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000cf160201b62002165179092919060201c565b80519091501562000c50578080602001905181019062000cd2919062000f70565b62000c505760405162461bcd60e51b81526004016200017290620010d6565b606062000d02848460008562000d0a565b949350505050565b606062000d178562000ddc565b62000d365760405162461bcd60e51b815260040162000172906200109f565b60006060866001600160a01b0316858760405162000d55919062000fab565b60006040518083038185875af1925050503d806000811462000d94576040519150601f19603f3d011682016040523d82523d6000602084013e62000d99565b606091505b5091509150811562000daf57915062000d029050565b80511562000dc05780518082602001fd5b8360405162461bcd60e51b815260040162000172919062000ffc565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000d02575050151592915050565b82805482825590600052602060002090810192821562000e6e579160200282015b8281111562000e6e57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000e37565b5062000e7c92915062000e80565b5090565b5b8082111562000e7c5780546001600160a01b031916815560010162000e81565b80516001600160a01b038116811462000eb957600080fd5b92915050565b60006020828403121562000ed1578081fd5b62000edd838362000ea1565b9392505050565b60008060008060008060c0878903121562000efd578182fd5b62000f09888862000ea1565b955062000f1a886020890162000ea1565b945062000f2b886040890162000ea1565b935062000f3c886060890162000ea1565b925062000f4d886080890162000ea1565b915060a0870151801515811462000f62578182fd5b809150509295509295509295565b60006020828403121562000f82578081fd5b8151801515811462000edd578182fd5b60006020828403121562000fa4578081fd5b5051919050565b6000825162000fbf81846020870162001186565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b60006020825282518060208401526200101d81604085016020870162001186565b601f01601f19169190910160400192915050565b6020808252601f908201527f636f6e7374727563746f723a20696e636f7272656374206c7020746f6b656e00604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b90815260200190565b60005b83811015620011a357818101518382015260200162001189565b83811115620011b3576000848401525b50505050565b61467480620011c96000396000f3fe608060405234801561001057600080fd5b50600436106103a45760003560e01c80636ea69d62116101e95780639ec5a8941161010f578063ce5494bb116100ad578063f017c92f1161007c578063f017c92f14610679578063f4b9fa751461068c578063fbfa77cf14610694578063fcf2d0ad1461069c576103a4565b8063ce5494bb14610638578063ec38a8621461064b578063ed882c2b1461065e578063efbb5cb014610671576103a4565b8063c1a3d44c116100e9578063c1a3d44c14610602578063c6def0761461060a578063c768780314610612578063c7b9d53014610625576103a4565b80639ec5a894146105ea578063aced1661146105f2578063af640d0f146105fa576103a4565b80638cdfe16611610187578063923c1d6111610156578063923c1d61146105bf578063955383bd146105c757806395e80c50146105da5780639be28785146105e2576103a4565b80638cdfe166146105945780638e6350e21461059c57806391397ab4146105a4578063918f8674146105b7576103a4565b8063750521f5116101c3578063750521f5146105535780637fef901a1461056657806381639eda1461056e5780638516c2c814610581576103a4565b80636ea69d62146105305780637165485d14610538578063748747e614610540576103a4565b80632e1a7d4d116102ce578063440368a31161026c578063565399a01161023b578063565399a0146104ef5780636095dd7b14610502578063650d1880146105155780636a4874a114610528576103a4565b8063440368a3146104cf5780634641257d146104d757806346c96aac146104df5780635641ec03146104e7576103a4565b8063380d0c08116102a8578063380d0c08146104a457806339a172a8146104ac5780633e413bee146104bf5780633fc8cef3146104c7576103a4565b80632e1a7d4d146104815780632f48ab7d1461049457806334659dc51461049c576103a4565b80631d12f28b1161034657806324d16c1a1161031557806324d16c1a1461045657806325829410146104695780632681f7e41461047157806328b7ccf714610479576103a4565b80631d12f28b146104295780631f1fcd51146104315780631fe4a6861461044657806322f3e2d41461044e576103a4565b80630acd095b116103825780630acd095b146103e45780630f969b87146103f9578063115880861461040c5780631c459a7f14610421576103a4565b806301681a62146103a957806303ee438c146103be57806306fdde03146103dc575b600080fd5b6103bc6103b7366004613e40565b6106a4565b005b6103c6610843565b6040516103d3919061429d565b60405180910390f35b6103c66108d1565b6103ec610976565b6040516103d39190614263565b6103bc6104073660046140bc565b610984565b610414610a11565b6040516103d391906144ed565b6103ec610a97565b610414610aa6565b610439610aac565b6040516103d391906141c9565b610439610abb565b6103ec610aca565b6104396104643660046140bc565b610b6b565b6103c6610b92565b610439610bb1565b610414610bc9565b61041461048f3660046140bc565b610bcf565b610439610c2a565b6103bc610c42565b6103bc610da1565b6103bc6104ba3660046140bc565b610e00565b610439610e82565b610439610e9a565b6103bc610eb2565b6103bc6110d9565b610439611443565b6103ec61145b565b6104396104fd3660046140bc565b611464565b6103bc61051036600461411b565b611471565b6103ec6105233660046140bc565b6114c8565b6104396114d0565b6104396114e8565b6104396114f7565b6103bc61054e366004613e40565b611506565b6103bc610561366004613f45565b6115b1565b610414611648565b6103bc61057c3660046140ec565b61164e565b6103bc61058f366004613f0d565b6116df565b610414611748565b61041461174e565b6103bc6105b23660046140bc565b611753565b6104146117d5565b6104396117db565b6103bc6105d53660046140bc565b6117f3565b610414611845565b61043961184b565b610439611863565b610439611872565b610414611881565b610414611887565b6104396118b8565b6103bc610620366004613f0d565b6118d0565b6103bc610633366004613e40565b611937565b6103bc610646366004613e40565b6119e2565b6103bc610659366004613e40565b611b53565b6103ec61066c3660046140bc565b611cea565b610414611ebe565b6103bc6106873660046140bc565b611ed9565b610439611f5b565b610439611f73565b6103bc611f82565b6106ac61217c565b6001600160a01b0316336001600160a01b0316146106e55760405162461bcd60e51b81526004016106dc90614404565b60405180910390fd5b6005546001600160a01b03828116911614156107135760405162461bcd60e51b81526004016106dc906142f5565b6001546001600160a01b03828116911614156107415760405162461bcd60e51b81526004016106dc906143ac565b606061074b6121f9565b905060005b81518110156107a65781818151811061076557fe5b60200260200101516001600160a01b0316836001600160a01b0316141561079e5760405162461bcd60e51b81526004016106dc90614473565b600101610750565b5061083f6107b261217c565b6040516370a0823160e01b81526001600160a01b038516906370a08231906107de9030906004016141c9565b60206040518083038186803b1580156107f657600080fd5b505afa15801561080a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082e91906140d4565b6001600160a01b038516919061229e565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561091657600080fd5b505afa15801561092a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109529190810190613fb2565b604051602001610962919061419b565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b03163314806109b557506109a061217c565b6001600160a01b0316336001600160a01b0316145b6109d15760405162461bcd60e51b81526004016106dc90614404565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610a069083906144ed565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a429030906004016141c9565b60206040518083038186803b158015610a5a57600080fd5b505afa158015610a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9291906140d4565b905090565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610aff9030906004016141c9565b6101206040518083038186803b158015610b1857600080fd5b505afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b50919061403e565b604001511180610a9257506000610b65611ebe565b11905090565b600e8181548110610b7857fe5b6000918252602090912001546001600160a01b0316905081565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610bfc5760405162461bcd60e51b81526004016106dc9061438c565b6000610c07836122bd565b600554909350909150610c24906001600160a01b0316338361229e565b50919050565b73dac17f958d2ee523a2206206994597c13d831ec781565b6002546001600160a01b0316331480610c735750610c5e61217c565b6001600160a01b0316336001600160a01b0316145b610c8f5760405162461bcd60e51b81526004016106dc90614404565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610cc09030906004016141c9565b60206040518083038186803b158015610cd857600080fd5b505afa158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1091906140d4565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610d4f918591610100900460ff169060040161450f565b602060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f9190613f29565b6002546001600160a01b0316331480610dd25750610dbd61217c565b6001600160a01b0316336001600160a01b0316145b610dee5760405162461bcd60e51b81526004016106dc90614404565b610df661230f565b610dfe612555565b565b6002546001600160a01b0316331480610e315750610e1c61217c565b6001600160a01b0316336001600160a01b0316145b610e4d5760405162461bcd60e51b81526004016106dc90614404565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610a069083906144ed565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6004546001600160a01b0316331480610ed557506002546001600160a01b031633145b80610ef85750610ee361217c565b6001600160a01b0316336001600160a01b0316145b80610f995750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4c57600080fd5b505afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f849190613e5c565b6001600160a01b0316336001600160a01b0316145b8061103a5750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610fed57600080fd5b505afa158015611001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110259190613e5c565b6001600160a01b0316336001600160a01b0316145b6110565760405162461bcd60e51b81526004016106dc90614404565b6001546040805163bf3759b560e01b81529051610dfe926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561109c57600080fd5b505afa1580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d491906140d4565b612848565b6004546001600160a01b03163314806110fc57506002546001600160a01b031633145b8061111f575061110a61217c565b6001600160a01b0316336001600160a01b0316145b806111c05750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab9190613e5c565b6001600160a01b0316336001600160a01b0316145b806112615750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190613e5c565b6001600160a01b0316336001600160a01b0316145b61127d5760405162461bcd60e51b81526004016106dc90614404565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d057600080fd5b505afa1580156112e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130891906140d4565b600a5490915060009060ff161561135e576000611323611ebe565b905061133c8382116113355783611337565b815b6122bd565b9450915082821115611358576113528284612971565b94508291505b5061136f565b611367826129bc565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc906113a390879087908690600401614573565b602060405180830381600087803b1580156113bd57600080fd5b505af11580156113d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f591906140d4565b915061140082612848565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516114359493929190614589565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b600a5460ff1681565b60108181548110610b7857fe5b6002546001600160a01b03163314806114a2575061148d61217c565b6001600160a01b0316336001600160a01b0316145b6114be5760405162461bcd60e51b81526004016106dc90614404565b61083f828261328c565b60005b919050565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b0316331480611537575061152261217c565b6001600160a01b0316336001600160a01b0316145b6115535760405162461bcd60e51b81526004016106dc90614404565b6001600160a01b03811661156657600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610a069083906141c9565b6002546001600160a01b03163314806115e257506115cd61217c565b6001600160a01b0316336001600160a01b0316145b6115fe5760405162461bcd60e51b81526004016106dc90614404565b61160a60008383613d61565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda6828260405161163c92919061426e565b60405180910390a15050565b600f5481565b6002546001600160a01b031633148061167f575061166a61217c565b6001600160a01b0316336001600160a01b0316145b61169b5760405162461bcd60e51b81526004016106dc90614404565b80600e83815481106116a957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061083f612555565b6002546001600160a01b031633148061171057506116fb61217c565b6001600160a01b0316336001600160a01b0316145b61172c5760405162461bcd60e51b81526004016106dc90614404565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b0316331480611784575061176f61217c565b6001600160a01b0316336001600160a01b0316145b6117a05760405162461bcd60e51b81526004016106dc90614404565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610a069083906144ed565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b0316331480611824575061180f61217c565b6001600160a01b0316336001600160a01b0316145b6118405760405162461bcd60e51b81526004016106dc90614404565b600f55565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a429030906004016141c9565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b031633148061190157506118ec61217c565b6001600160a01b0316336001600160a01b0316145b61191d5760405162461bcd60e51b81526004016106dc90614404565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611968575061195361217c565b6001600160a01b0316336001600160a01b0316145b6119845760405162461bcd60e51b81526004016106dc90614404565b6001600160a01b03811661199757600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610a069083906141c9565b6001546001600160a01b0316331480611a1357506119fe61217c565b6001600160a01b0316336001600160a01b0316145b611a1c57600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9b9190613e5c565b6001600160a01b031614611aae57600080fd5b611ab781613365565b6005546040516370a0823160e01b8152611b509183916001600160a01b03909116906370a0823190611aed9030906004016141c9565b60206040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906140d4565b6005546001600160a01b0316919061229e565b50565b6002546001600160a01b03163314611b7d5760405162461bcd60e51b81526004016106dc906142d0565b6001600160a01b038116611b9057600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611bc792911690600090600401614212565b602060405180830381600087803b158015611be157600080fd5b505af1158015611bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c199190613f29565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611c689291169060001990600401614212565b602060405180830381600087803b158015611c8257600080fd5b505af1158015611c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cba9190613f29565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610a0691906141c9565b6000611cf4613ddf565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611d249030906004016141c9565b6101206040518083038186803b158015611d3d57600080fd5b505afa158015611d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d75919061403e565b9050806020015160001415611d8e5760009150506114cb565b60065460a0820151611da1904290612971565b1015611db15760009150506114cb565b60075460a0820151611dc4904290612971565b10611dd35760019150506114cb565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015611e1857600080fd5b505afa158015611e2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5091906140d4565b9050600954811115611e67576001925050506114cb565b6000611e71611ebe565b90508260c00151611e8d600954836133db90919063ffffffff16565b1015611e9f57600193505050506114cb565b611ea7613400565b600854611eb4908761340a565b1095945050505050565b6000610a92611ecb610a11565b611ed3611887565b906133db565b6002546001600160a01b0316331480611f0a5750611ef561217c565b6001600160a01b0316336001600160a01b0316145b611f265760405162461bcd60e51b81526004016106dc90614404565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610a069083906144ed565b736b175474e89094c44da98b954eedeac495271d0f81565b6001546001600160a01b031681565b6002546001600160a01b0316331480611fb35750611f9e61217c565b6001600160a01b0316336001600160a01b0316145b611fcf5760405162461bcd60e51b81526004016106dc90614404565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561202357600080fd5b505af1158015612037573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806120ee5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061209c90309086906004016141dd565b60206040518083038186803b1580156120b457600080fd5b505afa1580156120c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ec91906140d4565b155b61210a5760405162461bcd60e51b81526004016106dc90614497565b6121608363095ea7b360e01b8484604051602401612129929190614212565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613444565b505050565b606061217484846000856134d3565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b1580156121c157600080fd5b505afa1580156121d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a929190613e5c565b60408051600280825260608083018452928392919060208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061223f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160018151811061228157fe5b6001600160a01b0390921660209283029190910190910152905090565b6121608363a9059cbb60e01b8484604051602401612129929190614212565b60008060006122ca611887565b905083811015612305576122e66122e18583612971565b613597565b92506122f283826133db565b92506122fe8484612971565b9150612309565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906123569073f403c135812408bfbe8713b5a23a04b3d48aae3190600090600401614212565b602060405180830381600087803b15801561237057600080fd5b505af1158015612384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a89190613f29565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906123f19073f403c135812408bfbe8713b5a23a04b3d48aae319060001990600401614212565b602060405180830381600087803b15801561240b57600080fd5b505af115801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190613f29565b50600d5461247190736b175474e89094c44da98b954eedeac495271d0f906001600160a01b03166000612066565b600d5461249f90736b175474e89094c44da98b954eedeac495271d0f906001600160a01b0316600019612066565b600d546124cc9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b03166000612066565b600d546124fa9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b0316600019612066565b600d546125279073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b03166000612066565b600d54610dfe9073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316600019612066565b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811061258657fe5b60009182526020822001546040516001600160e01b031960e085901b1681526125be926001600160a01b039092169190600401614212565b602060405180830381600087803b1580156125d857600080fd5b505af11580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126109190613f29565b5073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811061264257fe5b6000918252602090912001546040516001600160e01b031960e084901b16815261267c916001600160a01b03169060001990600401614212565b602060405180830381600087803b15801561269657600080fd5b505af11580156126aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ce9190613f29565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e60018154811061270057fe5b60009182526020822001546040516001600160e01b031960e085901b168152612738926001600160a01b039092169190600401614212565b602060405180830381600087803b15801561275257600080fd5b505af1158015612766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278a9190613f29565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e6001815481106127bc57fe5b6000918252602090912001546040516001600160e01b031960e084901b1681526127f6916001600160a01b03169060001990600401614212565b602060405180830381600087803b15801561281057600080fd5b505af1158015612824573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b509190613f29565b600a5460ff161561285857611b50565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906128899030906004016141c9565b60206040518083038186803b1580156128a157600080fd5b505afa1580156128b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d991906140d4565b9050801561083f57600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669161291f9190859060019060040161455b565b602060405180830381600087803b15801561293957600080fd5b505af115801561294d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121609190613f29565b60006129b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061364b565b90505b92915050565b6000806000806129ca611887565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd991612a0a91309162010000900460ff16906004016141f7565b602060405180830381600087803b158015612a2457600080fd5b505af1158015612a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5c9190613f29565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612a979030906004016141c9565b60206040518083038186803b158015612aaf57600080fd5b505afa158015612ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae791906140d4565b90508015612ca057612af881613677565b604080516003808252608082019092529192506060919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612b4057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612b8257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600081548110612bb057fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612bdb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e600081548110612c0957fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991612c4791869186903090429060040161451f565b600060405180830381600087803b158015612c6157600080fd5b505af1158015612c75573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c9d9190810190613e78565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612cda9030906004016141c9565b60206040518083038186803b158015612cf257600080fd5b505afa158015612d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2a91906140d4565b90508015612ed65760408051600380825260808201909252606091602082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110612d7657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612db857fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600181548110612de657fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612e1157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e600181548110612e3f57fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991612e7d91869186903090429060040161451f565b600060405180830381600087803b158015612e9757600080fd5b505af1158015612eab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ed39190810190613e78565b50505b6040516370a0823160e01b8152600090736b175474e89094c44da98b954eedeac495271d0f906370a0823190612f109030906004016141c9565b60206040518083038186803b158015612f2857600080fd5b505afa158015612f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6091906140d4565b6040516370a0823160e01b815290915060009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a0823190612f9d9030906004016141c9565b60206040518083038186803b158015612fb557600080fd5b505afa158015612fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fed91906140d4565b6040516370a0823160e01b815290915060009073dac17f958d2ee523a2206206994597c13d831ec7906370a082319061302a9030906004016141c9565b60206040518083038186803b15801561304257600080fd5b505afa158015613056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307a91906140d4565b9050600083118061308b5750600082115b806130965750600081115b1561311e57600d546040805160808101825285815260208101859052808201849052600060608201819052915162a6cbcd60e21b81526001600160a01b039093169263029b2f34926130eb929160040161422b565b600060405180830381600087803b15801561310557600080fd5b505af1158015613119573d6000803e3d6000fd5b505050505b6005546040516370a0823160e01b81526131aa9188916001600160a01b03909116906370a08231906131549030906004016141c9565b60206040518083038186803b15801561316c57600080fd5b505afa158015613180573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a491906140d4565b90612971565b985060006131b6611ebe565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf823906131ec9030906004016141c9565b6101206040518083038186803b15801561320557600080fd5b505afa158015613219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323d919061403e565b60c0015190508082101561325557818103995060009a505b8b1561327d576132648c613597565b5061327a8c6132758d6131a4611887565b6136e0565b98505b50505050505050509193909250565b806132e657736b175474e89094c44da98b954eedeac495271d0f601083815481106132b357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061083f565b80600114156133115773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601083815481106132b357fe5b73dac17f958d2ee523a2206206994597c13d831ec76010838154811061333357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a2916133a09161010090910460ff1690600401614263565b600060405180830381600087803b1580156133ba57600080fd5b505af11580156133ce573d6000803e3d6000fd5b50505050611b50816136f6565b6000828201838110156129b35760405162461bcd60e51b81526004016106dc90614314565b6000610a92613848565b600082613419575060006129b6565b8282028284828161342657fe5b04146129b35760405162461bcd60e51b81526004016106dc9061434b565b6060613499826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121659092919063ffffffff16565b80519091501561216057808060200190518101906134b79190613f29565b6121605760405162461bcd60e51b81526004016106dc90614429565b60606134de85613cb4565b6134fa5760405162461bcd60e51b81526004016106dc906143cd565b60006060866001600160a01b03168587604051613517919061417f565b60006040518083038185875af1925050503d8060008114613554576040519150601f19603f3d011682016040523d82523d6000602084013e613559565b606091505b5091509150811561356d5791506121749050565b80511561357d5780518082602001fd5b8360405162461bcd60e51b81526004016106dc919061429d565b60006135a582613275610a11565b915060006135b1611887565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e7202906135e590869060009060040161450f565b602060405180830381600087803b1580156135ff57600080fd5b505af1158015613613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136379190613f29565b50613644816131a4611887565b9392505050565b6000818484111561366f5760405162461bcd60e51b81526004016106dc919061429d565b505050900390565b60008061369b612710613695600f548661340a90919063ffffffff16565b90613ced565b905080156136d6576136d673d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a1339348361229e565b6136448382612971565b60008183106136ef57816129b3565b5090919050565b6040516370a0823160e01b815261379f90829073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906137339030906004016141c9565b60206040518083038186803b15801561374b57600080fd5b505afa15801561375f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378391906140d4565b73d533a949740bb3306d119cc777fa900ba034cd52919061229e565b6040516370a0823160e01b8152611b50908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a08231906137dc9030906004016141c9565b60206040518083038186803b1580156137f457600080fd5b505afa158015613808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382c91906140d4565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b919061229e565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc2629061387b9030906004016141c9565b60206040518083038186803b15801561389357600080fd5b505afa1580156138a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cb91906140d4565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561394257600080fd5b505afa158015613956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397a91906140d4565b90506000806139898385613ced565b9050858110156139ce57600061399f8783612971565b90506139af876136958a8461340a565b925060006139bd8786612971565b9050808411156139cb578093505b50505b60008715613b3557604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110613a1857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613a5a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e600081548110613a8a57fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f90613ac5908d9086906004016144f6565b60006040518083038186803b158015613add57600080fd5b505afa158015613af1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613b199190810190613e78565b905080600181518110613b2857fe5b6020026020010151925050505b60008315613c9c576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110613b7f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613bc157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e600181548110613bf157fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f90613c2c90899086906004016144f6565b60006040518083038186803b158015613c4457600080fd5b505afa158015613c58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c809190810190613e78565b905080600181518110613c8f57fe5b6020026020010151925050505b613ca682826133db565b995050505050505050505090565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612174575050151592915050565b60006129b383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183613d4b5760405162461bcd60e51b81526004016106dc919061429d565b506000838581613d5757fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613da25782800160ff19823516178555613dcf565b82800160010185558215613dcf579182015b82811115613dcf578235825591602001919060010190613db4565b50613ddb929150613e2b565b5090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613ddb5760008155600101613e2c565b600060208284031215613e51578081fd5b81356129b38161461b565b600060208284031215613e6d578081fd5b81516129b38161461b565b60006020808385031215613e8a578182fd5b825167ffffffffffffffff811115613ea0578283fd5b8301601f81018513613eb0578283fd5b8051613ec3613ebe826145cb565b6145a4565b8181528381019083850185840285018601891015613edf578687fd5b8694505b83851015613f01578051835260019490940193918501918501613ee3565b50979650505050505050565b600060208284031215613f1e578081fd5b81356129b381614630565b600060208284031215613f3a578081fd5b81516129b381614630565b60008060208385031215613f57578081fd5b823567ffffffffffffffff80821115613f6e578283fd5b818501915085601f830112613f81578283fd5b813581811115613f8f578384fd5b866020828501011115613fa0578384fd5b60209290920196919550909350505050565b600060208284031215613fc3578081fd5b815167ffffffffffffffff80821115613fda578283fd5b818401915084601f830112613fed578283fd5b815181811115613ffb578384fd5b61400e601f8201601f19166020016145a4565b9150808252856020828501011115614024578384fd5b6140358160208401602086016145eb565b50949350505050565b6000610120808385031215614051578182fd5b61405a816145a4565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156140cd578081fd5b5035919050565b6000602082840312156140e5578081fd5b5051919050565b600080604083850312156140fe578182fd5b8235915060208301356141108161461b565b809150509250929050565b6000806040838503121561412d578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156141745781516001600160a01b03168752958201959082019060010161414f565b509495945050505050565b600082516141918184602087016145eb565b9190910192915050565b600065086dedceccaf60d31b825282516141bc8160068501602087016145eb565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b60a08101818460005b6004811015614253578151835260209283019290910190600101614234565b5050508260808301529392505050565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b60006020825282518060208401526142bc8160408501602087016145eb565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b600083825260406020830152612174604083018461413c565b9182521515602082015260400190565b600086825285602083015260a0604083015261453e60a083018661413c565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff811182821017156145c357600080fd5b604052919050565b600067ffffffffffffffff8211156145e1578081fd5b5060209081020190565b60005b838110156146065781810151838201526020016145ee565b83811115614615576000848401525b50505050565b6001600160a01b0381168114611b5057600080fd5b8015158114611b5057600080fdfea2646970667358221220e7c125249560d6c3b057dd673aabb44c21b10750b8fdfac78663b0ad94abdfe564736f6c634300060c00330000000000000000000000008ee57c05741aa9db947a744e713c15d4d19d8822
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103a45760003560e01c80636ea69d62116101e95780639ec5a8941161010f578063ce5494bb116100ad578063f017c92f1161007c578063f017c92f14610679578063f4b9fa751461068c578063fbfa77cf14610694578063fcf2d0ad1461069c576103a4565b8063ce5494bb14610638578063ec38a8621461064b578063ed882c2b1461065e578063efbb5cb014610671576103a4565b8063c1a3d44c116100e9578063c1a3d44c14610602578063c6def0761461060a578063c768780314610612578063c7b9d53014610625576103a4565b80639ec5a894146105ea578063aced1661146105f2578063af640d0f146105fa576103a4565b80638cdfe16611610187578063923c1d6111610156578063923c1d61146105bf578063955383bd146105c757806395e80c50146105da5780639be28785146105e2576103a4565b80638cdfe166146105945780638e6350e21461059c57806391397ab4146105a4578063918f8674146105b7576103a4565b8063750521f5116101c3578063750521f5146105535780637fef901a1461056657806381639eda1461056e5780638516c2c814610581576103a4565b80636ea69d62146105305780637165485d14610538578063748747e614610540576103a4565b80632e1a7d4d116102ce578063440368a31161026c578063565399a01161023b578063565399a0146104ef5780636095dd7b14610502578063650d1880146105155780636a4874a114610528576103a4565b8063440368a3146104cf5780634641257d146104d757806346c96aac146104df5780635641ec03146104e7576103a4565b8063380d0c08116102a8578063380d0c08146104a457806339a172a8146104ac5780633e413bee146104bf5780633fc8cef3146104c7576103a4565b80632e1a7d4d146104815780632f48ab7d1461049457806334659dc51461049c576103a4565b80631d12f28b1161034657806324d16c1a1161031557806324d16c1a1461045657806325829410146104695780632681f7e41461047157806328b7ccf714610479576103a4565b80631d12f28b146104295780631f1fcd51146104315780631fe4a6861461044657806322f3e2d41461044e576103a4565b80630acd095b116103825780630acd095b146103e45780630f969b87146103f9578063115880861461040c5780631c459a7f14610421576103a4565b806301681a62146103a957806303ee438c146103be57806306fdde03146103dc575b600080fd5b6103bc6103b7366004613e40565b6106a4565b005b6103c6610843565b6040516103d3919061429d565b60405180910390f35b6103c66108d1565b6103ec610976565b6040516103d39190614263565b6103bc6104073660046140bc565b610984565b610414610a11565b6040516103d391906144ed565b6103ec610a97565b610414610aa6565b610439610aac565b6040516103d391906141c9565b610439610abb565b6103ec610aca565b6104396104643660046140bc565b610b6b565b6103c6610b92565b610439610bb1565b610414610bc9565b61041461048f3660046140bc565b610bcf565b610439610c2a565b6103bc610c42565b6103bc610da1565b6103bc6104ba3660046140bc565b610e00565b610439610e82565b610439610e9a565b6103bc610eb2565b6103bc6110d9565b610439611443565b6103ec61145b565b6104396104fd3660046140bc565b611464565b6103bc61051036600461411b565b611471565b6103ec6105233660046140bc565b6114c8565b6104396114d0565b6104396114e8565b6104396114f7565b6103bc61054e366004613e40565b611506565b6103bc610561366004613f45565b6115b1565b610414611648565b6103bc61057c3660046140ec565b61164e565b6103bc61058f366004613f0d565b6116df565b610414611748565b61041461174e565b6103bc6105b23660046140bc565b611753565b6104146117d5565b6104396117db565b6103bc6105d53660046140bc565b6117f3565b610414611845565b61043961184b565b610439611863565b610439611872565b610414611881565b610414611887565b6104396118b8565b6103bc610620366004613f0d565b6118d0565b6103bc610633366004613e40565b611937565b6103bc610646366004613e40565b6119e2565b6103bc610659366004613e40565b611b53565b6103ec61066c3660046140bc565b611cea565b610414611ebe565b6103bc6106873660046140bc565b611ed9565b610439611f5b565b610439611f73565b6103bc611f82565b6106ac61217c565b6001600160a01b0316336001600160a01b0316146106e55760405162461bcd60e51b81526004016106dc90614404565b60405180910390fd5b6005546001600160a01b03828116911614156107135760405162461bcd60e51b81526004016106dc906142f5565b6001546001600160a01b03828116911614156107415760405162461bcd60e51b81526004016106dc906143ac565b606061074b6121f9565b905060005b81518110156107a65781818151811061076557fe5b60200260200101516001600160a01b0316836001600160a01b0316141561079e5760405162461bcd60e51b81526004016106dc90614473565b600101610750565b5061083f6107b261217c565b6040516370a0823160e01b81526001600160a01b038516906370a08231906107de9030906004016141c9565b60206040518083038186803b1580156107f657600080fd5b505afa15801561080a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082e91906140d4565b6001600160a01b038516919061229e565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561091657600080fd5b505afa15801561092a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109529190810190613fb2565b604051602001610962919061419b565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b03163314806109b557506109a061217c565b6001600160a01b0316336001600160a01b0316145b6109d15760405162461bcd60e51b81526004016106dc90614404565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610a069083906144ed565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a429030906004016141c9565b60206040518083038186803b158015610a5a57600080fd5b505afa158015610a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9291906140d4565b905090565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610aff9030906004016141c9565b6101206040518083038186803b158015610b1857600080fd5b505afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b50919061403e565b604001511180610a9257506000610b65611ebe565b11905090565b600e8181548110610b7857fe5b6000918252602090912001546001600160a01b0316905081565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610bfc5760405162461bcd60e51b81526004016106dc9061438c565b6000610c07836122bd565b600554909350909150610c24906001600160a01b0316338361229e565b50919050565b73dac17f958d2ee523a2206206994597c13d831ec781565b6002546001600160a01b0316331480610c735750610c5e61217c565b6001600160a01b0316336001600160a01b0316145b610c8f5760405162461bcd60e51b81526004016106dc90614404565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610cc09030906004016141c9565b60206040518083038186803b158015610cd857600080fd5b505afa158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1091906140d4565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610d4f918591610100900460ff169060040161450f565b602060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f9190613f29565b6002546001600160a01b0316331480610dd25750610dbd61217c565b6001600160a01b0316336001600160a01b0316145b610dee5760405162461bcd60e51b81526004016106dc90614404565b610df661230f565b610dfe612555565b565b6002546001600160a01b0316331480610e315750610e1c61217c565b6001600160a01b0316336001600160a01b0316145b610e4d5760405162461bcd60e51b81526004016106dc90614404565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610a069083906144ed565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6004546001600160a01b0316331480610ed557506002546001600160a01b031633145b80610ef85750610ee361217c565b6001600160a01b0316336001600160a01b0316145b80610f995750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4c57600080fd5b505afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f849190613e5c565b6001600160a01b0316336001600160a01b0316145b8061103a5750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610fed57600080fd5b505afa158015611001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110259190613e5c565b6001600160a01b0316336001600160a01b0316145b6110565760405162461bcd60e51b81526004016106dc90614404565b6001546040805163bf3759b560e01b81529051610dfe926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561109c57600080fd5b505afa1580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d491906140d4565b612848565b6004546001600160a01b03163314806110fc57506002546001600160a01b031633145b8061111f575061110a61217c565b6001600160a01b0316336001600160a01b0316145b806111c05750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab9190613e5c565b6001600160a01b0316336001600160a01b0316145b806112615750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190613e5c565b6001600160a01b0316336001600160a01b0316145b61127d5760405162461bcd60e51b81526004016106dc90614404565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d057600080fd5b505afa1580156112e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130891906140d4565b600a5490915060009060ff161561135e576000611323611ebe565b905061133c8382116113355783611337565b815b6122bd565b9450915082821115611358576113528284612971565b94508291505b5061136f565b611367826129bc565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc906113a390879087908690600401614573565b602060405180830381600087803b1580156113bd57600080fd5b505af11580156113d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f591906140d4565b915061140082612848565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516114359493929190614589565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b600a5460ff1681565b60108181548110610b7857fe5b6002546001600160a01b03163314806114a2575061148d61217c565b6001600160a01b0316336001600160a01b0316145b6114be5760405162461bcd60e51b81526004016106dc90614404565b61083f828261328c565b60005b919050565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b0316331480611537575061152261217c565b6001600160a01b0316336001600160a01b0316145b6115535760405162461bcd60e51b81526004016106dc90614404565b6001600160a01b03811661156657600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610a069083906141c9565b6002546001600160a01b03163314806115e257506115cd61217c565b6001600160a01b0316336001600160a01b0316145b6115fe5760405162461bcd60e51b81526004016106dc90614404565b61160a60008383613d61565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda6828260405161163c92919061426e565b60405180910390a15050565b600f5481565b6002546001600160a01b031633148061167f575061166a61217c565b6001600160a01b0316336001600160a01b0316145b61169b5760405162461bcd60e51b81526004016106dc90614404565b80600e83815481106116a957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061083f612555565b6002546001600160a01b031633148061171057506116fb61217c565b6001600160a01b0316336001600160a01b0316145b61172c5760405162461bcd60e51b81526004016106dc90614404565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b0316331480611784575061176f61217c565b6001600160a01b0316336001600160a01b0316145b6117a05760405162461bcd60e51b81526004016106dc90614404565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610a069083906144ed565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b0316331480611824575061180f61217c565b6001600160a01b0316336001600160a01b0316145b6118405760405162461bcd60e51b81526004016106dc90614404565b600f55565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a429030906004016141c9565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b031633148061190157506118ec61217c565b6001600160a01b0316336001600160a01b0316145b61191d5760405162461bcd60e51b81526004016106dc90614404565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611968575061195361217c565b6001600160a01b0316336001600160a01b0316145b6119845760405162461bcd60e51b81526004016106dc90614404565b6001600160a01b03811661199757600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610a069083906141c9565b6001546001600160a01b0316331480611a1357506119fe61217c565b6001600160a01b0316336001600160a01b0316145b611a1c57600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9b9190613e5c565b6001600160a01b031614611aae57600080fd5b611ab781613365565b6005546040516370a0823160e01b8152611b509183916001600160a01b03909116906370a0823190611aed9030906004016141c9565b60206040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906140d4565b6005546001600160a01b0316919061229e565b50565b6002546001600160a01b03163314611b7d5760405162461bcd60e51b81526004016106dc906142d0565b6001600160a01b038116611b9057600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611bc792911690600090600401614212565b602060405180830381600087803b158015611be157600080fd5b505af1158015611bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c199190613f29565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611c689291169060001990600401614212565b602060405180830381600087803b158015611c8257600080fd5b505af1158015611c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cba9190613f29565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610a0691906141c9565b6000611cf4613ddf565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611d249030906004016141c9565b6101206040518083038186803b158015611d3d57600080fd5b505afa158015611d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d75919061403e565b9050806020015160001415611d8e5760009150506114cb565b60065460a0820151611da1904290612971565b1015611db15760009150506114cb565b60075460a0820151611dc4904290612971565b10611dd35760019150506114cb565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015611e1857600080fd5b505afa158015611e2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5091906140d4565b9050600954811115611e67576001925050506114cb565b6000611e71611ebe565b90508260c00151611e8d600954836133db90919063ffffffff16565b1015611e9f57600193505050506114cb565b611ea7613400565b600854611eb4908761340a565b1095945050505050565b6000610a92611ecb610a11565b611ed3611887565b906133db565b6002546001600160a01b0316331480611f0a5750611ef561217c565b6001600160a01b0316336001600160a01b0316145b611f265760405162461bcd60e51b81526004016106dc90614404565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610a069083906144ed565b736b175474e89094c44da98b954eedeac495271d0f81565b6001546001600160a01b031681565b6002546001600160a01b0316331480611fb35750611f9e61217c565b6001600160a01b0316336001600160a01b0316145b611fcf5760405162461bcd60e51b81526004016106dc90614404565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561202357600080fd5b505af1158015612037573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806120ee5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061209c90309086906004016141dd565b60206040518083038186803b1580156120b457600080fd5b505afa1580156120c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ec91906140d4565b155b61210a5760405162461bcd60e51b81526004016106dc90614497565b6121608363095ea7b360e01b8484604051602401612129929190614212565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613444565b505050565b606061217484846000856134d3565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b1580156121c157600080fd5b505afa1580156121d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a929190613e5c565b60408051600280825260608083018452928392919060208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd528160008151811061223f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160018151811061228157fe5b6001600160a01b0390921660209283029190910190910152905090565b6121608363a9059cbb60e01b8484604051602401612129929190614212565b60008060006122ca611887565b905083811015612305576122e66122e18583612971565b613597565b92506122f283826133db565b92506122fe8484612971565b9150612309565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906123569073f403c135812408bfbe8713b5a23a04b3d48aae3190600090600401614212565b602060405180830381600087803b15801561237057600080fd5b505af1158015612384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a89190613f29565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906123f19073f403c135812408bfbe8713b5a23a04b3d48aae319060001990600401614212565b602060405180830381600087803b15801561240b57600080fd5b505af115801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190613f29565b50600d5461247190736b175474e89094c44da98b954eedeac495271d0f906001600160a01b03166000612066565b600d5461249f90736b175474e89094c44da98b954eedeac495271d0f906001600160a01b0316600019612066565b600d546124cc9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b03166000612066565b600d546124fa9073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906001600160a01b0316600019612066565b600d546125279073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b03166000612066565b600d54610dfe9073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316600019612066565b73d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811061258657fe5b60009182526020822001546040516001600160e01b031960e085901b1681526125be926001600160a01b039092169190600401614212565b602060405180830381600087803b1580156125d857600080fd5b505af11580156125ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126109190613f29565b5073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663095ea7b3600e60008154811061264257fe5b6000918252602090912001546040516001600160e01b031960e084901b16815261267c916001600160a01b03169060001990600401614212565b602060405180830381600087803b15801561269657600080fd5b505af11580156126aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ce9190613f29565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e60018154811061270057fe5b60009182526020822001546040516001600160e01b031960e085901b168152612738926001600160a01b039092169190600401614212565b602060405180830381600087803b15801561275257600080fd5b505af1158015612766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278a9190613f29565b50734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b031663095ea7b3600e6001815481106127bc57fe5b6000918252602090912001546040516001600160e01b031960e084901b1681526127f6916001600160a01b03169060001990600401614212565b602060405180830381600087803b15801561281057600080fd5b505af1158015612824573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b509190613f29565b600a5460ff161561285857611b50565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906128899030906004016141c9565b60206040518083038186803b1580156128a157600080fd5b505afa1580156128b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d991906140d4565b9050801561083f57600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669161291f9190859060019060040161455b565b602060405180830381600087803b15801561293957600080fd5b505af115801561294d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121609190613f29565b60006129b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061364b565b90505b92915050565b6000806000806129ca611887565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd991612a0a91309162010000900460ff16906004016141f7565b602060405180830381600087803b158015612a2457600080fd5b505af1158015612a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5c9190613f29565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612a979030906004016141c9565b60206040518083038186803b158015612aaf57600080fd5b505afa158015612ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae791906140d4565b90508015612ca057612af881613677565b604080516003808252608082019092529192506060919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612b4057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612b8257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600081548110612bb057fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612bdb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e600081548110612c0957fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991612c4791869186903090429060040161451f565b600060405180830381600087803b158015612c6157600080fd5b505af1158015612c75573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c9d9190810190613e78565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612cda9030906004016141c9565b60206040518083038186803b158015612cf257600080fd5b505afa158015612d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2a91906140d4565b90508015612ed65760408051600380825260808201909252606091602082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110612d7657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612db857fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506010600181548110612de657fe5b9060005260206000200160009054906101000a90046001600160a01b031681600281518110612e1157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600e600181548110612e3f57fe5b60009182526020822001546040516338ed173960e01b81526001600160a01b03909116916338ed173991612e7d91869186903090429060040161451f565b600060405180830381600087803b158015612e9757600080fd5b505af1158015612eab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ed39190810190613e78565b50505b6040516370a0823160e01b8152600090736b175474e89094c44da98b954eedeac495271d0f906370a0823190612f109030906004016141c9565b60206040518083038186803b158015612f2857600080fd5b505afa158015612f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6091906140d4565b6040516370a0823160e01b815290915060009073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48906370a0823190612f9d9030906004016141c9565b60206040518083038186803b158015612fb557600080fd5b505afa158015612fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fed91906140d4565b6040516370a0823160e01b815290915060009073dac17f958d2ee523a2206206994597c13d831ec7906370a082319061302a9030906004016141c9565b60206040518083038186803b15801561304257600080fd5b505afa158015613056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307a91906140d4565b9050600083118061308b5750600082115b806130965750600081115b1561311e57600d546040805160808101825285815260208101859052808201849052600060608201819052915162a6cbcd60e21b81526001600160a01b039093169263029b2f34926130eb929160040161422b565b600060405180830381600087803b15801561310557600080fd5b505af1158015613119573d6000803e3d6000fd5b505050505b6005546040516370a0823160e01b81526131aa9188916001600160a01b03909116906370a08231906131549030906004016141c9565b60206040518083038186803b15801561316c57600080fd5b505afa158015613180573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a491906140d4565b90612971565b985060006131b6611ebe565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf823906131ec9030906004016141c9565b6101206040518083038186803b15801561320557600080fd5b505afa158015613219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323d919061403e565b60c0015190508082101561325557818103995060009a505b8b1561327d576132648c613597565b5061327a8c6132758d6131a4611887565b6136e0565b98505b50505050505050509193909250565b806132e657736b175474e89094c44da98b954eedeac495271d0f601083815481106132b357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061083f565b80600114156133115773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601083815481106132b357fe5b73dac17f958d2ee523a2206206994597c13d831ec76010838154811061333357fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a2916133a09161010090910460ff1690600401614263565b600060405180830381600087803b1580156133ba57600080fd5b505af11580156133ce573d6000803e3d6000fd5b50505050611b50816136f6565b6000828201838110156129b35760405162461bcd60e51b81526004016106dc90614314565b6000610a92613848565b600082613419575060006129b6565b8282028284828161342657fe5b04146129b35760405162461bcd60e51b81526004016106dc9061434b565b6060613499826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121659092919063ffffffff16565b80519091501561216057808060200190518101906134b79190613f29565b6121605760405162461bcd60e51b81526004016106dc90614429565b60606134de85613cb4565b6134fa5760405162461bcd60e51b81526004016106dc906143cd565b60006060866001600160a01b03168587604051613517919061417f565b60006040518083038185875af1925050503d8060008114613554576040519150601f19603f3d011682016040523d82523d6000602084013e613559565b606091505b5091509150811561356d5791506121749050565b80511561357d5780518082602001fd5b8360405162461bcd60e51b81526004016106dc919061429d565b60006135a582613275610a11565b915060006135b1611887565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e7202906135e590869060009060040161450f565b602060405180830381600087803b1580156135ff57600080fd5b505af1158015613613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136379190613f29565b50613644816131a4611887565b9392505050565b6000818484111561366f5760405162461bcd60e51b81526004016106dc919061429d565b505050900390565b60008061369b612710613695600f548661340a90919063ffffffff16565b90613ced565b905080156136d6576136d673d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a1339348361229e565b6136448382612971565b60008183106136ef57816129b3565b5090919050565b6040516370a0823160e01b815261379f90829073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906137339030906004016141c9565b60206040518083038186803b15801561374b57600080fd5b505afa15801561375f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378391906140d4565b73d533a949740bb3306d119cc777fa900ba034cd52919061229e565b6040516370a0823160e01b8152611b50908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a08231906137dc9030906004016141c9565b60206040518083038186803b1580156137f457600080fd5b505afa158015613808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382c91906140d4565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b919061229e565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc2629061387b9030906004016141c9565b60206040518083038186803b15801561389357600080fd5b505afa1580156138a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cb91906140d4565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561394257600080fd5b505afa158015613956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397a91906140d4565b90506000806139898385613ced565b9050858110156139ce57600061399f8783612971565b90506139af876136958a8461340a565b925060006139bd8786612971565b9050808411156139cb578093505b50505b60008715613b3557604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110613a1857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613a5a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e600081548110613a8a57fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f90613ac5908d9086906004016144f6565b60006040518083038186803b158015613add57600080fd5b505afa158015613af1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613b199190810190613e78565b905080600181518110613b2857fe5b6020026020010151925050505b60008315613c9c576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110613b7f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613bc157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060600e600181548110613bf157fe5b60009182526020909120015460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f90613c2c90899086906004016144f6565b60006040518083038186803b158015613c4457600080fd5b505afa158015613c58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c809190810190613e78565b905080600181518110613c8f57fe5b6020026020010151925050505b613ca682826133db565b995050505050505050505090565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612174575050151592915050565b60006129b383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183613d4b5760405162461bcd60e51b81526004016106dc919061429d565b506000838581613d5757fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613da25782800160ff19823516178555613dcf565b82800160010185558215613dcf579182015b82811115613dcf578235825591602001919060010190613db4565b50613ddb929150613e2b565b5090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613ddb5760008155600101613e2c565b600060208284031215613e51578081fd5b81356129b38161461b565b600060208284031215613e6d578081fd5b81516129b38161461b565b60006020808385031215613e8a578182fd5b825167ffffffffffffffff811115613ea0578283fd5b8301601f81018513613eb0578283fd5b8051613ec3613ebe826145cb565b6145a4565b8181528381019083850185840285018601891015613edf578687fd5b8694505b83851015613f01578051835260019490940193918501918501613ee3565b50979650505050505050565b600060208284031215613f1e578081fd5b81356129b381614630565b600060208284031215613f3a578081fd5b81516129b381614630565b60008060208385031215613f57578081fd5b823567ffffffffffffffff80821115613f6e578283fd5b818501915085601f830112613f81578283fd5b813581811115613f8f578384fd5b866020828501011115613fa0578384fd5b60209290920196919550909350505050565b600060208284031215613fc3578081fd5b815167ffffffffffffffff80821115613fda578283fd5b818401915084601f830112613fed578283fd5b815181811115613ffb578384fd5b61400e601f8201601f19166020016145a4565b9150808252856020828501011115614024578384fd5b6140358160208401602086016145eb565b50949350505050565b6000610120808385031215614051578182fd5b61405a816145a4565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156140cd578081fd5b5035919050565b6000602082840312156140e5578081fd5b5051919050565b600080604083850312156140fe578182fd5b8235915060208301356141108161461b565b809150509250929050565b6000806040838503121561412d578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156141745781516001600160a01b03168752958201959082019060010161414f565b509495945050505050565b600082516141918184602087016145eb565b9190910192915050565b600065086dedceccaf60d31b825282516141bc8160068501602087016145eb565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b60a08101818460005b6004811015614253578151835260209283019290910190600101614234565b5050508260808301529392505050565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b60006020825282518060208401526142bc8160408501602087016145eb565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b600083825260406020830152612174604083018461413c565b9182521515602082015260400190565b600086825285602083015260a0604083015261453e60a083018661413c565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff811182821017156145c357600080fd5b604052919050565b600067ffffffffffffffff8211156145e1578081fd5b5060209081020190565b60005b838110156146065781810151838201526020016145ee565b83811115614615576000848401525b50505050565b6001600160a01b0381168114611b5057600080fd5b8015158114611b5057600080fdfea2646970667358221220e7c125249560d6c3b057dd673aabb44c21b10750b8fdfac78663b0ad94abdfe564736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008ee57c05741aa9db947a744e713c15d4d19d8822
-----Decoded View---------------
Arg [0] : _vault (address): 0x8ee57c05741aA9DB947A744E713C15d4d19D8822
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ee57c05741aa9db947a744e713c15d4d19d8822
Deployed Bytecode Sourcemap
65513:3904:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56794:444;;;;;;:::i;:::-;;:::i;:::-;;30618:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60555:163;;;:::i;58572:26::-;;;:::i;:::-;;;;;;;:::i;39940:175::-;;;;;;:::i;:::-;;:::i;60844:129::-;;;:::i;:::-;;;;;;;:::i;58605:25::-;;;:::i;33808:28::-;;;:::i;32556:18::-;;;:::i;:::-;;;;;;;:::i;32465:25::-;;;:::i;42613:148::-;;;:::i;58726:20::-;;;;;;:::i;:::-;;:::i;30928:91::-;;;:::i;58332:85::-;;;:::i;33444:29::-;;;:::i;53374:515::-;;;;;;:::i;:::-;;:::i;58050:82::-;;;:::i;60331:216::-;;;:::i;59716:104::-;;;:::i;37989:154::-;;;;;;:::i;:::-;;:::i;57961:82::-;;;:::i;57784:::-;;;:::i;47366:170::-;;;:::i;51759:1371::-;;;:::i;57424:83::-;;;:::i;33887:25::-;;;:::i;65554:27::-;;;;;;:::i;:::-;;:::i;67161:120::-;;;;;;:::i;:::-;;:::i;46751:286::-;;;;;;:::i;:::-;;:::i;57696:81::-;;;:::i;58661:29::-;;;:::i;58697:20::-;;;:::i;36746:174::-;;;;;;:::i;:::-;;:::i;40418:171::-;;;;;;:::i;:::-;;:::i;58753:22::-;;;:::i;59935:128::-;;;;;;:::i;:::-;;:::i;60203:120::-;;;;;;:::i;:::-;;:::i;33630:27::-;;;:::i;32335:94::-;;;:::i;39214:169::-;;;;;;:::i;:::-;;:::i;58520:43::-;;;:::i;57608:81::-;;;:::i;59828:99::-;;;;;;:::i;:::-;;:::i;33293:29::-;;;:::i;58424:87::-;;;:::i;32497:22::-;;;:::i;32526:21::-;;;:::i;58637:17::-;;;:::i;60726:110::-;;;:::i;57514:85::-;;;:::i;60071:124::-;;;;;;:::i;:::-;;:::i;35990:202::-;;;;;;:::i;:::-;;:::i;54480:311::-;;;;;;:::i;:::-;;:::i;37209:263::-;;;;;;:::i;:::-;;:::i;64797:687::-;;;;;;:::i;:::-;;:::i;60981: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;60555:163::-;60693:4;;60670:38;;;-1:-1:-1;;;60670:38:0;;;;60603:13;;-1:-1:-1;;;;;60693:4:0;;60670:36;;:38;;;;;60693:4;;60670:38;;;;;;;60693:4;60670:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60670:38:0;;;;;;;;;;;;:::i;:::-;60643:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;60629:81;;60555:163;:::o;58572: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;60844:129::-;60925:14;;60917:48;;-1:-1:-1;;;60917:48:0;;60890:7;;-1:-1:-1;;;;;60925:14:0;;60917:33;;:48;;60959:4;;60917:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60910:55;;60844:129;:::o;58605: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;58726:20::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58726:20:0;;-1:-1:-1;58726:20:0;:::o;30928:91::-;30997:14;;;;;;;;;;;;-1:-1:-1;;;30997:14:0;;;;30928:91;:::o;58332:85::-;58374:42;58332: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;60331: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;:::-;60432:14:::1;::::0;60424:48:::1;::::0;-1:-1:-1;;;60424:48:0;;60407:14:::1;::::0;-1:-1:-1;;;;;60432:14:0::1;::::0;60424:33:::1;::::0;:48:::1;::::0;60466:4:::1;::::0;60424:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60491:14;::::0;60524::::1;::::0;60483:56:::1;::::0;-1:-1:-1;;;60483:56:0;;60407:65;;-1:-1:-1;;;;;;60491:14:0;;::::1;::::0;60483:32:::1;::::0;:56:::1;::::0;60407:65;;60491:14:::1;60524::::0;::::1;;;::::0;60483:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;59716: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;:::-;59773:15:::1;:13;:15::i;:::-;59799:13;:11;:13::i;:::-;59716: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;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;65554:27::-;;;;;;;;;;67161: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;:::-;67244:29:::1;67259:8;67269:3;67244:14;:29::i;46751:286::-:0;46819:4;46751:286;;;;:::o;57696:81::-;57734:42;57696:81;:::o;58661:29::-;;;-1:-1:-1;;;;;58661:29:0;;:::o;58697:20::-;;;-1:-1:-1;;;;;58697: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;58753:22::-;;;;:::o;59935: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;:::-;60027:4:::1;60016:3;60020;60016:8;;;;;;;;;;;;;;;;:15;;;;;-1:-1:-1::0;;;;;60016:15:0::1;;;;;-1:-1:-1::0;;;;;60016:15:0::1;;;;;;60042:13;:11;:13::i;60203: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;:::-;60285:13:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;60285:30:0;;::::1;::::0;;;::::1;::::0;;60203: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;58520:43::-:0;58558:5;58520:43;:::o;57608:81::-;57646:42;57608:81;:::o;59828: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;:::-;59901:7:::1;:18:::0;59828:99::o;33293:29::-;;;;:::o;58424:87::-;58468:42;58424:87;:::o;32497:22::-;;;-1:-1:-1;;;;;32497:22:0;;:::o;32526:21::-;;;-1:-1:-1;;;;;32526:21:0;;:::o;58637:17::-;;;;:::o;60726:110::-;60799:4;;:29;;-1:-1:-1;;;60799:29:0;;60772:7;;-1:-1:-1;;;;;60799:4:0;;:14;;:29;;60822:4;;60799:29;;;:::i;57514:85::-;57556:42;57514:85;:::o;60071: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;:::-;60155:14:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;60155:32:0;;::::1;::::0;;;::::1;::::0;;60071: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;64797:687::-:0;64869:4;64886:28;;:::i;:::-;64917:5;;:31;;-1:-1:-1;;;64917:31:0;;-1:-1:-1;;;;;64917:5:0;;;;:16;;:31;;64942:4;;64917:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64886:62;;64965:6;:17;;;64986:1;64965:22;64961:40;;;64996:5;64989:12;;;;;64961:40;65059:14;;65038:17;;;;65018:38;;:15;;:19;:38::i;:::-;:55;65014:73;;;65082:5;65075:12;;;;;65014:73;65146:14;;65124:17;;;;65104:38;;:15;;:19;:38::i;:::-;:56;65100:73;;65169:4;65162:11;;;;;65100:73;65208:5;;:23;;;-1:-1:-1;;;65208:23:0;;;;65186:19;;-1:-1:-1;;;;;65208:5:0;;:21;;:23;;;;;;;;;;;;;;:5;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65186:45;;65260:13;;65246:11;:27;65242:44;;;65282:4;65275:11;;;;;;65242:44;65299:13;65315:22;:20;:22::i;:::-;65299:38;;65379:6;:16;;;65352:24;65362:13;;65352:5;:9;;:24;;;;:::i;:::-;:43;65348:60;;;65404:4;65397:11;;;;;;;65348:60;65458:17;:15;:17::i;:::-;65429:12;;:26;;65446:8;65429:16;:26::i;:::-;:46;;64797:687;-1:-1:-1;;;;;64797:687:0:o;60981:133::-;61043:7;61070:36;61090:15;:13;:15::i;:::-;61070;: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;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;69147:267::-;69305:16;;;69319:1;69305:16;;;69242;69305;;;;;69242;;;69305;69319:1;69305:16;;;;;;;;;;-1:-1:-1;69305:16:0;69276:45;;57734:42;69332:9;69342:1;69332:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;69332:18:0;;;-1:-1:-1;;;;;69332:18:0;;;;;57646:42;69361:9;69371:1;69361:12;;;;;;;;-1:-1:-1;;;;;69361:18:0;;;:12;;;;;;;;;;;:18;69397:9;-1:-1:-1;69147:267:0;:::o;22196:177::-;22279:86;22299:5;22329:23;;;22354:2;22358:5;22306:58;;;;;;;;;:::i;61684:581::-;61788:25;61815:13;61846:16;61865:15;:13;:15::i;:::-;61846:34;;61906:13;61895:8;:24;61891:367;;;61956:42;61970:27;:13;61988:8;61970:17;:27::i;:::-;61956:13;:42::i;:::-;61936:62;-1:-1:-1;62033:31:0;61936:62;62055:8;62033:21;:31::i;:::-;62013:51;-1:-1:-1;62087:36:0;:13;62013:51;62087:17;:36::i;:::-;62079:44;;61891:367;;;62233:13;62213:33;;61891:367;61684:581;;;;:::o;59012:444::-;59057:4;;:24;;-1:-1:-1;;;59057:24:0;;-1:-1:-1;;;;;59057:4:0;;;;:12;;:24;;57556:42;;59057:4;;:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59092:4:0;;:40;;-1:-1:-1;;;59092:40:0;;-1:-1:-1;;;;;59092:4:0;;;;:12;;:40;;57556:42;;-1:-1:-1;;59114:17:0;59092:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59167:5:0;;59143:33;;57911:42;;-1:-1:-1;;;;;59167:5:0;;59143:23;:33::i;:::-;59211:5;;59187:49;;57911:42;;-1:-1:-1;;;;;59211:5:0;-1:-1:-1;;59187:23:0;:49::i;:::-;59272:5;;59247:34;;58000:42;;-1:-1:-1;;;;;59272:5:0;;59247:24;:34::i;:::-;59317:5;;59292:50;;58000:42;;-1:-1:-1;;;;;59317:5:0;-1:-1:-1;;59292:24:0;:50::i;:::-;59378:5;;59353:34;;58089:42;;-1:-1:-1;;;;;59378:5:0;;59353:24;:34::i;:::-;59423:5;;59398:50;;58089:42;;-1:-1:-1;;;;;59423:5:0;-1:-1:-1;;59398:24:0;:50::i;59464:244::-;57734:42;-1:-1:-1;;;;;59515:19:0;;59535:3;59539:1;59535:6;;;;;;;;;;;;;;;;;59515:30;;-1:-1:-1;;;;;;59515:30:0;;;;;;;;;-1:-1:-1;;;;;59535:6:0;;;;;59515:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57734:42;-1:-1:-1;;;;;59556:19:0;;59576:3;59580:1;59576:6;;;;;;;;;;;;;;;;;;59556:46;;-1:-1:-1;;;;;;59556:46:0;;;;;;;;;-1:-1:-1;;;;;59576:6:0;;-1:-1:-1;;59584:17:0;59556:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57646:42;-1:-1:-1;;;;;59613:19:0;;59633:3;59637:1;59633:6;;;;;;;;;;;;;;;;;59613:30;;-1:-1:-1;;;;;;59613:30:0;;;;;;;;;-1:-1:-1;;;;;59633:6:0;;;;;59613:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57646:42;-1:-1:-1;;;;;59654:19:0;;59674:3;59678:1;59674:6;;;;;;;;;;;;;;;;;;59654:46;;-1:-1:-1;;;;;;59654:46:0;;;;;;;;;-1:-1:-1;;;;;59674:6:0;;-1:-1:-1;;59682:17:0;59654:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;61122:261::-;61205:13;;;;61201:26;;;61220:7;;61201:26;61253:4;;:29;;-1:-1:-1;;;61253:29:0;;61237:13;;-1:-1:-1;;;;;61253:4:0;;:14;;:29;;61276:4;;61253:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61237:45;-1:-1:-1;61297:9:0;;61293:83;;61348:2;;61323:41;;-1:-1:-1;;;61323:41:0;;57556:42;;61323:24;;:41;;61348:2;61352:5;;61359:4;;61323:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14966:136::-;15024:7;15051:43;15055:1;15058;15051:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;15044:50;;14966:136;;;;;:::o;67289:1850::-;67406:15;67436:13;67464:20;67512:11;67526:15;:13;:15::i;:::-;67560:14;;67601:13;;67552:63;;-1:-1:-1;;;67552:63:0;;67512:29;;-1:-1:-1;;;;;;67560:14:0;;;;67552:33;;:63;;67594:4;;67601:13;;;;;;67552:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;67641:36:0;;-1:-1:-1;;;67641:36:0;;67626:12;;57734:42;;67641:21;;:36;;67671:4;;67641:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67626:51;-1:-1:-1;67692:8:0;;67688:313;;67724:16;67735:4;67724:10;:16::i;:::-;67781;;;67795:1;67781:16;;;;;;;;;67717:23;;-1:-1:-1;67757:21:0;;67781:16;;;;67757:21;;67781:16;;;;;-1:-1:-1;67781:16:0;67757:40;;57734:42;67812:4;67817:1;67812:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;67812:13:0;;;-1:-1:-1;;;;;67812:13:0;;;;;57823:42;67840:4;67845:1;67840:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;67840:14:0;;;-1:-1:-1;;;;;67840:14:0;;;;;67879:10;67890:1;67879:13;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67879:13:0;67869:4;67874:1;67869:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;67869:23:0;;;-1:-1:-1;;;;;67869:23:0;;;;;67913:3;67917:1;67913:6;;;;;;;;;;;;;;;;;67909:80;;-1:-1:-1;;;67909:80:0;;-1:-1:-1;;;;;67913:6:0;;;;67909:36;;:80;;67946:4;;67964;;67978;;67985:3;;67909:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67909:80:0;;;;;;;;;;;;:::i;:::-;;67688:313;;68026:36;;-1:-1:-1;;;68026:36:0;;68011:12;;57646:42;;68026:21;;:36;;68056:4;;68026:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68011:51;-1:-1:-1;68077:8:0;;68073:273;;68126:16;;;68140:1;68126:16;;;;;;;;;68102:21;;68126:16;;;68102:21;;68126:16;;;;;-1:-1:-1;68126:16:0;68102:40;;57646:42;68157:4;68162:1;68157:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;68157:13:0;;;-1:-1:-1;;;;;68157:13:0;;;;;57823:42;68185:4;68190:1;68185:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;68185:14:0;;;-1:-1:-1;;;;;68185:14:0;;;;;68224:10;68235:1;68224:13;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68224:13:0;68214:4;68219:1;68214:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;68214:23:0;;;-1:-1:-1;;;;;68214:23:0;;;;;68258:3;68262:1;68258:6;;;;;;;;;;;;;;;;;68254:80;;-1:-1:-1;;;68254:80:0;;-1:-1:-1;;;;;68258:6:0;;;;68254:36;;:80;;68291:4;;68309;;68323;;68330:3;;68254:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68254:80:0;;;;;;;;;;;;:::i;:::-;;68073:273;;68371:36;;-1:-1:-1;;;68371:36:0;;68356:12;;57911:42;;68371:21;;:36;;68401:4;;68371:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68434:37;;-1:-1:-1;;;68434:37:0;;68356:51;;-1:-1:-1;68418:13:0;;58000:42;;68434:22;;:37;;68465:4;;68434:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68498;;-1:-1:-1;;;68498:37:0;;68418:53;;-1:-1:-1;68482:13:0;;58089:42;;68498:22;;:37;;68529:4;;68498:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68482:53;;68557:1;68550:4;:8;:21;;;;68570:1;68562:5;:9;68550:21;:34;;;;68583:1;68575:5;:9;68550:34;68546:124;;;68610:5;;68601:57;;;;;;;;;;;;;;;;;;;;;;;68610:5;68601:57;;;;;;;;-1:-1:-1;;;68601:57:0;;-1:-1:-1;;;;;68610:5:0;;;;68601:29;;:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68546:124;68690:4;;:29;;-1:-1:-1;;;68690:29:0;;:41;;68724:6;;-1:-1:-1;;;;;68690:4:0;;;;:14;;:29;;68713:4;;68690:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;:41::i;:::-;68680:51;;68744:11;68758:22;:20;:22::i;:::-;68804:5;;:31;;-1:-1:-1;;;68804:31:0;;68744:36;;-1:-1:-1;68791:10:0;;-1:-1:-1;;;;;68804:5:0;;;;:16;;:31;;68829:4;;68804:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;68791:54;;68868:5;68859:6;:14;68856:94;;;68906:6;68898:5;:14;68890:22;;68937:1;68927:11;;68856:94;68966:20;;68962:170;;69003:31;69017:16;69003:13;:31::i;:::-;;69064:56;69073:16;69091:28;69111:7;69091:15;:13;:15::i;:28::-;69064:8;:56::i;:::-;69049:71;;68962:170;67289:1850;;;;;;;;;;;;;:::o;66857:296::-;66930:8;66926:220;;57911:42;66956:10;66967:8;66956:20;;;;;;;;;;;;;;;;:26;;;;;-1:-1:-1;;;;;66956:26:0;;;;;-1:-1:-1;;;;;66956:26:0;;;;;;66926:220;;;67013:3;67020:1;67013:8;67009:137;;;58000:42;67038:10;67049:8;67038:20;;;;;;;67009:137;58089:42;67107:10;67118:8;67107:20;;;;;;;;;;;;;;;;:27;;;;;-1:-1:-1;;;;;67107:27:0;;;;;-1:-1:-1;;;;;67107:27:0;;;;;;66857:296;;:::o;62273:185::-;62358:14;;62395;;62350:60;;-1:-1:-1;;;62350:60:0;;-1:-1:-1;;;;;62358:14:0;;;;62350:44;;:60;;62358:14;62395;;;;;;62350:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62421:29;62437:12;62421:15;:29::i;14502:181::-;14560:7;14592:5;;;14616:6;;;;14608:46;;;;-1:-1:-1;;;14608:46:0;;;;;;;:::i;64582:132::-;64640:18;64684:22;:20;:22::i;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;61391:285::-;61449:7;61479:34;61488:7;61497:15;:13;:15::i;61479:34::-;61469:44;;61524:12;61539:15;:13;:15::i;:::-;61573:14;;61565:57;;-1:-1:-1;;;61565:57:0;;61524:30;;-1:-1:-1;;;;;;61573:14:0;;61565:41;;:57;;61607:7;;61573:14;;61565:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61640:28;61660:7;61640:15;:13;:15::i;:28::-;61633:35;61391:285;-1:-1:-1;;;61391: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;62720:239::-;62772:7;62792:16;62811:34;58558:5;62811:17;62820:7;;62811:4;:8;;:17;;;;:::i;:::-;:21;;:34::i;:::-;62792:53;-1:-1:-1;62860:12:0;;62856:59;;62874:41;57734:42;57464;62906:8;62874:24;:41::i;:::-;62933:18;:4;62942:8;62933;: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;62466:246::-;62580:36;;-1:-1:-1;;;62580:36:0;;62541:76;;62566:12;;57734:42;;62580:21;;:36;;62610:4;;62580:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57734:42;;62541:76;:24;:76::i;:::-;62667:36;;-1:-1:-1;;;62667:36:0;;62628:76;;62653:12;;57646:42;;62667:21;;:36;;62697:4;;62667:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57646:42;;62628:76;:24;:76::i;62967:1607::-;63065:14;;63057:45;;-1:-1:-1;;;63057:45:0;;63022:7;;;;-1:-1:-1;;;;;63065:14:0;;;;63057:30;;:45;;63096:4;;63057:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63042:60;;63208:19;63230:4;63208:26;;63245:17;63265:10;63245:30;;63294:25;63322:10;63294:38;;63351:14;57646:42;-1:-1:-1;;;;;63368:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63351:42;-1:-1:-1;63404:12:0;;63445:29;63351:42;63456:17;63445:10;:29::i;:::-;63429:45;;63536:11;63528:5;:19;63524:417;;;63625:17;63645:22;:11;63661:5;63645:15;:22::i;:::-;63625:42;-1:-1:-1;63712:36:0;63736:11;63712:19;:4;63625:42;63712:8;:19::i;:36::-;63705:43;-1:-1:-1;63798:18:0;63819:21;:9;63833:6;63819:13;:21::i;:::-;63798:42;;63866:10;63859:4;:17;63855:75;;;63904:10;63897:17;;63855:75;63524:417;;;63953:16;63984:8;;63980:253;;64033:16;;;64047:1;64033:16;;;64009:21;64033:16;;;;;64009:21;64033:16;;;;;;;;;;-1:-1:-1;64033:16:0;64009:40;;57734:42;64064:4;64069:1;64064:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;64064:13:0;;;-1:-1:-1;;;;;64064:13:0;;;;;57823:42;64092:4;64097:1;64092:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;64092:14:0;;;-1:-1:-1;;;;;64092:14:0;;;;;64121:24;64152:3;64156:1;64152:6;;;;;;;;;;;;;;;;;;64148:37;;-1:-1:-1;;;64148:37:0;;-1:-1:-1;;;;;64152:6:0;;;;64148:25;;:37;;64174:4;;64180;;64148:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64148:37:0;;;;;;;;;;;;:::i;:::-;64121:64;;64211:7;64219:1;64211:10;;;;;;;;;;;;;;64200:21;;63980:253;;;64245:16;64276:8;;64272:253;;64325:16;;;64339:1;64325:16;;;64301:21;64325:16;;;;;64301:21;64325:16;;;;;;;;;;-1:-1:-1;64325:16:0;64301:40;;57646:42;64356:4;64361:1;64356:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;64356:13:0;;;-1:-1:-1;;;;;64356:13:0;;;;;57823:42;64384:4;64389:1;64384:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;64384:14:0;;;-1:-1:-1;;;;;64384:14:0;;;;;64413:24;64444:3;64448:1;64444:6;;;;;;;;;;;;;;;;;;64440:37;;-1:-1:-1;;;64440:37:0;;-1:-1:-1;;;;;64444:6:0;;;;64440:25;;:37;;64466:4;;64472;;64440:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64440:37:0;;;;;;;;;;;;:::i;:::-;64413:64;;64503:7;64511:1;64503:10;;;;;;;;;;;;;;64492:21;;64272:253;;;64544:22;:8;64557;64544:12;:22::i;:::-;64537:29;;;;;;;;;;;62967:1607;:::o;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;;;;;;;;;;;;;;;;;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;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;29627:6;29624:30;29621:2;;;-1:-1;;29657:12;29621:2;2016:65;29730:9;29711:17;;-1:-1;;29707:33;6493:2;29788: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;30185:12;30957:6;30952:3;30945:19;30994:4;;30989:3;30985:14;9162:93;;30994:4;9326:5;29935:14;-1:-1;9365:260;9390:6;9387:1;9384:13;9365:260;;;9451:13;;-1:-1;;;;;32008:54;8757:37;;8486:14;;;;30687;;;;5020:18;9405:9;9365:260;;;-1:-1;9631:10;;9081:566;-1:-1;;;;;9081:566::o;16682:271::-;;10627:5;30185: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;30185: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;;;;;32008:54;;;;8757:37;;17636:2;17621:18;;17607:124::o;17738:333::-;-1:-1;;;;;32008:54;;;8757:37;;32008:54;;18057:2;18042:18;;8757:37;17893:2;17878:18;;17864:207::o;18078:321::-;-1:-1;;;;;32008:54;;;;8757:37;;31805:13;31798:21;18385:2;18370:18;;10421:34;18227:2;18212:18;;18198:201::o;18406:349::-;-1:-1;;;;;32008:54;;;;8757:37;;18741:2;18726:18;;11237:58;18569:2;18554:18;;18540:215::o;19102:443::-;19311:3;19296:19;;19300:9;10051:21;19102:443;10078:258;30320:4;10100:1;10097:13;10078:258;;;10164:13;;16513:37;;8677:4;8668:14;;;;30687;;;;10125:1;10118:9;10078:258;;;10082:14;;;11288:5;19530:3;19519:9;19515:19;11237:58;19282:263;;;;;:::o;19552:210::-;31805:13;;31798:21;10421:34;;19673:2;19658:18;;19644:118::o;20289:330::-;;20446:2;20467:17;20460:47;30957:6;20446:2;20435:9;20431:18;30945:19;32937:6;32932:3;30985:14;20435:9;30985:14;32914:30;32975:16;;;30985:14;32975:16;;;32968:27;;;;29730:9;33354:14;;;-1:-1;;33350:28;11587:39;;;20417:202;-1:-1;20417:202::o;20626:310::-;;20773:2;20794:17;20787:47;11785:5;30185:12;30957:6;20773:2;20762:9;20758:18;30945:19;11879:52;11924:6;30985:14;20762:9;30985:14;20773:2;11905:5;11901:16;11879:52;:::i;:::-;29730:9;33354:14;-1:-1;;33350:28;11943:39;;;;30985:14;11943:39;;20744:192;-1:-1;;20744:192::o;20943:416::-;21143:2;21157:47;;;12586:2;21128:18;;;30945:19;-1:-1;;;30985:14;;;12602:34;12655:12;;;21114:245::o;21366:416::-;21566:2;21580:47;;;12906:1;21551:18;;;30945:19;-1:-1;;;30985:14;;;12921:28;12968:12;;;21537:245::o;21789:416::-;21989:2;22003:47;;;13219:2;21974:18;;;30945:19;13255:29;30985:14;;;13235:50;13304:12;;;21960:245::o;22212:416::-;22412:2;22426:47;;;13904:2;22397:18;;;30945:19;13940:34;30985:14;;;13920:55;-1:-1;;;13995:12;;;13988:25;14032:12;;;22383:245::o;22635:416::-;22835:2;22849:47;;;14283:1;22820:18;;;30945:19;-1:-1;;;30985:14;;;14298:29;14346:12;;;22806:245::o;23058:416::-;23258:2;23272:47;;;14597:1;23243:18;;;30945:19;-1:-1;;;30985:14;;;14612:30;14661:12;;;23229:245::o;23481:416::-;23681:2;23695:47;;;14912:2;23666:18;;;30945:19;14948:31;30985:14;;;14928:52;14999:12;;;23652:245::o;23904:416::-;24104:2;24118:47;;;15250:2;24089:18;;;30945:19;-1:-1;;;30985:14;;;15266:34;15319:12;;;24075:245::o;24327:416::-;24527:2;24541:47;;;15570:2;24512:18;;;30945:19;15606:34;30985:14;;;15586:55;-1:-1;;;15661:12;;;15654:34;15707:12;;;24498:245::o;24750:416::-;24950:2;24964:47;;;15958:2;24935:18;;;30945:19;-1:-1;;;30985:14;;;15974:33;16026:12;;;24921:245::o;25173:416::-;25373:2;25387:47;;;16277:2;25358:18;;;30945:19;16313:34;30985:14;;;16293:55;-1:-1;;;16368:12;;;16361:46;16426:12;;;25344:245::o;25596:222::-;16513:37;;;25723:2;25708:18;;25694:124::o;25825:481::-;;16543:5;16520:3;16513:37;26030:2;26148;26137:9;26133:18;26126:48;26188:108;26030:2;26019:9;26015:18;26282:6;26188:108;:::i;26313:321::-;16513:37;;;31805:13;31798:21;26620:2;26605:18;;10421:34;26462:2;26447:18;;26433:201::o;26641:816::-;;16543:5;16520:3;16513:37;16543:5;27095:2;27084:9;27080:18;16513:37;26930:3;27132:2;27121:9;27117:18;27110:48;27172:108;26930:3;26919:9;26915:19;27266:6;27172:108;:::i;:::-;-1:-1;;;;;32008:54;;;;27359:2;27344:18;;8757:37;-1:-1;27442:3;27427:19;16513:37;27164:116;26901:556;-1:-1;;;26901:556::o;27464:432::-;16513:37;;;27805:2;27790:18;;16513:37;;;;31805:13;31798:21;27882:2;27867:18;;10421:34;27641:2;27626:18;;27612:284::o;27903:444::-;16513:37;;;28250:2;28235:18;;16513:37;;;;28333:2;28318:18;;16513:37;28086:2;28071:18;;28057:290::o;28354:556::-;16513:37;;;28730:2;28715:18;;16513:37;;;;28813:2;28798:18;;16513:37;28896:2;28881:18;;16513:37;28565:3;28550:19;;28536:374::o;28917:256::-;28979:2;28973:9;29005:17;;;29080:18;29065:34;;29101:22;;;29062:62;29059:2;;;29137:1;;29127:12;29059:2;28979;29146:22;28957:216;;-1:-1;28957:216::o;29180:304::-;;29339:18;29331:6;29328:30;29325:2;;;-1:-1;;29361:12;29325:2;-1:-1;29406:4;29394:17;;;29459:15;;29262:222::o;33010:268::-;33075:1;33082:101;33096:6;33093:1;33090:13;33082:101;;;33163:11;;;33157:18;33144:11;;;33137:39;33118:2;33111:10;33082:101;;;33198:6;33195:1;33192:13;33189:2;;;33075:1;33254:6;33249:3;33245:16;33238:27;33189:2;;33059:219;;;:::o;33391:117::-;-1:-1;;;;;32008:54;;33450:35;;33440:2;;33499:1;;33489:12;33515:111;33596:5;31805:13;31798:21;33574:5;33571:32;33561:2;;33617:1;;33607:12
Swarm Source
ipfs://e7c125249560d6c3b057dd673aabb44c21b10750b8fdfac78663b0ad94abdfe5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.