Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 internal transactions (View All)
Advanced mode:
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
14497960 | 727 days ago | 0.56690575 ETH | ||||
14497960 | 727 days ago | 0.56690575 ETH | ||||
14033775 | 799 days ago | 2.06617079 ETH | ||||
14033775 | 799 days ago | 2.06617079 ETH | ||||
13506624 | 882 days ago | 12.7370169 ETH | ||||
13506624 | 882 days ago | 12.7370169 ETH | ||||
13372685 | 903 days ago | 20.87776942 ETH | ||||
13372685 | 903 days ago | 20.87776942 ETH | ||||
13327714 | 910 days ago | 7.26741619 ETH | ||||
13327714 | 910 days ago | 7.26741619 ETH | ||||
13308643 | 913 days ago | 3.63602179 ETH | ||||
13308643 | 913 days ago | 3.63602179 ETH | ||||
13296253 | 915 days ago | 2.3467642 ETH | ||||
13296253 | 915 days ago | 2.3467642 ETH | ||||
13284677 | 917 days ago | 0.80832186 ETH | ||||
13284677 | 917 days ago | 0.80832186 ETH | ||||
13255097 | 921 days ago | 3.91820118 ETH | ||||
13255097 | 921 days ago | 3.91820118 ETH | ||||
13119331 | 942 days ago | 0.47733 ETH | ||||
13119331 | 942 days ago | 0.47733 ETH | ||||
13099894 | 945 days ago | 0.49774681 ETH | ||||
13099894 | 945 days ago | 0.49774681 ETH | ||||
13080288 | 948 days ago | 0.61270516 ETH | ||||
13080288 | 948 days ago | 0.61270516 ETH | ||||
13059389 | 951 days ago | 0.57502881 ETH |
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-28 */ // 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); } // Part: WETH interface WETH { function deposit() external payable; function withdraw(uint256 wad) external; } // 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: ConvexETH abstract contract ConvexETH 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 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 = 1e21; dex = sushiswap; keepCRV = 1000; _approveDex(); } receive() external payable {} function _approveBasic() internal { want.approve(booster, 0); want.approve(booster, type(uint256).max); } function _approveDex() internal virtual { IERC20(crv).approve(dex, 0); IERC20(crv).approve(dex, type(uint256).max); IERC20(cvx).approve(dex, 0); IERC20(cvx).approve(dex, type(uint256).max); } function approveAll() external onlyAuthorized { _approveBasic(); _approveDex(); } function setKeepCRV(uint256 _keepCRV) external onlyAuthorized { keepCRV = _keepCRV; } function switchDex(bool isUniswap) external onlyAuthorized { if (isUniswap) dex = uniswap; else dex = sushiswap; _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).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(sushiswap).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: ankr.sol contract Strategy is ConvexETH { address public constant onx = address(0xE0aD1806Fd3E7edF6FF52Fdb822432e847411033); address public constant ankr = address(0x8290333ceF9e6D528dD5618Fb97a76f268f3EDD4); constructor(address _vault) public ConvexETH(_vault) { curve = address(0xA96A65c051bF88B4095Ee1f2451C2A9d43F53Ae2); id = 27; 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(); } // >>> approve other rewards on dex function _approveDex() internal override { super._approveDex(); IERC20(onx).approve(uniswap, 0); IERC20(onx).approve(uniswap, type(uint256).max); IERC20(ankr).approve(uniswap, 0); IERC20(ankr).approve(uniswap, type(uint256).max); } // >>> include other rewards function _migrateRewards(address _newStrategy) internal override { super._migrateRewards(_newStrategy); IERC20(onx).safeTransfer(_newStrategy, IERC20(onx).balanceOf(address(this))); IERC20(ankr).safeTransfer(_newStrategy, IERC20(ankr).balanceOf(address(this))); } // >>> include all other rewards in eth besides _claimableBasicInETH() function _claimableInETH() internal override view returns (uint256 _claimable) { _claimable = super._claimableInETH(); uint256 _onx = IERC20(onx).balanceOf(address(this)); if (_onx > 0) { address[] memory path = new address[](2); path[0] = onx; path[1] = weth; uint256[] memory swap = Uni(uniswap).getAmountsOut(_onx, path); _claimable = _claimable.add(swap[1]); } uint256 _ankr = IERC20(ankr).balanceOf(address(this)); if (_ankr > 0) { address[] memory path = new address[](2); path[0] = ankr; path[1] = weth; uint256[] memory swap = Uni(uniswap).getAmountsOut(_ankr, path); _claimable = _claimable.add(swap[1]); } } 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[](2); path[0] = crv; path[1] = weth; Uni(dex).swapExactTokensForTokens(_crv, uint256(0), path, address(this), now); } uint256 _cvx = IERC20(cvx).balanceOf(address(this)); if (_cvx > 0) { address[] memory path = new address[](2); path[0] = cvx; path[1] = weth; Uni(sushiswap).swapExactTokensForTokens(_cvx, uint256(0), path, address(this), now); } uint256 _onx = IERC20(onx).balanceOf(address(this)); if (_onx > 0) { address[] memory path = new address[](2); path[0] = onx; path[1] = weth; Uni(uniswap).swapExactTokensForTokens(_onx, uint256(0), path, address(this), now); } uint256 _ankr = IERC20(ankr).balanceOf(address(this)); if (_ankr > 0) { address[] memory path = new address[](2); path[0] = ankr; path[1] = weth; Uni(uniswap).swapExactTokensForTokens(_ankr, uint256(0), path, address(this), now); } uint256 _weth = IERC20(weth).balanceOf(address(this)); if (_weth > 0) { WETH(weth).withdraw(_weth); _weth = address(this).balance; ICurveFi(curve).add_liquidity{value: _weth}([_weth, 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[](4); protected[0] = crv; protected[1] = cvx; protected[2] = onx; protected[3] = ankr; 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":"ankr","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"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":[],"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":[],"name":"onx","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":"_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":"bool","name":"isUniswap","type":"bool"}],"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":"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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005e7a38038062005e7a833981016040819052620000349162000c70565b80806200004481338080620001e5565b5061a8c06006556203f4806007556103e86008819055683635c9adc5dea00000600955600e80546001600160a01b03191673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f179055600f556200009a620003c1565b50600d80546001600160a01b03191673a96a65c051bf88b4095ee1f2451c2a9d43f53ae2179055601b600b819055600a805462ff00001961ff0019909116610100171662010000179055604051631526fe2760e01b8152600091829173f403c135812408bfbe8713b5a23a04b3d48aae3191631526fe279162000121919060040162000f2e565b60c06040518083038186803b1580156200013a57600080fd5b505afa1580156200014f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000175919062000c95565b5050600554939550935050506001600160a01b03808416911614620001b75760405162461bcd60e51b8152600401620001ae9062000de2565b60405180910390fd5b600c80546001600160a01b0319166001600160a01b038316179055620001dc62000676565b50505062000f6a565b6005546001600160a01b031615620002115760405162461bcd60e51b8152600401620001ae9062000e19565b600180546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b1580156200026e57600080fd5b505afa15801562000283573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a9919062000c70565b600580546001600160a01b0319166001600160a01b039283161790819055620002e391168560001962000760602090811b6200227717901c565b600280546001600160a01b038086166001600160a01b0319928316179092556003805485841690831617908190556004805485851693169290921782556000600681905562015180600755606460085560095560015460405163095ea7b360e01b81529084169363095ea7b393620003649390911691600019910162000d94565b602060405180830381600087803b1580156200037f57600080fd5b505af115801562000394573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ba919062000d21565b5050505050565b620003d66200086e60201b620023761760201c565b60405163095ea7b360e01b815273e0ad1806fd3e7edf6ff52fdb822432e8474110339063095ea7b3906200042690737a250d5630b4cf539739df2c5dacb4c659f2488d9060009060040162000d94565b602060405180830381600087803b1580156200044157600080fd5b505af115801562000456573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047c919062000d21565b5060405163095ea7b360e01b815273e0ad1806fd3e7edf6ff52fdb822432e8474110339063095ea7b390620004ce90737a250d5630b4cf539739df2c5dacb4c659f2488d906000199060040162000d94565b602060405180830381600087803b158015620004e957600080fd5b505af1158015620004fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000524919062000d21565b5060405163095ea7b360e01b8152738290333cef9e6d528dd5618fb97a76f268f3edd49063095ea7b3906200057590737a250d5630b4cf539739df2c5dacb4c659f2488d9060009060040162000d94565b602060405180830381600087803b1580156200059057600080fd5b505af1158015620005a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cb919062000d21565b5060405163095ea7b360e01b8152738290333cef9e6d528dd5618fb97a76f268f3edd49063095ea7b3906200061d90737a250d5630b4cf539739df2c5dacb4c659f2488d906000199060040162000d94565b602060405180830381600087803b1580156200063857600080fd5b505af11580156200064d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000673919062000d21565b50565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620006bf9073f403c135812408bfbe8713b5a23a04b3d48aae319060009060040162000d94565b602060405180830381600087803b158015620006da57600080fd5b505af1158015620006ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000715919062000d21565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906200061d9073f403c135812408bfbe8713b5a23a04b3d48aae31906000199060040162000d94565b801580620007ef5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9062000799903090869060040162000d7a565b60206040518083038186803b158015620007b257600080fd5b505afa158015620007c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007ed919062000d43565b155b6200080e5760405162461bcd60e51b8152600401620001ae9062000ed1565b620008698363095ea7b360e01b84846040516024016200083092919062000d94565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529062000a9116565b505050565b600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b391620008b5916001600160a01b03169060009060040162000d94565b602060405180830381600087803b158015620008d057600080fd5b505af1158015620008e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200090b919062000d21565b50600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b39162000954916001600160a01b0316906000199060040162000d94565b602060405180830381600087803b1580156200096f57600080fd5b505af115801562000984573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009aa919062000d21565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b391620009f2916001600160a01b03169060009060040162000d94565b602060405180830381600087803b15801562000a0d57600080fd5b505af115801562000a22573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a48919062000d21565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b3916200061d916001600160a01b0316906000199060040162000d94565b606062000aed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000b2d60201b620025d7179092919060201c565b80519091501562000869578080602001905181019062000b0e919062000d21565b620008695760405162461bcd60e51b8152600401620001ae9062000e87565b606062000b3e848460008562000b46565b949350505050565b606062000b538562000c18565b62000b725760405162461bcd60e51b8152600401620001ae9062000e50565b60006060866001600160a01b0316858760405162000b91919062000d5c565b60006040518083038185875af1925050503d806000811462000bd0576040519150601f19603f3d011682016040523d82523d6000602084013e62000bd5565b606091505b5091509150811562000beb57915062000b3e9050565b80511562000bfc5780518082602001fd5b8360405162461bcd60e51b8152600401620001ae919062000dad565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000b3e575050151592915050565b80516001600160a01b038116811462000c6a57600080fd5b92915050565b60006020828403121562000c82578081fd5b62000c8e838362000c52565b9392505050565b60008060008060008060c0878903121562000cae578182fd5b62000cba888862000c52565b955062000ccb886020890162000c52565b945062000cdc886040890162000c52565b935062000ced886060890162000c52565b925062000cfe886080890162000c52565b915060a0870151801515811462000d13578182fd5b809150509295509295509295565b60006020828403121562000d33578081fd5b8151801515811462000c8e578182fd5b60006020828403121562000d55578081fd5b5051919050565b6000825162000d7081846020870162000f37565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015262000dce81604085016020870162000f37565b601f01601f19169190910160400192915050565b6020808252601f908201527f636f6e7374727563746f723a20696e636f7272656374206c7020746f6b656e00604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b90815260200190565b60005b8381101562000f5457818101518382015260200162000f3a565b8381111562000f64576000848401525b50505050565b614f008062000f7a6000396000f3fe60806040526004361061037a5760003560e01c80636ea69d62116101d15780639ec5a89411610102578063ce5494bb116100a0578063efbb5cb01161006f578063efbb5cb0146108ce578063f017c92f146108e3578063fbfa77cf14610903578063fcf2d0ad1461091857610381565b8063ce5494bb14610859578063dd9e73da14610879578063ec38a8621461088e578063ed882c2b146108ae57610381565b8063c1a3d44c116100dc578063c1a3d44c146107ef578063c6def07614610804578063c768780314610819578063c7b9d5301461083957610381565b80639ec5a894146107b0578063aced1661146107c5578063af640d0f146107da57610381565b80638e6350e21161016f578063923c1d6111610149578063923c1d6114610751578063955383bd1461076657806395e80c50146107865780639be287851461079b57610381565b80638e6350e21461070757806391397ab41461071c578063918f86741461073c57610381565b8063750521f5116101ab578063750521f51461069d5780637fef901a146106bd5780638516c2c8146106d25780638cdfe166146106f257610381565b80636ea69d62146106535780637165485d14610668578063748747e61461067d57610381565b80632e1a7d4d116102ab57806346c96aac11610249578063650d188011610223578063650d1880146105e9578063692058c2146106095780636a4874a11461061e5780636bc558761461063357610381565b806346c96aac146105aa5780635641ec03146105bf57806356e6456f146105d457610381565b806339a172a81161028557806339a172a81461054b5780633fc8cef31461056b578063440368a3146105805780634641257d1461059557610381565b80632e1a7d4d1461050157806334659dc514610521578063380d0c081461053657610381565b80631d12f28b1161031857806322f3e2d4116102f257806322f3e2d4146104ad57806325829410146104c25780632681f7e4146104d757806328b7ccf7146104ec57610381565b80631d12f28b146104615780631f1fcd51146104765780631fe4a6861461049857610381565b80630acd095b116103545780630acd095b146103e85780630f969b871461040a578063115880861461042a5780631c459a7f1461044c57610381565b806301681a621461038657806303ee438c146103a857806306fdde03146103d357610381565b3661038157005b600080fd5b34801561039257600080fd5b506103a66103a136600461471c565b61092d565b005b3480156103b457600080fd5b506103bd610acc565b6040516103ca9190614b29565b60405180910390f35b3480156103df57600080fd5b506103bd610b5a565b3480156103f457600080fd5b506103fd610bff565b6040516103ca9190614aef565b34801561041657600080fd5b506103a6610425366004614998565b610c0d565b34801561043657600080fd5b5061043f610c9a565b6040516103ca9190614d79565b34801561045857600080fd5b506103fd610d20565b34801561046d57600080fd5b5061043f610d2f565b34801561048257600080fd5b5061048b610d35565b6040516103ca9190614a55565b3480156104a457600080fd5b5061048b610d44565b3480156104b957600080fd5b506103fd610d53565b3480156104ce57600080fd5b506103bd610df4565b3480156104e357600080fd5b5061048b610e13565b3480156104f857600080fd5b5061043f610e2b565b34801561050d57600080fd5b5061043f61051c366004614998565b610e31565b34801561052d57600080fd5b506103a6610e8c565b34801561054257600080fd5b506103a6610feb565b34801561055757600080fd5b506103a6610566366004614998565b61104a565b34801561057757600080fd5b5061048b6110cc565b34801561058c57600080fd5b506103a66110e4565b3480156105a157600080fd5b506103a661130b565b3480156105b657600080fd5b5061048b611675565b3480156105cb57600080fd5b506103fd61168d565b3480156105e057600080fd5b5061048b611696565b3480156105f557600080fd5b506103fd610604366004614998565b6116ae565b34801561061557600080fd5b5061048b6116b6565b34801561062a57600080fd5b5061048b6116c5565b34801561063f57600080fd5b506103a661064e3660046147e9565b6116dd565b34801561065f57600080fd5b5061048b61178d565b34801561067457600080fd5b5061048b61179c565b34801561068957600080fd5b506103a661069836600461471c565b6117ab565b3480156106a957600080fd5b506103a66106b8366004614821565b611856565b3480156106c957600080fd5b5061043f6118ed565b3480156106de57600080fd5b506103a66106ed3660046147e9565b6118f3565b3480156106fe57600080fd5b5061043f61195c565b34801561071357600080fd5b5061043f611962565b34801561072857600080fd5b506103a6610737366004614998565b611967565b34801561074857600080fd5b5061043f6119e9565b34801561075d57600080fd5b5061048b6119ef565b34801561077257600080fd5b506103a6610781366004614998565b611a07565b34801561079257600080fd5b5061043f611a59565b3480156107a757600080fd5b5061048b611a5f565b3480156107bc57600080fd5b5061048b611a77565b3480156107d157600080fd5b5061048b611a86565b3480156107e657600080fd5b5061043f611a95565b3480156107fb57600080fd5b5061043f611a9b565b34801561081057600080fd5b5061048b611acc565b34801561082557600080fd5b506103a66108343660046147e9565b611ae4565b34801561084557600080fd5b506103a661085436600461471c565b611b4b565b34801561086557600080fd5b506103a661087436600461471c565b611bf6565b34801561088557600080fd5b5061048b611d64565b34801561089a57600080fd5b506103a66108a936600461471c565b611d7c565b3480156108ba57600080fd5b506103fd6108c9366004614998565b611f13565b3480156108da57600080fd5b5061043f6120e7565b3480156108ef57600080fd5b506103a66108fe366004614998565b612102565b34801561090f57600080fd5b5061048b612184565b34801561092457600080fd5b506103a6612193565b6109356125ee565b6001600160a01b0316336001600160a01b03161461096e5760405162461bcd60e51b815260040161096590614c90565b60405180910390fd5b6005546001600160a01b038281169116141561099c5760405162461bcd60e51b815260040161096590614b81565b6001546001600160a01b03828116911614156109ca5760405162461bcd60e51b815260040161096590614c38565b60606109d461266b565b905060005b8151811015610a2f578181815181106109ee57fe5b60200260200101516001600160a01b0316836001600160a01b03161415610a275760405162461bcd60e51b815260040161096590614cff565b6001016109d9565b50610ac8610a3b6125ee565b6040516370a0823160e01b81526001600160a01b038516906370a0823190610a67903090600401614a55565b60206040518083038186803b158015610a7f57600080fd5b505afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab791906149b0565b6001600160a01b0385169190612796565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b525780601f10610b2757610100808354040283529160200191610b52565b820191906000526020600020905b815481529060010190602001808311610b3557829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b158015610b9f57600080fd5b505afa158015610bb3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bdb919081019061488e565b604051602001610beb9190614a27565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b0316331480610c3e5750610c296125ee565b6001600160a01b0316336001600160a01b0316145b610c5a5760405162461bcd60e51b815260040161096590614c90565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610c8f908390614d79565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ccb903090600401614a55565b60206040518083038186803b158015610ce357600080fd5b505afa158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b91906149b0565b905090565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610d88903090600401614a55565b6101206040518083038186803b158015610da157600080fd5b505afa158015610db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd9919061491a565b604001511180610d1b57506000610dee6120e7565b11905090565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610e5e5760405162461bcd60e51b815260040161096590614c18565b6000610e69836127b5565b600554909350909150610e86906001600160a01b03163383612796565b50919050565b6002546001600160a01b0316331480610ebd5750610ea86125ee565b6001600160a01b0316336001600160a01b0316145b610ed95760405162461bcd60e51b815260040161096590614c90565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610f0a903090600401614a55565b60206040518083038186803b158015610f2257600080fd5b505afa158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a91906149b0565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610f99918591610100900460ff1690600401614d9b565b602060405180830381600087803b158015610fb357600080fd5b505af1158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac89190614805565b6002546001600160a01b031633148061101c57506110076125ee565b6001600160a01b0316336001600160a01b0316145b6110385760405162461bcd60e51b815260040161096590614c90565b611040612807565b6110486128e9565b565b6002546001600160a01b031633148061107b57506110666125ee565b6001600160a01b0316336001600160a01b0316145b6110975760405162461bcd60e51b815260040161096590614c90565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610c8f908390614d79565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6004546001600160a01b031633148061110757506002546001600160a01b031633145b8061112a57506111156125ee565b6001600160a01b0316336001600160a01b0316145b806111cb5750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561117e57600080fd5b505afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190614738565b6001600160a01b0316336001600160a01b0316145b8061126c5750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561121f57600080fd5b505afa158015611233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614738565b6001600160a01b0316336001600160a01b0316145b6112885760405162461bcd60e51b815260040161096590614c90565b6001546040805163bf3759b560e01b81529051611048926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b1580156112ce57600080fd5b505afa1580156112e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130691906149b0565b612b24565b6004546001600160a01b031633148061132e57506002546001600160a01b031633145b80611351575061133c6125ee565b6001600160a01b0316336001600160a01b0316145b806113f25750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b1580156113a557600080fd5b505afa1580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd9190614738565b6001600160a01b0316336001600160a01b0316145b806114935750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561144657600080fd5b505afa15801561145a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147e9190614738565b6001600160a01b0316336001600160a01b0316145b6114af5760405162461bcd60e51b815260040161096590614c90565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561150257600080fd5b505afa158015611516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153a91906149b0565b600a5490915060009060ff16156115905760006115556120e7565b905061156e8382116115675783611569565b815b6127b5565b945091508282111561158a576115848284612c4d565b94508291505b506115a1565b61159982612c98565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc906115d590879087908690600401614dff565b602060405180830381600087803b1580156115ef57600080fd5b505af1158015611603573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162791906149b0565b915061163282612b24565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516116679493929190614e15565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b600a5460ff1681565b73e0ad1806fd3e7edf6ff52fdb822432e84741103381565b60005b919050565b600e546001600160a01b031681565b73d533a949740bb3306d119cc777fa900ba034cd5281565b6002546001600160a01b031633148061170e57506116f96125ee565b6001600160a01b0316336001600160a01b0316145b61172a5760405162461bcd60e51b815260040161096590614c90565b801561175b57600e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055611782565b600e80546001600160a01b03191673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f1790555b61178a6128e9565b50565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b03163314806117dc57506117c76125ee565b6001600160a01b0316336001600160a01b0316145b6117f85760405162461bcd60e51b815260040161096590614c90565b6001600160a01b03811661180b57600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610c8f908390614a55565b6002546001600160a01b031633148061188757506118726125ee565b6001600160a01b0316336001600160a01b0316145b6118a35760405162461bcd60e51b815260040161096590614c90565b6118af6000838361463d565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda682826040516118e1929190614afa565b60405180910390a15050565b600f5481565b6002546001600160a01b0316331480611924575061190f6125ee565b6001600160a01b0316336001600160a01b0316145b6119405760405162461bcd60e51b815260040161096590614c90565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b031633148061199857506119836125ee565b6001600160a01b0316336001600160a01b0316145b6119b45760405162461bcd60e51b815260040161096590614c90565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610c8f908390614d79565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b0316331480611a385750611a236125ee565b6001600160a01b0316336001600160a01b0316145b611a545760405162461bcd60e51b815260040161096590614c90565b600f55565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ccb903090600401614a55565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b0316331480611b155750611b006125ee565b6001600160a01b0316336001600160a01b0316145b611b315760405162461bcd60e51b815260040161096590614c90565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611b7c5750611b676125ee565b6001600160a01b0316336001600160a01b0316145b611b985760405162461bcd60e51b815260040161096590614c90565b6001600160a01b038116611bab57600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610c8f908390614a55565b6001546001600160a01b0316331480611c275750611c126125ee565b6001600160a01b0316336001600160a01b0316145b611c3057600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611c7757600080fd5b505afa158015611c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caf9190614738565b6001600160a01b031614611cc257600080fd5b611ccb81613735565b6005546040516370a0823160e01b815261178a9183916001600160a01b03909116906370a0823190611d01903090600401614a55565b60206040518083038186803b158015611d1957600080fd5b505afa158015611d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5191906149b0565b6005546001600160a01b03169190612796565b738290333cef9e6d528dd5618fb97a76f268f3edd481565b6002546001600160a01b03163314611da65760405162461bcd60e51b815260040161096590614b5c565b6001600160a01b038116611db957600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611df092911690600090600401614a9e565b602060405180830381600087803b158015611e0a57600080fd5b505af1158015611e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e429190614805565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611e919291169060001990600401614a9e565b602060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee39190614805565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610c8f9190614a55565b6000611f1d6146bb565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611f4d903090600401614a55565b6101206040518083038186803b158015611f6657600080fd5b505afa158015611f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9e919061491a565b9050806020015160001415611fb75760009150506116b1565b60065460a0820151611fca904290612c4d565b1015611fda5760009150506116b1565b60075460a0820151611fed904290612c4d565b10611ffc5760019150506116b1565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561204157600080fd5b505afa158015612055573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207991906149b0565b9050600954811115612090576001925050506116b1565b600061209a6120e7565b90508260c001516120b6600954836137ab90919063ffffffff16565b10156120c857600193505050506116b1565b6120d06137d0565b6008546120dd9087613bba565b1095945050505050565b6000610d1b6120f4610c9a565b6120fc611a9b565b906137ab565b6002546001600160a01b0316331480612133575061211e6125ee565b6001600160a01b0316336001600160a01b0316145b61214f5760405162461bcd60e51b815260040161096590614c90565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610c8f908390614d79565b6001546001600160a01b031681565b6002546001600160a01b03163314806121c457506121af6125ee565b6001600160a01b0316336001600160a01b0316145b6121e05760405162461bcd60e51b815260040161096590614c90565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561223457600080fd5b505af1158015612248573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806122ff5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906122ad9030908690600401614a84565b60206040518083038186803b1580156122c557600080fd5b505afa1580156122d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fd91906149b0565b155b61231b5760405162461bcd60e51b815260040161096590614d23565b6123718363095ea7b360e01b848460405160240161233a929190614a9e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613bf4565b505050565b600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b3916123bb916001600160a01b031690600090600401614a9e565b602060405180830381600087803b1580156123d557600080fd5b505af11580156123e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240d9190614805565b50600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b391612454916001600160a01b03169060001990600401614a9e565b602060405180830381600087803b15801561246e57600080fd5b505af1158015612482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a69190614805565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b3916124ec916001600160a01b031690600090600401614a9e565b602060405180830381600087803b15801561250657600080fd5b505af115801561251a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253e9190614805565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b391612585916001600160a01b03169060001990600401614a9e565b602060405180830381600087803b15801561259f57600080fd5b505af11580156125b3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a9190614805565b60606125e68484600085613c83565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561263357600080fd5b505afa158015612647573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b9190614738565b60408051600480825260a082019092526060918291906020820160808036833701905050905073d533a949740bb3306d119cc777fa900ba034cd52816000815181106126b357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b816001815181106126f557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073e0ad1806fd3e7edf6ff52fdb822432e8474110338160028151811061273757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050738290333cef9e6d528dd5618fb97a76f268f3edd48160038151811061277957fe5b6001600160a01b0390921660209283029190910190910152905090565b6123718363a9059cbb60e01b848460405160240161233a929190614a9e565b60008060006127c2611a9b565b9050838110156127fd576127de6127d98583612c4d565b613d47565b92506127ea83826137ab565b92506127f68484612c4d565b9150612801565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061284e9073f403c135812408bfbe8713b5a23a04b3d48aae3190600090600401614a9e565b602060405180830381600087803b15801561286857600080fd5b505af115801561287c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a09190614805565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906125859073f403c135812408bfbe8713b5a23a04b3d48aae319060001990600401614a9e565b6128f1612376565b60405163095ea7b360e01b815273e0ad1806fd3e7edf6ff52fdb822432e8474110339063095ea7b39061293f90737a250d5630b4cf539739df2c5dacb4c659f2488d90600090600401614a9e565b602060405180830381600087803b15801561295957600080fd5b505af115801561296d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129919190614805565b5060405163095ea7b360e01b815273e0ad1806fd3e7edf6ff52fdb822432e8474110339063095ea7b3906129e190737a250d5630b4cf539739df2c5dacb4c659f2488d9060001990600401614a9e565b602060405180830381600087803b1580156129fb57600080fd5b505af1158015612a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a339190614805565b5060405163095ea7b360e01b8152738290333cef9e6d528dd5618fb97a76f268f3edd49063095ea7b390612a8290737a250d5630b4cf539739df2c5dacb4c659f2488d90600090600401614a9e565b602060405180830381600087803b158015612a9c57600080fd5b505af1158015612ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad49190614805565b5060405163095ea7b360e01b8152738290333cef9e6d528dd5618fb97a76f268f3edd49063095ea7b39061258590737a250d5630b4cf539739df2c5dacb4c659f2488d9060001990600401614a9e565b600a5460ff1615612b345761178a565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612b65903090600401614a55565b60206040518083038186803b158015612b7d57600080fd5b505afa158015612b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb591906149b0565b90508015610ac857600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d06691612bfb91908590600190600401614de7565b602060405180830381600087803b158015612c1557600080fd5b505af1158015612c29573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123719190614805565b6000612c8f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613dfb565b90505b92915050565b600080600080612ca6611a9b565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd991612ce691309162010000900460ff1690600401614a69565b602060405180830381600087803b158015612d0057600080fd5b505af1158015612d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d389190614805565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612d73903090600401614a55565b60206040518083038186803b158015612d8b57600080fd5b505afa158015612d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc391906149b0565b90508015612efb57612dd481613e27565b60408051600280825260608083018452939450909160208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612e1a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612e5c57fe5b6001600160a01b039283166020918202929092010152600e546040516338ed173960e01b81529116906338ed173990612ea2908590600090869030904290600401614dab565b600060405180830381600087803b158015612ebc57600080fd5b505af1158015612ed0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ef89190810190614754565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612f35903090600401614a55565b60206040518083038186803b158015612f4d57600080fd5b505afa158015612f61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8591906149b0565b905080156130c2576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110612fcf57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061301157fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990613069908590600090869030904290600401614dab565b600060405180830381600087803b15801561308357600080fd5b505af1158015613097573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130bf9190810190614754565b50505b6040516370a0823160e01b815260009073e0ad1806fd3e7edf6ff52fdb822432e847411033906370a08231906130fc903090600401614a55565b60206040518083038186803b15801561311457600080fd5b505afa158015613128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314c91906149b0565b9050801561328957604080516002808252606080830184529260208301908036833701905050905073e0ad1806fd3e7edf6ff52fdb822432e8474110338160008151811061319657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106131d857fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed173990613230908590600090869030904290600401614dab565b600060405180830381600087803b15801561324a57600080fd5b505af115801561325e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132869190810190614754565b50505b6040516370a0823160e01b8152600090738290333cef9e6d528dd5618fb97a76f268f3edd4906370a08231906132c3903090600401614a55565b60206040518083038186803b1580156132db57600080fd5b505afa1580156132ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331391906149b0565b90508015613450576040805160028082526060808301845292602083019080368337019050509050738290333cef9e6d528dd5618fb97a76f268f3edd48160008151811061335d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061339f57fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed1739906133f7908590600090869030904290600401614dab565b600060405180830381600087803b15801561341157600080fd5b505af1158015613425573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261344d9190810190614754565b50505b6040516370a0823160e01b815260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a082319061348a903090600401614a55565b60206040518083038186803b1580156134a257600080fd5b505afa1580156134b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134da91906149b0565b905080156135c757604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90613519908490600401614d79565b600060405180830381600087803b15801561353357600080fd5b505af1158015613547573d6000803e3d6000fd5b5050600d54604080518082018252478082526000602083018190529251630b4c7e4d60e01b81529096506001600160a01b039093169450630b4c7e4d935085926135949290600401614ab7565b6000604051808303818588803b1580156135ad57600080fd5b505af11580156135c1573d6000803e3d6000fd5b50505050505b6005546040516370a0823160e01b81526136539188916001600160a01b03909116906370a08231906135fd903090600401614a55565b60206040518083038186803b15801561361557600080fd5b505afa158015613629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364d91906149b0565b90612c4d565b9850600061365f6120e7565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf82390613695903090600401614a55565b6101206040518083038186803b1580156136ae57600080fd5b505afa1580156136c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e6919061491a565b60c001519050808210156136fe57818103995060009a505b8b156137265761370d8c613d47565b506137238c61371e8d61364d611a9b565b613e90565b98505b50505050505050509193909250565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a2916137709161010090910460ff1690600401614aef565b600060405180830381600087803b15801561378a57600080fd5b505af115801561379e573d6000803e3d6000fd5b5050505061178a81613ea6565b600082820183811015612c8f5760405162461bcd60e51b815260040161096590614ba0565b60006137da614001565b6040516370a0823160e01b815290915060009073e0ad1806fd3e7edf6ff52fdb822432e847411033906370a0823190613817903090600401614a55565b60206040518083038186803b15801561382f57600080fd5b505afa158015613843573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386791906149b0565b905080156139c957604080516002808252606080830184529260208301908036833701905050905073e0ad1806fd3e7edf6ff52fdb822432e847411033816000815181106138b157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106138f357fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b8152606090737a250d5630b4cf539739df2c5dacb4c659f2488d9063d06ca61f906139479086908690600401614d82565b60006040518083038186803b15801561395f57600080fd5b505afa158015613973573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261399b9190810190614754565b90506139c4816001815181106139ad57fe5b6020026020010151856137ab90919063ffffffff16565b935050505b6040516370a0823160e01b8152600090738290333cef9e6d528dd5618fb97a76f268f3edd4906370a0823190613a03903090600401614a55565b60206040518083038186803b158015613a1b57600080fd5b505afa158015613a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5391906149b0565b90508015613bb5576040805160028082526060808301845292602083019080368337019050509050738290333cef9e6d528dd5618fb97a76f268f3edd481600081518110613a9d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613adf57fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b8152606090737a250d5630b4cf539739df2c5dacb4c659f2488d9063d06ca61f90613b339086908690600401614d82565b60006040518083038186803b158015613b4b57600080fd5b505afa158015613b5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613b879190810190614754565b9050613bb081600181518110613b9957fe5b6020026020010151866137ab90919063ffffffff16565b945050505b505090565b600082613bc957506000612c92565b82820282848281613bd657fe5b0414612c8f5760405162461bcd60e51b815260040161096590614bd7565b6060613c49826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125d79092919063ffffffff16565b8051909150156123715780806020019051810190613c679190614805565b6123715760405162461bcd60e51b815260040161096590614cb5565b6060613c8e8561400b565b613caa5760405162461bcd60e51b815260040161096590614c59565b60006060866001600160a01b03168587604051613cc79190614a0b565b60006040518083038185875af1925050503d8060008114613d04576040519150601f19603f3d011682016040523d82523d6000602084013e613d09565b606091505b50915091508115613d1d5791506125e69050565b805115613d2d5780518082602001fd5b8360405162461bcd60e51b81526004016109659190614b29565b6000613d558261371e610c9a565b91506000613d61611a9b565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e720290613d95908690600090600401614d9b565b602060405180830381600087803b158015613daf57600080fd5b505af1158015613dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613de79190614805565b50613df48161364d611a9b565b9392505050565b60008184841115613e1f5760405162461bcd60e51b81526004016109659190614b29565b505050900390565b600080613e4b612710613e45600f5486613bba90919063ffffffff16565b90614044565b90508015613e8657613e8673d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483612796565b613df48382612c4d565b6000818310613e9f5781612c8f565b5090919050565b613eaf81614086565b6040516370a0823160e01b8152613f5890829073e0ad1806fd3e7edf6ff52fdb822432e847411033906370a0823190613eec903090600401614a55565b60206040518083038186803b158015613f0457600080fd5b505afa158015613f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3c91906149b0565b73e0ad1806fd3e7edf6ff52fdb822432e8474110339190612796565b6040516370a0823160e01b815261178a908290738290333cef9e6d528dd5618fb97a76f268f3edd4906370a0823190613f95903090600401614a55565b60206040518083038186803b158015613fad57600080fd5b505afa158015613fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe591906149b0565b738290333cef9e6d528dd5618fb97a76f268f3edd49190612796565b6000610d1b6141d8565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906125e6575050151592915050565b6000612c8f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614606565b6040516370a0823160e01b815261412f90829073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906140c3903090600401614a55565b60206040518083038186803b1580156140db57600080fd5b505afa1580156140ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061411391906149b0565b73d533a949740bb3306d119cc777fa900ba034cd529190612796565b6040516370a0823160e01b815261178a908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a082319061416c903090600401614a55565b60206040518083038186803b15801561418457600080fd5b505afa158015614198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141bc91906149b0565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612796565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc2629061420b903090600401614a55565b60206040518083038186803b15801561422357600080fd5b505afa158015614237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061425b91906149b0565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156142d257600080fd5b505afa1580156142e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061430a91906149b0565b90506000806143198385614044565b90508581101561435e57600061432f8783612c4d565b905061433f87613e458a84613bba565b9250600061434d8786612c4d565b90508084111561435b578093505b50505b6000871561449e57604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd52816000815181106143a857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106143ea57fe5b6001600160a01b039283166020918202929092010152600e5460405163d06ca61f60e01b8152606092919091169063d06ca61f9061442e908d908690600401614d82565b60006040518083038186803b15801561444657600080fd5b505afa15801561445a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526144829190810190614754565b90508060018151811061449157fe5b6020026020010151925050505b600083156145ee576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b816000815181106144e857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061452a57fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815260609073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063d06ca61f9061457e9089908690600401614d82565b60006040518083038186803b15801561459657600080fd5b505afa1580156145aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526145d29190810190614754565b9050806001815181106145e157fe5b6020026020010151925050505b6145f882826137ab565b995050505050505050505090565b600081836146275760405162461bcd60e51b81526004016109659190614b29565b50600083858161463357fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061467e5782800160ff198235161785556146ab565b828001600101855582156146ab579182015b828111156146ab578235825591602001919060010190614690565b506146b7929150614707565b5090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b808211156146b75760008155600101614708565b60006020828403121561472d578081fd5b8135612c8f81614ea7565b600060208284031215614749578081fd5b8151612c8f81614ea7565b60006020808385031215614766578182fd5b825167ffffffffffffffff81111561477c578283fd5b8301601f8101851361478c578283fd5b805161479f61479a82614e57565b614e30565b81815283810190838501858402850186018910156147bb578687fd5b8694505b838510156147dd5780518352600194909401939185019185016147bf565b50979650505050505050565b6000602082840312156147fa578081fd5b8135612c8f81614ebc565b600060208284031215614816578081fd5b8151612c8f81614ebc565b60008060208385031215614833578081fd5b823567ffffffffffffffff8082111561484a578283fd5b818501915085601f83011261485d578283fd5b81358181111561486b578384fd5b86602082850101111561487c578384fd5b60209290920196919550909350505050565b60006020828403121561489f578081fd5b815167ffffffffffffffff808211156148b6578283fd5b818401915084601f8301126148c9578283fd5b8151818111156148d7578384fd5b6148ea601f8201601f1916602001614e30565b9150808252856020828501011115614900578384fd5b614911816020840160208601614e77565b50949350505050565b600061012080838503121561492d578182fd5b61493681614e30565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156149a9578081fd5b5035919050565b6000602082840312156149c1578081fd5b5051919050565b6000815180845260208085019450808401835b83811015614a005781516001600160a01b0316875295820195908201906001016149db565b509495945050505050565b60008251614a1d818460208701614e77565b9190910192915050565b600065086dedceccaf60d31b82528251614a48816006850160208701614e77565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b60608101818460005b6002811015614adf578151835260209283019290910190600101614ac0565b5050508260408301529392505050565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082528251806020840152614b48816040850160208701614e77565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b6000838252604060208301526125e660408301846149c8565b9182521515602082015260400190565b600086825285602083015260a06040830152614dca60a08301866149c8565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715614e4f57600080fd5b604052919050565b600067ffffffffffffffff821115614e6d578081fd5b5060209081020190565b60005b83811015614e92578181015183820152602001614e7a565b83811115614ea1576000848401525b50505050565b6001600160a01b038116811461178a57600080fd5b801515811461178a57600080fdfea26469706673582212209ca5264dff4695556e7166f290c25808c52f65eddad63a7009843e0b8f41eb6064736f6c634300060c0033000000000000000000000000132d8d2c76db3812403431facb00f3453fc42125
Deployed Bytecode
0x60806040526004361061037a5760003560e01c80636ea69d62116101d15780639ec5a89411610102578063ce5494bb116100a0578063efbb5cb01161006f578063efbb5cb0146108ce578063f017c92f146108e3578063fbfa77cf14610903578063fcf2d0ad1461091857610381565b8063ce5494bb14610859578063dd9e73da14610879578063ec38a8621461088e578063ed882c2b146108ae57610381565b8063c1a3d44c116100dc578063c1a3d44c146107ef578063c6def07614610804578063c768780314610819578063c7b9d5301461083957610381565b80639ec5a894146107b0578063aced1661146107c5578063af640d0f146107da57610381565b80638e6350e21161016f578063923c1d6111610149578063923c1d6114610751578063955383bd1461076657806395e80c50146107865780639be287851461079b57610381565b80638e6350e21461070757806391397ab41461071c578063918f86741461073c57610381565b8063750521f5116101ab578063750521f51461069d5780637fef901a146106bd5780638516c2c8146106d25780638cdfe166146106f257610381565b80636ea69d62146106535780637165485d14610668578063748747e61461067d57610381565b80632e1a7d4d116102ab57806346c96aac11610249578063650d188011610223578063650d1880146105e9578063692058c2146106095780636a4874a11461061e5780636bc558761461063357610381565b806346c96aac146105aa5780635641ec03146105bf57806356e6456f146105d457610381565b806339a172a81161028557806339a172a81461054b5780633fc8cef31461056b578063440368a3146105805780634641257d1461059557610381565b80632e1a7d4d1461050157806334659dc514610521578063380d0c081461053657610381565b80631d12f28b1161031857806322f3e2d4116102f257806322f3e2d4146104ad57806325829410146104c25780632681f7e4146104d757806328b7ccf7146104ec57610381565b80631d12f28b146104615780631f1fcd51146104765780631fe4a6861461049857610381565b80630acd095b116103545780630acd095b146103e85780630f969b871461040a578063115880861461042a5780631c459a7f1461044c57610381565b806301681a621461038657806303ee438c146103a857806306fdde03146103d357610381565b3661038157005b600080fd5b34801561039257600080fd5b506103a66103a136600461471c565b61092d565b005b3480156103b457600080fd5b506103bd610acc565b6040516103ca9190614b29565b60405180910390f35b3480156103df57600080fd5b506103bd610b5a565b3480156103f457600080fd5b506103fd610bff565b6040516103ca9190614aef565b34801561041657600080fd5b506103a6610425366004614998565b610c0d565b34801561043657600080fd5b5061043f610c9a565b6040516103ca9190614d79565b34801561045857600080fd5b506103fd610d20565b34801561046d57600080fd5b5061043f610d2f565b34801561048257600080fd5b5061048b610d35565b6040516103ca9190614a55565b3480156104a457600080fd5b5061048b610d44565b3480156104b957600080fd5b506103fd610d53565b3480156104ce57600080fd5b506103bd610df4565b3480156104e357600080fd5b5061048b610e13565b3480156104f857600080fd5b5061043f610e2b565b34801561050d57600080fd5b5061043f61051c366004614998565b610e31565b34801561052d57600080fd5b506103a6610e8c565b34801561054257600080fd5b506103a6610feb565b34801561055757600080fd5b506103a6610566366004614998565b61104a565b34801561057757600080fd5b5061048b6110cc565b34801561058c57600080fd5b506103a66110e4565b3480156105a157600080fd5b506103a661130b565b3480156105b657600080fd5b5061048b611675565b3480156105cb57600080fd5b506103fd61168d565b3480156105e057600080fd5b5061048b611696565b3480156105f557600080fd5b506103fd610604366004614998565b6116ae565b34801561061557600080fd5b5061048b6116b6565b34801561062a57600080fd5b5061048b6116c5565b34801561063f57600080fd5b506103a661064e3660046147e9565b6116dd565b34801561065f57600080fd5b5061048b61178d565b34801561067457600080fd5b5061048b61179c565b34801561068957600080fd5b506103a661069836600461471c565b6117ab565b3480156106a957600080fd5b506103a66106b8366004614821565b611856565b3480156106c957600080fd5b5061043f6118ed565b3480156106de57600080fd5b506103a66106ed3660046147e9565b6118f3565b3480156106fe57600080fd5b5061043f61195c565b34801561071357600080fd5b5061043f611962565b34801561072857600080fd5b506103a6610737366004614998565b611967565b34801561074857600080fd5b5061043f6119e9565b34801561075d57600080fd5b5061048b6119ef565b34801561077257600080fd5b506103a6610781366004614998565b611a07565b34801561079257600080fd5b5061043f611a59565b3480156107a757600080fd5b5061048b611a5f565b3480156107bc57600080fd5b5061048b611a77565b3480156107d157600080fd5b5061048b611a86565b3480156107e657600080fd5b5061043f611a95565b3480156107fb57600080fd5b5061043f611a9b565b34801561081057600080fd5b5061048b611acc565b34801561082557600080fd5b506103a66108343660046147e9565b611ae4565b34801561084557600080fd5b506103a661085436600461471c565b611b4b565b34801561086557600080fd5b506103a661087436600461471c565b611bf6565b34801561088557600080fd5b5061048b611d64565b34801561089a57600080fd5b506103a66108a936600461471c565b611d7c565b3480156108ba57600080fd5b506103fd6108c9366004614998565b611f13565b3480156108da57600080fd5b5061043f6120e7565b3480156108ef57600080fd5b506103a66108fe366004614998565b612102565b34801561090f57600080fd5b5061048b612184565b34801561092457600080fd5b506103a6612193565b6109356125ee565b6001600160a01b0316336001600160a01b03161461096e5760405162461bcd60e51b815260040161096590614c90565b60405180910390fd5b6005546001600160a01b038281169116141561099c5760405162461bcd60e51b815260040161096590614b81565b6001546001600160a01b03828116911614156109ca5760405162461bcd60e51b815260040161096590614c38565b60606109d461266b565b905060005b8151811015610a2f578181815181106109ee57fe5b60200260200101516001600160a01b0316836001600160a01b03161415610a275760405162461bcd60e51b815260040161096590614cff565b6001016109d9565b50610ac8610a3b6125ee565b6040516370a0823160e01b81526001600160a01b038516906370a0823190610a67903090600401614a55565b60206040518083038186803b158015610a7f57600080fd5b505afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab791906149b0565b6001600160a01b0385169190612796565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b525780601f10610b2757610100808354040283529160200191610b52565b820191906000526020600020905b815481529060010190602001808311610b3557829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b158015610b9f57600080fd5b505afa158015610bb3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bdb919081019061488e565b604051602001610beb9190614a27565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b0316331480610c3e5750610c296125ee565b6001600160a01b0316336001600160a01b0316145b610c5a5760405162461bcd60e51b815260040161096590614c90565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860090610c8f908390614d79565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ccb903090600401614a55565b60206040518083038186803b158015610ce357600080fd5b505afa158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b91906149b0565b905090565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610d88903090600401614a55565b6101206040518083038186803b158015610da157600080fd5b505afa158015610db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd9919061491a565b604001511180610d1b57506000610dee6120e7565b11905090565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610e5e5760405162461bcd60e51b815260040161096590614c18565b6000610e69836127b5565b600554909350909150610e86906001600160a01b03163383612796565b50919050565b6002546001600160a01b0316331480610ebd5750610ea86125ee565b6001600160a01b0316336001600160a01b0316145b610ed95760405162461bcd60e51b815260040161096590614c90565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610f0a903090600401614a55565b60206040518083038186803b158015610f2257600080fd5b505afa158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a91906149b0565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610f99918591610100900460ff1690600401614d9b565b602060405180830381600087803b158015610fb357600080fd5b505af1158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac89190614805565b6002546001600160a01b031633148061101c57506110076125ee565b6001600160a01b0316336001600160a01b0316145b6110385760405162461bcd60e51b815260040161096590614c90565b611040612807565b6110486128e9565b565b6002546001600160a01b031633148061107b57506110666125ee565b6001600160a01b0316336001600160a01b0316145b6110975760405162461bcd60e51b815260040161096590614c90565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b190610c8f908390614d79565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6004546001600160a01b031633148061110757506002546001600160a01b031633145b8061112a57506111156125ee565b6001600160a01b0316336001600160a01b0316145b806111cb5750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561117e57600080fd5b505afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190614738565b6001600160a01b0316336001600160a01b0316145b8061126c5750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561121f57600080fd5b505afa158015611233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190614738565b6001600160a01b0316336001600160a01b0316145b6112885760405162461bcd60e51b815260040161096590614c90565b6001546040805163bf3759b560e01b81529051611048926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b1580156112ce57600080fd5b505afa1580156112e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130691906149b0565b612b24565b6004546001600160a01b031633148061132e57506002546001600160a01b031633145b80611351575061133c6125ee565b6001600160a01b0316336001600160a01b0316145b806113f25750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b1580156113a557600080fd5b505afa1580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd9190614738565b6001600160a01b0316336001600160a01b0316145b806114935750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561144657600080fd5b505afa15801561145a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147e9190614738565b6001600160a01b0316336001600160a01b0316145b6114af5760405162461bcd60e51b815260040161096590614c90565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561150257600080fd5b505afa158015611516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153a91906149b0565b600a5490915060009060ff16156115905760006115556120e7565b905061156e8382116115675783611569565b815b6127b5565b945091508282111561158a576115848284612c4d565b94508291505b506115a1565b61159982612c98565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc906115d590879087908690600401614dff565b602060405180830381600087803b1580156115ef57600080fd5b505af1158015611603573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162791906149b0565b915061163282612b24565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516116679493929190614e15565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b600a5460ff1681565b73e0ad1806fd3e7edf6ff52fdb822432e84741103381565b60005b919050565b600e546001600160a01b031681565b73d533a949740bb3306d119cc777fa900ba034cd5281565b6002546001600160a01b031633148061170e57506116f96125ee565b6001600160a01b0316336001600160a01b0316145b61172a5760405162461bcd60e51b815260040161096590614c90565b801561175b57600e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055611782565b600e80546001600160a01b03191673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f1790555b61178a6128e9565b50565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b03163314806117dc57506117c76125ee565b6001600160a01b0316336001600160a01b0316145b6117f85760405162461bcd60e51b815260040161096590614c90565b6001600160a01b03811661180b57600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe715490610c8f908390614a55565b6002546001600160a01b031633148061188757506118726125ee565b6001600160a01b0316336001600160a01b0316145b6118a35760405162461bcd60e51b815260040161096590614c90565b6118af6000838361463d565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda682826040516118e1929190614afa565b60405180910390a15050565b600f5481565b6002546001600160a01b0316331480611924575061190f6125ee565b6001600160a01b0316336001600160a01b0316145b6119405760405162461bcd60e51b815260040161096590614c90565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b031633148061199857506119836125ee565b6001600160a01b0316336001600160a01b0316145b6119b45760405162461bcd60e51b815260040161096590614c90565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec29890610c8f908390614d79565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b0316331480611a385750611a236125ee565b6001600160a01b0316336001600160a01b0316145b611a545760405162461bcd60e51b815260040161096590614c90565b600f55565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ccb903090600401614a55565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b0316331480611b155750611b006125ee565b6001600160a01b0316336001600160a01b0316145b611b315760405162461bcd60e51b815260040161096590614c90565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611b7c5750611b676125ee565b6001600160a01b0316336001600160a01b0316145b611b985760405162461bcd60e51b815260040161096590614c90565b6001600160a01b038116611bab57600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b490610c8f908390614a55565b6001546001600160a01b0316331480611c275750611c126125ee565b6001600160a01b0316336001600160a01b0316145b611c3057600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611c7757600080fd5b505afa158015611c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caf9190614738565b6001600160a01b031614611cc257600080fd5b611ccb81613735565b6005546040516370a0823160e01b815261178a9183916001600160a01b03909116906370a0823190611d01903090600401614a55565b60206040518083038186803b158015611d1957600080fd5b505afa158015611d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5191906149b0565b6005546001600160a01b03169190612796565b738290333cef9e6d528dd5618fb97a76f268f3edd481565b6002546001600160a01b03163314611da65760405162461bcd60e51b815260040161096590614b5c565b6001600160a01b038116611db957600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611df092911690600090600401614a9e565b602060405180830381600087803b158015611e0a57600080fd5b505af1158015611e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e429190614805565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611e919291169060001990600401614a9e565b602060405180830381600087803b158015611eab57600080fd5b505af1158015611ebf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee39190614805565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051610c8f9190614a55565b6000611f1d6146bb565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611f4d903090600401614a55565b6101206040518083038186803b158015611f6657600080fd5b505afa158015611f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9e919061491a565b9050806020015160001415611fb75760009150506116b1565b60065460a0820151611fca904290612c4d565b1015611fda5760009150506116b1565b60075460a0820151611fed904290612c4d565b10611ffc5760019150506116b1565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561204157600080fd5b505afa158015612055573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207991906149b0565b9050600954811115612090576001925050506116b1565b600061209a6120e7565b90508260c001516120b6600954836137ab90919063ffffffff16565b10156120c857600193505050506116b1565b6120d06137d0565b6008546120dd9087613bba565b1095945050505050565b6000610d1b6120f4610c9a565b6120fc611a9b565b906137ab565b6002546001600160a01b0316331480612133575061211e6125ee565b6001600160a01b0316336001600160a01b0316145b61214f5760405162461bcd60e51b815260040161096590614c90565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c590610c8f908390614d79565b6001546001600160a01b031681565b6002546001600160a01b03163314806121c457506121af6125ee565b6001600160a01b0316336001600160a01b0316145b6121e05760405162461bcd60e51b815260040161096590614c90565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561223457600080fd5b505af1158015612248573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806122ff5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906122ad9030908690600401614a84565b60206040518083038186803b1580156122c557600080fd5b505afa1580156122d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fd91906149b0565b155b61231b5760405162461bcd60e51b815260040161096590614d23565b6123718363095ea7b360e01b848460405160240161233a929190614a9e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613bf4565b505050565b600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b3916123bb916001600160a01b031690600090600401614a9e565b602060405180830381600087803b1580156123d557600080fd5b505af11580156123e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240d9190614805565b50600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b391612454916001600160a01b03169060001990600401614a9e565b602060405180830381600087803b15801561246e57600080fd5b505af1158015612482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a69190614805565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b3916124ec916001600160a01b031690600090600401614a9e565b602060405180830381600087803b15801561250657600080fd5b505af115801561251a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253e9190614805565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b391612585916001600160a01b03169060001990600401614a9e565b602060405180830381600087803b15801561259f57600080fd5b505af11580156125b3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a9190614805565b60606125e68484600085613c83565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561263357600080fd5b505afa158015612647573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b9190614738565b60408051600480825260a082019092526060918291906020820160808036833701905050905073d533a949740bb3306d119cc777fa900ba034cd52816000815181106126b357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b816001815181106126f557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073e0ad1806fd3e7edf6ff52fdb822432e8474110338160028151811061273757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050738290333cef9e6d528dd5618fb97a76f268f3edd48160038151811061277957fe5b6001600160a01b0390921660209283029190910190910152905090565b6123718363a9059cbb60e01b848460405160240161233a929190614a9e565b60008060006127c2611a9b565b9050838110156127fd576127de6127d98583612c4d565b613d47565b92506127ea83826137ab565b92506127f68484612c4d565b9150612801565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061284e9073f403c135812408bfbe8713b5a23a04b3d48aae3190600090600401614a9e565b602060405180830381600087803b15801561286857600080fd5b505af115801561287c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a09190614805565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906125859073f403c135812408bfbe8713b5a23a04b3d48aae319060001990600401614a9e565b6128f1612376565b60405163095ea7b360e01b815273e0ad1806fd3e7edf6ff52fdb822432e8474110339063095ea7b39061293f90737a250d5630b4cf539739df2c5dacb4c659f2488d90600090600401614a9e565b602060405180830381600087803b15801561295957600080fd5b505af115801561296d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129919190614805565b5060405163095ea7b360e01b815273e0ad1806fd3e7edf6ff52fdb822432e8474110339063095ea7b3906129e190737a250d5630b4cf539739df2c5dacb4c659f2488d9060001990600401614a9e565b602060405180830381600087803b1580156129fb57600080fd5b505af1158015612a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a339190614805565b5060405163095ea7b360e01b8152738290333cef9e6d528dd5618fb97a76f268f3edd49063095ea7b390612a8290737a250d5630b4cf539739df2c5dacb4c659f2488d90600090600401614a9e565b602060405180830381600087803b158015612a9c57600080fd5b505af1158015612ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad49190614805565b5060405163095ea7b360e01b8152738290333cef9e6d528dd5618fb97a76f268f3edd49063095ea7b39061258590737a250d5630b4cf539739df2c5dacb4c659f2488d9060001990600401614a9e565b600a5460ff1615612b345761178a565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612b65903090600401614a55565b60206040518083038186803b158015612b7d57600080fd5b505afa158015612b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb591906149b0565b90508015610ac857600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d06691612bfb91908590600190600401614de7565b602060405180830381600087803b158015612c1557600080fd5b505af1158015612c29573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123719190614805565b6000612c8f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613dfb565b90505b92915050565b600080600080612ca6611a9b565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd991612ce691309162010000900460ff1690600401614a69565b602060405180830381600087803b158015612d0057600080fd5b505af1158015612d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d389190614805565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612d73903090600401614a55565b60206040518083038186803b158015612d8b57600080fd5b505afa158015612d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc391906149b0565b90508015612efb57612dd481613e27565b60408051600280825260608083018452939450909160208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612e1a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612e5c57fe5b6001600160a01b039283166020918202929092010152600e546040516338ed173960e01b81529116906338ed173990612ea2908590600090869030904290600401614dab565b600060405180830381600087803b158015612ebc57600080fd5b505af1158015612ed0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ef89190810190614754565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612f35903090600401614a55565b60206040518083038186803b158015612f4d57600080fd5b505afa158015612f61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8591906149b0565b905080156130c2576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110612fcf57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061301157fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990613069908590600090869030904290600401614dab565b600060405180830381600087803b15801561308357600080fd5b505af1158015613097573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130bf9190810190614754565b50505b6040516370a0823160e01b815260009073e0ad1806fd3e7edf6ff52fdb822432e847411033906370a08231906130fc903090600401614a55565b60206040518083038186803b15801561311457600080fd5b505afa158015613128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314c91906149b0565b9050801561328957604080516002808252606080830184529260208301908036833701905050905073e0ad1806fd3e7edf6ff52fdb822432e8474110338160008151811061319657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106131d857fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed173990613230908590600090869030904290600401614dab565b600060405180830381600087803b15801561324a57600080fd5b505af115801561325e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132869190810190614754565b50505b6040516370a0823160e01b8152600090738290333cef9e6d528dd5618fb97a76f268f3edd4906370a08231906132c3903090600401614a55565b60206040518083038186803b1580156132db57600080fd5b505afa1580156132ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331391906149b0565b90508015613450576040805160028082526060808301845292602083019080368337019050509050738290333cef9e6d528dd5618fb97a76f268f3edd48160008151811061335d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061339f57fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d906338ed1739906133f7908590600090869030904290600401614dab565b600060405180830381600087803b15801561341157600080fd5b505af1158015613425573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261344d9190810190614754565b50505b6040516370a0823160e01b815260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a082319061348a903090600401614a55565b60206040518083038186803b1580156134a257600080fd5b505afa1580156134b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134da91906149b0565b905080156135c757604051632e1a7d4d60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90613519908490600401614d79565b600060405180830381600087803b15801561353357600080fd5b505af1158015613547573d6000803e3d6000fd5b5050600d54604080518082018252478082526000602083018190529251630b4c7e4d60e01b81529096506001600160a01b039093169450630b4c7e4d935085926135949290600401614ab7565b6000604051808303818588803b1580156135ad57600080fd5b505af11580156135c1573d6000803e3d6000fd5b50505050505b6005546040516370a0823160e01b81526136539188916001600160a01b03909116906370a08231906135fd903090600401614a55565b60206040518083038186803b15801561361557600080fd5b505afa158015613629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364d91906149b0565b90612c4d565b9850600061365f6120e7565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf82390613695903090600401614a55565b6101206040518083038186803b1580156136ae57600080fd5b505afa1580156136c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e6919061491a565b60c001519050808210156136fe57818103995060009a505b8b156137265761370d8c613d47565b506137238c61371e8d61364d611a9b565b613e90565b98505b50505050505050509193909250565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a2916137709161010090910460ff1690600401614aef565b600060405180830381600087803b15801561378a57600080fd5b505af115801561379e573d6000803e3d6000fd5b5050505061178a81613ea6565b600082820183811015612c8f5760405162461bcd60e51b815260040161096590614ba0565b60006137da614001565b6040516370a0823160e01b815290915060009073e0ad1806fd3e7edf6ff52fdb822432e847411033906370a0823190613817903090600401614a55565b60206040518083038186803b15801561382f57600080fd5b505afa158015613843573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386791906149b0565b905080156139c957604080516002808252606080830184529260208301908036833701905050905073e0ad1806fd3e7edf6ff52fdb822432e847411033816000815181106138b157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106138f357fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b8152606090737a250d5630b4cf539739df2c5dacb4c659f2488d9063d06ca61f906139479086908690600401614d82565b60006040518083038186803b15801561395f57600080fd5b505afa158015613973573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261399b9190810190614754565b90506139c4816001815181106139ad57fe5b6020026020010151856137ab90919063ffffffff16565b935050505b6040516370a0823160e01b8152600090738290333cef9e6d528dd5618fb97a76f268f3edd4906370a0823190613a03903090600401614a55565b60206040518083038186803b158015613a1b57600080fd5b505afa158015613a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5391906149b0565b90508015613bb5576040805160028082526060808301845292602083019080368337019050509050738290333cef9e6d528dd5618fb97a76f268f3edd481600081518110613a9d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613adf57fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b8152606090737a250d5630b4cf539739df2c5dacb4c659f2488d9063d06ca61f90613b339086908690600401614d82565b60006040518083038186803b158015613b4b57600080fd5b505afa158015613b5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613b879190810190614754565b9050613bb081600181518110613b9957fe5b6020026020010151866137ab90919063ffffffff16565b945050505b505090565b600082613bc957506000612c92565b82820282848281613bd657fe5b0414612c8f5760405162461bcd60e51b815260040161096590614bd7565b6060613c49826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125d79092919063ffffffff16565b8051909150156123715780806020019051810190613c679190614805565b6123715760405162461bcd60e51b815260040161096590614cb5565b6060613c8e8561400b565b613caa5760405162461bcd60e51b815260040161096590614c59565b60006060866001600160a01b03168587604051613cc79190614a0b565b60006040518083038185875af1925050503d8060008114613d04576040519150601f19603f3d011682016040523d82523d6000602084013e613d09565b606091505b50915091508115613d1d5791506125e69050565b805115613d2d5780518082602001fd5b8360405162461bcd60e51b81526004016109659190614b29565b6000613d558261371e610c9a565b91506000613d61611a9b565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e720290613d95908690600090600401614d9b565b602060405180830381600087803b158015613daf57600080fd5b505af1158015613dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613de79190614805565b50613df48161364d611a9b565b9392505050565b60008184841115613e1f5760405162461bcd60e51b81526004016109659190614b29565b505050900390565b600080613e4b612710613e45600f5486613bba90919063ffffffff16565b90614044565b90508015613e8657613e8673d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483612796565b613df48382612c4d565b6000818310613e9f5781612c8f565b5090919050565b613eaf81614086565b6040516370a0823160e01b8152613f5890829073e0ad1806fd3e7edf6ff52fdb822432e847411033906370a0823190613eec903090600401614a55565b60206040518083038186803b158015613f0457600080fd5b505afa158015613f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3c91906149b0565b73e0ad1806fd3e7edf6ff52fdb822432e8474110339190612796565b6040516370a0823160e01b815261178a908290738290333cef9e6d528dd5618fb97a76f268f3edd4906370a0823190613f95903090600401614a55565b60206040518083038186803b158015613fad57600080fd5b505afa158015613fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe591906149b0565b738290333cef9e6d528dd5618fb97a76f268f3edd49190612796565b6000610d1b6141d8565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906125e6575050151592915050565b6000612c8f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614606565b6040516370a0823160e01b815261412f90829073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906140c3903090600401614a55565b60206040518083038186803b1580156140db57600080fd5b505afa1580156140ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061411391906149b0565b73d533a949740bb3306d119cc777fa900ba034cd529190612796565b6040516370a0823160e01b815261178a908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a082319061416c903090600401614a55565b60206040518083038186803b15801561418457600080fd5b505afa158015614198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141bc91906149b0565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612796565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc2629061420b903090600401614a55565b60206040518083038186803b15801561422357600080fd5b505afa158015614237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061425b91906149b0565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156142d257600080fd5b505afa1580156142e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061430a91906149b0565b90506000806143198385614044565b90508581101561435e57600061432f8783612c4d565b905061433f87613e458a84613bba565b9250600061434d8786612c4d565b90508084111561435b578093505b50505b6000871561449e57604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd52816000815181106143a857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106143ea57fe5b6001600160a01b039283166020918202929092010152600e5460405163d06ca61f60e01b8152606092919091169063d06ca61f9061442e908d908690600401614d82565b60006040518083038186803b15801561444657600080fd5b505afa15801561445a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526144829190810190614754565b90508060018151811061449157fe5b6020026020010151925050505b600083156145ee576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b816000815181106144e857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061452a57fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815260609073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063d06ca61f9061457e9089908690600401614d82565b60006040518083038186803b15801561459657600080fd5b505afa1580156145aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526145d29190810190614754565b9050806001815181106145e157fe5b6020026020010151925050505b6145f882826137ab565b995050505050505050505090565b600081836146275760405162461bcd60e51b81526004016109659190614b29565b50600083858161463357fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061467e5782800160ff198235161785556146ab565b828001600101855582156146ab579182015b828111156146ab578235825591602001919060010190614690565b506146b7929150614707565b5090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b808211156146b75760008155600101614708565b60006020828403121561472d578081fd5b8135612c8f81614ea7565b600060208284031215614749578081fd5b8151612c8f81614ea7565b60006020808385031215614766578182fd5b825167ffffffffffffffff81111561477c578283fd5b8301601f8101851361478c578283fd5b805161479f61479a82614e57565b614e30565b81815283810190838501858402850186018910156147bb578687fd5b8694505b838510156147dd5780518352600194909401939185019185016147bf565b50979650505050505050565b6000602082840312156147fa578081fd5b8135612c8f81614ebc565b600060208284031215614816578081fd5b8151612c8f81614ebc565b60008060208385031215614833578081fd5b823567ffffffffffffffff8082111561484a578283fd5b818501915085601f83011261485d578283fd5b81358181111561486b578384fd5b86602082850101111561487c578384fd5b60209290920196919550909350505050565b60006020828403121561489f578081fd5b815167ffffffffffffffff808211156148b6578283fd5b818401915084601f8301126148c9578283fd5b8151818111156148d7578384fd5b6148ea601f8201601f1916602001614e30565b9150808252856020828501011115614900578384fd5b614911816020840160208601614e77565b50949350505050565b600061012080838503121561492d578182fd5b61493681614e30565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156149a9578081fd5b5035919050565b6000602082840312156149c1578081fd5b5051919050565b6000815180845260208085019450808401835b83811015614a005781516001600160a01b0316875295820195908201906001016149db565b509495945050505050565b60008251614a1d818460208701614e77565b9190910192915050565b600065086dedceccaf60d31b82528251614a48816006850160208701614e77565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b60608101818460005b6002811015614adf578151835260209283019290910190600101614ac0565b5050508260408301529392505050565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082528251806020840152614b48816040850160208701614e77565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b6000838252604060208301526125e660408301846149c8565b9182521515602082015260400190565b600086825285602083015260a06040830152614dca60a08301866149c8565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715614e4f57600080fd5b604052919050565b600067ffffffffffffffff821115614e6d578081fd5b5060209081020190565b60005b83811015614e92578181015183820152602001614e7a565b83811115614ea1576000848401525b50505050565b6001600160a01b038116811461178a57600080fd5b801515811461178a57600080fdfea26469706673582212209ca5264dff4695556e7166f290c25808c52f65eddad63a7009843e0b8f41eb6064736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000132d8d2c76db3812403431facb00f3453fc42125
-----Decoded View---------------
Arg [0] : _vault (address): 0x132d8D2C76Db3812403431fAcB00F3453Fc42125
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000132d8d2c76db3812403431facb00f3453fc42125
Deployed Bytecode Sourcemap
64509:4971:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56460:444;;;;;;;;;;-1:-1:-1;56460:444:0;;;;;:::i;:::-;;:::i;:::-;;30284:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59552:163;;;;;;;;;;;;;:::i;57775:26::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39606:175::-;;;;;;;;;;-1:-1:-1;39606:175:0;;;;;:::i;:::-;;:::i;59841:129::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;57808:25::-;;;;;;;;;;;;;:::i;33474:28::-;;;;;;;;;;;;;:::i;32222:18::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32131:25::-;;;;;;;;;;;;;:::i;42279:148::-;;;;;;;;;;;;;:::i;30594:91::-;;;;;;;;;;;;;:::i;57535:85::-;;;;;;;;;;;;;:::i;33110:29::-;;;;;;;;;;;;;:::i;53040:515::-;;;;;;;;;;-1:-1:-1;53040:515:0;;;;;:::i;:::-;;:::i;59328:216::-;;;;;;;;;;;;;:::i;58680:104::-;;;;;;;;;;;;;:::i;37655:154::-;;;;;;;;;;-1:-1:-1;37655:154:0;;;;;:::i;:::-;;:::i;57444:82::-;;;;;;;;;;;;;:::i;47032:170::-;;;;;;;;;;;;;:::i;51425:1371::-;;;;;;;;;;;;;:::i;57084:83::-;;;;;;;;;;;;;:::i;33553:25::-;;;;;;;;;;;;;:::i;64547:81::-;;;;;;;;;;;;;:::i;46417:286::-;;;;;;;;;;-1:-1:-1;46417:286:0;;;;;:::i;:::-;;:::i;57929:18::-;;;;;;;;;;;;;:::i;57356:81::-;;;;;;;;;;;;;:::i;58899:161::-;;;;;;;;;;-1:-1:-1;58899:161:0;;;;;:::i;:::-;;:::i;57864:29::-;;;;;;;;;;;;;:::i;57900:20::-;;;;;;;;;;;;;:::i;36412:174::-;;;;;;;;;;-1:-1:-1;36412:174:0;;;;;:::i;:::-;;:::i;40084:171::-;;;;;;;;;;-1:-1:-1;40084:171:0;;;;;:::i;:::-;;:::i;57954:22::-;;;;;;;;;;;;;:::i;59200:120::-;;;;;;;;;;-1:-1:-1;59200:120:0;;;;;:::i;:::-;;:::i;33296:27::-;;;;;;;;;;;;;:::i;32001:94::-;;;;;;;;;;;;;:::i;38880:169::-;;;;;;;;;;-1:-1:-1;38880:169:0;;;;;:::i;:::-;;:::i;57723:43::-;;;;;;;;;;;;;:::i;57268:81::-;;;;;;;;;;;;;:::i;58792:99::-;;;;;;;;;;-1:-1:-1;58792:99:0;;;;;:::i;:::-;;:::i;32959:29::-;;;;;;;;;;;;;:::i;57627:87::-;;;;;;;;;;;;;:::i;32163:22::-;;;;;;;;;;;;;:::i;32192:21::-;;;;;;;;;;;;;:::i;57840:17::-;;;;;;;;;;;;;:::i;59723:110::-;;;;;;;;;;;;;:::i;57174:85::-;;;;;;;;;;;;;:::i;59068:124::-;;;;;;;;;;-1:-1:-1;59068:124:0;;;;;:::i;:::-;;:::i;35656:202::-;;;;;;;;;;-1:-1:-1;35656:202:0;;;;;:::i;:::-;;:::i;54146:311::-;;;;;;;;;;-1:-1:-1;54146:311:0;;;;;:::i;:::-;;:::i;64635:82::-;;;;;;;;;;;;;:::i;36875:263::-;;;;;;;;;;-1:-1:-1;36875:263:0;;;;;:::i;:::-;;:::i;63794:687::-;;;;;;;;;;-1:-1:-1;63794:687:0;;;;;:::i;:::-;;:::i;59978:133::-;;;;;;;;;;;;;:::i;38326:154::-;;;;;;;;;;-1:-1:-1;38326:154:0;;;;;:::i;:::-;;:::i;32103:21::-;;;;;;;;;;;;;:::i;54886:164::-;;;;;;;;;;;;;:::i;56460:444::-;33920:12;:10;:12::i;:::-;-1:-1:-1;;;;;33906:26:0;:10;-1:-1:-1;;;;;33906:26:0;;33898:50;;;;-1:-1:-1;;;33898:50:0;;;;;;;:::i;:::-;;;;;;;;;56552:4:::1;::::0;-1:-1:-1;;;;;56534:23:0;;::::1;56552:4:::0;::::1;56534:23;;56526:41;;;;-1:-1:-1::0;;;56526:41:0::1;;;;;;;:::i;:::-;56604:5;::::0;-1:-1:-1;;;;;56586:24:0;;::::1;56604:5:::0;::::1;56586:24;;56578:44;;;;-1:-1:-1::0;;;56578:44:0::1;;;;;;;:::i;:::-;56635:33;56671:17;:15;:17::i;:::-;56635:53;;56704:9;56699:102;56719:16;:23;56715:1;:27;56699:102;;;56767:16;56784:1;56767:19;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56757:29:0::1;:6;-1:-1:-1::0;;;;;56757:29:0::1;;;56749:52;;;;-1:-1:-1::0;;;56749:52:0::1;;;;;;;:::i;:::-;56744:3;;56699:102;;;;56814:82;56842:12;:10;:12::i;:::-;56856:39;::::0;-1:-1:-1;;;56856:39:0;;-1:-1:-1;;;;;56856:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;56889:4:::1;::::0;56856:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56814:27:0;::::1;::::0;:82;:27:::1;:82::i;:::-;33959:1;56460:444:::0;:::o;30284:25::-;;;;;;;;;;;;;;;-1:-1:-1;;30284:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59552:163::-;59690:4;;59667:38;;;-1:-1:-1;;;59667:38:0;;;;59600:13;;-1:-1:-1;;;;;59690:4:0;;59667:36;;:38;;;;;59690:4;;59667:38;;;;;;;59690:4;59667:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59667:38:0;;;;;;;;;;;;:::i;:::-;59640:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;59626:81;;59552:163;:::o;57775:26::-;;;;;;;;;:::o;39606:175::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;39691:13:::1;:30:::0;;;39737:36:::1;::::0;::::1;::::0;::::1;::::0;39707:14;;39737:36:::1;:::i;:::-;;;;;;;;39606:175:::0;:::o;59841:129::-;59922:14;;59914:48;;-1:-1:-1;;;59914:48:0;;59887:7;;-1:-1:-1;;;;;59922:14:0;;59914:33;;:48;;59956:4;;59914:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59907:55;;59841:129;:::o;57808:25::-;;;;;;;;;:::o;33474:28::-;;;;:::o;32222:18::-;;;-1:-1:-1;;;;;32222:18:0;;:::o;32131:25::-;;;-1:-1:-1;;;;;32131:25:0;;:::o;42279:148::-;42344:5;;:31;;-1:-1:-1;;;42344:31:0;;42320:4;;;;-1:-1:-1;;;;;42344:5:0;;;;:16;;:31;;42369:4;;42344:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;:45;:75;;;;42418:1;42393:22;:20;:22::i;:::-;:26;42337:82;;42279:148;:::o;30594:91::-;30663:14;;;;;;;;;;;;-1:-1:-1;;;30663:14:0;;;;30594:91;:::o;57535:85::-;57577:42;57535:85;:::o;33110:29::-;;;;:::o;53040:515::-;53155:5;;53099:13;;-1:-1:-1;;;;;53155:5:0;53133:10;:28;53125:47;;;;-1:-1:-1;;;53125:47:0;;;;;;;:::i;:::-;53258:19;53311:32;53329:13;53311:17;:32::i;:::-;53435:4;;53288:55;;-1:-1:-1;53288:55:0;;-1:-1:-1;53435:42:0;;-1:-1:-1;;;;;53435:4:0;53453:10;53288:55;53435:17;:42::i;:::-;53040:515;;;;:::o;59328:216::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;59429:14:::1;::::0;59421:48:::1;::::0;-1:-1:-1;;;59421:48:0;;59404:14:::1;::::0;-1:-1:-1;;;;;59429:14:0::1;::::0;59421:33:::1;::::0;:48:::1;::::0;59463:4:::1;::::0;59421:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59488:14;::::0;59521::::1;::::0;59480:56:::1;::::0;-1:-1:-1;;;59480:56:0;;59404:65;;-1:-1:-1;;;;;;59488:14:0;;::::1;::::0;59480:32:::1;::::0;:56:::1;::::0;59404:65;;59488:14:::1;59521::::0;::::1;;;::::0;59480:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58680:104::-:0;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;58737:15:::1;:13;:15::i;:::-;58763:13;:11;:13::i;:::-;58680:104::o:0;37655:154::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;37733:14:::1;:23:::0;;;37772:29:::1;::::0;::::1;::::0;::::1;::::0;37750:6;;37772:29:::1;:::i;57444:82::-:0;57483:42;57444:82;:::o;47032:170::-;34046:6;;-1:-1:-1;;;;;34046:6:0;34032:10;:20;;:65;;-1:-1:-1;34087:10:0;;-1:-1:-1;;;;;34087:10:0;34073;:24;34032:65;:112;;;;34132:12;:10;:12::i;:::-;-1:-1:-1;;;;;34118:26:0;:10;-1:-1:-1;;;;;34118:26:0;;34032:112;:163;;;;34179:5;;;;;;;;;-1:-1:-1;;;;;34179:5:0;-1:-1:-1;;;;;34179:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34165:30:0;:10;-1:-1:-1;;;;;34165:30:0;;34032:163;:216;;;;34230:5;;;;;;;;;-1:-1:-1;;;;;34230:5:0;-1:-1:-1;;;;;34230:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34216:32:0;:10;-1:-1:-1;;;;;34216:32:0;;34032:216;34010:277;;;;-1:-1:-1;;;34010:277:0;;;;;;;:::i;:::-;47170:5:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;47170:23:0;;;;47155:39:::1;::::0;-1:-1:-1;;;;;47170:5:0::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47155:14;:39::i;51425:1371::-:0;34046:6;;-1:-1:-1;;;;;34046:6:0;34032:10;:20;;:65;;-1:-1:-1;34087:10:0;;-1:-1:-1;;;;;34087:10:0;34073;:24;34032:65;:112;;;;34132:12;:10;:12::i;:::-;-1:-1:-1;;;;;34118:26:0;:10;-1:-1:-1;;;;;34118:26:0;;34032:112;:163;;;;34179:5;;;;;;;;;-1:-1:-1;;;;;34179:5:0;-1:-1:-1;;;;;34179:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34165:30:0;:10;-1:-1:-1;;;;;34165:30:0;;34032:163;:216;;;;34230:5;;;;;;;;;-1:-1:-1;;;;;34230:5:0;-1:-1:-1;;;;;34230:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34216:32:0;:10;-1:-1:-1;;;;;34216:32:0;;34032:216;34010:277;;;;-1:-1:-1;;;34010:277:0;;;;;;;:::i;:::-;51476:14:::1;51505:12:::0;51532:23:::1;51558:5;;;;;;;;;-1:-1:-1::0;;;;;51558:5:0::1;-1:-1:-1::0;;;;;51558:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51630:13;::::0;51532:49;;-1:-1:-1;51592:19:0::1;::::0;51630:13:::1;;51626:731;;;51712:19;51734:22;:20;:22::i;:::-;51712:44;;51890:80;51922:15;51908:11;:29;:61;;51954:15;51908:61;;;51940:11;51908:61;51890:17;:80::i;:::-;51868:102:::0;-1:-1:-1;51868:102:0;-1:-1:-1;52048:29:0;;::::1;52044:159;;;52107:32;:11:::0;52123:15;52107::::1;:32::i;:::-;52098:41;;52172:15;52158:29;;52044:159;51626:731;;;;52315:30;52329:15;52315:13;:30::i;:::-;52285:60:::0;;-1:-1:-1;52285:60:0;-1:-1:-1;52285:60:0;-1:-1:-1;51626:731:0::1;52571:5;::::0;:39:::1;::::0;-1:-1:-1;;;52571:39:0;;-1:-1:-1;;;;;52571:5:0;;::::1;::::0;:12:::1;::::0;:39:::1;::::0;52584:6;;52592:4;;52598:11;;52571:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52553:57;;52686:31;52701:15;52686:14;:31::i;:::-;52735:53;52745:6;52753:4;52759:11;52772:15;52735:53;;;;;;;;;:::i;:::-;;;;;;;;34298:1;;;;51425:1371::o:0;57084:83::-;57124:42;57084:83;:::o;33553:25::-;;;;;;:::o;64547:81::-;64585:42;64547:81;:::o;46417:286::-;46485:4;46417:286;;;;:::o;57929:18::-;;;-1:-1:-1;;;;;57929:18:0;;:::o;57356:81::-;57394:42;57356:81;:::o;58899:161::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;58973:9:::1;58969:59;;;58984:3;:13:::0;;-1:-1:-1;;;;;;58984:13:0::1;57577:42;58984:13;::::0;;58969:59:::1;;;59013:3;:15:::0;;-1:-1:-1;;;;;;59013:15:0::1;57671:42;59013:15;::::0;;58969:59:::1;59039:13;:11;:13::i;:::-;58899:161:::0;:::o;57864:29::-;;;-1:-1:-1;;;;;57864:29:0;;:::o;57900:20::-;;;-1:-1:-1;;;;;57900:20:0;;:::o;36412:174::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36491:21:0;::::1;36483:30;;;::::0;::::1;;36524:6;:16:::0;;-1:-1:-1;;;;;;36524:16:0::1;-1:-1:-1::0;;;;;36524:16:0;::::1;;::::0;;36556:22:::1;::::0;::::1;::::0;::::1;::::0;36524:16;;36556:22:::1;:::i;40084:171::-:0;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;40173:26:::1;:11;40187:12:::0;;40173:26:::1;:::i;:::-;;40215:32;40234:12;;40215:32;;;;;;;:::i;:::-;;;;;;;;40084:171:::0;;:::o;57954:22::-;;;;:::o;59200:120::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;59282:13:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;59282:30:0;;::::1;::::0;;;::::1;::::0;;59200:120::o;33296:27::-;;;;:::o;32001:94::-;32059:7;32001:94;:::o;38880:169::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;38963:12:::1;:28:::0;;;39007:34:::1;::::0;::::1;::::0;::::1;::::0;38978:13;;39007:34:::1;:::i;57723:43::-:0;57761:5;57723:43;:::o;57268:81::-;57306:42;57268:81;:::o;58792:99::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;58865:7:::1;:18:::0;58792:99::o;32959:29::-;;;;:::o;57627:87::-;57671:42;57627:87;:::o;32163:22::-;;;-1:-1:-1;;;;;32163:22:0;;:::o;32192:21::-;;;-1:-1:-1;;;;;32192:21:0;;:::o;57840:17::-;;;;:::o;59723:110::-;59796:4;;:29;;-1:-1:-1;;;59796:29:0;;59769:7;;-1:-1:-1;;;;;59796:4:0;;:14;;:29;;59819:4;;59796:29;;;:::i;57174:85::-;57216:42;57174:85;:::o;59068:124::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;59152:14:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;59152:32:0;;::::1;::::0;;;::::1;::::0;;59068:124::o;35656:202::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35743:25:0;::::1;35735:34;;;::::0;::::1;;35780:10;:24:::0;;-1:-1:-1;;;;;;35780:24:0::1;-1:-1:-1::0;;;;;35780:24:0;::::1;;::::0;;35820:30:::1;::::0;::::1;::::0;::::1;::::0;35780:24;;35820:30:::1;:::i;54146:311::-:0;54235:5;;-1:-1:-1;;;;;54235:5:0;54213:10;:28;;:58;;;54259:12;:10;:12::i;:::-;-1:-1:-1;;;;;54245:26:0;:10;-1:-1:-1;;;;;54245:26:0;;54213:58;54205:67;;;;;;54329:5;;54291:34;;;-1:-1:-1;;;54291:34:0;;;;-1:-1:-1;;;;;54329:5:0;;;;54291:32;;;;;:34;;;;;;;;;;;;;;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54291:43:0;;54283:52;;;;;;54346:30;54363:12;54346:16;:30::i;:::-;54419:4;;:29;;-1:-1:-1;;;54419:29:0;;54387:62;;54405:12;;-1:-1:-1;;;;;54419:4:0;;;;:14;;:29;;54442:4;;54419:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54387:4;;-1:-1:-1;;;;;54387:4:0;;:62;:17;:62::i;64635:82::-;64674:42;64635:82;:::o;36875:263::-;33807:10;;-1:-1:-1;;;;;33807:10:0;33793;:24;33785:48;;;;-1:-1:-1;;;33785:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36956:22:0;::::1;36948:31;;;::::0;::::1;;36990:5;::::0;37004:7:::1;::::0;36990:25:::1;::::0;-1:-1:-1;;;36990:25:0;;-1:-1:-1;;;;;36990:5:0;;::::1;::::0;:13:::1;::::0;:25:::1;::::0;37004:7;::::1;::::0;36990:5:::1;::::0;:25:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;37026:7:0::1;:18:::0;;-1:-1:-1;;;;;;37026:18:0::1;-1:-1:-1::0;;;;;37026:18:0;;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;37055:5:0;:35:::1;::::0;-1:-1:-1;;;37055:35:0;;:5;;::::1;::::0;:13:::1;::::0;:35:::1;::::0;37069:7;::::1;::::0;-1:-1:-1;;37086:2:0;37055:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37106:24;37121:8;37106:24;;;;;;:::i;63794:687::-:0;63866:4;63883:28;;:::i;:::-;63914:5;;:31;;-1:-1:-1;;;63914:31:0;;-1:-1:-1;;;;;63914:5:0;;;;:16;;:31;;63939:4;;63914:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63883:62;;63962:6;:17;;;63983:1;63962:22;63958:40;;;63993:5;63986:12;;;;;63958:40;64056:14;;64035:17;;;;64015:38;;:15;;:19;:38::i;:::-;:55;64011:73;;;64079:5;64072:12;;;;;64011:73;64143:14;;64121:17;;;;64101:38;;:15;;:19;:38::i;:::-;:56;64097:73;;64166:4;64159:11;;;;;64097:73;64205:5;;:23;;;-1:-1:-1;;;64205:23:0;;;;64183:19;;-1:-1:-1;;;;;64205:5:0;;:21;;:23;;;;;;;;;;;;;;:5;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64183:45;;64257:13;;64243:11;:27;64239:44;;;64279:4;64272:11;;;;;;64239:44;64296:13;64312:22;:20;:22::i;:::-;64296:38;;64376:6;:16;;;64349:24;64359:13;;64349:5;:9;;:24;;;;:::i;:::-;:43;64345:60;;;64401:4;64394:11;;;;;;;64345:60;64455:17;:15;:17::i;:::-;64426:12;;:26;;64443:8;64426:16;:26::i;:::-;:46;;63794:687;-1:-1:-1;;;;;63794:687:0:o;59978:133::-;60040:7;60067:36;60087:15;:13;:15::i;:::-;60067;:13;:15::i;:::-;:19;;:36::i;38326:154::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;38404:14:::1;:23:::0;;;38443:29:::1;::::0;::::1;::::0;::::1;::::0;38421:6;;38443:29:::1;:::i;32103:21::-:0;;;-1:-1:-1;;;;;32103:21:0;;:::o;54886:164::-;33664:10;;-1:-1:-1;;;;;33664:10:0;33650;:24;;:54;;;33692:12;:10;:12::i;:::-;-1:-1:-1;;;;;33678:26:0;:10;-1:-1:-1;;;;;33678:26:0;;33650:54;33642:78;;;;-1:-1:-1;;;33642:78:0;;;;;;;:::i;:::-;54949:13:::1;:20:::0;;-1:-1:-1;;54949:20:0::1;54965:4;54949:20:::0;;::::1;::::0;;;54980:5;:22:::1;::::0;;-1:-1:-1;;;54980:22:0;;;;-1:-1:-1;;;;;54980:5:0;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;54949:13:::1;::::0;54980:22;;;;;;;;54949:13;54980:5;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55020:22:0::1;::::0;::::1;::::0;-1:-1:-1;55020:22:0;;-1:-1:-1;55020:22:0::1;54886:164::o:0;22521:622::-;22891:10;;;22890:62;;-1:-1:-1;22907:39:0;;-1:-1:-1;;;22907:39:0;;-1:-1:-1;;;;;22907:15:0;;;;;:39;;22931:4;;22938:7;;22907:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;22890:62;22882:152;;;;-1:-1:-1;;;22882:152:0;;;;;;;:::i;:::-;23045:90;23065:5;23095:22;;;23119:7;23128:5;23072:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23072:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;23072:62:0;-1:-1:-1;;;;;;23072:62:0;;;;;;;;;;23045:19;:90::i;:::-;22521:622;;;:::o;58440:232::-;58511:3;;58491:27;;-1:-1:-1;;;58491:27:0;;57394:42;;58491:19;;:27;;-1:-1:-1;;;;;58511:3:0;;;;58491:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58549:3:0;;58529:43;;-1:-1:-1;;;58529:43:0;;57394:42;;58529:19;;:43;;-1:-1:-1;;;;;58549:3:0;;-1:-1:-1;;58554:17:0;58529:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58603:3:0;;58583:27;;-1:-1:-1;;;58583:27:0;;57306:42;;58583:19;;:27;;-1:-1:-1;;;;;58603:3:0;;;;58583:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58641:3:0;;58621:43;;-1:-1:-1;;;58621:43:0;;57306:42;;58621:19;;:43;;-1:-1:-1;;;;;58641:3:0;;-1:-1:-1;;58646:17:0;58621:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8462:196::-;8565:12;8597:53;8620:6;8628:4;8634:1;8637:12;8597:22;:53::i;:::-;8590:60;8462:196;-1:-1:-1;;;;8462:196:0:o;40409:98::-;40481:5;;:18;;;-1:-1:-1;;;40481:18:0;;;;40454:7;;-1:-1:-1;;;;;40481:5:0;;:16;;:18;;;;;;;;;;;;;;:5;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;69151:326::-;69309:16;;;69323:1;69309:16;;;;;;;;;69246;;;;69309;;;;;;;;;;;-1:-1:-1;69309:16:0;69280:45;;57394:42;69336:9;69346:1;69336:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;69336:18:0;;;-1:-1:-1;;;;;69336:18:0;;;;;57306:42;69365:9;69375:1;69365:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;69365:18:0;;;-1:-1:-1;;;;;69365:18:0;;;;;64585:42;69394:9;69404:1;69394:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;69394:18:0;;;-1:-1:-1;;;;;69394:18:0;;;;;64674:42;69423:9;69433:1;69423:12;;;;;;;;-1:-1:-1;;;;;69423:19:0;;;:12;;;;;;;;;;;:19;69460:9;-1:-1:-1;69151:326:0;:::o;21862:177::-;21945:86;21965:5;21995:23;;;22020:2;22024:5;21972:58;;;;;;;;;:::i;60681:581::-;60785:25;60812:13;60843:16;60862:15;:13;:15::i;:::-;60843:34;;60903:13;60892:8;:24;60888:367;;;60953:42;60967:27;:13;60985:8;60967:17;:27::i;:::-;60953:13;:42::i;:::-;60933:62;-1:-1:-1;61030:31:0;60933:62;61052:8;61030:21;:31::i;:::-;61010:51;-1:-1:-1;61084:36:0;:13;61010:51;61084:17;:36::i;:::-;61076:44;;60888:367;;;61230:13;61210:33;;60888:367;60681:581;;;;:::o;58304:128::-;58349:4;;:24;;-1:-1:-1;;;58349:24:0;;-1:-1:-1;;;;;58349:4:0;;;;:12;;:24;;57216:42;;58349:4;;:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58384:4:0;;:40;;-1:-1:-1;;;58384:40:0;;-1:-1:-1;;;;;58384:4:0;;;;:12;;:40;;57216:42;;-1:-1:-1;;58406:17:0;58384:40;;;:::i;65284:281::-;65336:19;:17;:19::i;:::-;65366:31;;-1:-1:-1;;;65366:31:0;;64585:42;;65366:19;;:31;;57577:42;;65395:1;;65366:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;65408:47:0;;-1:-1:-1;;;65408:47:0;;64585:42;;65408:19;;:47;;57577:42;;-1:-1:-1;;65437:17:0;65408:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;65466:32:0;;-1:-1:-1;;;65466:32:0;;64674:42;;65466:20;;:32;;57577:42;;65496:1;;65466:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;65509:48:0;;-1:-1:-1;;;65509:48:0;;64674:42;;65509:20;;:48;;57577:42;;-1:-1:-1;;65539:17:0;65509:48;;;:::i;60119:261::-;60202:13;;;;60198:26;;;60217:7;;60198:26;60250:4;;:29;;-1:-1:-1;;;60250:29:0;;60234:13;;-1:-1:-1;;;;;60250:4:0;;:14;;:29;;60273:4;;60250:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60234:45;-1:-1:-1;60294:9:0;;60290:83;;60345:2;;60320:41;;-1:-1:-1;;;60320:41:0;;57216:42;;60320:24;;:41;;60345:2;60349:5;;60356:4;;60320:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14966:136::-;15024:7;15051:43;15055:1;15058;15051:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;15044:50;;14966:136;;;;;:::o;66813:2330::-;66930:15;66960:13;66988:20;67036:11;67050:15;:13;:15::i;:::-;67084:14;;67125:13;;67076:63;;-1:-1:-1;;;67076:63:0;;67036:29;;-1:-1:-1;;;;;;67084:14:0;;;;67076:33;;:63;;67118:4;;67125:13;;;;;;67076:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;67165:36:0;;-1:-1:-1;;;67165:36:0;;67150:12;;57394:42;;67165:21;;:36;;67195:4;;67165:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67150:51;-1:-1:-1;67216:8:0;;67212:272;;67248:16;67259:4;67248:10;:16::i;:::-;67305;;;67319:1;67305:16;;;67281:21;67305:16;;;;;67241:23;;-1:-1:-1;67305:16:0;;;;;;;;;;;;-1:-1:-1;67305:16:0;67281:40;;57394:42;67336:4;67341:1;67336:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;67336:13:0;;;-1:-1:-1;;;;;67336:13:0;;;;;57483:42;67364:4;67369:1;67364:7;;;;;;;;-1:-1:-1;;;;;67364:14:0;;;:7;;;;;;;;;:14;67399:3;;67395:77;;-1:-1:-1;;;67395:77:0;;67399:3;;;67395:33;;:77;;67429:4;;67399:3;;67447:4;;67461;;67468:3;;67395:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67395:77:0;;;;;;;;;;;;:::i;:::-;;67212:272;;67509:36;;-1:-1:-1;;;67509:36:0;;67494:12;;57306:42;;67509:21;;:36;;67539:4;;67509:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67494:51;-1:-1:-1;67560:8:0;;67556:238;;67609:16;;;67623:1;67609:16;;;67585:21;67609:16;;;;;67585:21;67609:16;;;;;;;;;;-1:-1:-1;67609:16:0;67585:40;;57306:42;67640:4;67645:1;67640:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;67640:13:0;;;-1:-1:-1;;;;;67640:13:0;;;;;57483:42;67668:4;67673:1;67668:7;;;;;;;;-1:-1:-1;;;;;67668:14:0;;;:7;;;;;;;;;;;:14;67699:83;;-1:-1:-1;;;67699:83:0;;57671:42;;67699:39;;:83;;67739:4;;67753:1;;67757:4;;67771;;67778:3;;67699:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67699:83:0;;;;;;;;;;;;:::i;:::-;;67556:238;;67819:36;;-1:-1:-1;;;67819:36:0;;67804:12;;64585:42;;67819:21;;:36;;67849:4;;67819:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67804:51;-1:-1:-1;67870:8:0;;67866:236;;67919:16;;;67933:1;67919:16;;;67895:21;67919:16;;;;;67895:21;67919:16;;;;;;;;;;-1:-1:-1;67919:16:0;67895:40;;64585:42;67950:4;67955:1;67950:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;67950:13:0;;;-1:-1:-1;;;;;67950:13:0;;;;;57483:42;67978:4;67983:1;67978:7;;;;;;;;-1:-1:-1;;;;;67978:14:0;;;:7;;;;;;;;;;;:14;68009:81;;-1:-1:-1;;;68009:81:0;;57577:42;;68009:37;;:81;;68047:4;;68061:1;;68065:4;;68079;;68086:3;;68009:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68009:81:0;;;;;;;;;;;;:::i;:::-;;67866:236;;68128:37;;-1:-1:-1;;;68128:37:0;;68112:13;;64674:42;;68128:22;;:37;;68159:4;;68128:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68112:53;-1:-1:-1;68180:9:0;;68176:239;;68230:16;;;68244:1;68230:16;;;68206:21;68230:16;;;;;68206:21;68230:16;;;;;;;;;;-1:-1:-1;68230:16:0;68206:40;;64674:42;68261:4;68266:1;68261:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;68261:14:0;;;-1:-1:-1;;;;;68261:14:0;;;;;57483:42;68290:4;68295:1;68290:7;;;;;;;;-1:-1:-1;;;;;68290:14:0;;;:7;;;;;;;;;;;:14;68321:82;;-1:-1:-1;;;68321:82:0;;57577:42;;68321:37;;:82;;68359:5;;68374:1;;68378:4;;68392;;68399:3;;68321:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68321:82:0;;;;;;;;;;;;:::i;:::-;;68176:239;;68441:37;;-1:-1:-1;;;68441:37:0;;68425:13;;57483:42;;68441:22;;:37;;68472:4;;68441:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68425:53;-1:-1:-1;68493:9:0;;68489:185;;68519:26;;-1:-1:-1;;;68519:26:0;;57483:42;;68519:19;;:26;;68539:5;;68519:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68613:5:0;;68604:58;;;;;;;;68568:21;68604:58;;;68613:5;68604:58;;;;;;;;-1:-1:-1;;;68604:58:0;;68568:21;;-1:-1:-1;;;;;;68613:5:0;;;;-1:-1:-1;68604:29:0;;-1:-1:-1;68568:21:0;;68604:58;;68613:5;68604:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68489:185;68694:4;;:29;;-1:-1:-1;;;68694:29:0;;:41;;68728:6;;-1:-1:-1;;;;;68694:4:0;;;;:14;;:29;;68717:4;;68694:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;:41::i;:::-;68684:51;;68748:11;68762:22;:20;:22::i;:::-;68808:5;;:31;;-1:-1:-1;;;68808:31:0;;68748:36;;-1:-1:-1;68795:10:0;;-1:-1:-1;;;;;68808:5:0;;;;:16;;:31;;68833:4;;68808:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;68795:54;;68872:5;68863:6;:14;68860:94;;;68910:6;68902:5;:14;68894:22;;68941:1;68931:11;;68860:94;68970:20;;68966:170;;69007:31;69021:16;69007:13;:31::i;:::-;;69068:56;69077:16;69095:28;69115:7;69095:15;:13;:15::i;:28::-;69068:8;:56::i;:::-;69053:71;;68966:170;66813:2330;;;;;;;;;;;;;:::o;61270:185::-;61355:14;;61392;;61347:60;;-1:-1:-1;;;61347:60:0;;-1:-1:-1;;;;;61355:14:0;;;;61347:44;;:60;;61355:14;61392;;;;;;61347:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61418:29;61434:12;61418:15;:29::i;14502:181::-;14560:7;14592:5;;;14616:6;;;;14608:46;;;;-1:-1:-1;;;14608:46:0;;;;;;;:::i;65986:819::-;66045:18;66089:23;:21;:23::i;:::-;66140:36;;-1:-1:-1;;;66140:36:0;;66076;;-1:-1:-1;66125:12:0;;64585:42;;66140:21;;:36;;66170:4;;66140:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66125:51;-1:-1:-1;66191:8:0;;66187:266;;66240:16;;;66254:1;66240:16;;;66216:21;66240:16;;;;;66216:21;66240:16;;;;;;;;;;-1:-1:-1;66240:16:0;66216:40;;64585:42;66271:4;66276:1;66271:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;66271:13:0;;;-1:-1:-1;;;;;66271:13:0;;;;;57483:42;66299:4;66304:1;66299:7;;;;;;;;-1:-1:-1;;;;;66299:14:0;;;:7;;;;;;;;;;;:14;66352:38;;-1:-1:-1;;;66352:38:0;;66328:21;;57577:42;;66352:26;;:38;;66379:4;;66385;;66352:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66352:38:0;;;;;;;;;;;;:::i;:::-;66328:62;;66418:23;66433:4;66438:1;66433:7;;;;;;;;;;;;;;66418:10;:14;;:23;;;;:::i;:::-;66405:36;;66187:266;;;66481:37;;-1:-1:-1;;;66481:37:0;;66465:13;;64674:42;;66481:22;;:37;;66512:4;;66481:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66465:53;-1:-1:-1;66533:9:0;;66529:269;;66583:16;;;66597:1;66583:16;;;66559:21;66583:16;;;;;66559:21;66583:16;;;;;;;;;;-1:-1:-1;66583:16:0;66559:40;;64674:42;66614:4;66619:1;66614:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;66614:14:0;;;-1:-1:-1;;;;;66614:14:0;;;;;57483:42;66643:4;66648:1;66643:7;;;;;;;;-1:-1:-1;;;;;66643:14:0;;;:7;;;;;;;;;;;:14;66696:39;;-1:-1:-1;;;66696:39:0;;66672:21;;57577:42;;66696:26;;:39;;66723:5;;66730:4;;66696:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66696:39:0;;;;;;;;;;;;:::i;:::-;66672:63;;66763:23;66778:4;66783:1;66778:7;;;;;;;;;;;;;;66763:10;:14;;:23;;;;:::i;:::-;66750:36;;66529:269;;;65986:819;;;:::o;15856:471::-;15914:7;16159:6;16155:47;;-1:-1:-1;16189:1:0;16182:8;;16155:47;16226:5;;;16230:1;16226;:5;:1;16250:5;;;;;:10;16242:56;;;;-1:-1:-1;;;16242:56:0;;;;;;;:::i;24167:761::-;24591:23;24617:69;24645:4;24617:69;;;;;;;;;;;;;;;;;24625:5;-1:-1:-1;;;;;24617:27:0;;;:69;;;;;:::i;:::-;24701:17;;24591:95;;-1:-1:-1;24701:21:0;24697:224;;24843:10;24832:30;;;;;;;;;;;;:::i;:::-;24824:85;;;;-1:-1:-1;;;24824: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;60388:285::-;60446:7;60476:34;60485:7;60494:15;:13;:15::i;60476:34::-;60466:44;;60521:12;60536:15;:13;:15::i;:::-;60570:14;;60562:57;;-1:-1:-1;;;60562:57:0;;60521:30;;-1:-1:-1;;;;;;60570:14:0;;60562:41;;:57;;60604:7;;60570:14;;60562:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60637:28;60657:7;60637:15;:13;:15::i;:28::-;60630:35;60388:285;-1:-1:-1;;;60388: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;61717:239::-;61769:7;61789:16;61808:34;57761:5;61808:17;61817:7;;61808:4;:8;;:17;;;;:::i;:::-;:21;;:34::i;:::-;61789:53;-1:-1:-1;61857:12:0;;61853:59;;61871:41;57394:42;57124;61903:8;61871:24;:41::i;:::-;61930:18;:4;61939:8;61930;: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;65607:295::-;65683:35;65705:12;65683:21;:35::i;:::-;65768:36;;-1:-1:-1;;;65768:36:0;;65729:76;;65754:12;;64585:42;;65768:21;;:36;;65798:4;;65768:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64585:42;;65729:76;:24;:76::i;:::-;65856:37;;-1:-1:-1;;;65856:37:0;;65816:78;;65842:12;;64674:42;;65856:22;;:37;;65887:4;;65856:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64674:42;;65816:78;:25;:78::i;63579:132::-;63637:18;63681:22;:20;:22::i;5347:619::-;5407:4;5875:20;;5718:66;5915:23;;;;;;:42;;-1:-1:-1;;5942:15:0;;;5907:51;-1:-1:-1;;5347:619:0:o;16803:132::-;16861:7;16888:39;16892:1;16895;16888:39;;;;;;;;;;;;;;;;;:3;:39::i;61463:246::-;61577:36;;-1:-1:-1;;;61577:36:0;;61538:76;;61563:12;;57394:42;;61577:21;;:36;;61607:4;;61577:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57394:42;;61538:76;:24;:76::i;:::-;61664:36;;-1:-1:-1;;;61664:36:0;;61625:76;;61650:12;;57306:42;;61664:21;;:36;;61694:4;;61664:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57306:42;;61625:76;:24;:76::i;61964:1607::-;62062:14;;62054:45;;-1:-1:-1;;;62054:45:0;;62019:7;;;;-1:-1:-1;;;;;62062:14:0;;;;62054:30;;:45;;62093:4;;62054:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62039:60;;62205:19;62227:4;62205:26;;62242:17;62262:10;62242:30;;62291:25;62319:10;62291:38;;62348:14;57306:42;-1:-1:-1;;;;;62365:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62348:42;-1:-1:-1;62401:12:0;;62442:29;62348:42;62453:17;62442:10;:29::i;:::-;62426:45;;62533:11;62525:5;:19;62521:417;;;62622:17;62642:22;:11;62658:5;62642:15;:22::i;:::-;62622:42;-1:-1:-1;62709:36:0;62733:11;62709:19;:4;62622:42;62709:8;:19::i;:36::-;62702:43;-1:-1:-1;62795:18:0;62816:21;:9;62830:6;62816:13;:21::i;:::-;62795:42;;62863:10;62856:4;:17;62852:75;;;62901:10;62894:17;;62852:75;62521:417;;;62950:16;62981:8;;62977:250;;63030:16;;;63044:1;63030:16;;;63006:21;63030:16;;;;;63006:21;63030:16;;;;;;;;;;-1:-1:-1;63030:16:0;63006:40;;57394:42;63061:4;63066:1;63061:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;63061:13:0;;;-1:-1:-1;;;;;63061:13:0;;;;;57483:42;63089:4;63094:1;63089:7;;;;;;;;-1:-1:-1;;;;;63089:14:0;;;:7;;;;;;;;;:14;63149:3;;63145:34;;-1:-1:-1;;;63145:34:0;;63118:24;;63149:3;;;;;63145:22;;:34;;63168:4;;63174;;63145:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63145:34:0;;;;;;;;;;;;:::i;:::-;63118:61;;63205:7;63213:1;63205:10;;;;;;;;;;;;;;63194:21;;62977:250;;;63239:16;63270:8;;63266:256;;63319:16;;;63333:1;63319:16;;;63295:21;63319:16;;;;;63295:21;63319:16;;;;;;;;;;-1:-1:-1;63319:16:0;63295:40;;57306:42;63350:4;63355:1;63350:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;63350:13:0;;;-1:-1:-1;;;;;63350:13:0;;;;;57483:42;63378:4;63383:1;63378:7;;;;;;;;-1:-1:-1;;;;;63378:14:0;;;:7;;;;;;;;;;;:14;63434:40;;-1:-1:-1;;;63434:40:0;;63407:24;;57671:42;;63434:28;;:40;;63463:4;;63469;;63434:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63434:40:0;;;;;;;;;;;;:::i;:::-;63407:67;;63500:7;63508:1;63500:10;;;;;;;;;;;;;;63489:21;;63266:256;;;63541:22;:8;63554;63541:12;:22::i;:::-;63534:29;;;;;;;;;;;61964:1607;:::o;17431:278::-;17517:7;17552:12;17545:5;17537:28;;;;-1:-1:-1;;;17537:28:0;;;;;;;;:::i;:::-;;17576:9;17592:1;17588;:5;;;;;;;17431:278;-1:-1:-1;;;;;17431:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;29305:6;29302:30;29299:2;;;-1:-1;;29335:12;29299:2;2016:65;29408:9;29389:17;;-1:-1;;29385:33;6493:2;29466: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;8360:690::-;;8553:5;29863:12;30635:6;30630:3;30623:19;30672:4;;30667:3;30663:14;8565:93;;30672:4;8729:5;29613:14;-1:-1;8768:260;8793:6;8790:1;8787:13;8768:260;;;8854:13;;-1:-1;;;;;31686:54;8160:37;;7740:14;;;;30365;;;;5020:18;8808:9;8768:260;;;-1:-1;9034:10;;8484:566;-1:-1;;;;;8484:566::o;16085:271::-;;10030:5;29863:12;10141:52;10186:6;10181:3;10174:4;10167:5;10163:16;10141:52;:::i;:::-;10205:16;;;;;16219:137;-1:-1;;16219:137::o;16363:542::-;;-1:-1;;;13016:11;13009:29;10030:5;29863:12;10141:52;10186:6;12994:1;13061:3;13057:11;10174:4;10167:5;10163:16;10141:52;:::i;:::-;10205:16;;;;12994:1;10205:16;;16600:305;-1:-1;;16600:305::o;16912:222::-;-1:-1;;;;;31686:54;;;;8160:37;;17039:2;17024:18;;17010:124::o;17386:337::-;-1:-1;;;;;31686:54;;;;8029:58;;31483:13;31476:21;17709:2;17694:18;;9824:34;17543:2;17528:18;;17514:209::o;17730:333::-;-1:-1;;;;;31686:54;;;8160:37;;31686:54;;18049:2;18034:18;;8160:37;17885:2;17870:18;;17856:207::o;18070:349::-;-1:-1;;;;;31686:54;;;;8160:37;;18405:2;18390:18;;10640:58;18233:2;18218:18;;18204:215::o;18766:441::-;18975:2;18960:18;;18964:9;9454:21;18766:441;9481:258;29998:4;9503:1;9500:13;9481:258;;;9567:13;;15916:37;;7931:4;7922:14;;;;30365;;;;9528:1;9521:9;9481:258;;;9485:14;;;10691:5;19193:2;19182:9;19178:18;10640:58;18946:261;;;;;:::o;19214:210::-;31483:13;;31476:21;9824:34;;19335:2;19320:18;;19306:118::o;19951:330::-;;20108:2;20129:17;20122:47;30635:6;20108:2;20097:9;20093:18;30623:19;32994:6;32989:3;30663:14;20097:9;30663:14;32971:30;33032:16;;;30663:14;33032:16;;;33025:27;;;;29408:9;33411:14;;;-1:-1;;33407:28;10990:39;;;20079:202;-1:-1;20079:202::o;20288:310::-;;20435:2;20456:17;20449:47;11188:5;29863:12;30635:6;20435:2;20424:9;20420:18;30623:19;11282:52;11327:6;30663:14;20424:9;30663:14;20435:2;11308:5;11304:16;11282:52;:::i;:::-;29408:9;33411:14;-1:-1;;33407:28;11346:39;;;;30663:14;11346:39;;20406:192;-1:-1;;20406:192::o;20605:416::-;20805:2;20819:47;;;11989:2;20790:18;;;30623:19;-1:-1;;;30663:14;;;12005:34;12058:12;;;20776:245::o;21028:416::-;21228:2;21242:47;;;12309:1;21213:18;;;30623:19;-1:-1;;;30663:14;;;12324:28;12371:12;;;21199:245::o;21451:416::-;21651:2;21665:47;;;12622:2;21636:18;;;30623:19;12658:29;30663:14;;;12638:50;12707:12;;;21622:245::o;21874:416::-;22074:2;22088:47;;;13307:2;22059:18;;;30623:19;13343:34;30663:14;;;13323:55;-1:-1;;;13398:12;;;13391:25;13435:12;;;22045:245::o;22297:416::-;22497:2;22511:47;;;13686:1;22482:18;;;30623:19;-1:-1;;;30663:14;;;13701:29;13749:12;;;22468:245::o;22720:416::-;22920:2;22934:47;;;14000:1;22905:18;;;30623:19;-1:-1;;;30663:14;;;14015:30;14064:12;;;22891:245::o;23143:416::-;23343:2;23357:47;;;14315:2;23328:18;;;30623:19;14351:31;30663:14;;;14331:52;14402:12;;;23314:245::o;23566:416::-;23766:2;23780:47;;;14653:2;23751:18;;;30623:19;-1:-1;;;30663:14;;;14669:34;14722:12;;;23737:245::o;23989:416::-;24189:2;24203:47;;;14973:2;24174:18;;;30623:19;15009:34;30663:14;;;14989:55;-1:-1;;;15064:12;;;15057:34;15110:12;;;24160:245::o;24412:416::-;24612:2;24626:47;;;15361:2;24597:18;;;30623:19;-1:-1;;;30663:14;;;15377:33;15429:12;;;24583:245::o;24835:416::-;25035:2;25049:47;;;15680:2;25020:18;;;30623:19;15716:34;30663:14;;;15696:55;-1:-1;;;15771:12;;;15764:46;15829:12;;;25006:245::o;25258:222::-;15916:37;;;25385:2;25370:18;;25356:124::o;25487:481::-;;15946:5;15923:3;15916:37;25692:2;25810;25799:9;25795:18;25788:48;25850:108;25692:2;25681:9;25677:18;25944:6;25850:108;:::i;25975:321::-;15916:37;;;31483:13;31476:21;26282:2;26267:18;;9824:34;26124:2;26109:18;;26095:201::o;26303:832::-;;15946:5;15923:3;15916:37;15946:5;26765:2;26754:9;26750:18;15916:37;26600:3;26802:2;26791:9;26787:18;26780:48;26842:108;26600:3;26589:9;26585:19;26936:6;26842:108;:::i;:::-;-1:-1;;;;;31686:54;;;;27037:2;27022:18;;8029:58;-1:-1;27120:3;27105:19;15916:37;26834:116;26571:564;-1:-1;;;26571:564::o;27142:432::-;15916:37;;;27483:2;27468:18;;15916:37;;;;31483:13;31476:21;27560:2;27545:18;;9824:34;27319:2;27304:18;;27290:284::o;27581:444::-;15916:37;;;27928:2;27913:18;;15916:37;;;;28011:2;27996:18;;15916:37;27764:2;27749:18;;27735:290::o;28032:556::-;15916:37;;;28408:2;28393:18;;15916:37;;;;28491:2;28476:18;;15916:37;28574:2;28559:18;;15916:37;28243:3;28228:19;;28214:374::o;28595:256::-;28657:2;28651:9;28683:17;;;28758:18;28743:34;;28779:22;;;28740:62;28737:2;;;28815:1;;28805:12;28737:2;28657;28824:22;28635:216;;-1:-1;28635:216::o;28858:304::-;;29017:18;29009:6;29006:30;29003:2;;;-1:-1;;29039:12;29003:2;-1:-1;29084:4;29072:17;;;29137:15;;28940:222::o;33067:268::-;33132:1;33139:101;33153:6;33150:1;33147:13;33139:101;;;33220:11;;;33214:18;33201:11;;;33194:39;33175:2;33168:10;33139:101;;;33255:6;33252:1;33249:13;33246:2;;;33132:1;33311:6;33306:3;33302:16;33295:27;33246:2;;33116:219;;;:::o;33448:117::-;-1:-1;;;;;31686:54;;33507:35;;33497:2;;33556:1;;33546:12;33572:111;33653:5;31483:13;31476:21;33631:5;33628:32;33618:2;;33674:1;;33664:12
Swarm Source
ipfs://9ca5264dff4695556e7166f290c25808c52f65eddad63a7009843e0b8f41eb60
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.