Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Keeper | 12526017 | 1743 days ago | IN | 0 ETH | 0.00066435 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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-29
*/
// 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/openzeppelin-contracts@3.1.0/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/openzeppelin-contracts@3.1.0/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/openzeppelin-contracts@3.1.0/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: OpenZeppelin/openzeppelin-contracts@3.1.0/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/yearn-vaults@0.3.5/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/yearn-vaults@0.3.5/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: ConvexBTC
abstract contract ConvexBTC 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 wbtc = address(0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599);
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();
}
function _approveBasic() internal {
want.approve(booster, 0);
want.approve(booster, type(uint256).max);
IERC20(wbtc).approve(curve, 0);
IERC20(wbtc).approve(curve, 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: obtc.sol
contract Strategy is ConvexBTC {
address public constant bor = address(0x3c9d6c1C73b31c837832c72E04D3152f051fc1A9);
constructor(address _vault) public ConvexBTC(_vault) {
curve = address(0xd5BCf53e2C81e1991570f33Fa881c49EEa570C8D);
id = 20;
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(bor).approve(sushiswap, 0);
IERC20(bor).approve(sushiswap, type(uint256).max);
}
// >>> include other rewards
function _migrateRewards(address _newStrategy) internal override {
super._migrateRewards(_newStrategy);
IERC20(bor).safeTransfer(_newStrategy, IERC20(bor).balanceOf(address(this)));
}
// >>> include all other rewards in eth besides _claimableBasicInETH()
function _claimableInETH() internal override view returns (uint256 _claimable) {
_claimable = super._claimableInETH();
uint256 _bor = IERC20(bor).balanceOf(address(this));
if (_bor > 0) {
address[] memory path = new address[](3);
path[0] = bor;
path[1] = weth;
path[2] = wbtc;
uint256[] memory swap = Uni(sushiswap).getAmountsOut(_bor, 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[](3);
path[0] = crv;
path[1] = weth;
path[2] = wbtc;
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[](3);
path[0] = cvx;
path[1] = weth;
path[2] = wbtc;
Uni(sushiswap).swapExactTokensForTokens(_cvx, uint256(0), path, address(this), now);
}
uint256 _bor = IERC20(bor).balanceOf(address(this));
if (_bor > 0) {
address[] memory path = new address[](3);
path[0] = bor;
path[1] = weth;
path[2] = wbtc;
Uni(sushiswap).swapExactTokensForTokens(_bor, uint256(0), path, address(this), now);
}
uint256 _wbtc = IERC20(wbtc).balanceOf(address(this));
if (_wbtc > 0) {
ICurveFi(curve).add_liquidity([0, 0, _wbtc, 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[](3);
protected[0] = crv;
protected[1] = cvx;
protected[2] = bor;
return protected;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"EmergencyExitEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtPayment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtOutstanding","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"debtThreshold","type":"uint256"}],"name":"UpdatedDebtThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"UpdatedKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMaxReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"metadataURI","type":"string"}],"name":"UpdatedMetadataURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMinReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profitFactor","type":"uint256"}],"name":"UpdatedProfitFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewards","type":"address"}],"name":"UpdatedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategist","type":"address"}],"name":"UpdatedStrategist","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apiVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"approveAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"booster","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bor","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":"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":"wbtc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountNeeded","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"_loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawToConvexDepositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200577c3803806200577c833981016040819052620000349162000c5e565b80806200004481338080620001e5565b5061a8c06006556203f4806007556103e86008819055683635c9adc5dea00000600955600e80546001600160a01b03191673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f179055600f556200009a620003c1565b50600d80546001600160a01b03191673d5bcf53e2c81e1991570f33fa881c49eea570c8d1790556014600b819055600a805462ff00001961ff0019909116610100171662010000179055604051631526fe2760e01b8152600091829173f403c135812408bfbe8713b5a23a04b3d48aae3191631526fe279162000121919060040162000f1c565b60c06040518083038186803b1580156200013a57600080fd5b505afa1580156200014f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000175919062000c83565b5050600554939550935050506001600160a01b03808416911614620001b75760405162461bcd60e51b8152600401620001ae9062000dd0565b60405180910390fd5b600c80546001600160a01b0319166001600160a01b038316179055620001dc62000527565b50505062000f58565b6005546001600160a01b031615620002115760405162461bcd60e51b8152600401620001ae9062000e07565b600180546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b1580156200026e57600080fd5b505afa15801562000283573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a9919062000c5e565b600580546001600160a01b0319166001600160a01b039283161790819055620002e39116856000196200074e602090811b62001f9417901c565b600280546001600160a01b038086166001600160a01b0319928316179092556003805485841690831617908190556004805485851693169290921782556000600681905562015180600755606460085560095560015460405163095ea7b360e01b81529084169363095ea7b393620003649390911691600019910162000d82565b602060405180830381600087803b1580156200037f57600080fd5b505af115801562000394573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ba919062000d0f565b5050505050565b620003d66200085c60201b620020931760201c565b60405163095ea7b360e01b8152733c9d6c1c73b31c837832c72e04d3152f051fc1a99063095ea7b390620004269073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9060009060040162000d82565b602060405180830381600087803b1580156200044157600080fd5b505af115801562000456573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047c919062000d0f565b5060405163095ea7b360e01b8152733c9d6c1c73b31c837832c72e04d3152f051fc1a99063095ea7b390620004ce9073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906000199060040162000d82565b602060405180830381600087803b158015620004e957600080fd5b505af1158015620004fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000524919062000d0f565b50565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620005709073f403c135812408bfbe8713b5a23a04b3d48aae319060009060040162000d82565b602060405180830381600087803b1580156200058b57600080fd5b505af1158015620005a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005c6919062000d0f565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620006119073f403c135812408bfbe8713b5a23a04b3d48aae31906000199060040162000d82565b602060405180830381600087803b1580156200062c57600080fd5b505af115801562000641573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000667919062000d0f565b50600d5460405163095ea7b360e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c5999163095ea7b391620006af916001600160a01b03169060009060040162000d82565b602060405180830381600087803b158015620006ca57600080fd5b505af1158015620006df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000705919062000d0f565b50600d5460405163095ea7b360e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c5999163095ea7b391620004ce916001600160a01b0316906000199060040162000d82565b801580620007dd5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9062000787903090869060040162000d68565b60206040518083038186803b158015620007a057600080fd5b505afa158015620007b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007db919062000d31565b155b620007fc5760405162461bcd60e51b8152600401620001ae9062000ebf565b620008578363095ea7b360e01b84846040516024016200081e92919062000d82565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529062000a7f16565b505050565b600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b391620008a3916001600160a01b03169060009060040162000d82565b602060405180830381600087803b158015620008be57600080fd5b505af1158015620008d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008f9919062000d0f565b50600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b39162000942916001600160a01b0316906000199060040162000d82565b602060405180830381600087803b1580156200095d57600080fd5b505af115801562000972573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000998919062000d0f565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b391620009e0916001600160a01b03169060009060040162000d82565b602060405180830381600087803b158015620009fb57600080fd5b505af115801562000a10573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a36919062000d0f565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b391620004ce916001600160a01b0316906000199060040162000d82565b606062000adb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000b1b60201b620022f4179092919060201c565b80519091501562000857578080602001905181019062000afc919062000d0f565b620008575760405162461bcd60e51b8152600401620001ae9062000e75565b606062000b2c848460008562000b34565b949350505050565b606062000b418562000c06565b62000b605760405162461bcd60e51b8152600401620001ae9062000e3e565b60006060866001600160a01b0316858760405162000b7f919062000d4a565b60006040518083038185875af1925050503d806000811462000bbe576040519150601f19603f3d011682016040523d82523d6000602084013e62000bc3565b606091505b5091509150811562000bd957915062000b2c9050565b80511562000bea5780518082602001fd5b8360405162461bcd60e51b8152600401620001ae919062000d9b565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000b2c575050151592915050565b80516001600160a01b038116811462000c5857600080fd5b92915050565b60006020828403121562000c70578081fd5b62000c7c838362000c40565b9392505050565b60008060008060008060c0878903121562000c9c578182fd5b62000ca8888862000c40565b955062000cb9886020890162000c40565b945062000cca886040890162000c40565b935062000cdb886060890162000c40565b925062000cec886080890162000c40565b915060a0870151801515811462000d01578182fd5b809150509295509295509295565b60006020828403121562000d21578081fd5b8151801515811462000c7c578182fd5b60006020828403121562000d43578081fd5b5051919050565b6000825162000d5e81846020870162000f25565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015262000dbc81604085016020870162000f25565b601f01601f19169190910160400192915050565b6020808252601f908201527f636f6e7374727563746f723a20696e636f7272656374206c7020746f6b656e00604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b90815260200190565b60005b8381101562000f4257818101518382015260200162000f28565b8381111562000f52576000848401525b50505050565b6148148062000f686000396000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c80636ea69d62116101de5780639ec5a8941161010f578063ce5494bb116100ad578063efbb5cb01161007c578063efbb5cb01461061f578063f017c92f14610627578063fbfa77cf1461063a578063fcf2d0ad1461064257610383565b8063ce5494bb146105de578063e853a1c2146105f1578063ec38a862146105f9578063ed882c2b1461060c57610383565b8063c1a3d44c116100e9578063c1a3d44c146105a8578063c6def076146105b0578063c7687803146105b8578063c7b9d530146105cb57610383565b80639ec5a89414610590578063aced166114610598578063af640d0f146105a057610383565b80638e6350e21161017c578063923c1d6111610156578063923c1d6114610565578063955383bd1461056d57806395e80c50146105805780639be287851461058857610383565b80638e6350e21461054257806391397ab41461054a578063918f86741461055d57610383565b8063750521f5116101b8578063750521f51461050c5780637fef901a1461051f5780638516c2c8146105275780638cdfe1661461053a57610383565b80636ea69d62146104e95780637165485d146104f1578063748747e6146104f957610383565b80632e1a7d4d116102b85780634641257d11610256578063650d188011610230578063650d1880146104b3578063692058c2146104c65780636a4874a1146104ce5780636bc55876146104d657610383565b80634641257d1461049b57806346c96aac146104a35780635641ec03146104ab57610383565b806339a172a81161029257806339a172a8146104705780633cdc5389146104835780633fc8cef31461048b578063440368a31461049357610383565b80632e1a7d4d1461044d57806334659dc514610460578063380d0c081461046857610383565b80631d12f28b1161032557806322f3e2d4116102ff57806322f3e2d41461042d57806325829410146104355780632681f7e41461043d57806328b7ccf71461044557610383565b80631d12f28b146104085780631f1fcd51146104105780631fe4a6861461042557610383565b80630acd095b116103615780630acd095b146103c35780630f969b87146103d857806311588086146103eb5780631c459a7f1461040057610383565b806301681a621461038857806303ee438c1461039d57806306fdde03146103bb575b600080fd5b61039b610396366004614030565b61064a565b005b6103a56107e9565b6040516103b2919061443d565b60405180910390f35b6103a5610877565b6103cb61091c565b6040516103b29190614403565b61039b6103e63660046142ac565b61092a565b6103f36109b7565b6040516103b2919061468d565b6103cb610a3d565b6103f3610a4c565b610418610a52565b6040516103b29190614369565b610418610a61565b6103cb610a70565b6103a5610b11565b610418610b30565b6103f3610b48565b6103f361045b3660046142ac565b610b4e565b61039b610ba9565b61039b610d08565b61039b61047e3660046142ac565b610d67565b610418610de9565b610418610e01565b61039b610e19565b61039b611040565b6104186113aa565b6103cb6113c2565b6103cb6104c13660046142ac565b6113cb565b6104186113d3565b6104186113e2565b61039b6104e43660046140fd565b6113fa565b6104186114aa565b6104186114b9565b61039b610507366004614030565b6114c8565b61039b61051a366004614135565b611573565b6103f361160a565b61039b6105353660046140fd565b611610565b6103f3611679565b6103f361167f565b61039b6105583660046142ac565b611684565b6103f3611706565b61041861170c565b61039b61057b3660046142ac565b611724565b6103f3611776565b61041861177c565b610418611794565b6104186117a3565b6103f36117b2565b6103f36117b8565b6104186117e9565b61039b6105c63660046140fd565b611801565b61039b6105d9366004614030565b611868565b61039b6105ec366004614030565b611913565b610418611a81565b61039b610607366004614030565b611a99565b6103cb61061a3660046142ac565b611c30565b6103f3611e04565b61039b6106353660046142ac565b611e1f565b610418611ea1565b61039b611eb0565b61065261230b565b6001600160a01b0316336001600160a01b03161461068b5760405162461bcd60e51b8152600401610682906145a4565b60405180910390fd5b6005546001600160a01b03828116911614156106b95760405162461bcd60e51b815260040161068290614495565b6001546001600160a01b03828116911614156106e75760405162461bcd60e51b81526004016106829061454c565b60606106f1612388565b905060005b815181101561074c5781818151811061070b57fe5b60200260200101516001600160a01b0316836001600160a01b031614156107445760405162461bcd60e51b815260040161068290614613565b6001016106f6565b506107e561075861230b565b6040516370a0823160e01b81526001600160a01b038516906370a0823190610784903090600401614369565b60206040518083038186803b15801561079c57600080fd5b505afa1580156107b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d491906142c4565b6001600160a01b0385169190612470565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561086f5780601f106108445761010080835404028352916020019161086f565b820191906000526020600020905b81548152906001019060200180831161085257829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b1580156108bc57600080fd5b505afa1580156108d0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108f891908101906141a2565b604051602001610908919061433b565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b031633148061095b575061094661230b565b6001600160a01b0316336001600160a01b0316145b6109775760405162461bcd60e51b8152600401610682906145a4565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600906109ac90839061468d565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a08231906109e8903090600401614369565b60206040518083038186803b158015610a0057600080fd5b505afa158015610a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3891906142c4565b905090565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610aa5903090600401614369565b6101206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af6919061422e565b604001511180610a3857506000610b0b611e04565b11905090565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610b7b5760405162461bcd60e51b81526004016106829061452c565b6000610b868361248f565b600554909350909150610ba3906001600160a01b03163383612470565b50919050565b6002546001600160a01b0316331480610bda5750610bc561230b565b6001600160a01b0316336001600160a01b0316145b610bf65760405162461bcd60e51b8152600401610682906145a4565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610c27903090600401614369565b60206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7791906142c4565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610cb6918591610100900460ff16906004016146af565b602060405180830381600087803b158015610cd057600080fd5b505af1158015610ce4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190614119565b6002546001600160a01b0316331480610d395750610d2461230b565b6001600160a01b0316336001600160a01b0316145b610d555760405162461bcd60e51b8152600401610682906145a4565b610d5d6124e1565b610d656126f4565b565b6002546001600160a01b0316331480610d985750610d8361230b565b6001600160a01b0316336001600160a01b0316145b610db45760405162461bcd60e51b8152600401610682906145a4565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b1906109ac90839061468d565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6004546001600160a01b0316331480610e3c57506002546001600160a01b031633145b80610e5f5750610e4a61230b565b6001600160a01b0316336001600160a01b0316145b80610f005750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610eb357600080fd5b505afa158015610ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eeb919061404c565b6001600160a01b0316336001600160a01b0316145b80610fa15750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5457600080fd5b505afa158015610f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8c919061404c565b6001600160a01b0316336001600160a01b0316145b610fbd5760405162461bcd60e51b8152600401610682906145a4565b6001546040805163bf3759b560e01b81529051610d65926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561100357600080fd5b505afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b91906142c4565b6127ec565b6004546001600160a01b031633148061106357506002546001600160a01b031633145b80611086575061107161230b565b6001600160a01b0316336001600160a01b0316145b806111275750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611112919061404c565b6001600160a01b0316336001600160a01b0316145b806111c85750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561117b57600080fd5b505afa15801561118f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b3919061404c565b6001600160a01b0316336001600160a01b0316145b6111e45760405162461bcd60e51b8152600401610682906145a4565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f91906142c4565b600a5490915060009060ff16156112c557600061128a611e04565b90506112a383821161129c578361129e565b815b61248f565b94509150828211156112bf576112b98284612915565b94508291505b506112d6565b6112ce82612960565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc9061130a90879087908690600401614713565b602060405180830381600087803b15801561132457600080fd5b505af1158015611338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135c91906142c4565b9150611367826127ec565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5098484838560405161139c9493929190614729565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b600a5460ff1681565b60005b919050565b600e546001600160a01b031681565b73d533a949740bb3306d119cc777fa900ba034cd5281565b6002546001600160a01b031633148061142b575061141661230b565b6001600160a01b0316336001600160a01b0316145b6114475760405162461bcd60e51b8152600401610682906145a4565b801561147857600e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905561149f565b600e80546001600160a01b03191673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f1790555b6114a76126f4565b50565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b03163314806114f957506114e461230b565b6001600160a01b0316336001600160a01b0316145b6115155760405162461bcd60e51b8152600401610682906145a4565b6001600160a01b03811661152857600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe7154906109ac908390614369565b6002546001600160a01b03163314806115a4575061158f61230b565b6001600160a01b0316336001600160a01b0316145b6115c05760405162461bcd60e51b8152600401610682906145a4565b6115cc60008383613f55565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda682826040516115fe92919061440e565b60405180910390a15050565b600f5481565b6002546001600160a01b0316331480611641575061162c61230b565b6001600160a01b0316336001600160a01b0316145b61165d5760405162461bcd60e51b8152600401610682906145a4565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b03163314806116b557506116a061230b565b6001600160a01b0316336001600160a01b0316145b6116d15760405162461bcd60e51b8152600401610682906145a4565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec298906109ac90839061468d565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b0316331480611755575061174061230b565b6001600160a01b0316336001600160a01b0316145b6117715760405162461bcd60e51b8152600401610682906145a4565b600f55565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906109e8903090600401614369565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b0316331480611832575061181d61230b565b6001600160a01b0316336001600160a01b0316145b61184e5760405162461bcd60e51b8152600401610682906145a4565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611899575061188461230b565b6001600160a01b0316336001600160a01b0316145b6118b55760405162461bcd60e51b8152600401610682906145a4565b6001600160a01b0381166118c857600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b4906109ac908390614369565b6001546001600160a01b0316331480611944575061192f61230b565b6001600160a01b0316336001600160a01b0316145b61194d57600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b15801561199457600080fd5b505afa1580156119a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cc919061404c565b6001600160a01b0316146119df57600080fd5b6119e88161329f565b6005546040516370a0823160e01b81526114a79183916001600160a01b03909116906370a0823190611a1e903090600401614369565b60206040518083038186803b158015611a3657600080fd5b505afa158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e91906142c4565b6005546001600160a01b03169190612470565b733c9d6c1c73b31c837832c72e04d3152f051fc1a981565b6002546001600160a01b03163314611ac35760405162461bcd60e51b815260040161068290614470565b6001600160a01b038116611ad657600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611b0d929116906000906004016143b2565b602060405180830381600087803b158015611b2757600080fd5b505af1158015611b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f9190614119565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611bae92911690600019906004016143b2565b602060405180830381600087803b158015611bc857600080fd5b505af1158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190614119565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a069816040516109ac9190614369565b6000611c3a613fcf565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611c6a903090600401614369565b6101206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbb919061422e565b9050806020015160001415611cd45760009150506113ce565b60065460a0820151611ce7904290612915565b1015611cf75760009150506113ce565b60075460a0820151611d0a904290612915565b10611d195760019150506113ce565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015611d5e57600080fd5b505afa158015611d72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9691906142c4565b9050600954811115611dad576001925050506113ce565b6000611db7611e04565b90508260c00151611dd36009548361331590919063ffffffff16565b1015611de557600193505050506113ce565b611ded61333a565b600854611dfa908761357b565b1095945050505050565b6000610a38611e116109b7565b611e196117b8565b90613315565b6002546001600160a01b0316331480611e505750611e3b61230b565b6001600160a01b0316336001600160a01b0316145b611e6c5760405162461bcd60e51b8152600401610682906145a4565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c5906109ac90839061468d565b6001546001600160a01b031681565b6002546001600160a01b0316331480611ee15750611ecc61230b565b6001600160a01b0316336001600160a01b0316145b611efd5760405162461bcd60e51b8152600401610682906145a4565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b158015611f5157600080fd5b505af1158015611f65573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b80158061201c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611fca903090869060040161437d565b60206040518083038186803b158015611fe257600080fd5b505afa158015611ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201a91906142c4565b155b6120385760405162461bcd60e51b815260040161068290614637565b61208e8363095ea7b360e01b84846040516024016120579291906143b2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526135b5565b505050565b600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b3916120d8916001600160a01b0316906000906004016143b2565b602060405180830381600087803b1580156120f257600080fd5b505af1158015612106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212a9190614119565b50600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b391612171916001600160a01b031690600019906004016143b2565b602060405180830381600087803b15801561218b57600080fd5b505af115801561219f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c39190614119565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b391612209916001600160a01b0316906000906004016143b2565b602060405180830381600087803b15801561222357600080fd5b505af1158015612237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225b9190614119565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b3916122a2916001600160a01b031690600019906004016143b2565b602060405180830381600087803b1580156122bc57600080fd5b505af11580156122d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a79190614119565b60606123038484600085613644565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561235057600080fd5b505afa158015612364573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a38919061404c565b6040805160038082526080820190925260609182919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd52816000815181106123cf57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160018151811061241157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050733c9d6c1c73b31c837832c72e04d3152f051fc1a98160028151811061245357fe5b6001600160a01b0390921660209283029190910190910152905090565b61208e8363a9059cbb60e01b84846040516024016120579291906143b2565b600080600061249c6117b8565b9050838110156124d7576124b86124b38583612915565b613708565b92506124c48382613315565b92506124d08484612915565b91506124db565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906125289073f403c135812408bfbe8713b5a23a04b3d48aae31906000906004016143b2565b602060405180830381600087803b15801561254257600080fd5b505af1158015612556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257a9190614119565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906125c39073f403c135812408bfbe8713b5a23a04b3d48aae3190600019906004016143b2565b602060405180830381600087803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126159190614119565b50600d5460405163095ea7b360e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c5999163095ea7b39161265b916001600160a01b0316906000906004016143b2565b602060405180830381600087803b15801561267557600080fd5b505af1158015612689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ad9190614119565b50600d5460405163095ea7b360e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c5999163095ea7b3916122a2916001600160a01b031690600019906004016143b2565b6126fc612093565b60405163095ea7b360e01b8152733c9d6c1c73b31c837832c72e04d3152f051fc1a99063095ea7b39061274a9073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906000906004016143b2565b602060405180830381600087803b15801561276457600080fd5b505af1158015612778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279c9190614119565b5060405163095ea7b360e01b8152733c9d6c1c73b31c837832c72e04d3152f051fc1a99063095ea7b3906122a29073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f90600019906004016143b2565b600a5460ff16156127fc576114a7565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a082319061282d903090600401614369565b60206040518083038186803b15801561284557600080fd5b505afa158015612859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287d91906142c4565b905080156107e557600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d066916128c3919085906001906004016146fb565b602060405180830381600087803b1580156128dd57600080fd5b505af11580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208e9190614119565b600061295783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137bc565b90505b92915050565b60008060008061296e6117b8565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd9916129ae91309162010000900460ff1690600401614397565b602060405180830381600087803b1580156129c857600080fd5b505af11580156129dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a009190614119565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612a3b903090600401614369565b60206040518083038186803b158015612a5357600080fd5b505afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b91906142c4565b90508015612c0757612a9c816137e8565b604080516003808252608082019092529192506060919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612ae457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612b2657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c59981600281518110612b6857fe5b6001600160a01b039283166020918202929092010152600e546040516338ed173960e01b81529116906338ed173990612bae9085906000908690309042906004016146bf565b600060405180830381600087803b158015612bc857600080fd5b505af1158015612bdc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c049190810190614068565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612c41903090600401614369565b60206040518083038186803b158015612c5957600080fd5b505afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9191906142c4565b90508015612e125760408051600380825260808201909252606091602082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110612cdd57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612d1f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c59981600281518110612d6157fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990612db99085906000908690309042906004016146bf565b600060405180830381600087803b158015612dd357600080fd5b505af1158015612de7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e0f9190810190614068565b50505b6040516370a0823160e01b8152600090733c9d6c1c73b31c837832c72e04d3152f051fc1a9906370a0823190612e4c903090600401614369565b60206040518083038186803b158015612e6457600080fd5b505afa158015612e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e9c91906142c4565b9050801561301d5760408051600380825260808201909252606091602082018380368337019050509050733c9d6c1c73b31c837832c72e04d3152f051fc1a981600081518110612ee857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612f2a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c59981600281518110612f6c57fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990612fc49085906000908690309042906004016146bf565b600060405180830381600087803b158015612fde57600080fd5b505af1158015612ff2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261301a9190810190614068565b50505b6040516370a0823160e01b8152600090732260fac5e5542a773aa44fbcfedf7c193bc2c599906370a0823190613057903090600401614369565b60206040518083038186803b15801561306f57600080fd5b505afa158015613083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a791906142c4565b9050801561313257600d546040805160808101825260008082526020820181905281830185905260608201819052915162a6cbcd60e21b81526001600160a01b039093169263029b2f34926130ff92916004016143cb565b600060405180830381600087803b15801561311957600080fd5b505af115801561312d573d6000803e3d6000fd5b505050505b6005546040516370a0823160e01b81526131be9187916001600160a01b03909116906370a0823190613168903090600401614369565b60206040518083038186803b15801561318057600080fd5b505afa158015613194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b891906142c4565b90612915565b975060006131ca611e04565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf82390613200903090600401614369565b6101206040518083038186803b15801561321957600080fd5b505afa15801561322d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613251919061422e565b60c00151905080821015613269578181039850600099505b8a15613291576132788b613708565b5061328e8b6132898c6131b86117b8565b613851565b97505b505050505050509193909250565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a2916132da9161010090910460ff1690600401614403565b600060405180830381600087803b1580156132f457600080fd5b505af1158015613308573d6000803e3d6000fd5b505050506114a781613867565b6000828201838110156129575760405162461bcd60e51b8152600401610682906144b4565b6000613344613919565b6040516370a0823160e01b8152909150600090733c9d6c1c73b31c837832c72e04d3152f051fc1a9906370a0823190613381903090600401614369565b60206040518083038186803b15801561339957600080fd5b505afa1580156133ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d191906142c4565b905080156135775760408051600380825260808201909252606091602082018380368337019050509050733c9d6c1c73b31c837832c72e04d3152f051fc1a98160008151811061341d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061345f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c599816002815181106134a157fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815260609073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063d06ca61f906134f59086908690600401614696565b60006040518083038186803b15801561350d57600080fd5b505afa158015613521573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135499190810190614068565b90506135728160018151811061355b57fe5b60200260200101518561331590919063ffffffff16565b935050505b5090565b60008261358a5750600061295a565b8282028284828161359757fe5b04146129575760405162461bcd60e51b8152600401610682906144eb565b606061360a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122f49092919063ffffffff16565b80519091501561208e57808060200190518101906136289190614119565b61208e5760405162461bcd60e51b8152600401610682906145c9565b606061364f85613923565b61366b5760405162461bcd60e51b81526004016106829061456d565b60006060866001600160a01b03168587604051613688919061431f565b60006040518083038185875af1925050503d80600081146136c5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ca565b606091505b509150915081156136de5791506123039050565b8051156136ee5780518082602001fd5b8360405162461bcd60e51b8152600401610682919061443d565b6000613716826132896109b7565b915060006137226117b8565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e7202906137569086906000906004016146af565b602060405180830381600087803b15801561377057600080fd5b505af1158015613784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a89190614119565b506137b5816131b86117b8565b9392505050565b600081848411156137e05760405162461bcd60e51b8152600401610682919061443d565b505050900390565b60008061380c612710613806600f548661357b90919063ffffffff16565b9061395c565b905080156138475761384773d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483612470565b6137b58382612915565b60008183106138605781612957565b5090919050565b6138708161399e565b6040516370a0823160e01b81526114a7908290733c9d6c1c73b31c837832c72e04d3152f051fc1a9906370a08231906138ad903090600401614369565b60206040518083038186803b1580156138c557600080fd5b505afa1580156138d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138fd91906142c4565b733c9d6c1c73b31c837832c72e04d3152f051fc1a99190612470565b6000610a38613af0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612303575050151592915050565b600061295783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f1e565b6040516370a0823160e01b8152613a4790829073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906139db903090600401614369565b60206040518083038186803b1580156139f357600080fd5b505afa158015613a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2b91906142c4565b73d533a949740bb3306d119cc777fa900ba034cd529190612470565b6040516370a0823160e01b81526114a7908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190613a84903090600401614369565b60206040518083038186803b158015613a9c57600080fd5b505afa158015613ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad491906142c4565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612470565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc26290613b23903090600401614369565b60206040518083038186803b158015613b3b57600080fd5b505afa158015613b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7391906142c4565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613bea57600080fd5b505afa158015613bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2291906142c4565b9050600080613c31838561395c565b905085811015613c76576000613c478783612915565b9050613c57876138068a8461357b565b92506000613c658786612915565b905080841115613c73578093505b50505b60008715613db657604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110613cc057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613d0257fe5b6001600160a01b039283166020918202929092010152600e5460405163d06ca61f60e01b8152606092919091169063d06ca61f90613d46908d908690600401614696565b60006040518083038186803b158015613d5e57600080fd5b505afa158015613d72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d9a9190810190614068565b905080600181518110613da957fe5b6020026020010151925050505b60008315613f06576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110613e0057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613e4257fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815260609073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063d06ca61f90613e969089908690600401614696565b60006040518083038186803b158015613eae57600080fd5b505afa158015613ec2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613eea9190810190614068565b905080600181518110613ef957fe5b6020026020010151925050505b613f108282613315565b995050505050505050505090565b60008183613f3f5760405162461bcd60e51b8152600401610682919061443d565b506000838581613f4b57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613f965782800160ff19823516178555613fc3565b82800160010185558215613fc3579182015b82811115613fc3578235825591602001919060010190613fa8565b5061357792915061401b565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613577576000815560010161401c565b600060208284031215614041578081fd5b8135612957816147bb565b60006020828403121561405d578081fd5b8151612957816147bb565b6000602080838503121561407a578182fd5b825167ffffffffffffffff811115614090578283fd5b8301601f810185136140a0578283fd5b80516140b36140ae8261476b565b614744565b81815283810190838501858402850186018910156140cf578687fd5b8694505b838510156140f15780518352600194909401939185019185016140d3565b50979650505050505050565b60006020828403121561410e578081fd5b8135612957816147d0565b60006020828403121561412a578081fd5b8151612957816147d0565b60008060208385031215614147578081fd5b823567ffffffffffffffff8082111561415e578283fd5b818501915085601f830112614171578283fd5b81358181111561417f578384fd5b866020828501011115614190578384fd5b60209290920196919550909350505050565b6000602082840312156141b3578081fd5b815167ffffffffffffffff808211156141ca578283fd5b818401915084601f8301126141dd578283fd5b8151818111156141eb578384fd5b6141fe601f8201601f1916602001614744565b9150808252856020828501011115614214578384fd5b61422581602084016020860161478b565b50949350505050565b6000610120808385031215614241578182fd5b61424a81614744565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156142bd578081fd5b5035919050565b6000602082840312156142d5578081fd5b5051919050565b6000815180845260208085019450808401835b838110156143145781516001600160a01b0316875295820195908201906001016142ef565b509495945050505050565b6000825161433181846020870161478b565b9190910192915050565b600065086dedceccaf60d31b8252825161435c81600685016020870161478b565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b60a08101818460005b60048110156143f35781518352602092830192909101906001016143d4565b5050508260808301529392505050565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b600060208252825180602084015261445c81604085016020870161478b565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b60008382526040602083015261230360408301846142dc565b9182521515602082015260400190565b600086825285602083015260a060408301526146de60a08301866142dc565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff8111828210171561476357600080fd5b604052919050565b600067ffffffffffffffff821115614781578081fd5b5060209081020190565b60005b838110156147a657818101518382015260200161478e565b838111156147b5576000848401525b50505050565b6001600160a01b03811681146114a757600080fd5b80151581146114a757600080fdfea2646970667358221220ee578f34ccaf884fa47c990a6f30ec1a67a3fe6b2ca7dfc8215a3974a995c8de64736f6c634300060c0033000000000000000000000000e9dc63083c464d6edccff23444ff3cfc6886f6fb
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103835760003560e01c80636ea69d62116101de5780639ec5a8941161010f578063ce5494bb116100ad578063efbb5cb01161007c578063efbb5cb01461061f578063f017c92f14610627578063fbfa77cf1461063a578063fcf2d0ad1461064257610383565b8063ce5494bb146105de578063e853a1c2146105f1578063ec38a862146105f9578063ed882c2b1461060c57610383565b8063c1a3d44c116100e9578063c1a3d44c146105a8578063c6def076146105b0578063c7687803146105b8578063c7b9d530146105cb57610383565b80639ec5a89414610590578063aced166114610598578063af640d0f146105a057610383565b80638e6350e21161017c578063923c1d6111610156578063923c1d6114610565578063955383bd1461056d57806395e80c50146105805780639be287851461058857610383565b80638e6350e21461054257806391397ab41461054a578063918f86741461055d57610383565b8063750521f5116101b8578063750521f51461050c5780637fef901a1461051f5780638516c2c8146105275780638cdfe1661461053a57610383565b80636ea69d62146104e95780637165485d146104f1578063748747e6146104f957610383565b80632e1a7d4d116102b85780634641257d11610256578063650d188011610230578063650d1880146104b3578063692058c2146104c65780636a4874a1146104ce5780636bc55876146104d657610383565b80634641257d1461049b57806346c96aac146104a35780635641ec03146104ab57610383565b806339a172a81161029257806339a172a8146104705780633cdc5389146104835780633fc8cef31461048b578063440368a31461049357610383565b80632e1a7d4d1461044d57806334659dc514610460578063380d0c081461046857610383565b80631d12f28b1161032557806322f3e2d4116102ff57806322f3e2d41461042d57806325829410146104355780632681f7e41461043d57806328b7ccf71461044557610383565b80631d12f28b146104085780631f1fcd51146104105780631fe4a6861461042557610383565b80630acd095b116103615780630acd095b146103c35780630f969b87146103d857806311588086146103eb5780631c459a7f1461040057610383565b806301681a621461038857806303ee438c1461039d57806306fdde03146103bb575b600080fd5b61039b610396366004614030565b61064a565b005b6103a56107e9565b6040516103b2919061443d565b60405180910390f35b6103a5610877565b6103cb61091c565b6040516103b29190614403565b61039b6103e63660046142ac565b61092a565b6103f36109b7565b6040516103b2919061468d565b6103cb610a3d565b6103f3610a4c565b610418610a52565b6040516103b29190614369565b610418610a61565b6103cb610a70565b6103a5610b11565b610418610b30565b6103f3610b48565b6103f361045b3660046142ac565b610b4e565b61039b610ba9565b61039b610d08565b61039b61047e3660046142ac565b610d67565b610418610de9565b610418610e01565b61039b610e19565b61039b611040565b6104186113aa565b6103cb6113c2565b6103cb6104c13660046142ac565b6113cb565b6104186113d3565b6104186113e2565b61039b6104e43660046140fd565b6113fa565b6104186114aa565b6104186114b9565b61039b610507366004614030565b6114c8565b61039b61051a366004614135565b611573565b6103f361160a565b61039b6105353660046140fd565b611610565b6103f3611679565b6103f361167f565b61039b6105583660046142ac565b611684565b6103f3611706565b61041861170c565b61039b61057b3660046142ac565b611724565b6103f3611776565b61041861177c565b610418611794565b6104186117a3565b6103f36117b2565b6103f36117b8565b6104186117e9565b61039b6105c63660046140fd565b611801565b61039b6105d9366004614030565b611868565b61039b6105ec366004614030565b611913565b610418611a81565b61039b610607366004614030565b611a99565b6103cb61061a3660046142ac565b611c30565b6103f3611e04565b61039b6106353660046142ac565b611e1f565b610418611ea1565b61039b611eb0565b61065261230b565b6001600160a01b0316336001600160a01b03161461068b5760405162461bcd60e51b8152600401610682906145a4565b60405180910390fd5b6005546001600160a01b03828116911614156106b95760405162461bcd60e51b815260040161068290614495565b6001546001600160a01b03828116911614156106e75760405162461bcd60e51b81526004016106829061454c565b60606106f1612388565b905060005b815181101561074c5781818151811061070b57fe5b60200260200101516001600160a01b0316836001600160a01b031614156107445760405162461bcd60e51b815260040161068290614613565b6001016106f6565b506107e561075861230b565b6040516370a0823160e01b81526001600160a01b038516906370a0823190610784903090600401614369565b60206040518083038186803b15801561079c57600080fd5b505afa1580156107b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d491906142c4565b6001600160a01b0385169190612470565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561086f5780601f106108445761010080835404028352916020019161086f565b820191906000526020600020905b81548152906001019060200180831161085257829003601f168201915b505050505081565b600554604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b1580156108bc57600080fd5b505afa1580156108d0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108f891908101906141a2565b604051602001610908919061433b565b604051602081830303815290604052905090565b600a54610100900460ff1681565b6002546001600160a01b031633148061095b575061094661230b565b6001600160a01b0316336001600160a01b0316145b6109775760405162461bcd60e51b8152600401610682906145a4565b60098190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600906109ac90839061468d565b60405180910390a150565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a08231906109e8903090600401614369565b60206040518083038186803b158015610a0057600080fd5b505afa158015610a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3891906142c4565b905090565b600a5462010000900460ff1681565b60095481565b6005546001600160a01b031681565b6002546001600160a01b031681565b6001546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610aa5903090600401614369565b6101206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af6919061422e565b604001511180610a3857506000610b0b611e04565b11905090565b604080518082019091526005815264302e332e3560d81b602082015290565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60075481565b6001546000906001600160a01b03163314610b7b5760405162461bcd60e51b81526004016106829061452c565b6000610b868361248f565b600554909350909150610ba3906001600160a01b03163383612470565b50919050565b6002546001600160a01b0316331480610bda5750610bc561230b565b6001600160a01b0316336001600160a01b0316145b610bf65760405162461bcd60e51b8152600401610682906145a4565b600c546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610c27903090600401614369565b60206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7791906142c4565b600c54600a54604051631c683a1b60e11b81529293506001600160a01b03909116916338d0743691610cb6918591610100900460ff16906004016146af565b602060405180830381600087803b158015610cd057600080fd5b505af1158015610ce4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190614119565b6002546001600160a01b0316331480610d395750610d2461230b565b6001600160a01b0316336001600160a01b0316145b610d555760405162461bcd60e51b8152600401610682906145a4565b610d5d6124e1565b610d656126f4565b565b6002546001600160a01b0316331480610d985750610d8361230b565b6001600160a01b0316336001600160a01b0316145b610db45760405162461bcd60e51b8152600401610682906145a4565b60068190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b1906109ac90839061468d565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6004546001600160a01b0316331480610e3c57506002546001600160a01b031633145b80610e5f5750610e4a61230b565b6001600160a01b0316336001600160a01b0316145b80610f005750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610eb357600080fd5b505afa158015610ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eeb919061404c565b6001600160a01b0316336001600160a01b0316145b80610fa15750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5457600080fd5b505afa158015610f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8c919061404c565b6001600160a01b0316336001600160a01b0316145b610fbd5760405162461bcd60e51b8152600401610682906145a4565b6001546040805163bf3759b560e01b81529051610d65926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b15801561100357600080fd5b505afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b91906142c4565b6127ec565b6004546001600160a01b031633148061106357506002546001600160a01b031633145b80611086575061107161230b565b6001600160a01b0316336001600160a01b0316145b806111275750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b1580156110da57600080fd5b505afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611112919061404c565b6001600160a01b0316336001600160a01b0316145b806111c85750600160009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561117b57600080fd5b505afa15801561118f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b3919061404c565b6001600160a01b0316336001600160a01b0316145b6111e45760405162461bcd60e51b8152600401610682906145a4565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f91906142c4565b600a5490915060009060ff16156112c557600061128a611e04565b90506112a383821161129c578361129e565b815b61248f565b94509150828211156112bf576112b98284612915565b94508291505b506112d6565b6112ce82612960565b919550935090505b6001546040516328766ebf60e21b81526001600160a01b039091169063a1d9bafc9061130a90879087908690600401614713565b602060405180830381600087803b15801561132457600080fd5b505af1158015611338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135c91906142c4565b9150611367826127ec565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d5098484838560405161139c9493929190614729565b60405180910390a150505050565b73f147b8125d2ef93fb6965db97d6746952a13393481565b600a5460ff1681565b60005b919050565b600e546001600160a01b031681565b73d533a949740bb3306d119cc777fa900ba034cd5281565b6002546001600160a01b031633148061142b575061141661230b565b6001600160a01b0316336001600160a01b0316145b6114475760405162461bcd60e51b8152600401610682906145a4565b801561147857600e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905561149f565b600e80546001600160a01b03191673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f1790555b6114a76126f4565b50565b600c546001600160a01b031681565b600d546001600160a01b031681565b6002546001600160a01b03163314806114f957506114e461230b565b6001600160a01b0316336001600160a01b0316145b6115155760405162461bcd60e51b8152600401610682906145a4565b6001600160a01b03811661152857600080fd5b600480546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe7154906109ac908390614369565b6002546001600160a01b03163314806115a4575061158f61230b565b6001600160a01b0316336001600160a01b0316145b6115c05760405162461bcd60e51b8152600401610682906145a4565b6115cc60008383613f55565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda682826040516115fe92919061440e565b60405180910390a15050565b600f5481565b6002546001600160a01b0316331480611641575061162c61230b565b6001600160a01b0316336001600160a01b0316145b61165d5760405162461bcd60e51b8152600401610682906145a4565b600a8054911515620100000262ff000019909216919091179055565b60085481565b600090565b6002546001600160a01b03163314806116b557506116a061230b565b6001600160a01b0316336001600160a01b0316145b6116d15760405162461bcd60e51b8152600401610682906145a4565b60088190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec298906109ac90839061468d565b61271081565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6002546001600160a01b0316331480611755575061174061230b565b6001600160a01b0316336001600160a01b0316145b6117715760405162461bcd60e51b8152600401610682906145a4565b600f55565b60065481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6004546001600160a01b031681565b600b5481565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906109e8903090600401614369565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b6002546001600160a01b0316331480611832575061181d61230b565b6001600160a01b0316336001600160a01b0316145b61184e5760405162461bcd60e51b8152600401610682906145a4565b600a80549115156101000261ff0019909216919091179055565b6002546001600160a01b0316331480611899575061188461230b565b6001600160a01b0316336001600160a01b0316145b6118b55760405162461bcd60e51b8152600401610682906145a4565b6001600160a01b0381166118c857600080fd5b600280546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b4906109ac908390614369565b6001546001600160a01b0316331480611944575061192f61230b565b6001600160a01b0316336001600160a01b0316145b61194d57600080fd5b6001546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b15801561199457600080fd5b505afa1580156119a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cc919061404c565b6001600160a01b0316146119df57600080fd5b6119e88161329f565b6005546040516370a0823160e01b81526114a79183916001600160a01b03909116906370a0823190611a1e903090600401614369565b60206040518083038186803b158015611a3657600080fd5b505afa158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e91906142c4565b6005546001600160a01b03169190612470565b733c9d6c1c73b31c837832c72e04d3152f051fc1a981565b6002546001600160a01b03163314611ac35760405162461bcd60e51b815260040161068290614470565b6001600160a01b038116611ad657600080fd5b60015460035460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611b0d929116906000906004016143b2565b602060405180830381600087803b158015611b2757600080fd5b505af1158015611b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f9190614119565b50600380546001600160a01b0319166001600160a01b03838116919091179182905560015460405163095ea7b360e01b81529082169263095ea7b392611bae92911690600019906004016143b2565b602060405180830381600087803b158015611bc857600080fd5b505af1158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190614119565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a069816040516109ac9190614369565b6000611c3a613fcf565b6001546040516339ebf82360e01b81526001600160a01b03909116906339ebf82390611c6a903090600401614369565b6101206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbb919061422e565b9050806020015160001415611cd45760009150506113ce565b60065460a0820151611ce7904290612915565b1015611cf75760009150506113ce565b60075460a0820151611d0a904290612915565b10611d195760019150506113ce565b6001546040805163bf3759b560e01b815290516000926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015611d5e57600080fd5b505afa158015611d72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9691906142c4565b9050600954811115611dad576001925050506113ce565b6000611db7611e04565b90508260c00151611dd36009548361331590919063ffffffff16565b1015611de557600193505050506113ce565b611ded61333a565b600854611dfa908761357b565b1095945050505050565b6000610a38611e116109b7565b611e196117b8565b90613315565b6002546001600160a01b0316331480611e505750611e3b61230b565b6001600160a01b0316336001600160a01b0316145b611e6c5760405162461bcd60e51b8152600401610682906145a4565b60078190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c5906109ac90839061468d565b6001546001600160a01b031681565b6002546001600160a01b0316331480611ee15750611ecc61230b565b6001600160a01b0316336001600160a01b0316145b611efd5760405162461bcd60e51b8152600401610682906145a4565b600a805460ff19166001908117909155546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b158015611f5157600080fd5b505af1158015611f65573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b80158061201c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611fca903090869060040161437d565b60206040518083038186803b158015611fe257600080fd5b505afa158015611ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201a91906142c4565b155b6120385760405162461bcd60e51b815260040161068290614637565b61208e8363095ea7b360e01b84846040516024016120579291906143b2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526135b5565b505050565b600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b3916120d8916001600160a01b0316906000906004016143b2565b602060405180830381600087803b1580156120f257600080fd5b505af1158015612106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212a9190614119565b50600e5460405163095ea7b360e01b815273d533a949740bb3306d119cc777fa900ba034cd529163095ea7b391612171916001600160a01b031690600019906004016143b2565b602060405180830381600087803b15801561218b57600080fd5b505af115801561219f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c39190614119565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b391612209916001600160a01b0316906000906004016143b2565b602060405180830381600087803b15801561222357600080fd5b505af1158015612237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225b9190614119565b50600e5460405163095ea7b360e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9163095ea7b3916122a2916001600160a01b031690600019906004016143b2565b602060405180830381600087803b1580156122bc57600080fd5b505af11580156122d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a79190614119565b60606123038484600085613644565b949350505050565b60015460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561235057600080fd5b505afa158015612364573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a38919061404c565b6040805160038082526080820190925260609182919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd52816000815181106123cf57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8160018151811061241157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050733c9d6c1c73b31c837832c72e04d3152f051fc1a98160028151811061245357fe5b6001600160a01b0390921660209283029190910190910152905090565b61208e8363a9059cbb60e01b84846040516024016120579291906143b2565b600080600061249c6117b8565b9050838110156124d7576124b86124b38583612915565b613708565b92506124c48382613315565b92506124d08484612915565b91506124db565b8392505b50915091565b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906125289073f403c135812408bfbe8713b5a23a04b3d48aae31906000906004016143b2565b602060405180830381600087803b15801561254257600080fd5b505af1158015612556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257a9190614119565b5060055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906125c39073f403c135812408bfbe8713b5a23a04b3d48aae3190600019906004016143b2565b602060405180830381600087803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126159190614119565b50600d5460405163095ea7b360e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c5999163095ea7b39161265b916001600160a01b0316906000906004016143b2565b602060405180830381600087803b15801561267557600080fd5b505af1158015612689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ad9190614119565b50600d5460405163095ea7b360e01b8152732260fac5e5542a773aa44fbcfedf7c193bc2c5999163095ea7b3916122a2916001600160a01b031690600019906004016143b2565b6126fc612093565b60405163095ea7b360e01b8152733c9d6c1c73b31c837832c72e04d3152f051fc1a99063095ea7b39061274a9073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906000906004016143b2565b602060405180830381600087803b15801561276457600080fd5b505af1158015612778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279c9190614119565b5060405163095ea7b360e01b8152733c9d6c1c73b31c837832c72e04d3152f051fc1a99063095ea7b3906122a29073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f90600019906004016143b2565b600a5460ff16156127fc576114a7565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a082319061282d903090600401614369565b60206040518083038186803b15801561284557600080fd5b505afa158015612859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287d91906142c4565b905080156107e557600b546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d066916128c3919085906001906004016146fb565b602060405180830381600087803b1580156128dd57600080fd5b505af11580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208e9190614119565b600061295783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137bc565b90505b92915050565b60008060008061296e6117b8565b600c54600a54604051637050ccd960e01b81529293506001600160a01b0390911691637050ccd9916129ae91309162010000900460ff1690600401614397565b602060405180830381600087803b1580156129c857600080fd5b505af11580156129dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a009190614119565b506040516370a0823160e01b815260009073d533a949740bb3306d119cc777fa900ba034cd52906370a0823190612a3b903090600401614369565b60206040518083038186803b158015612a5357600080fd5b505afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b91906142c4565b90508015612c0757612a9c816137e8565b604080516003808252608082019092529192506060919060208201838036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110612ae457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612b2657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c59981600281518110612b6857fe5b6001600160a01b039283166020918202929092010152600e546040516338ed173960e01b81529116906338ed173990612bae9085906000908690309042906004016146bf565b600060405180830381600087803b158015612bc857600080fd5b505af1158015612bdc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c049190810190614068565b50505b6040516370a0823160e01b8152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190612c41903090600401614369565b60206040518083038186803b158015612c5957600080fd5b505afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9191906142c4565b90508015612e125760408051600380825260808201909252606091602082018380368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110612cdd57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612d1f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c59981600281518110612d6157fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990612db99085906000908690309042906004016146bf565b600060405180830381600087803b158015612dd357600080fd5b505af1158015612de7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e0f9190810190614068565b50505b6040516370a0823160e01b8152600090733c9d6c1c73b31c837832c72e04d3152f051fc1a9906370a0823190612e4c903090600401614369565b60206040518083038186803b158015612e6457600080fd5b505afa158015612e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e9c91906142c4565b9050801561301d5760408051600380825260808201909252606091602082018380368337019050509050733c9d6c1c73b31c837832c72e04d3152f051fc1a981600081518110612ee857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612f2a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c59981600281518110612f6c57fe5b6001600160a01b03909216602092830291909101909101526040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990612fc49085906000908690309042906004016146bf565b600060405180830381600087803b158015612fde57600080fd5b505af1158015612ff2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261301a9190810190614068565b50505b6040516370a0823160e01b8152600090732260fac5e5542a773aa44fbcfedf7c193bc2c599906370a0823190613057903090600401614369565b60206040518083038186803b15801561306f57600080fd5b505afa158015613083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a791906142c4565b9050801561313257600d546040805160808101825260008082526020820181905281830185905260608201819052915162a6cbcd60e21b81526001600160a01b039093169263029b2f34926130ff92916004016143cb565b600060405180830381600087803b15801561311957600080fd5b505af115801561312d573d6000803e3d6000fd5b505050505b6005546040516370a0823160e01b81526131be9187916001600160a01b03909116906370a0823190613168903090600401614369565b60206040518083038186803b15801561318057600080fd5b505afa158015613194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b891906142c4565b90612915565b975060006131ca611e04565b6001546040516339ebf82360e01b81529192506000916001600160a01b03909116906339ebf82390613200903090600401614369565b6101206040518083038186803b15801561321957600080fd5b505afa15801561322d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613251919061422e565b60c00151905080821015613269578181039850600099505b8a15613291576132788b613708565b5061328e8b6132898c6131b86117b8565b613851565b97505b505050505050509193909250565b600c54600a546040516324f81cd160e11b81526001600160a01b03909216916349f039a2916132da9161010090910460ff1690600401614403565b600060405180830381600087803b1580156132f457600080fd5b505af1158015613308573d6000803e3d6000fd5b505050506114a781613867565b6000828201838110156129575760405162461bcd60e51b8152600401610682906144b4565b6000613344613919565b6040516370a0823160e01b8152909150600090733c9d6c1c73b31c837832c72e04d3152f051fc1a9906370a0823190613381903090600401614369565b60206040518083038186803b15801561339957600080fd5b505afa1580156133ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d191906142c4565b905080156135775760408051600380825260808201909252606091602082018380368337019050509050733c9d6c1c73b31c837832c72e04d3152f051fc1a98160008151811061341d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061345f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c599816002815181106134a157fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815260609073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063d06ca61f906134f59086908690600401614696565b60006040518083038186803b15801561350d57600080fd5b505afa158015613521573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135499190810190614068565b90506135728160018151811061355b57fe5b60200260200101518561331590919063ffffffff16565b935050505b5090565b60008261358a5750600061295a565b8282028284828161359757fe5b04146129575760405162461bcd60e51b8152600401610682906144eb565b606061360a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122f49092919063ffffffff16565b80519091501561208e57808060200190518101906136289190614119565b61208e5760405162461bcd60e51b8152600401610682906145c9565b606061364f85613923565b61366b5760405162461bcd60e51b81526004016106829061456d565b60006060866001600160a01b03168587604051613688919061431f565b60006040518083038185875af1925050503d80600081146136c5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ca565b606091505b509150915081156136de5791506123039050565b8051156136ee5780518082602001fd5b8360405162461bcd60e51b8152600401610682919061443d565b6000613716826132896109b7565b915060006137226117b8565b600c54604051636197390160e11b81529192506001600160a01b03169063c32e7202906137569086906000906004016146af565b602060405180830381600087803b15801561377057600080fd5b505af1158015613784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a89190614119565b506137b5816131b86117b8565b9392505050565b600081848411156137e05760405162461bcd60e51b8152600401610682919061443d565b505050900390565b60008061380c612710613806600f548661357b90919063ffffffff16565b9061395c565b905080156138475761384773d533a949740bb3306d119cc777fa900ba034cd5273f147b8125d2ef93fb6965db97d6746952a13393483612470565b6137b58382612915565b60008183106138605781612957565b5090919050565b6138708161399e565b6040516370a0823160e01b81526114a7908290733c9d6c1c73b31c837832c72e04d3152f051fc1a9906370a08231906138ad903090600401614369565b60206040518083038186803b1580156138c557600080fd5b505afa1580156138d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138fd91906142c4565b733c9d6c1c73b31c837832c72e04d3152f051fc1a99190612470565b6000610a38613af0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612303575050151592915050565b600061295783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f1e565b6040516370a0823160e01b8152613a4790829073d533a949740bb3306d119cc777fa900ba034cd52906370a08231906139db903090600401614369565b60206040518083038186803b1580156139f357600080fd5b505afa158015613a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2b91906142c4565b73d533a949740bb3306d119cc777fa900ba034cd529190612470565b6040516370a0823160e01b81526114a7908290734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a0823190613a84903090600401614369565b60206040518083038186803b158015613a9c57600080fd5b505afa158015613ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad491906142c4565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9190612470565b600c546040516246613160e11b815260009182916001600160a01b0390911690628cc26290613b23903090600401614369565b60206040518083038186803b158015613b3b57600080fd5b505afa158015613b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7391906142c4565b905060006103e8905060006a52b7d2dcc80cd2e40000009050600069152d02c7e14af680000090506000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613bea57600080fd5b505afa158015613bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2291906142c4565b9050600080613c31838561395c565b905085811015613c76576000613c478783612915565b9050613c57876138068a8461357b565b92506000613c658786612915565b905080841115613c73578093505b50505b60008715613db657604080516002808252606080830184529260208301908036833701905050905073d533a949740bb3306d119cc777fa900ba034cd5281600081518110613cc057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613d0257fe5b6001600160a01b039283166020918202929092010152600e5460405163d06ca61f60e01b8152606092919091169063d06ca61f90613d46908d908690600401614696565b60006040518083038186803b158015613d5e57600080fd5b505afa158015613d72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d9a9190810190614068565b905080600181518110613da957fe5b6020026020010151925050505b60008315613f06576040805160028082526060808301845292602083019080368337019050509050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81600081518110613e0057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613e4257fe5b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815260609073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063d06ca61f90613e969089908690600401614696565b60006040518083038186803b158015613eae57600080fd5b505afa158015613ec2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613eea9190810190614068565b905080600181518110613ef957fe5b6020026020010151925050505b613f108282613315565b995050505050505050505090565b60008183613f3f5760405162461bcd60e51b8152600401610682919061443d565b506000838581613f4b57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613f965782800160ff19823516178555613fc3565b82800160010185558215613fc3579182015b82811115613fc3578235825591602001919060010190613fa8565b5061357792915061401b565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613577576000815560010161401c565b600060208284031215614041578081fd5b8135612957816147bb565b60006020828403121561405d578081fd5b8151612957816147bb565b6000602080838503121561407a578182fd5b825167ffffffffffffffff811115614090578283fd5b8301601f810185136140a0578283fd5b80516140b36140ae8261476b565b614744565b81815283810190838501858402850186018910156140cf578687fd5b8694505b838510156140f15780518352600194909401939185019185016140d3565b50979650505050505050565b60006020828403121561410e578081fd5b8135612957816147d0565b60006020828403121561412a578081fd5b8151612957816147d0565b60008060208385031215614147578081fd5b823567ffffffffffffffff8082111561415e578283fd5b818501915085601f830112614171578283fd5b81358181111561417f578384fd5b866020828501011115614190578384fd5b60209290920196919550909350505050565b6000602082840312156141b3578081fd5b815167ffffffffffffffff808211156141ca578283fd5b818401915084601f8301126141dd578283fd5b8151818111156141eb578384fd5b6141fe601f8201601f1916602001614744565b9150808252856020828501011115614214578384fd5b61422581602084016020860161478b565b50949350505050565b6000610120808385031215614241578182fd5b61424a81614744565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602082840312156142bd578081fd5b5035919050565b6000602082840312156142d5578081fd5b5051919050565b6000815180845260208085019450808401835b838110156143145781516001600160a01b0316875295820195908201906001016142ef565b509495945050505050565b6000825161433181846020870161478b565b9190910192915050565b600065086dedceccaf60d31b8252825161435c81600685016020870161478b565b9190910160060192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b60a08101818460005b60048110156143f35781518352602092830192909101906001016143d4565b5050508260808301529392505050565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b600060208252825180602084015261445c81604085016020870161478b565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b60008382526040602083015261230360408301846142dc565b9182521515602082015260400190565b600086825285602083015260a060408301526146de60a08301866142dc565b6001600160a01b0394909416606083015250608001529392505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff8111828210171561476357600080fd5b604052919050565b600067ffffffffffffffff821115614781578081fd5b5060209081020190565b60005b838110156147a657818101518382015260200161478e565b838111156147b5576000848401525b50505050565b6001600160a01b03811681146114a757600080fd5b80151581146114a757600080fdfea2646970667358221220ee578f34ccaf884fa47c990a6f30ec1a67a3fe6b2ca7dfc8215a3974a995c8de64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e9dc63083c464d6edccff23444ff3cfc6886f6fb
-----Decoded View---------------
Arg [0] : _vault (address): 0xe9Dc63083c464d6EDcCFf23444fF3CFc6886f6FB
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e9dc63083c464d6edccff23444ff3cfc6886f6fb
Deployed Bytecode Sourcemap
64531:4034:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56332:444;;;;;;:::i;:::-;;:::i;:::-;;30156:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59574:163;;;:::i;57736:26::-;;;:::i;:::-;;;;;;;:::i;39478:175::-;;;;;;:::i;:::-;;:::i;59863:129::-;;;:::i;:::-;;;;;;;:::i;57769:25::-;;;:::i;33346:28::-;;;:::i;32094:18::-;;;:::i;:::-;;;;;;;:::i;32003:25::-;;;:::i;42151:148::-;;;:::i;30466:91::-;;;:::i;57496:85::-;;;:::i;32982:29::-;;;:::i;52912:515::-;;;;;;:::i;:::-;;:::i;59350:216::-;;;:::i;58702:104::-;;;:::i;37527:154::-;;;;;;:::i;:::-;;:::i;57405:82::-;;;:::i;57316:::-;;;:::i;46904:170::-;;;:::i;51297:1371::-;;;:::i;56956:83::-;;;:::i;33425:25::-;;;:::i;46289:286::-;;;;;;:::i;:::-;;:::i;57890:18::-;;;:::i;57228:81::-;;;:::i;58921:161::-;;;;;;:::i;:::-;;:::i;57825:29::-;;;:::i;57861:20::-;;;:::i;36284:174::-;;;;;;:::i;:::-;;:::i;39956:171::-;;;;;;:::i;:::-;;:::i;57915:22::-;;;:::i;59222:120::-;;;;;;:::i;:::-;;:::i;33168:27::-;;;:::i;31873:94::-;;;:::i;38752:169::-;;;;;;:::i;:::-;;:::i;57684:43::-;;;:::i;57140:81::-;;;:::i;58814:99::-;;;;;;:::i;:::-;;:::i;32831:29::-;;;:::i;57588:87::-;;;:::i;32035:22::-;;;:::i;32064:21::-;;;:::i;57801:17::-;;;:::i;59745:110::-;;;:::i;57046:85::-;;;:::i;59090:124::-;;;;;;:::i;:::-;;:::i;35528:202::-;;;;;;:::i;:::-;;:::i;54018:311::-;;;;;;:::i;:::-;;:::i;64569:81::-;;;:::i;36747:263::-;;;;;;:::i;:::-;;:::i;63816:687::-;;;;;;:::i;:::-;;:::i;60000:133::-;;;:::i;38198:154::-;;;;;;:::i;:::-;;:::i;31975:21::-;;;:::i;54758:164::-;;;:::i;56332:444::-;33792:12;:10;:12::i;:::-;-1:-1:-1;;;;;33778:26:0;:10;-1:-1:-1;;;;;33778:26:0;;33770:50;;;;-1:-1:-1;;;33770:50:0;;;;;;;:::i;:::-;;;;;;;;;56424:4:::1;::::0;-1:-1:-1;;;;;56406:23:0;;::::1;56424:4:::0;::::1;56406:23;;56398:41;;;;-1:-1:-1::0;;;56398:41:0::1;;;;;;;:::i;:::-;56476:5;::::0;-1:-1:-1;;;;;56458:24:0;;::::1;56476:5:::0;::::1;56458:24;;56450:44;;;;-1:-1:-1::0;;;56450:44:0::1;;;;;;;:::i;:::-;56507:33;56543:17;:15;:17::i;:::-;56507:53;;56576:9;56571:102;56591:16;:23;56587:1;:27;56571:102;;;56639:16;56656:1;56639:19;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56629:29:0::1;:6;-1:-1:-1::0;;;;;56629:29:0::1;;;56621:52;;;;-1:-1:-1::0;;;56621:52:0::1;;;;;;;:::i;:::-;56616:3;;56571:102;;;;56686:82;56714:12;:10;:12::i;:::-;56728:39;::::0;-1:-1:-1;;;56728:39:0;;-1:-1:-1;;;;;56728:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;56761:4:::1;::::0;56728:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56686:27:0;::::1;::::0;:82;:27:::1;:82::i;:::-;33831:1;56332:444:::0;:::o;30156:25::-;;;;;;;;;;;;;;;-1:-1:-1;;30156:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59574:163::-;59712:4;;59689:38;;;-1:-1:-1;;;59689:38:0;;;;59622:13;;-1:-1:-1;;;;;59712:4:0;;59689:36;;:38;;;;;59712:4;;59689:38;;;;;;;59712:4;59689:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59689:38:0;;;;;;;;;;;;:::i;:::-;59662:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;59648:81;;59574:163;:::o;57736:26::-;;;;;;;;;:::o;39478:175::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;39563:13:::1;:30:::0;;;39609:36:::1;::::0;::::1;::::0;::::1;::::0;39579:14;;39609:36:::1;:::i;:::-;;;;;;;;39478:175:::0;:::o;59863:129::-;59944:14;;59936:48;;-1:-1:-1;;;59936:48:0;;59909:7;;-1:-1:-1;;;;;59944:14:0;;59936:33;;:48;;59978:4;;59936:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59929:55;;59863:129;:::o;57769:25::-;;;;;;;;;:::o;33346:28::-;;;;:::o;32094:18::-;;;-1:-1:-1;;;;;32094:18:0;;:::o;32003:25::-;;;-1:-1:-1;;;;;32003:25:0;;:::o;42151:148::-;42216:5;;:31;;-1:-1:-1;;;42216:31:0;;42192:4;;;;-1:-1:-1;;;;;42216:5:0;;;;:16;;:31;;42241:4;;42216:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;:45;:75;;;;42290:1;42265:22;:20;:22::i;:::-;:26;42209:82;;42151:148;:::o;30466:91::-;30535:14;;;;;;;;;;;;-1:-1:-1;;;30535:14:0;;;;30466:91;:::o;57496:85::-;57538:42;57496:85;:::o;32982:29::-;;;;:::o;52912:515::-;53027:5;;52971:13;;-1:-1:-1;;;;;53027:5:0;53005:10;:28;52997:47;;;;-1:-1:-1;;;52997:47:0;;;;;;;:::i;:::-;53130:19;53183:32;53201:13;53183:17;:32::i;:::-;53307:4;;53160:55;;-1:-1:-1;53160:55:0;;-1:-1:-1;53307:42:0;;-1:-1:-1;;;;;53307:4:0;53325:10;53160:55;53307:17;:42::i;:::-;52912:515;;;;:::o;59350:216::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;59451:14:::1;::::0;59443:48:::1;::::0;-1:-1:-1;;;59443:48:0;;59426:14:::1;::::0;-1:-1:-1;;;;;59451:14:0::1;::::0;59443:33:::1;::::0;:48:::1;::::0;59485:4:::1;::::0;59443:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59510:14;::::0;59543::::1;::::0;59502:56:::1;::::0;-1:-1:-1;;;59502:56:0;;59426:65;;-1:-1:-1;;;;;;59510:14:0;;::::1;::::0;59502:32:::1;::::0;:56:::1;::::0;59426:65;;59510:14:::1;59543::::0;::::1;;;::::0;59502:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58702:104::-:0;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;58759:15:::1;:13;:15::i;:::-;58785:13;:11;:13::i;:::-;58702:104::o:0;37527:154::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;37605:14:::1;:23:::0;;;37644:29:::1;::::0;::::1;::::0;::::1;::::0;37622:6;;37644:29:::1;:::i;57405:82::-:0;57444:42;57405:82;:::o;57316:::-;57355:42;57316:82;:::o;46904:170::-;33918:6;;-1:-1:-1;;;;;33918:6:0;33904:10;:20;;:65;;-1:-1:-1;33959:10:0;;-1:-1:-1;;;;;33959:10:0;33945;:24;33904:65;:112;;;;34004:12;:10;:12::i;:::-;-1:-1:-1;;;;;33990:26:0;:10;-1:-1:-1;;;;;33990:26:0;;33904:112;:163;;;;34051:5;;;;;;;;;-1:-1:-1;;;;;34051:5:0;-1:-1:-1;;;;;34051:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34037:30:0;:10;-1:-1:-1;;;;;34037:30:0;;33904:163;:216;;;;34102:5;;;;;;;;;-1:-1:-1;;;;;34102:5:0;-1:-1:-1;;;;;34102:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34088:32:0;:10;-1:-1:-1;;;;;34088:32:0;;33904:216;33882:277;;;;-1:-1:-1;;;33882:277:0;;;;;;;:::i;:::-;47042:5:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;47042:23:0;;;;47027:39:::1;::::0;-1:-1:-1;;;;;47042:5:0::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47027:14;:39::i;51297:1371::-:0;33918:6;;-1:-1:-1;;;;;33918:6:0;33904:10;:20;;:65;;-1:-1:-1;33959:10:0;;-1:-1:-1;;;;;33959:10:0;33945;:24;33904:65;:112;;;;34004:12;:10;:12::i;:::-;-1:-1:-1;;;;;33990:26:0;:10;-1:-1:-1;;;;;33990:26:0;;33904:112;:163;;;;34051:5;;;;;;;;;-1:-1:-1;;;;;34051:5:0;-1:-1:-1;;;;;34051:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34037:30:0;:10;-1:-1:-1;;;;;34037:30:0;;33904:163;:216;;;;34102:5;;;;;;;;;-1:-1:-1;;;;;34102:5:0;-1:-1:-1;;;;;34102:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34088:32:0;:10;-1:-1:-1;;;;;34088:32:0;;33904:216;33882:277;;;;-1:-1:-1;;;33882:277:0;;;;;;;:::i;:::-;51348:14:::1;51377:12:::0;51404:23:::1;51430:5;;;;;;;;;-1:-1:-1::0;;;;;51430:5:0::1;-1:-1:-1::0;;;;;51430:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51502:13;::::0;51404:49;;-1:-1:-1;51464:19:0::1;::::0;51502:13:::1;;51498:731;;;51584:19;51606:22;:20;:22::i;:::-;51584:44;;51762:80;51794:15;51780:11;:29;:61;;51826:15;51780:61;;;51812:11;51780:61;51762:17;:80::i;:::-;51740:102:::0;-1:-1:-1;51740:102:0;-1:-1:-1;51920:29:0;;::::1;51916:159;;;51979:32;:11:::0;51995:15;51979::::1;:32::i;:::-;51970:41;;52044:15;52030:29;;51916:159;51498:731;;;;52187:30;52201:15;52187:13;:30::i;:::-;52157:60:::0;;-1:-1:-1;52157:60:0;-1:-1:-1;52157:60:0;-1:-1:-1;51498:731:0::1;52443:5;::::0;:39:::1;::::0;-1:-1:-1;;;52443:39:0;;-1:-1:-1;;;;;52443:5:0;;::::1;::::0;:12:::1;::::0;:39:::1;::::0;52456:6;;52464:4;;52470:11;;52443:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52425:57;;52558:31;52573:15;52558:14;:31::i;:::-;52607:53;52617:6;52625:4;52631:11;52644:15;52607:53;;;;;;;;;:::i;:::-;;;;;;;;34170:1;;;;51297:1371::o:0;56956:83::-;56996:42;56956:83;:::o;33425:25::-;;;;;;:::o;46289:286::-;46357:4;46289:286;;;;:::o;57890:18::-;;;-1:-1:-1;;;;;57890:18:0;;:::o;57228:81::-;57266:42;57228:81;:::o;58921:161::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;58995:9:::1;58991:59;;;59006:3;:13:::0;;-1:-1:-1;;;;;;59006:13:0::1;57538:42;59006:13;::::0;;58991:59:::1;;;59035:3;:15:::0;;-1:-1:-1;;;;;;59035:15:0::1;57632:42;59035:15;::::0;;58991:59:::1;59061:13;:11;:13::i;:::-;58921:161:::0;:::o;57825:29::-;;;-1:-1:-1;;;;;57825:29:0;;:::o;57861:20::-;;;-1:-1:-1;;;;;57861:20:0;;:::o;36284:174::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36363:21:0;::::1;36355:30;;;::::0;::::1;;36396:6;:16:::0;;-1:-1:-1;;;;;;36396:16:0::1;-1:-1:-1::0;;;;;36396:16:0;::::1;;::::0;;36428:22:::1;::::0;::::1;::::0;::::1;::::0;36396:16;;36428:22:::1;:::i;39956:171::-:0;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;40045:26:::1;:11;40059:12:::0;;40045:26:::1;:::i;:::-;;40087:32;40106:12;;40087:32;;;;;;;:::i;:::-;;;;;;;;39956:171:::0;;:::o;57915:22::-;;;;:::o;59222:120::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;59304:13:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;59304:30:0;;::::1;::::0;;;::::1;::::0;;59222:120::o;33168:27::-;;;;:::o;31873:94::-;31931:7;31873:94;:::o;38752:169::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;38835:12:::1;:28:::0;;;38879:34:::1;::::0;::::1;::::0;::::1;::::0;38850:13;;38879:34:::1;:::i;57684:43::-:0;57722:5;57684:43;:::o;57140:81::-;57178:42;57140:81;:::o;58814:99::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;58887:7:::1;:18:::0;58814:99::o;32831:29::-;;;;:::o;57588:87::-;57632:42;57588:87;:::o;32035:22::-;;;-1:-1:-1;;;;;32035:22:0;;:::o;32064:21::-;;;-1:-1:-1;;;;;32064:21:0;;:::o;57801:17::-;;;;:::o;59745:110::-;59818:4;;:29;;-1:-1:-1;;;59818:29:0;;59791:7;;-1:-1:-1;;;;;59818:4:0;;:14;;:29;;59841:4;;59818:29;;;:::i;57046:85::-;57088:42;57046:85;:::o;59090:124::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;59174:14:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;59174:32:0;;::::1;::::0;;;::::1;::::0;;59090:124::o;35528:202::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35615:25:0;::::1;35607:34;;;::::0;::::1;;35652:10;:24:::0;;-1:-1:-1;;;;;;35652:24:0::1;-1:-1:-1::0;;;;;35652:24:0;::::1;;::::0;;35692:30:::1;::::0;::::1;::::0;::::1;::::0;35652:24;;35692:30:::1;:::i;54018:311::-:0;54107:5;;-1:-1:-1;;;;;54107:5:0;54085:10;:28;;:58;;;54131:12;:10;:12::i;:::-;-1:-1:-1;;;;;54117:26:0;:10;-1:-1:-1;;;;;54117:26:0;;54085:58;54077:67;;;;;;54201:5;;54163:34;;;-1:-1:-1;;;54163:34:0;;;;-1:-1:-1;;;;;54201:5:0;;;;54163:32;;;;;:34;;;;;;;;;;;;;;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54163:43:0;;54155:52;;;;;;54218:30;54235:12;54218:16;:30::i;:::-;54291:4;;:29;;-1:-1:-1;;;54291:29:0;;54259:62;;54277:12;;-1:-1:-1;;;;;54291:4:0;;;;:14;;:29;;54314:4;;54291:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54259:4;;-1:-1:-1;;;;;54259:4:0;;:62;:17;:62::i;64569:81::-;64607:42;64569:81;:::o;36747:263::-;33679:10;;-1:-1:-1;;;;;33679:10:0;33665;:24;33657:48;;;;-1:-1:-1;;;33657:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36828:22:0;::::1;36820:31;;;::::0;::::1;;36862:5;::::0;36876:7:::1;::::0;36862:25:::1;::::0;-1:-1:-1;;;36862:25:0;;-1:-1:-1;;;;;36862:5:0;;::::1;::::0;:13:::1;::::0;:25:::1;::::0;36876:7;::::1;::::0;36862:5:::1;::::0;:25:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;36898:7:0::1;:18:::0;;-1:-1:-1;;;;;;36898:18:0::1;-1:-1:-1::0;;;;;36898:18:0;;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;36927:5:0;:35:::1;::::0;-1:-1:-1;;;36927:35:0;;:5;;::::1;::::0;:13:::1;::::0;:35:::1;::::0;36941:7;::::1;::::0;-1:-1:-1;;36958:2:0;36927:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36978:24;36993:8;36978:24;;;;;;:::i;63816:687::-:0;63888:4;63905:28;;:::i;:::-;63936:5;;:31;;-1:-1:-1;;;63936:31:0;;-1:-1:-1;;;;;63936:5:0;;;;:16;;:31;;63961:4;;63936:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63905:62;;63984:6;:17;;;64005:1;63984:22;63980:40;;;64015:5;64008:12;;;;;63980:40;64078:14;;64057:17;;;;64037:38;;:15;;:19;:38::i;:::-;:55;64033:73;;;64101:5;64094:12;;;;;64033:73;64165:14;;64143:17;;;;64123:38;;:15;;:19;:38::i;:::-;:56;64119:73;;64188:4;64181:11;;;;;64119:73;64227:5;;:23;;;-1:-1:-1;;;64227:23:0;;;;64205:19;;-1:-1:-1;;;;;64227:5:0;;:21;;:23;;;;;;;;;;;;;;:5;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64205:45;;64279:13;;64265:11;:27;64261:44;;;64301:4;64294:11;;;;;;64261:44;64318:13;64334:22;:20;:22::i;:::-;64318:38;;64398:6;:16;;;64371:24;64381:13;;64371:5;:9;;:24;;;;:::i;:::-;:43;64367:60;;;64423:4;64416:11;;;;;;;64367:60;64477:17;:15;:17::i;:::-;64448:12;;:26;;64465:8;64448:16;:26::i;:::-;:46;;63816:687;-1:-1:-1;;;;;63816:687:0:o;60000:133::-;60062:7;60089:36;60109:15;:13;:15::i;:::-;60089;:13;:15::i;:::-;:19;;:36::i;38198:154::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;38276:14:::1;:23:::0;;;38315:29:::1;::::0;::::1;::::0;::::1;::::0;38293:6;;38315:29:::1;:::i;31975:21::-:0;;;-1:-1:-1;;;;;31975:21:0;;:::o;54758:164::-;33536:10;;-1:-1:-1;;;;;33536:10:0;33522;:24;;:54;;;33564:12;:10;:12::i;:::-;-1:-1:-1;;;;;33550:26:0;:10;-1:-1:-1;;;;;33550:26:0;;33522:54;33514:78;;;;-1:-1:-1;;;33514:78:0;;;;;;;:::i;:::-;54821:13:::1;:20:::0;;-1:-1:-1;;54821:20:0::1;54837:4;54821:20:::0;;::::1;::::0;;;54852:5;:22:::1;::::0;;-1:-1:-1;;;54852:22:0;;;;-1:-1:-1;;;;;54852:5:0;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;54821:13:::1;::::0;54852:22;;;;;;;;54821:13;54852:5;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54892:22:0::1;::::0;::::1;::::0;-1:-1:-1;54892:22:0;;-1:-1:-1;54892:22:0::1;54758:164::o:0;22393:622::-;22763:10;;;22762:62;;-1:-1:-1;22779:39:0;;-1:-1:-1;;;22779:39:0;;-1:-1:-1;;;;;22779:15:0;;;;;:39;;22803:4;;22810:7;;22779:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;22762:62;22754:152;;;;-1:-1:-1;;;22754:152:0;;;;;;;:::i;:::-;22917:90;22937:5;22967:22;;;22991:7;23000:5;22944:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22944:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22944:62:0;-1:-1:-1;;;;;;22944:62:0;;;;;;;;;;22917:19;:90::i;:::-;22393:622;;;:::o;58462:232::-;58533:3;;58513:27;;-1:-1:-1;;;58513:27:0;;57266:42;;58513:19;;:27;;-1:-1:-1;;;;;58533:3:0;;;;58513:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58571:3:0;;58551:43;;-1:-1:-1;;;58551:43:0;;57266:42;;58551:19;;:43;;-1:-1:-1;;;;;58571:3:0;;-1:-1:-1;;58576:17:0;58551:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58625:3:0;;58605:27;;-1:-1:-1;;;58605:27:0;;57178:42;;58605:19;;:27;;-1:-1:-1;;;;;58625:3:0;;;;58605:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58663:3:0;;58643:43;;-1:-1:-1;;;58643:43:0;;57178:42;;58643:19;;:43;;-1:-1:-1;;;;;58663:3:0;;-1:-1:-1;;58668:17:0;58643: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;40281:98::-;40353:5;;:18;;;-1:-1:-1;;;40353:18:0;;;;40326:7;;-1:-1:-1;;;;;40353:5:0;;:16;;:18;;;;;;;;;;;;;;:5;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;68266:296::-;68424:16;;;68438:1;68424:16;;;;;;;;;68361;;;;68424;;;;68361;;68424;;;;;-1:-1:-1;68424:16:0;68395:45;;57266:42;68451:9;68461:1;68451:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;68451:18:0;;;-1:-1:-1;;;;;68451:18:0;;;;;57178:42;68480:9;68490:1;68480:12;;;;;;;;;;;;;:18;-1:-1:-1;;;;;68480:18:0;;;-1:-1:-1;;;;;68480:18:0;;;;;64607:42;68509:9;68519:1;68509:12;;;;;;;;-1:-1:-1;;;;;68509:18:0;;;:12;;;;;;;;;;;:18;68545:9;-1:-1:-1;68266:296:0;:::o;21734:177::-;21817:86;21837:5;21867:23;;;21892:2;21896:5;21844:58;;;;;;;;;:::i;60703:581::-;60807:25;60834:13;60865:16;60884:15;:13;:15::i;:::-;60865:34;;60925:13;60914:8;:24;60910:367;;;60975:42;60989:27;:13;61007:8;60989:17;:27::i;:::-;60975:13;:42::i;:::-;60955:62;-1:-1:-1;61052:31:0;60955:62;61074:8;61052:21;:31::i;:::-;61032:51;-1:-1:-1;61106:36:0;:13;61032:51;61106:17;:36::i;:::-;61098:44;;60910:367;;;61252:13;61232:33;;60910:367;60703:581;;;;:::o;58228:226::-;58273:4;;:24;;-1:-1:-1;;;58273:24:0;;-1:-1:-1;;;;;58273:4:0;;;;:12;;:24;;57088:42;;58273:4;;:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58308:4:0;;:40;;-1:-1:-1;;;58308:40:0;;-1:-1:-1;;;;;58308:4:0;;;;:12;;:40;;57088:42;;-1:-1:-1;;58330:17:0;58308:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58380:5:0;;58359:30;;-1:-1:-1;;;58359:30:0;;57444:42;;58359:20;;:30;;-1:-1:-1;;;;;58380:5:0;;;;58359:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58421:5:0;;58400:46;;-1:-1:-1;;;58400:46:0;;57444:42;;58400:20;;:46;;-1:-1:-1;;;;;58421:5:0;;-1:-1:-1;;58428:17:0;58400:46;;;:::i;65217:183::-;65269:19;:17;:19::i;:::-;65299:33;;-1:-1:-1;;;65299:33:0;;64607:42;;65299:19;;:33;;57632:42;;65330:1;;65299:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;65343:49:0;;-1:-1:-1;;;65343:49:0;;64607:42;;65343:19;;:49;;57632:42;;-1:-1:-1;;65374:17:0;65343:49;;;:::i;60141:261::-;60224:13;;;;60220:26;;;60239:7;;60220:26;60272:4;;:29;;-1:-1:-1;;;60272:29:0;;60256:13;;-1:-1:-1;;;;;60272:4:0;;:14;;:29;;60295:4;;60272:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60256:45;-1:-1:-1;60316:9:0;;60312:83;;60367:2;;60342:41;;-1:-1:-1;;;60342:41:0;;57088:42;;60342:24;;:41;;60367:2;60371:5;;60378:4;;60342:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14966:136::-;15024:7;15051:43;15055:1;15058;15051:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;15044:50;;14966:136;;;;;:::o;66245:2013::-;66362:15;66392:13;66420:20;66468:11;66482:15;:13;:15::i;:::-;66516:14;;66557:13;;66508:63;;-1:-1:-1;;;66508:63:0;;66468:29;;-1:-1:-1;;;;;;66516:14:0;;;;66508:33;;:63;;66550:4;;66557:13;;;;;;66508:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;66597:36:0;;-1:-1:-1;;;66597:36:0;;66582:12;;57266:42;;66597:21;;:36;;66627:4;;66597:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66582:51;-1:-1:-1;66648:8:0;;66644:301;;66680:16;66691:4;66680:10;:16::i;:::-;66737;;;66751:1;66737:16;;;;;;;;;66673:23;;-1:-1:-1;66713:21:0;;66737:16;;;;66713:21;;66737:16;;;;;-1:-1:-1;66737:16:0;66713:40;;57266:42;66768:4;66773:1;66768:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;66768:13:0;;;-1:-1:-1;;;;;66768:13:0;;;;;57355:42;66796:4;66801:1;66796:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;66796:14:0;;;-1:-1:-1;;;;;66796:14:0;;;;;57444:42;66825:4;66830:1;66825:7;;;;;;;;-1:-1:-1;;;;;66825:14:0;;;:7;;;;;;;;;:14;66860:3;;66856:77;;-1:-1:-1;;;66856:77:0;;66860:3;;;66856:33;;:77;;66890:4;;66860:3;;66908:4;;66922;;66929:3;;66856:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66856:77:0;;;;;;;;;;;;:::i;:::-;;66644:301;;66970:36;;-1:-1:-1;;;66970:36:0;;66955:12;;57178:42;;66970:21;;:36;;67000:4;;66970:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66955:51;-1:-1:-1;67021:8:0;;67017:267;;67070:16;;;67084:1;67070:16;;;;;;;;;67046:21;;67070:16;;;67046:21;;67070:16;;;;;-1:-1:-1;67070:16:0;67046:40;;57178:42;67101:4;67106:1;67101:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;67101:13:0;;;-1:-1:-1;;;;;67101:13:0;;;;;57355:42;67129:4;67134:1;67129:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;67129:14:0;;;-1:-1:-1;;;;;67129:14:0;;;;;57444:42;67158:4;67163:1;67158:7;;;;;;;;-1:-1:-1;;;;;67158:14:0;;;:7;;;;;;;;;;;:14;67189:83;;-1:-1:-1;;;67189:83:0;;57632:42;;67189:39;;:83;;67229:4;;67243:1;;67247:4;;67261;;67268:3;;67189:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67189:83:0;;;;;;;;;;;;:::i;:::-;;67017:267;;67309:36;;-1:-1:-1;;;67309:36:0;;67294:12;;64607:42;;67309:21;;:36;;67339:4;;67309:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67294:51;-1:-1:-1;67360:8:0;;67356:267;;67409:16;;;67423:1;67409:16;;;;;;;;;67385:21;;67409:16;;;67385:21;;67409:16;;;;;-1:-1:-1;67409:16:0;67385:40;;64607:42;67440:4;67445:1;67440:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;67440:13:0;;;-1:-1:-1;;;;;67440:13:0;;;;;57355:42;67468:4;67473:1;67468:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;67468:14:0;;;-1:-1:-1;;;;;67468:14:0;;;;;57444:42;67497:4;67502:1;67497:7;;;;;;;;-1:-1:-1;;;;;67497:14:0;;;:7;;;;;;;;;;;:14;67528:83;;-1:-1:-1;;;67528:83:0;;57632:42;;67528:39;;:83;;67568:4;;67582:1;;67586:4;;67600;;67607:3;;67528:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67528:83:0;;;;;;;;;;;;:::i;:::-;;67356:267;;67649:37;;-1:-1:-1;;;67649:37:0;;67633:13;;57444:42;;67649:22;;:37;;67680:4;;67649:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67633:53;-1:-1:-1;67701:9:0;;67697:92;;67736:5;;67727:50;;;;;;;;67736:5;67727:50;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67727:50:0;;-1:-1:-1;;;;;67736:5:0;;;;67727:29;;:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67697:92;67809:4;;:29;;-1:-1:-1;;;67809:29:0;;:41;;67843:6;;-1:-1:-1;;;;;67809:4:0;;;;:14;;:29;;67832:4;;67809:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;:41::i;:::-;67799:51;;67863:11;67877:22;:20;:22::i;:::-;67923:5;;:31;;-1:-1:-1;;;67923:31:0;;67863:36;;-1:-1:-1;67910:10:0;;-1:-1:-1;;;;;67923:5:0;;;;:16;;:31;;67948:4;;67923:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;67910:54;;67987:5;67978:6;:14;67975:94;;;68025:6;68017:5;:14;68009:22;;68056:1;68046:11;;67975:94;68085:20;;68081:170;;68122:31;68136:16;68122:13;:31::i;:::-;;68183:56;68192:16;68210:28;68230:7;68210:15;:13;:15::i;:28::-;68183:8;:56::i;:::-;68168:71;;68081:170;66245:2013;;;;;;;;;;;;:::o;61292:185::-;61377:14;;61414;;61369:60;;-1:-1:-1;;;61369:60:0;;-1:-1:-1;;;;;61377:14:0;;;;61369:44;;:60;;61377:14;61414;;;;;;61369:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61440:29;61456:12;61440:15;:29::i;14502:181::-;14560:7;14592:5;;;14616:6;;;;14608:46;;;;-1:-1:-1;;;14608:46:0;;;;;;;:::i;65732:505::-;65791:18;65835:23;:21;:23::i;:::-;65886:36;;-1:-1:-1;;;65886:36:0;;65822;;-1:-1:-1;65871:12:0;;64607:42;;65886:21;;:36;;65916:4;;65886:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65871:51;-1:-1:-1;65937:8:0;;65933:297;;65986:16;;;66000:1;65986:16;;;;;;;;;65962:21;;65986:16;;;65962:21;;65986:16;;;;;-1:-1:-1;65986:16:0;65962:40;;64607:42;66017:4;66022:1;66017:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;66017:13:0;;;-1:-1:-1;;;;;66017:13:0;;;;;57355:42;66045:4;66050:1;66045:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;66045:14:0;;;-1:-1:-1;;;;;66045:14:0;;;;;57444:42;66074:4;66079:1;66074:7;;;;;;;;-1:-1:-1;;;;;66074:14:0;;;:7;;;;;;;;;;;:14;66127:40;;-1:-1:-1;;;66127:40:0;;66103:21;;57632:42;;66127:28;;:40;;66156:4;;66162;;66127:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66127:40:0;;;;;;;;;;;;:::i;:::-;66103:64;;66195:23;66210:4;66215:1;66210:7;;;;;;;;;;;;;;66195:10;:14;;:23;;;;:::i;:::-;66182:36;;65933:297;;;65732:505;;:::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;24039:761::-;24463:23;24489:69;24517:4;24489:69;;;;;;;;;;;;;;;;;24497:5;-1:-1:-1;;;;;24489:27:0;;;:69;;;;;:::i;:::-;24573:17;;24463:95;;-1:-1:-1;24573:21:0;24569:224;;24715:10;24704:30;;;;;;;;;;;;:::i;:::-;24696:85;;;;-1:-1:-1;;;24696: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;60410:285::-;60468:7;60498:34;60507:7;60516:15;:13;:15::i;60498:34::-;60488:44;;60543:12;60558:15;:13;:15::i;:::-;60592:14;;60584:57;;-1:-1:-1;;;60584:57:0;;60543:30;;-1:-1:-1;;;;;;60592:14:0;;60584:41;;:57;;60626:7;;60592:14;;60584:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60659:28;60679:7;60659:15;:13;:15::i;:28::-;60652:35;60410:285;-1:-1:-1;;;60410: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;61739:239::-;61791:7;61811:16;61830:34;57722:5;61830:17;61839:7;;61830:4;:8;;:17;;;;:::i;:::-;:21;;:34::i;:::-;61811:53;-1:-1:-1;61879:12:0;;61875:59;;61893:41;57266:42;56996;61925:8;61893:24;:41::i;:::-;61952:18;:4;61961:8;61952;: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;65442:206::-;65518:35;65540:12;65518:21;:35::i;:::-;65603:36;;-1:-1:-1;;;65603:36:0;;65564:76;;65589:12;;64607:42;;65603:21;;:36;;65633:4;;65603:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64607:42;;65564:76;:24;:76::i;63601:132::-;63659:18;63703: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;61485:246::-;61599:36;;-1:-1:-1;;;61599:36:0;;61560:76;;61585:12;;57266:42;;61599:21;;:36;;61629:4;;61599:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57266:42;;61560:76;:24;:76::i;:::-;61686:36;;-1:-1:-1;;;61686:36:0;;61647:76;;61672:12;;57178:42;;61686:21;;:36;;61716:4;;61686:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57178:42;;61647:76;:24;:76::i;61986:1607::-;62084:14;;62076:45;;-1:-1:-1;;;62076:45:0;;62041:7;;;;-1:-1:-1;;;;;62084:14:0;;;;62076:30;;:45;;62115:4;;62076:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62061:60;;62227:19;62249:4;62227:26;;62264:17;62284:10;62264:30;;62313:25;62341:10;62313:38;;62370:14;57178:42;-1:-1:-1;;;;;62387:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62370:42;-1:-1:-1;62423:12:0;;62464:29;62370:42;62475:17;62464:10;:29::i;:::-;62448:45;;62555:11;62547:5;:19;62543:417;;;62644:17;62664:22;:11;62680:5;62664:15;:22::i;:::-;62644:42;-1:-1:-1;62731:36:0;62755:11;62731:19;:4;62644:42;62731:8;:19::i;:36::-;62724:43;-1:-1:-1;62817:18:0;62838:21;:9;62852:6;62838:13;:21::i;:::-;62817:42;;62885:10;62878:4;:17;62874:75;;;62923:10;62916:17;;62874:75;62543:417;;;62972:16;63003:8;;62999:250;;63052:16;;;63066:1;63052:16;;;63028:21;63052:16;;;;;63028:21;63052:16;;;;;;;;;;-1:-1:-1;63052:16:0;63028:40;;57266:42;63083:4;63088:1;63083:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;63083:13:0;;;-1:-1:-1;;;;;63083:13:0;;;;;57355:42;63111:4;63116:1;63111:7;;;;;;;;-1:-1:-1;;;;;63111:14:0;;;:7;;;;;;;;;:14;63171:3;;63167:34;;-1:-1:-1;;;63167:34:0;;63140:24;;63171:3;;;;;63167:22;;:34;;63190:4;;63196;;63167:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63167:34:0;;;;;;;;;;;;:::i;:::-;63140:61;;63227:7;63235:1;63227:10;;;;;;;;;;;;;;63216:21;;62999:250;;;63261:16;63292:8;;63288:256;;63341:16;;;63355:1;63341:16;;;63317:21;63341:16;;;;;63317:21;63341:16;;;;;;;;;;-1:-1:-1;63341:16:0;63317:40;;57178:42;63372:4;63377:1;63372:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;63372:13:0;;;-1:-1:-1;;;;;63372:13:0;;;;;57355:42;63400:4;63405:1;63400:7;;;;;;;;-1:-1:-1;;;;;63400:14:0;;;:7;;;;;;;;;;;:14;63456:40;;-1:-1:-1;;;63456:40:0;;63429:24;;57632:42;;63456:28;;:40;;63485:4;;63491;;63456:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63456:40:0;;;;;;;;;;;;:::i;:::-;63429:67;;63522:7;63530:1;63522:10;;;;;;;;;;;;;;63511:21;;63288:256;;;63563:22;:8;63576;63563:12;:22::i;:::-;63556:29;;;;;;;;;;;61986:1607;:::o;17431:278::-;17517:7;17552:12;17545:5;17537:28;;;;-1:-1:-1;;;17537:28:0;;;;;;;;:::i;:::-;;17576:9;17592:1;17588;:5;;;;;;;17431:278;-1:-1:-1;;;;;17431:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;4267:241;;4371:2;4359:9;4350:7;4346:23;4342:32;4339:2;;;-1:-1;;4377:12;4339:2;85:6;72:20;97:33;124:5;97:33;:::i;4515:263::-;;4630:2;4618:9;4609:7;4605:23;4601:32;4598:2;;;-1:-1;;4636:12;4598:2;226:6;220:13;238:33;265:5;238:33;:::i;4785:392::-;;4925:2;;4913:9;4904:7;4900:23;4896:32;4893:2;;;-1:-1;;4931:12;4893:2;4982:17;4976:24;5020:18;5012:6;5009:30;5006:2;;;-1:-1;;5042:12;5006:2;5129:22;;422:4;410:17;;406:27;-1:-1;396:2;;-1:-1;;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;:::i;:::-;499:80;:::i;:::-;607:21;;;664:14;;;;639:17;;;753;;;744:27;;;;741:36;-1:-1;738:2;;;-1:-1;;780:12;738:2;-1:-1;806:10;;800:217;825:6;822:1;819:13;800:217;;;4204:13;;893:61;;847:1;840:9;;;;;968:14;;;;996;;800:217;;;-1:-1;5062:99;4887:290;-1:-1;;;;;;;4887:290::o;5184:235::-;;5285:2;5273:9;5264:7;5260:23;5256:32;5253:2;;;-1:-1;;5291:12;5253:2;1108:6;1095:20;1120:30;1144:5;1120:30;:::i;5426:257::-;;5538:2;5526:9;5517:7;5513:23;5509:32;5506:2;;;-1:-1;;5544:12;5506:2;1243:6;1237:13;1255:30;1279:5;1255:30;:::i;5994:367::-;;;6118:2;6106:9;6097:7;6093:23;6089:32;6086:2;;;-1:-1;;6124:12;6086:2;6182:17;6169:31;6220:18;;6212:6;6209:30;6206:2;;;-1:-1;;6242:12;6206:2;6328:6;6317:9;6313:22;;;1602:3;1595:4;1587:6;1583:17;1579:27;1569:2;;-1:-1;;1610:12;1569:2;1653:6;1640:20;6220:18;1672:6;1669:30;1666:2;;;-1:-1;;1702:12;1666:2;1797:3;6118:2;1777:17;1738:6;1763:32;;1760:41;1757:2;;;-1:-1;;1804:12;1757:2;6118;1734:17;;;;;6262:83;;-1:-1;6080:281;;-1:-1;;;;6080:281::o;6368:362::-;;6493:2;6481:9;6472:7;6468:23;6464:32;6461:2;;;-1:-1;;6499:12;6461:2;6550:17;6544:24;6588:18;;6580:6;6577:30;6574:2;;;-1:-1;;6610:12;6574:2;6697:6;6686:9;6682:22;;;1946:3;1939:4;1931:6;1927:17;1923:27;1913:2;;-1:-1;;1954:12;1913:2;1994:6;1988:13;6588:18;28881:6;28878:30;28875:2;;;-1:-1;;28911:12;28875:2;2016:65;28984:9;28965:17;;-1:-1;;28961:33;6493:2;29042: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;8211:690::-;;8404:5;29439:12;30211:6;30206:3;30199:19;30248:4;;30243:3;30239:14;8416:93;;30248:4;8580:5;29189:14;-1:-1;8619:260;8644:6;8641:1;8638:13;8619:260;;;8705:13;;-1:-1;;;;;31262:54;8011:37;;7740:14;;;;29941;;;;5020:18;8659:9;8619:260;;;-1:-1;8885:10;;8335:566;-1:-1;;;;;8335:566::o;15936:271::-;;9881:5;29439:12;9992:52;10037:6;10032:3;10025:4;10018:5;10014:16;9992:52;:::i;:::-;10056:16;;;;;16070:137;-1:-1;;16070:137::o;16214:542::-;;-1:-1;;;12867:11;12860:29;9881:5;29439:12;9992:52;10037:6;12845:1;12912:3;12908:11;10025:4;10018:5;10014:16;9992:52;:::i;:::-;10056:16;;;;12845:1;10056:16;;16451:305;-1:-1;;16451:305::o;16763:222::-;-1:-1;;;;;31262:54;;;;8011:37;;16890:2;16875:18;;16861:124::o;16992:333::-;-1:-1;;;;;31262:54;;;8011:37;;31262:54;;17311:2;17296:18;;8011:37;17147:2;17132:18;;17118:207::o;17332:321::-;-1:-1;;;;;31262:54;;;;8011:37;;31059:13;31052:21;17639:2;17624:18;;9675:34;17481:2;17466:18;;17452:201::o;17660:349::-;-1:-1;;;;;31262:54;;;;8011:37;;17995:2;17980:18;;10491:58;17823:2;17808:18;;17794:215::o;18356:443::-;18565:3;18550:19;;18554:9;9305:21;18356:443;9332:258;29574:4;9354:1;9351:13;9332:258;;;9418:13;;15767:37;;7931:4;7922:14;;;;29941;;;;9379:1;9372:9;9332:258;;;9336:14;;;10542:5;18784:3;18773:9;18769:19;10491:58;18536:263;;;;;:::o;18806:210::-;31059:13;;31052:21;9675:34;;18927:2;18912:18;;18898:118::o;19543:330::-;;19700:2;19721:17;19714:47;30211:6;19700:2;19689:9;19685:18;30199:19;32191:6;32186:3;30239:14;19689:9;30239:14;32168:30;32229:16;;;30239:14;32229:16;;;32222:27;;;;28984:9;32608:14;;;-1:-1;;32604:28;10841:39;;;19671:202;-1:-1;19671:202::o;19880:310::-;;20027:2;20048:17;20041:47;11039:5;29439:12;30211:6;20027:2;20016:9;20012:18;30199:19;11133:52;11178:6;30239:14;20016:9;30239:14;20027:2;11159:5;11155:16;11133:52;:::i;:::-;28984:9;32608:14;-1:-1;;32604:28;11197:39;;;;30239:14;11197:39;;19998:192;-1:-1;;19998:192::o;20197:416::-;20397:2;20411:47;;;11840:2;20382:18;;;30199:19;-1:-1;;;30239:14;;;11856:34;11909:12;;;20368:245::o;20620:416::-;20820:2;20834:47;;;12160:1;20805:18;;;30199:19;-1:-1;;;30239:14;;;12175:28;12222:12;;;20791:245::o;21043:416::-;21243:2;21257:47;;;12473:2;21228:18;;;30199:19;12509:29;30239:14;;;12489:50;12558:12;;;21214:245::o;21466:416::-;21666:2;21680:47;;;13158:2;21651:18;;;30199:19;13194:34;30239:14;;;13174:55;-1:-1;;;13249:12;;;13242:25;13286:12;;;21637:245::o;21889:416::-;22089:2;22103:47;;;13537:1;22074:18;;;30199:19;-1:-1;;;30239:14;;;13552:29;13600:12;;;22060:245::o;22312:416::-;22512:2;22526:47;;;13851:1;22497:18;;;30199:19;-1:-1;;;30239:14;;;13866:30;13915:12;;;22483:245::o;22735:416::-;22935:2;22949:47;;;14166:2;22920:18;;;30199:19;14202:31;30239:14;;;14182:52;14253:12;;;22906:245::o;23158:416::-;23358:2;23372:47;;;14504:2;23343:18;;;30199:19;-1:-1;;;30239:14;;;14520:34;14573:12;;;23329:245::o;23581:416::-;23781:2;23795:47;;;14824:2;23766:18;;;30199:19;14860:34;30239:14;;;14840:55;-1:-1;;;14915:12;;;14908:34;14961:12;;;23752:245::o;24004:416::-;24204:2;24218:47;;;15212:2;24189:18;;;30199:19;-1:-1;;;30239:14;;;15228:33;15280:12;;;24175:245::o;24427:416::-;24627:2;24641:47;;;15531:2;24612:18;;;30199:19;15567:34;30239:14;;;15547:55;-1:-1;;;15622:12;;;15615:46;15680:12;;;24598:245::o;24850:222::-;15767:37;;;24977:2;24962:18;;24948:124::o;25079:481::-;;15797:5;15774:3;15767:37;25284:2;25402;25391:9;25387:18;25380:48;25442:108;25284:2;25273:9;25269:18;25536:6;25442:108;:::i;25567:321::-;15767:37;;;31059:13;31052:21;25874:2;25859:18;;9675:34;25716:2;25701:18;;25687:201::o;25895:816::-;;15797:5;15774:3;15767:37;15797:5;26349:2;26338:9;26334:18;15767:37;26184:3;26386:2;26375:9;26371:18;26364:48;26426:108;26184:3;26173:9;26169:19;26520:6;26426:108;:::i;:::-;-1:-1;;;;;31262:54;;;;26613:2;26598:18;;8011:37;-1:-1;26696:3;26681:19;15767:37;26418:116;26155:556;-1:-1;;;26155:556::o;26718:432::-;15767:37;;;27059:2;27044:18;;15767:37;;;;31059:13;31052:21;27136:2;27121:18;;9675:34;26895:2;26880:18;;26866:284::o;27157:444::-;15767:37;;;27504:2;27489:18;;15767:37;;;;27587:2;27572:18;;15767:37;27340:2;27325:18;;27311:290::o;27608:556::-;15767:37;;;27984:2;27969:18;;15767:37;;;;28067:2;28052:18;;15767:37;28150:2;28135:18;;15767:37;27819:3;27804:19;;27790:374::o;28171:256::-;28233:2;28227:9;28259:17;;;28334:18;28319:34;;28355:22;;;28316:62;28313:2;;;28391:1;;28381:12;28313:2;28233;28400:22;28211:216;;-1:-1;28211:216::o;28434:304::-;;28593:18;28585:6;28582:30;28579:2;;;-1:-1;;28615:12;28579:2;-1:-1;28660:4;28648:17;;;28713:15;;28516:222::o;32264:268::-;32329:1;32336:101;32350:6;32347:1;32344:13;32336:101;;;32417:11;;;32411:18;32398:11;;;32391:39;32372:2;32365:10;32336:101;;;32452:6;32449:1;32446:13;32443:2;;;32329:1;32508:6;32503:3;32499:16;32492:27;32443:2;;32313:219;;;:::o;32645:117::-;-1:-1;;;;;31262:54;;32704:35;;32694:2;;32753:1;;32743:12;32769:111;32850:5;31059:13;31052:21;32828:5;32825:32;32815:2;;32871:1;;32861:12
Swarm Source
ipfs://ee578f34ccaf884fa47c990a6f30ec1a67a3fe6b2ca7dfc8215a3974a995c8de
Loading...
Loading
Loading...
Loading
Net Worth in USD
$5.07
Net Worth in ETH
0.002557
Token Allocations
BORING
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.000052 | 97,880.3973 | $5.07 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.