Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize Vault | 11881604 | 1847 days ago | IN | 0 ETH | 0.06410725 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
VaultFarm
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-02-02
*/
// File: @openzeppelin/contracts-ethereum-package/contracts/math/Math.sol
pragma solidity ^0.5.0;
/**
* @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);
}
}
// File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @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.
*
* _Available since v2.4.0._
*/
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.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
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.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
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);
}
// File: @openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol
pragma solidity ^0.5.5;
/**
* @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 Converts an `address` into `address payable`. Note that this is
* simply a type cast: the actual underlying value is not changed.
*
* _Available since v2.4.0._
*/
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
/**
* @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].
*
* _Available since v2.4.0._
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-call-value
(bool success, ) = recipient.call.value(amount)("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/SafeERC20.sol
pragma solidity ^0.5.0;
/**
* @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 ERC20;` 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));
}
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.
// A Solidity high level call has three parts:
// 1. The target address is checked to verify it contains contract code
// 2. The call itself is made, and success asserted
// 3. The return value is decoded, which in turn checks the size of the returned data.
// solhint-disable-next-line max-line-length
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "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");
}
}
}
// File: @openzeppelin/upgrades/contracts/Initializable.sol
pragma solidity >=0.4.24 <0.6.0;
/**
* @title Initializable
*
* @dev Helper contract to support initializer functions. To use it, replace
* the constructor with a function that has the `initializer` modifier.
* WARNING: Unlike constructors, initializer functions must be manually
* invoked. This applies both to deploying an Initializable contract, as well
* as extending an Initializable contract via inheritance.
* WARNING: When used with inheritance, manual care must be taken to not invoke
* a parent initializer twice, or ensure that all initializers are idempotent,
* because this is not dealt with automatically as with constructors.
*/
contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private initializing;
/**
* @dev Modifier to use in the initializer function of a contract.
*/
modifier initializer() {
require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");
bool isTopLevelCall = !initializing;
if (isTopLevelCall) {
initializing = true;
initialized = true;
}
_;
if (isTopLevelCall) {
initializing = false;
}
}
/// @dev Returns true if and only if the function is running in the constructor
function isConstructor() private view returns (bool) {
// extcodesize checks the size of the code stored in an address, and
// address returns the current address. Since the code is still not
// deployed when running a constructor, any checks on its code size will
// yield zero, making it an effective way to detect if a contract is
// under construction or not.
uint256 cs;
assembly { cs := extcodesize(address) }
return cs == 0;
}
// Reserved storage space to allow for layout changes in the future.
uint256[50] private ______gap;
}
// File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol
pragma solidity ^0.5.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
contract Context is Initializable {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
constructor () internal { }
// solhint-disable-previous-line no-empty-blocks
function _msgSender() internal view returns (address payable) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20Mintable}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Initializable, Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for `sender`'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal {
require(account != address(0), "ERC20: burn from the zero address");
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
*
* This is internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Destroys `amount` tokens from `account`.`amount` is then deducted
* from the caller's allowance.
*
* See {_burn} and {_approve}.
*/
function _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
}
uint256[50] private ______gap;
}
// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20Detailed.sol
pragma solidity ^0.5.0;
/**
* @dev Optional functions from the ERC20 standard.
*/
contract ERC20Detailed is Initializable, IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
* these values are immutable: they can only be set once during
* construction.
*/
function initialize(string memory name, string memory symbol, uint8 decimals) public initializer {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
uint256[50] private ______gap;
}
// File: contracts/hardworkInterface/IStrategy.sol
pragma solidity 0.5.16;
interface IStrategy {
function unsalvagableTokens(address tokens) external view returns (bool);
function governance() external view returns (address);
function controller() external view returns (address);
function underlying() external view returns (address);
function vault() external view returns (address);
function withdrawAllToVault() external;
function withdrawToVault(uint256 amount) external;
function investedUnderlyingBalance() external view returns (uint256); // itsNotMuch()
// should only be called by controller
function salvage(address recipient, address token, uint256 amount) external;
function doHardWork() external;
function depositArbCheck() external view returns(bool);
}
// File: contracts/hardworkInterface/IStrategyV2.sol
pragma solidity 0.5.16;
interface IStrategyV2 {
function unsalvagableTokens(address tokens) external view returns (bool);
function governance() external view returns (address);
function controller() external view returns (address);
function underlying() external view returns (address);
function vault() external view returns (address);
function withdrawAllToVault() external;
function withdrawToVault(uint256 correspondingShares, uint256 totalShares) external;
function investedUnderlyingBalance() external view returns (uint256); // itsNotMuch()
// should only be called by controller
function salvage(address recipient, address token, uint256 amount) external;
function doHardWork() external;
function depositArbCheck() external view returns(bool);
}
// File: contracts/hardworkInterface/IVault.sol
pragma solidity 0.5.16;
interface IVault {
function underlyingBalanceInVault() external view returns (uint256);
function underlyingBalanceWithInvestment() external view returns (uint256);
// function store() external view returns (address);
function governance() external view returns (address);
function controller() external view returns (address);
function underlying() external view returns (address);
function strategy() external view returns (address);
function setStrategy(address _strategy) external;
function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external;
function deposit(uint256 amountWei) external;
function depositFor(uint256 amountWei, address holder) external;
function withdrawAll() external;
function withdraw(uint256 numberOfShares) external;
function getPricePerFullShare() external view returns (uint256);
function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256);
// hard work should be callable only by the controller (by the hard worker) or by governance
function doHardWork() external;
}
// File: contracts/hardworkInterface/IController.sol
pragma solidity 0.5.16;
interface IController {
// [Grey list]
// An EOA can safely interact with the system no matter what.
// If you're using Metamask, you're using an EOA.
// Only smart contracts may be affected by this grey list.
//
// This contract will not be able to ban any EOA from the system
// even if an EOA is being added to the greyList, he/she will still be able
// to interact with the whole system as if nothing happened.
// Only smart contracts will be affected by being added to the greyList.
// This grey list is only used in Vault.sol, see the code there for reference
function greyList(address _target) external view returns(bool);
function addVaultAndStrategy(address _vault, address _strategy) external;
function doHardWork(address _vault, uint256 hint, uint256 devianceNumerator, uint256 devianceDenominator) external;
function hasVault(address _vault) external returns(bool);
function salvage(address _token, uint256 amount) external;
function salvageStrategy(address _strategy, address _token, uint256 amount) external;
function notifyFee(address _underlying, uint256 fee) external;
function profitSharingNumerator() external view returns (uint256);
function profitSharingDenominator() external view returns (uint256);
}
// File: contracts/hardworkInterface/IUpgradeSource.sol
pragma solidity 0.5.16;
interface IUpgradeSource {
function shouldUpgrade() external view returns (bool, address);
function finalizeUpgrade() external;
}
// File: contracts/hardworkInterface/IFFarmStrategy.sol
pragma solidity 0.5.16;
interface IFFarmStrategy {
function refreshAutoStaking() external;
}
// File: contracts/Storage.sol
pragma solidity 0.5.16;
contract Storage {
address public governance;
address public controller;
constructor() public {
governance = msg.sender;
}
modifier onlyGovernance() {
require(isGovernance(msg.sender), "Not governance");
_;
}
function setGovernance(address _governance) public onlyGovernance {
require(_governance != address(0), "new governance shouldn't be empty");
governance = _governance;
}
function setController(address _controller) public onlyGovernance {
require(_controller != address(0), "new controller shouldn't be empty");
controller = _controller;
}
function isGovernance(address account) public view returns (bool) {
return account == governance;
}
function isController(address account) public view returns (bool) {
return account == controller;
}
}
// File: contracts/GovernableInit.sol
pragma solidity 0.5.16;
// A clone of Governable supporting the Initializable interface and pattern
contract GovernableInit is Initializable {
bytes32 internal constant _STORAGE_SLOT = 0xa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc;
modifier onlyGovernance() {
require(Storage(_storage()).isGovernance(msg.sender), "Not governance");
_;
}
constructor() public {
assert(_STORAGE_SLOT == bytes32(uint256(keccak256("eip1967.governableInit.storage")) - 1));
}
function initialize(address _store) public initializer {
_setStorage(_store);
}
function _setStorage(address newStorage) private {
bytes32 slot = _STORAGE_SLOT;
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(slot, newStorage)
}
}
function setStorage(address _store) public onlyGovernance {
require(_store != address(0), "new storage shouldn't be empty");
_setStorage(_store);
}
function _storage() internal view returns (address str) {
bytes32 slot = _STORAGE_SLOT;
// solhint-disable-next-line no-inline-assembly
assembly {
str := sload(slot)
}
}
function governance() public view returns (address) {
return Storage(_storage()).governance();
}
}
// File: contracts/ControllableInit.sol
pragma solidity 0.5.16;
// A clone of Governable supporting the Initializable interface and pattern
contract ControllableInit is GovernableInit {
constructor() public {
}
function initialize(address _storage) public initializer {
GovernableInit.initialize(_storage);
}
modifier onlyController() {
require(Storage(_storage()).isController(msg.sender), "Not a controller");
_;
}
modifier onlyControllerOrGovernance(){
require((Storage(_storage()).isController(msg.sender) || Storage(_storage()).isGovernance(msg.sender)),
"The caller must be controller or governance");
_;
}
function controller() public view returns (address) {
return Storage(_storage()).controller();
}
}
// File: contracts/VaultStorage.sol
pragma solidity 0.5.16;
contract VaultStorage is Initializable {
bytes32 internal constant _STRATEGY_SLOT = 0xf1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea;
bytes32 internal constant _UNDERLYING_SLOT = 0x1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371;
bytes32 internal constant _UNDERLYING_UNIT_SLOT = 0xa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff;
bytes32 internal constant _VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT = 0x39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a;
bytes32 internal constant _VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT = 0x469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed32308;
bytes32 internal constant _NEXT_IMPLEMENTATION_SLOT = 0xb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df;
bytes32 internal constant _NEXT_IMPLEMENTATION_TIMESTAMP_SLOT = 0x3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9;
bytes32 internal constant _NEXT_IMPLEMENTATION_DELAY_SLOT = 0x82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf0;
bytes32 internal constant _STRATEGY_TIME_LOCK_SLOT = 0x6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b;
bytes32 internal constant _FUTURE_STRATEGY_SLOT = 0xb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc8590610;
bytes32 internal constant _STRATEGY_UPDATE_TIME_SLOT = 0x56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e72;
bytes32 internal constant _ALLOW_SHARE_PRICE_DECREASE_SLOT = 0x22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed;
bytes32 internal constant _WITHDRAW_BEFORE_REINVESTING_SLOT = 0x4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a79;
constructor() public {
assert(_STRATEGY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategy")) - 1));
assert(_UNDERLYING_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.underlying")) - 1));
assert(_UNDERLYING_UNIT_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.underlyingUnit")) - 1));
assert(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.vaultFractionToInvestNumerator")) - 1));
assert(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.vaultFractionToInvestDenominator")) - 1));
assert(_NEXT_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementation")) - 1));
assert(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementationTimestamp")) - 1));
assert(_NEXT_IMPLEMENTATION_DELAY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementationDelay")) - 1));
assert(_STRATEGY_TIME_LOCK_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategyTimeLock")) - 1));
assert(_FUTURE_STRATEGY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.futureStrategy")) - 1));
assert(_STRATEGY_UPDATE_TIME_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategyUpdateTime")) - 1));
assert(_ALLOW_SHARE_PRICE_DECREASE_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.allowSharePriceDecrease")) - 1));
assert(_WITHDRAW_BEFORE_REINVESTING_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.withdrawBeforeReinvesting")) - 1));
}
function initialize(
address _underlying,
uint256 _toInvestNumerator,
uint256 _toInvestDenominator,
uint256 _underlyingUnit,
uint256 _implementationChangeDelay,
uint256 _strategyChangeDelay
) public initializer {
_setUnderlying(_underlying);
_setVaultFractionToInvestNumerator(_toInvestNumerator);
_setVaultFractionToInvestDenominator(_toInvestDenominator);
_setUnderlyingUnit(_underlyingUnit);
_setNextImplementationDelay(_implementationChangeDelay);
_setStrategyTimeLock(_strategyChangeDelay);
_setStrategyUpdateTime(0);
_setFutureStrategy(address(0));
_setAllowSharePriceDecrease(false);
_setWithdrawBeforeReinvesting(false);
}
function _setStrategy(address _address) internal {
setAddress(_STRATEGY_SLOT, _address);
}
function _strategy() internal view returns (address) {
return getAddress(_STRATEGY_SLOT);
}
function _setUnderlying(address _address) internal {
setAddress(_UNDERLYING_SLOT, _address);
}
function _underlying() internal view returns (address) {
return getAddress(_UNDERLYING_SLOT);
}
function _setUnderlyingUnit(uint256 _value) internal {
setUint256(_UNDERLYING_UNIT_SLOT, _value);
}
function _underlyingUnit() internal view returns (uint256) {
return getUint256(_UNDERLYING_UNIT_SLOT);
}
function _setVaultFractionToInvestNumerator(uint256 _value) internal {
setUint256(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT, _value);
}
function _vaultFractionToInvestNumerator() internal view returns (uint256) {
return getUint256(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT);
}
function _setVaultFractionToInvestDenominator(uint256 _value) internal {
setUint256(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT, _value);
}
function _vaultFractionToInvestDenominator() internal view returns (uint256) {
return getUint256(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT);
}
function _setAllowSharePriceDecrease(bool _value) internal {
setBoolean(_ALLOW_SHARE_PRICE_DECREASE_SLOT, _value);
}
function _allowSharePriceDecrease() internal view returns (bool) {
return getBoolean(_ALLOW_SHARE_PRICE_DECREASE_SLOT);
}
function _setWithdrawBeforeReinvesting(bool _value) internal {
setBoolean(_WITHDRAW_BEFORE_REINVESTING_SLOT, _value);
}
function _withdrawBeforeReinvesting() internal view returns (bool) {
return getBoolean(_WITHDRAW_BEFORE_REINVESTING_SLOT);
}
function _setNextImplementation(address _address) internal {
setAddress(_NEXT_IMPLEMENTATION_SLOT, _address);
}
function _nextImplementation() internal view returns (address) {
return getAddress(_NEXT_IMPLEMENTATION_SLOT);
}
function _setNextImplementationTimestamp(uint256 _value) internal {
setUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT, _value);
}
function _nextImplementationTimestamp() internal view returns (uint256) {
return getUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT);
}
function _setNextImplementationDelay(uint256 _value) internal {
setUint256(_NEXT_IMPLEMENTATION_DELAY_SLOT, _value);
}
function _nextImplementationDelay() internal view returns (uint256) {
return getUint256(_NEXT_IMPLEMENTATION_DELAY_SLOT);
}
function _setStrategyTimeLock(uint256 _value) internal {
setUint256(_STRATEGY_TIME_LOCK_SLOT, _value);
}
function _strategyTimeLock() internal view returns (uint256) {
return getUint256(_STRATEGY_TIME_LOCK_SLOT);
}
function _setFutureStrategy(address _value) internal {
setAddress(_FUTURE_STRATEGY_SLOT, _value);
}
function _futureStrategy() internal view returns (address) {
return getAddress(_FUTURE_STRATEGY_SLOT);
}
function _setStrategyUpdateTime(uint256 _value) internal {
setUint256(_STRATEGY_UPDATE_TIME_SLOT, _value);
}
function _strategyUpdateTime() internal view returns (uint256) {
return getUint256(_STRATEGY_UPDATE_TIME_SLOT);
}
function setBoolean(bytes32 slot, bool _value) internal {
setUint256(slot, _value ? 1 : 0);
}
function getBoolean(bytes32 slot) internal view returns (bool) {
return (getUint256(slot) == 1);
}
function setAddress(bytes32 slot, address _address) private {
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(slot, _address)
}
}
function setUint256(bytes32 slot, uint256 _value) private {
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(slot, _value)
}
}
function getAddress(bytes32 slot) private view returns (address str) {
// solhint-disable-next-line no-inline-assembly
assembly {
str := sload(slot)
}
}
function getUint256(bytes32 slot) private view returns (uint256 str) {
// solhint-disable-next-line no-inline-assembly
assembly {
str := sload(slot)
}
}
uint256[50] private ______gap;
}
// File: contracts/VaultFarm.sol
pragma solidity 0.5.16;
contract VaultFarm is ERC20, ERC20Detailed, IVault, IUpgradeSource, ControllableInit, VaultStorage {
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
event Withdraw(address indexed beneficiary, uint256 amount);
event Deposit(address indexed beneficiary, uint256 amount);
event Invest(uint256 amount);
event StrategyAnnounced(address newStrategy, uint256 time);
event StrategyChanged(address newStrategy, address oldStrategy);
// FFarm-specific:
bytes32 internal constant _AUTO_STAKE_UPON_WITHDRAWAL = 0x158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c7644160;
constructor() public {
assert(_AUTO_STAKE_UPON_WITHDRAWAL == bytes32(uint256(keccak256("eip1967.vaultStorage.autoStakeUponWithdrawal")) - 1));
}
// the function is name differently to not cause inheritance clash in truffle and allows tests
function initializeVault(address _storage,
address _underlying,
uint256 _toInvestNumerator,
uint256 _toInvestDenominator
) public initializer {
require(_toInvestNumerator <= _toInvestDenominator, "cannot invest more than 100%");
require(_toInvestDenominator != 0, "cannot divide by 0");
ERC20Detailed.initialize(
string(abi.encodePacked("i", ERC20Detailed(_underlying).symbol())),
string(abi.encodePacked("i", ERC20Detailed(_underlying).symbol())),
ERC20Detailed(_underlying).decimals()
);
ControllableInit.initialize(
_storage
);
uint256 underlyingUnit = 10 ** uint256(ERC20Detailed(address(_underlying)).decimals());
uint256 implementationDelay = 12 hours;
uint256 strategyChangeDelay = 12 hours;
VaultStorage.initialize(
_underlying,
_toInvestNumerator,
_toInvestDenominator,
underlyingUnit,
implementationDelay,
strategyChangeDelay
);
}
function strategy() public view returns(address) {
return _strategy();
}
function underlying() public view returns(address) {
return _underlying();
}
function underlyingUnit() public view returns(uint256) {
return _underlyingUnit();
}
function vaultFractionToInvestNumerator() public view returns(uint256) {
return _vaultFractionToInvestNumerator();
}
function vaultFractionToInvestDenominator() public view returns(uint256) {
return _vaultFractionToInvestDenominator();
}
function nextImplementation() public view returns(address) {
return _nextImplementation();
}
function nextImplementationTimestamp() public view returns(uint256) {
return _nextImplementationTimestamp();
}
function nextImplementationDelay() public view returns(uint256) {
return _nextImplementationDelay();
}
modifier whenStrategyDefined() {
require(address(strategy()) != address(0), "Strategy must be defined");
_;
}
// Only smart contracts will be affected by this modifier
modifier defense() {
require(
(msg.sender == tx.origin) || // If it is a normal user and not smart contract,
// then the requirement will pass
!IController(controller()).greyList(msg.sender), // If it is a smart contract, then
"This smart contract has been grey listed" // make sure that it is not on our greyList.
);
_;
}
/**
* Chooses the best strategy and re-invests. If the strategy did not change, it just calls
* doHardWork on the current strategy. Call this through controller to claim hard rewards.
*/
function doHardWork() whenStrategyDefined onlyControllerOrGovernance external {
// ensure that new funds are invested too
invest();
IStrategy(strategy()).doHardWork();
}
/*
* Returns the cash balance across all users in this contract.
*/
function underlyingBalanceInVault() view public returns (uint256) {
return IERC20(underlying()).balanceOf(address(this));
}
/* Returns the current underlying (e.g., DAI's) balance together with
* the invested amount (if DAI is invested elsewhere by the strategy).
*/
function underlyingBalanceWithInvestment() view public returns (uint256) {
if (address(strategy()) == address(0)) {
// initial state, when not set
return underlyingBalanceInVault();
}
return underlyingBalanceInVault().add(IStrategy(strategy()).investedUnderlyingBalance());
}
function getPricePerFullShare() public view returns (uint256) {
return totalSupply() == 0
? underlyingUnit()
: underlyingUnit().mul(underlyingBalanceWithInvestment()).div(totalSupply());
}
/* get the user's share (in underlying)
*/
function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256) {
if (totalSupply() == 0) {
return 0;
}
return underlyingBalanceWithInvestment()
.mul(balanceOf(holder))
.div(totalSupply());
}
function futureStrategy() public view returns (address) {
return _futureStrategy();
}
function strategyUpdateTime() public view returns (uint256) {
return _strategyUpdateTime();
}
function strategyTimeLock() public view returns (uint256) {
return _strategyTimeLock();
}
// FFarm-specific:
function autoStakeUponWithdrawal() public view returns (bool) {
return getBoolean(_AUTO_STAKE_UPON_WITHDRAWAL);
}
function setAutoStakeUponWithdrawal(bool _value) public onlyGovernance {
return setBoolean(_AUTO_STAKE_UPON_WITHDRAWAL, _value);
}
function canUpdateStrategy(address _strategy) public view returns(bool) {
return strategy() == address(0) // no strategy was set yet
|| (_strategy == futureStrategy()
&& block.timestamp > strategyUpdateTime()
&& strategyUpdateTime() > 0); // or the timelock has passed
}
/**
* Indicates that the strategy update will happen in the future
*/
function announceStrategyUpdate(address _strategy) public onlyControllerOrGovernance {
// records a new timestamp
uint256 when = block.timestamp.add(strategyTimeLock());
_setStrategyUpdateTime(when);
_setFutureStrategy(_strategy);
emit StrategyAnnounced(_strategy, when);
}
/**
* Finalizes (or cancels) the strategy update by resetting the data
*/
function finalizeStrategyUpdate() public onlyControllerOrGovernance {
_setStrategyUpdateTime(0);
_setFutureStrategy(address(0));
}
function setStrategy(address _strategy) public onlyControllerOrGovernance {
require(canUpdateStrategy(_strategy),
"The strategy exists and switch timelock did not elapse yet");
require(_strategy != address(0), "new _strategy cannot be empty");
require(IStrategy(_strategy).underlying() == address(underlying()), "Vault underlying must match Strategy underlying");
require(IStrategy(_strategy).vault() == address(this), "the strategy does not belong to this vault");
emit StrategyChanged(_strategy, strategy());
if (address(_strategy) != address(strategy())) {
if (address(strategy()) != address(0)) { // if the original strategy (no underscore) is defined
IERC20(underlying()).safeApprove(address(strategy()), 0);
IStrategy(strategy()).withdrawAllToVault();
}
_setStrategy(_strategy);
IERC20(underlying()).safeApprove(address(strategy()), 0);
IERC20(underlying()).safeApprove(address(strategy()), uint256(~0));
}
finalizeStrategyUpdate();
}
function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external onlyGovernance {
require(denominator > 0, "denominator must be greater than 0");
require(numerator <= denominator, "denominator must be greater than or equal to the numerator");
_setVaultFractionToInvestNumerator(numerator);
_setVaultFractionToInvestDenominator(denominator);
}
function rebalance() external onlyControllerOrGovernance {
withdrawAll();
invest();
}
function availableToInvestOut() public view returns (uint256) {
uint256 wantInvestInTotal = underlyingBalanceWithInvestment()
.mul(vaultFractionToInvestNumerator())
.div(vaultFractionToInvestDenominator());
uint256 alreadyInvested = IStrategy(strategy()).investedUnderlyingBalance();
if (alreadyInvested >= wantInvestInTotal) {
return 0;
} else {
uint256 remainingToInvest = wantInvestInTotal.sub(alreadyInvested);
return remainingToInvest <= underlyingBalanceInVault()
// TODO: we think that the "else" branch of the ternary operation is not
// going to get hit
? remainingToInvest : underlyingBalanceInVault();
}
}
function invest() internal whenStrategyDefined {
uint256 availableAmount = availableToInvestOut();
if (availableAmount > 0) {
IERC20(underlying()).safeTransfer(address(strategy()), availableAmount);
emit Invest(availableAmount);
}
}
/*
* Allows for depositing the underlying asset in exchange for shares.
* Approval is assumed.
*/
function deposit(uint256 amount) external defense {
_deposit(amount, msg.sender, msg.sender);
}
/*
* Allows for depositing the underlying asset in exchange for shares
* assigned to the holder.
* This facilitates depositing for someone else (using DepositHelper)
*/
function depositFor(uint256 amount, address holder) public defense {
_deposit(amount, msg.sender, holder);
}
function withdrawAll() public onlyControllerOrGovernance whenStrategyDefined {
IStrategy(strategy()).withdrawAllToVault();
}
function withdraw(uint256 numberOfShares) external {
require(totalSupply() > 0, "Vault has no shares");
require(numberOfShares > 0, "numberOfShares must be greater than 0");
uint256 totalSupply = totalSupply();
_burn(msg.sender, numberOfShares);
uint256 underlyingAmountToWithdraw = underlyingBalanceWithInvestment()
.mul(numberOfShares)
.div(totalSupply);
if (underlyingAmountToWithdraw > underlyingBalanceInVault()) {
// withdraw everything from the strategy to accurately check the share value
if (numberOfShares == totalSupply) {
IStrategy(strategy()).withdrawAllToVault();
} else {
uint256 missing = underlyingAmountToWithdraw.sub(underlyingBalanceInVault());
IStrategy(strategy()).withdrawToVault(missing);
}
// recalculate to improve accuracy
underlyingAmountToWithdraw = Math.min(underlyingBalanceWithInvestment()
.mul(numberOfShares)
.div(totalSupply), underlyingBalanceInVault());
}
IERC20(underlying()).safeTransfer(msg.sender, underlyingAmountToWithdraw);
// FFarm-specific:
// Even if we have enough buffer, we need to call doHardWork
// for auto-staking
if (autoStakeUponWithdrawal()) {
IFFarmStrategy(strategy()).refreshAutoStaking();
}
// update the withdrawal amount for the holder
emit Withdraw(msg.sender, underlyingAmountToWithdraw);
}
function _deposit(uint256 amount, address sender, address beneficiary) internal {
require(amount > 0, "Cannot deposit 0");
require(beneficiary != address(0), "holder must be defined");
if (address(strategy()) != address(0)) {
require(IStrategy(strategy()).depositArbCheck(), "Too much arb");
}
uint256 toMint = totalSupply() == 0
? amount
: amount.mul(totalSupply()).div(underlyingBalanceWithInvestment());
_mint(beneficiary, toMint);
IERC20(underlying()).safeTransferFrom(sender, address(this), amount);
// update the contribution amount for the beneficiary
emit Deposit(beneficiary, amount);
}
/**
* Schedules an upgrade for this vault's proxy.
*/
function scheduleUpgrade(address impl) public onlyGovernance {
_setNextImplementation(impl);
_setNextImplementationTimestamp(block.timestamp.add(nextImplementationDelay()));
}
function shouldUpgrade() external view returns (bool, address) {
return (
nextImplementationTimestamp() != 0
&& block.timestamp > nextImplementationTimestamp()
&& nextImplementation() != address(0),
nextImplementation()
);
}
function finalizeUpgrade() external onlyGovernance {
_setNextImplementation(address(0));
_setNextImplementationTimestamp(0);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Invest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategy","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"StrategyAnnounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategy","type":"address"},{"indexed":false,"internalType":"address","name":"oldStrategy","type":"address"}],"name":"StrategyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"announceStrategyUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"autoStakeUponWithdrawal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"availableToInvestOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"canUpdateStrategy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"holder","type":"address"}],"name":"depositFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"doHardWork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalizeStrategyUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalizeUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"futureStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_toInvestNumerator","type":"uint256"},{"internalType":"uint256","name":"_toInvestDenominator","type":"uint256"},{"internalType":"uint256","name":"_underlyingUnit","type":"uint256"},{"internalType":"uint256","name":"_implementationChangeDelay","type":"uint256"},{"internalType":"uint256","name":"_strategyChangeDelay","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_storage","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_storage","type":"address"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"uint256","name":"_toInvestNumerator","type":"uint256"},{"internalType":"uint256","name":"_toInvestDenominator","type":"uint256"}],"name":"initializeVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextImplementationDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextImplementationTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"impl","type":"address"}],"name":"scheduleUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAutoStakeUponWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_store","type":"address"}],"name":"setStorage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"setStrategy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setVaultFractionToInvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"shouldUpgrade","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"strategy","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"strategyTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"strategyUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingBalanceInVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingBalanceWithInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"underlyingBalanceWithInvestmentForHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlyingUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultFractionToInvestDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultFractionToInvestNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"numberOfShares","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604080517f656970313936372e676f7665726e61626c65496e69742e73746f7261676500008152905190819003601e0190207fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc600019909101146200007357fe5b604080517f656970313936372e7661756c7453746f726167652e73747261746567790000008152905190819003601d0190207ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea60001990910114620000d457fe5b604080517f656970313936372e7661756c7453746f726167652e756e6465726c79696e67008152905190819003601f0190207f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371600019909101146200013557fe5b6001604051808062004c12602391396023019050604051809103902060001c0360001b7fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff60001b146200018457fe5b6001604051808062004ad4603391396033019050604051809103902060001c0360001b7f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a60001b14620001d357fe5b6001604051808062004b65603591396035019050604051809103902060001c0360001b7f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed3230860001b146200022257fe5b6001604051808062004c35602791396027019050604051809103902060001c0360001b7fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df60001b146200027157fe5b6001604051808062004b07603091396030019050604051809103902060001c0360001b7f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c960001b14620002c057fe5b6001604051808062004be6602c9139602c019050604051809103902060001c0360001b7f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf060001b146200030f57fe5b6001604051808062004bc1602591396025019050604051809103902060001c0360001b7f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b60001b146200035e57fe5b6001604051808062004c5c602391396023019050604051809103902060001c0360001b7fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc859061060001b14620003ad57fe5b6001604051808062004b9a602791396027019050604051809103902060001c0360001b7f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e7260001b14620003fc57fe5b6001604051808062004aa8602c9139602c019050604051809103902060001c0360001b7f22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed60001b146200044b57fe5b6001604051808062004b37602e9139602e019050604051809103902060001c0360001b7f4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a7960001b146200049a57fe5b6001604051808062004a7c602c9139602c019050604051809103902060001c0360001b7f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c764416060001b14620004e957fe5b61458380620004f96000396000f3fe608060405234801561001057600080fd5b50600436106102b65760003560e01c806382de9c1b11610172578063a9059cbb116100d9578063c2baf35611610092578063c2baf3561461088d578063c4d66de814610895578063dd62ed3e146108bb578063eda199aa146108e9578063f0cf91e7146108f1578063f2768c1e14610917578063f77c47911461091f576102b6565b8063a9059cbb1461080d578063aa04462514610839578063b592c39014610841578063b635bf8f14610849578063b6b55f2514610868578063bdd1475e14610885576102b6565b80639a508c8e1161012b5780639a508c8e1461077b5780639d16acfd14610783578063a457c2d7146107ae578063a5b1a24d146107da578063a8365693146107fd578063a8c62e7614610805576102b6565b806382de9c1b146106db578063853828b6146106e35780638cb1d67f146106eb5780638fc1708c146107115780639137c1a71461074d57806395d89b4114610773576102b6565b806333a100ca1161022157806353ceb01c116101da57806353ceb01c146106855780635aa6e6751461068d5780635fe51e6d146106955780636f307dc31461069d57806370a08231146106a557806377c7b8fc146106cb5780637d7c2a1c146106d3576102b6565b806333a100ca146105b357806336efd16f146105d9578063395093511461060557806345ff4c80146106315780634af1758b146106755780634fa5d8541461067d576102b6565b80631624f6c6116102735780631624f6c61461040457806318160ddd146105325780631bf8e7be1461053a57806323b872dd146105425780632e1a7d4d14610578578063313ce56714610595576102b6565b806306fdde03146102bb578063095ea7b31461033857806309ff18f0146103785780630a6bbeb31461039c5780630ad2239d146103c45780630c80447a146103de575b600080fd5b6102c3610927565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fd5781810151838201526020016102e5565b50505050905090810190601f16801561032a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103646004803603604081101561034e57600080fd5b506001600160a01b0381351690602001356109be565b604080519115158252519081900360200190f35b6103806109dc565b604080516001600160a01b039092168252519081900360200190f35b6103c2600480360360208110156103b257600080fd5b50356001600160a01b03166109eb565b005b6103cc610bb5565b60408051918252519081900360200190f35b6103c2600480360360208110156103f457600080fd5b50356001600160a01b0316610bbf565b6103c26004803603606081101561041a57600080fd5b810190602081018135600160201b81111561043457600080fd5b82018360208201111561044657600080fd5b803590602001918460018302840111600160201b8311171561046757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156104b957600080fd5b8201836020820111156104cb57600080fd5b803590602001918460018302840111600160201b831117156104ec57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610ca99050565b6103cc610d85565b6103cc610d8b565b6103646004803603606081101561055857600080fd5b506001600160a01b03813581169160208101359091169060400135610e37565b6103c26004803603602081101561058e57600080fd5b5035610ec4565b61059d611179565b6040805160ff9092168252519081900360200190f35b6103c2600480360360208110156105c957600080fd5b50356001600160a01b0316611182565b6103c2600480360360408110156105ef57600080fd5b50803590602001356001600160a01b0316611623565b6103646004803603604081101561061b57600080fd5b506001600160a01b038135169060200135611701565b6103c2600480360360c081101561064757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a00135611755565b6103cc61185b565b6103c2611865565b6103cc611a78565b610380611a82565b610380611af5565b610380611aff565b6103cc600480360360208110156106bb57600080fd5b50356001600160a01b0316611b09565b6103cc611b28565b6103c2611b62565b6103cc611cc8565b6103c2611cd2565b6103cc6004803603602081101561070157600080fd5b50356001600160a01b0316611ec9565b6103c26004803603608081101561072757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611efe565b6103c26004803603602081101561076357600080fd5b50356001600160a01b0316612466565b6102c3612595565b6103c26125f6565b61078b6126d5565b6040805192151583526001600160a01b0390911660208301528051918290030190f35b610364600480360360408110156107c457600080fd5b506001600160a01b038135169060200135612721565b6103c2600480360360408110156107f057600080fd5b508035906020013561278f565b6103cc6128ea565b6103806128f4565b6103646004803603604081101561082357600080fd5b506001600160a01b0381351690602001356128fe565b6103cc612912565b6103cc61291c565b6103c26004803603602081101561085f57600080fd5b503515156129f5565b6103c26004803603602081101561087e57600080fd5b5035612aea565b610364612bc4565b6103cc612bef565b6103c2600480360360208110156108ab57600080fd5b50356001600160a01b0316612c4e565b6103cc600480360360408110156108d157600080fd5b506001600160a01b0381358116916020013516612cf9565b6103c2612d24565b6103646004803603602081101561090757600080fd5b50356001600160a01b0316612e8c565b6103cc612eed565b610380612ef7565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109b35780601f10610988576101008083540402835291602001916109b3565b820191906000526020600020905b81548152906001019060200180831161099657829003601f168201915b505050505090505b90565b60006109d26109cb612f39565b8484612f3d565b5060015b92915050565b60006109e6613029565b905090565b6109f3613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610a4857600080fd5b505afa158015610a5c573d6000803e3d6000fd5b505050506040513d6020811015610a7257600080fd5b505180610b045750610a82613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610ad757600080fd5b505afa158015610aeb573d6000803e3d6000fd5b505050506040513d6020811015610b0157600080fd5b50515b610b3f5760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6000610b59610b4c610bb5565b429063ffffffff61307916565b9050610b64816130da565b610b6d82613104565b604080516001600160a01b03841681526020810183905281517f7d5e1cfe55788983acd19d248da36a27c9413e8e43445ed36a76ae0e741a04ed929181900390910190a15050565b60006109e661312e565b610bc7613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610c1c57600080fd5b505afa158015610c30573d6000803e3d6000fd5b505050506040513d6020811015610c4657600080fd5b5051610c8a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610c9381613159565b610ca6610ca1610b4c6128ea565b613183565b50565b600054610100900460ff1680610cc25750610cc26131ad565b80610cd0575060005460ff16155b610d0b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015610d36576000805460ff1961ff0019909116610100171660011790555b8351610d4990606890602087019061415c565b508251610d5d90606990602086019061415c565b50606a805460ff191660ff84161790558015610d7f576000805461ff00191690555b50505050565b60355490565b600080610d966128f4565b6001600160a01b03161415610db457610dad612bef565b90506109bb565b6109e6610dbf6128f4565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610df757600080fd5b505afa158015610e0b573d6000803e3d6000fd5b505050506040513d6020811015610e2157600080fd5b5051610e2b612bef565b9063ffffffff61307916565b6000610e448484846131b3565b610eba84610e50612f39565b610eb5856040518060600160405280602881526020016143ab602891396001600160a01b038a16600090815260346020526040812090610e8e612f39565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61331116565b612f3d565b5060019392505050565b6000610ece610d85565b11610f16576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b60008111610f555760405162461bcd60e51b815260040180806020018281038252602581526020018061443b6025913960400191505060405180910390fd5b6000610f5f610d85565b9050610f6b33836133a8565b6000610f9582610f8985610f7d610d8b565b9063ffffffff6134a416565b9063ffffffff6134fd16565b9050610f9f612bef565b8111156110b3578183141561100d57610fb66128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ff057600080fd5b505af1158015611004573d6000803e3d6000fd5b50505050611090565b600061102761101a612bef565b839063ffffffff61353f16565b90506110316128f4565b6001600160a01b031663ce8c42e8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561107657600080fd5b505af115801561108a573d6000803e3d6000fd5b50505050505b6110b06110a383610f8986610f7d610d8b565b6110ab612bef565b613581565b90505b6110d633826110c0611aff565b6001600160a01b0316919063ffffffff61359716565b6110de612bc4565b1561113e576110eb6128f4565b6001600160a01b031663203971926040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561112557600080fd5b505af1158015611139573d6000803e3d6000fd5b505050505b60408051828152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b606a5460ff1690565b61118a613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156111df57600080fd5b505afa1580156111f3573d6000803e3d6000fd5b505050506040513d602081101561120957600080fd5b50518061129b5750611219613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d602081101561129857600080fd5b50515b6112d65760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6112df81612e8c565b61131a5760405162461bcd60e51b815260040180806020018281038252603a815260200180614401603a913960400191505060405180910390fd5b6001600160a01b038116611375576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b61137d611aff565b6001600160a01b0316816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156113bf57600080fd5b505afa1580156113d3573d6000803e3d6000fd5b505050506040513d60208110156113e957600080fd5b50516001600160a01b0316146114305760405162461bcd60e51b815260040180806020018281038252602f81526020018061435b602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561147357600080fd5b505afa158015611487573d6000803e3d6000fd5b505050506040513d602081101561149d57600080fd5b50516001600160a01b0316146114e45760405162461bcd60e51b815260040180806020018281038252602a8152602001806142a9602a913960400191505060405180910390fd5b7f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c58161150e6128f4565b604080516001600160a01b03938416815291909216602082015281519081900390910190a161153b6128f4565b6001600160a01b0316816001600160a01b03161461161b57600061155d6128f4565b6001600160a01b0316146115f1576115966115766128f4565b6000611580611aff565b6001600160a01b0316919063ffffffff6135ee16565b61159e6128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115d857600080fd5b505af11580156115ec573d6000803e3d6000fd5b505050505b6115fa81613701565b6116056115766128f4565b61161b6116106128f4565b600019611580611aff565b610ca6612d24565b333214806116b75750611634612ef7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561168957600080fd5b505afa15801561169d573d6000803e3d6000fd5b505050506040513d60208110156116b357600080fd5b5051155b6116f25760405162461bcd60e51b81526004018080602001828103825260288152602001806143336028913960400191505060405180910390fd5b6116fd82338361372b565b5050565b60006109d261170e612f39565b84610eb5856034600061171f612f39565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61307916565b600054610100900460ff168061176e575061176e6131ad565b8061177c575060005460ff16155b6117b75760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff161580156117e2576000805460ff1961ff0019909116610100171660011790555b6117eb8761393a565b6117f486613964565b6117fd8561398e565b611806846139b8565b61180f836139e2565b61181882613a0c565b61182260006130da565b61182c6000613104565b6118366000613a36565b6118406000613a60565b8015611852576000805461ff00191690555b50505050505050565b60006109e6613a8a565b600061186f6128f4565b6001600160a01b031614156118c6576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6118ce613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d602081101561194d57600080fd5b5051806119df575061195d613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119b257600080fd5b505afa1580156119c6573d6000803e3d6000fd5b505050506040513d60208110156119dc57600080fd5b50515b611a1a5760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b611a22613ab5565b611a2a6128f4565b6001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a6457600080fd5b505af1158015610d7f573d6000803e3d6000fd5b60006109e6613b72565b6000611a8c613054565b6001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b505afa158015611ad8573d6000803e3d6000fd5b505050506040513d6020811015611aee57600080fd5b5051905090565b60006109e6613b9d565b60006109e6613bc8565b6001600160a01b0381166000908152603360205260409020545b919050565b6000611b32610d85565b15611b5a57611b55611b42610d85565b610f89611b4d610d8b565b610f7d611a78565b6109e6565b6109e6611a78565b611b6a613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b505180611c7b5750611bf9613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c4e57600080fd5b505afa158015611c62573d6000803e3d6000fd5b505050506040513d6020811015611c7857600080fd5b50515b611cb65760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b611cbe611cd2565b611cc6613ab5565b565b60006109e6613bf3565b611cda613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611d2f57600080fd5b505afa158015611d43573d6000803e3d6000fd5b505050506040513d6020811015611d5957600080fd5b505180611deb5750611d69613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611dbe57600080fd5b505afa158015611dd2573d6000803e3d6000fd5b505050506040513d6020811015611de857600080fd5b50515b611e265760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6000611e306128f4565b6001600160a01b03161415611e87576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b611e8f6128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a6457600080fd5b6000611ed3610d85565b611edf57506000611b23565b6109d6611eea610d85565b610f89611ef685611b09565b610f7d610d8b565b600054610100900460ff1680611f175750611f176131ad565b80611f25575060005460ff16155b611f605760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015611f8b576000805460ff1961ff0019909116610100171660011790555b81831115611fe0576040805162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420696e76657374206d6f7265207468616e203130302500000000604482015290519081900360640190fd5b81612027576040805162461bcd60e51b8152602060048201526012602482015271063616e6e6f742064697669646520627920360741b604482015290519081900360640190fd5b6123c0846001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561206357600080fd5b505afa158015612077573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156120a057600080fd5b8101908080516040519392919084600160201b8211156120bf57600080fd5b9083019060208201858111156120d457600080fd5b8251600160201b8111828201881017156120ed57600080fd5b82525081516020918201929091019080838360005b8381101561211a578181015183820152602001612102565b50505050905090810190601f1680156121475780820380516001836020036101000a031916815260200191505b506040525050506040516020018080606960f81b81525060010182805190602001908083835b6020831061218c5780518252601f19909201916020918201910161216d565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052856001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156121f957600080fd5b505afa15801561220d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561223657600080fd5b8101908080516040519392919084600160201b82111561225557600080fd5b90830190602082018581111561226a57600080fd5b8251600160201b81118282018810171561228357600080fd5b82525081516020918201929091019080838360005b838110156122b0578181015183820152602001612298565b50505050905090810190601f1680156122dd5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080606960f81b81525060010182805190602001908083835b602083106123225780518252601f199092019160209182019101612303565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561238f57600080fd5b505afa1580156123a3573d6000803e3d6000fd5b505050506040513d60208110156123b957600080fd5b5051610ca9565b6123c985612c4e565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561240457600080fd5b505afa158015612418573d6000803e3d6000fd5b505050506040513d602081101561242e57600080fd5b505160ff16600a0a905061a8c08061244a878787868580611755565b505050801561245f576000805461ff00191690555b5050505050565b61246e613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156124c357600080fd5b505afa1580156124d7573d6000803e3d6000fd5b505050506040513d60208110156124ed57600080fd5b5051612531576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b03811661258c576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b610ca681613c1e565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109b35780601f10610988576101008083540402835291602001916109b3565b6125fe613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265357600080fd5b505afa158015612667573d6000803e3d6000fd5b505050506040513d602081101561267d57600080fd5b50516126c1576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6126cb6000613159565b611cc66000613183565b6000806126e0611cc8565b158015906126f457506126f1611cc8565b42115b8015612711575060006127056109dc565b6001600160a01b031614155b6127196109dc565b915091509091565b60006109d261272e612f39565b84610eb58560405180606001604052806025815260200161452a6025913960346000612758612f39565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61331116565b612797613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156127ec57600080fd5b505afa158015612800573d6000803e3d6000fd5b505050506040513d602081101561281657600080fd5b505161285a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116128995760405162461bcd60e51b81526004018080602001828103825260228152602001806142436022913960400191505060405180910390fd5b808211156128d85760405162461bcd60e51b815260040180806020018281038252603a8152602001806142d3603a913960400191505060405180910390fd5b6128e182613964565b6116fd8161398e565b60006109e6613c42565b60006109e6613c6d565b60006109d261290b612f39565b84846131b3565b60006109e6613c98565b60008061293561292a612eed565b610f89611ef661185b565b905060006129416128f4565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b505190508181106129b9576000925050506109bb565b60006129cb838363ffffffff61353f16565b90506129d5612bef565b8111156129e9576129e4612bef565b6129eb565b805b93505050506109bb565b6129fd613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612a5257600080fd5b505afa158015612a66573d6000803e3d6000fd5b505050506040513d6020811015612a7c57600080fd5b5051612ac0576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610ca67f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c764416082613cc3565b33321480612b7e5750612afb612ef7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b5051155b612bb95760405162461bcd60e51b81526004018080602001828103825260288152602001806143336028913960400191505060405180910390fd5b610ca681333361372b565b60006109e67f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c7644160613cde565b6000612bf9611aff565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611ac457600080fd5b600054610100900460ff1680612c675750612c676131ad565b80612c75575060005460ff16155b612cb05760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015612cdb576000805460ff1961ff0019909116610100171660011790555b612ce482613cf2565b80156116fd576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b612d2c613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612d8157600080fd5b505afa158015612d95573d6000803e3d6000fd5b505050506040513d6020811015612dab57600080fd5b505180612e3d5750612dbb613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612e1057600080fd5b505afa158015612e24573d6000803e3d6000fd5b505050506040513d6020811015612e3a57600080fd5b50515b612e785760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b612e8260006130da565b611cc66000613104565b600080612e976128f4565b6001600160a01b031614806109d65750612eaf611af5565b6001600160a01b0316826001600160a01b0316148015612ed55750612ed2612912565b42115b80156109d657506000612ee6612912565b1192915050565b60006109e6613d88565b6000612f01613054565b6001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b3390565b6001600160a01b038316612f825760405162461bcd60e51b81526004018080602001828103825260248152602001806144a66024913960400191505060405180910390fd5b6001600160a01b038216612fc75760405162461bcd60e51b81526004018080602001828103825260228152602001806142876022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006109e67fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df613daf565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc5490565b6000828201838110156130d3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610ca67f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e7282613db3565b610ca67fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc859061082613db3565b60006109e67f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b613daf565b610ca67fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df82613db3565b610ca67f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c982613db3565b303b1590565b6001600160a01b0383166131f85760405162461bcd60e51b81526004018080602001828103825260258152602001806144816025913960400191505060405180910390fd5b6001600160a01b03821661323d5760405162461bcd60e51b81526004018080602001828103825260238152602001806142206023913960400191505060405180910390fd5b6132808160405180606001604052806026815260200161430d602691396001600160a01b038616600090815260336020526040902054919063ffffffff61331116565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546132b5908263ffffffff61307916565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156133a05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561336557818101518382015260200161334d565b50505050905090810190601f1680156133925780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166133ed5760405162461bcd60e51b81526004018080602001828103825260218152602001806144606021913960400191505060405180910390fd5b61343081604051806060016040528060228152602001614265602291396001600160a01b038516600090815260336020526040902054919063ffffffff61331116565b6001600160a01b03831660009081526033602052604090205560355461345c908263ffffffff61353f16565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826134b3575060006109d6565b828202828482816134c057fe5b04146130d35760405162461bcd60e51b815260040180806020018281038252602181526020018061438a6021913960400191505060405180910390fd5b60006130d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613db7565b60006130d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613311565b600081831061359057816130d3565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526135e9908490613e1c565b505050565b801580613674575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561364657600080fd5b505afa15801561365a573d6000803e3d6000fd5b505050506040513d602081101561367057600080fd5b5051155b6136af5760405162461bcd60e51b81526004018080602001828103825260368152602001806144f46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526135e9908490613e1c565b610ca67ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea82613db3565b60008311613773576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b0381166137c7576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b60006137d16128f4565b6001600160a01b03161461388b576137e76128f4565b6001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561381f57600080fd5b505afa158015613833573d6000803e3d6000fd5b505050506040513d602081101561384957600080fd5b505161388b576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b6000613895610d85565b156138c2576138bd6138a5610d8b565b610f896138b0610d85565b879063ffffffff6134a416565b6138c4565b835b90506138d08282613fd4565b6138f58330866138de611aff565b6001600160a01b031692919063ffffffff6140c616565b6040805185815290516001600160a01b038416917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b610ca67f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a737182613db3565b610ca67f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a82613db3565b610ca67f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed3230882613db3565b610ca67fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff82613db3565b610ca67f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf082613db3565b610ca67f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b82613db3565b610ca67f22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed82613cc3565b610ca67f4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a7982613cc3565b60006109e67f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a613daf565b6000613abf6128f4565b6001600160a01b03161415613b16576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6000613b2061291c565b90508015610ca657613b3c613b336128f4565b826110c0611aff565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b60006109e67fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff613daf565b60006109e67fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc8590610613daf565b60006109e67f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371613daf565b60006109e67f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9613daf565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc55565b60006109e67f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf0613daf565b60006109e67ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea613daf565b60006109e67f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e72613daf565b6116fd8282613cd3576000613cd6565b60015b60ff16613db3565b6000613ce982613daf565b60011492915050565b600054610100900460ff1680613d0b5750613d0b6131ad565b80613d19575060005460ff16155b613d545760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015613d7f576000805460ff1961ff0019909116610100171660011790555b612ce482613c1e565b60006109e67f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed323085b5490565b9055565b60008183613e065760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561336557818101518382015260200161334d565b506000838581613e1257fe5b0495945050505050565b613e2e826001600160a01b0316614120565b613e7f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613ebd5780518252601f199092019160209182019101613e9e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f1f576040519150601f19603f3d011682016040523d82523d6000602084013e613f24565b606091505b509150915081613f7b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610d7f57808060200190516020811015613f9757600080fd5b5051610d7f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806144ca602a913960400191505060405180910390fd5b6001600160a01b03821661402f576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b603554614042908263ffffffff61307916565b6035556001600160a01b03821660009081526033602052604090205461406e908263ffffffff61307916565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d7f908590613e1c565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061415457508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061419d57805160ff19168380011785556141ca565b828001600101855582156141ca579182015b828111156141ca5782518255916020019190600101906141af565b506141d69291506141da565b5090565b6109bb91905b808211156141d657600081556001016141e056fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737374686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7464656e6f6d696e61746f72206d7573742062652067726561746572207468616e206f7220657175616c20746f20746865206e756d657261746f7245524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645468652073747261746567792065786973747320616e64207377697463682074696d656c6f636b20646964206e6f7420656c61707365207965746e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820a7e08d6be18da9085daf733e25e4c3e4b5ce8a48f9dc5f103fc011429fe4ae1c64736f6c63430005100032656970313936372e7661756c7453746f726167652e6175746f5374616b6555706f6e5769746864726177616c656970313936372e7661756c7453746f726167652e616c6c6f77536861726550726963654465637265617365656970313936372e7661756c7453746f726167652e7661756c744672616374696f6e546f496e766573744e756d657261746f72656970313936372e7661756c7453746f726167652e6e657874496d706c656d656e746174696f6e54696d657374616d70656970313936372e7661756c7453746f726167652e77697468647261774265666f72655265696e76657374696e67656970313936372e7661756c7453746f726167652e7661756c744672616374696f6e546f496e7665737444656e6f6d696e61746f72656970313936372e7661756c7453746f726167652e737472617465677955706461746554696d65656970313936372e7661756c7453746f726167652e737472617465677954696d654c6f636b656970313936372e7661756c7453746f726167652e6e657874496d706c656d656e746174696f6e44656c6179656970313936372e7661756c7453746f726167652e756e6465726c79696e67556e6974656970313936372e7661756c7453746f726167652e6e657874496d706c656d656e746174696f6e656970313936372e7661756c7453746f726167652e6675747572655374726174656779
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102b65760003560e01c806382de9c1b11610172578063a9059cbb116100d9578063c2baf35611610092578063c2baf3561461088d578063c4d66de814610895578063dd62ed3e146108bb578063eda199aa146108e9578063f0cf91e7146108f1578063f2768c1e14610917578063f77c47911461091f576102b6565b8063a9059cbb1461080d578063aa04462514610839578063b592c39014610841578063b635bf8f14610849578063b6b55f2514610868578063bdd1475e14610885576102b6565b80639a508c8e1161012b5780639a508c8e1461077b5780639d16acfd14610783578063a457c2d7146107ae578063a5b1a24d146107da578063a8365693146107fd578063a8c62e7614610805576102b6565b806382de9c1b146106db578063853828b6146106e35780638cb1d67f146106eb5780638fc1708c146107115780639137c1a71461074d57806395d89b4114610773576102b6565b806333a100ca1161022157806353ceb01c116101da57806353ceb01c146106855780635aa6e6751461068d5780635fe51e6d146106955780636f307dc31461069d57806370a08231146106a557806377c7b8fc146106cb5780637d7c2a1c146106d3576102b6565b806333a100ca146105b357806336efd16f146105d9578063395093511461060557806345ff4c80146106315780634af1758b146106755780634fa5d8541461067d576102b6565b80631624f6c6116102735780631624f6c61461040457806318160ddd146105325780631bf8e7be1461053a57806323b872dd146105425780632e1a7d4d14610578578063313ce56714610595576102b6565b806306fdde03146102bb578063095ea7b31461033857806309ff18f0146103785780630a6bbeb31461039c5780630ad2239d146103c45780630c80447a146103de575b600080fd5b6102c3610927565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fd5781810151838201526020016102e5565b50505050905090810190601f16801561032a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103646004803603604081101561034e57600080fd5b506001600160a01b0381351690602001356109be565b604080519115158252519081900360200190f35b6103806109dc565b604080516001600160a01b039092168252519081900360200190f35b6103c2600480360360208110156103b257600080fd5b50356001600160a01b03166109eb565b005b6103cc610bb5565b60408051918252519081900360200190f35b6103c2600480360360208110156103f457600080fd5b50356001600160a01b0316610bbf565b6103c26004803603606081101561041a57600080fd5b810190602081018135600160201b81111561043457600080fd5b82018360208201111561044657600080fd5b803590602001918460018302840111600160201b8311171561046757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156104b957600080fd5b8201836020820111156104cb57600080fd5b803590602001918460018302840111600160201b831117156104ec57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610ca99050565b6103cc610d85565b6103cc610d8b565b6103646004803603606081101561055857600080fd5b506001600160a01b03813581169160208101359091169060400135610e37565b6103c26004803603602081101561058e57600080fd5b5035610ec4565b61059d611179565b6040805160ff9092168252519081900360200190f35b6103c2600480360360208110156105c957600080fd5b50356001600160a01b0316611182565b6103c2600480360360408110156105ef57600080fd5b50803590602001356001600160a01b0316611623565b6103646004803603604081101561061b57600080fd5b506001600160a01b038135169060200135611701565b6103c2600480360360c081101561064757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a00135611755565b6103cc61185b565b6103c2611865565b6103cc611a78565b610380611a82565b610380611af5565b610380611aff565b6103cc600480360360208110156106bb57600080fd5b50356001600160a01b0316611b09565b6103cc611b28565b6103c2611b62565b6103cc611cc8565b6103c2611cd2565b6103cc6004803603602081101561070157600080fd5b50356001600160a01b0316611ec9565b6103c26004803603608081101561072757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611efe565b6103c26004803603602081101561076357600080fd5b50356001600160a01b0316612466565b6102c3612595565b6103c26125f6565b61078b6126d5565b6040805192151583526001600160a01b0390911660208301528051918290030190f35b610364600480360360408110156107c457600080fd5b506001600160a01b038135169060200135612721565b6103c2600480360360408110156107f057600080fd5b508035906020013561278f565b6103cc6128ea565b6103806128f4565b6103646004803603604081101561082357600080fd5b506001600160a01b0381351690602001356128fe565b6103cc612912565b6103cc61291c565b6103c26004803603602081101561085f57600080fd5b503515156129f5565b6103c26004803603602081101561087e57600080fd5b5035612aea565b610364612bc4565b6103cc612bef565b6103c2600480360360208110156108ab57600080fd5b50356001600160a01b0316612c4e565b6103cc600480360360408110156108d157600080fd5b506001600160a01b0381358116916020013516612cf9565b6103c2612d24565b6103646004803603602081101561090757600080fd5b50356001600160a01b0316612e8c565b6103cc612eed565b610380612ef7565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109b35780601f10610988576101008083540402835291602001916109b3565b820191906000526020600020905b81548152906001019060200180831161099657829003601f168201915b505050505090505b90565b60006109d26109cb612f39565b8484612f3d565b5060015b92915050565b60006109e6613029565b905090565b6109f3613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610a4857600080fd5b505afa158015610a5c573d6000803e3d6000fd5b505050506040513d6020811015610a7257600080fd5b505180610b045750610a82613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610ad757600080fd5b505afa158015610aeb573d6000803e3d6000fd5b505050506040513d6020811015610b0157600080fd5b50515b610b3f5760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6000610b59610b4c610bb5565b429063ffffffff61307916565b9050610b64816130da565b610b6d82613104565b604080516001600160a01b03841681526020810183905281517f7d5e1cfe55788983acd19d248da36a27c9413e8e43445ed36a76ae0e741a04ed929181900390910190a15050565b60006109e661312e565b610bc7613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610c1c57600080fd5b505afa158015610c30573d6000803e3d6000fd5b505050506040513d6020811015610c4657600080fd5b5051610c8a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610c9381613159565b610ca6610ca1610b4c6128ea565b613183565b50565b600054610100900460ff1680610cc25750610cc26131ad565b80610cd0575060005460ff16155b610d0b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015610d36576000805460ff1961ff0019909116610100171660011790555b8351610d4990606890602087019061415c565b508251610d5d90606990602086019061415c565b50606a805460ff191660ff84161790558015610d7f576000805461ff00191690555b50505050565b60355490565b600080610d966128f4565b6001600160a01b03161415610db457610dad612bef565b90506109bb565b6109e6610dbf6128f4565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610df757600080fd5b505afa158015610e0b573d6000803e3d6000fd5b505050506040513d6020811015610e2157600080fd5b5051610e2b612bef565b9063ffffffff61307916565b6000610e448484846131b3565b610eba84610e50612f39565b610eb5856040518060600160405280602881526020016143ab602891396001600160a01b038a16600090815260346020526040812090610e8e612f39565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61331116565b612f3d565b5060019392505050565b6000610ece610d85565b11610f16576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b60008111610f555760405162461bcd60e51b815260040180806020018281038252602581526020018061443b6025913960400191505060405180910390fd5b6000610f5f610d85565b9050610f6b33836133a8565b6000610f9582610f8985610f7d610d8b565b9063ffffffff6134a416565b9063ffffffff6134fd16565b9050610f9f612bef565b8111156110b3578183141561100d57610fb66128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ff057600080fd5b505af1158015611004573d6000803e3d6000fd5b50505050611090565b600061102761101a612bef565b839063ffffffff61353f16565b90506110316128f4565b6001600160a01b031663ce8c42e8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561107657600080fd5b505af115801561108a573d6000803e3d6000fd5b50505050505b6110b06110a383610f8986610f7d610d8b565b6110ab612bef565b613581565b90505b6110d633826110c0611aff565b6001600160a01b0316919063ffffffff61359716565b6110de612bc4565b1561113e576110eb6128f4565b6001600160a01b031663203971926040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561112557600080fd5b505af1158015611139573d6000803e3d6000fd5b505050505b60408051828152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b606a5460ff1690565b61118a613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156111df57600080fd5b505afa1580156111f3573d6000803e3d6000fd5b505050506040513d602081101561120957600080fd5b50518061129b5750611219613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d602081101561129857600080fd5b50515b6112d65760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6112df81612e8c565b61131a5760405162461bcd60e51b815260040180806020018281038252603a815260200180614401603a913960400191505060405180910390fd5b6001600160a01b038116611375576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b61137d611aff565b6001600160a01b0316816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156113bf57600080fd5b505afa1580156113d3573d6000803e3d6000fd5b505050506040513d60208110156113e957600080fd5b50516001600160a01b0316146114305760405162461bcd60e51b815260040180806020018281038252602f81526020018061435b602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561147357600080fd5b505afa158015611487573d6000803e3d6000fd5b505050506040513d602081101561149d57600080fd5b50516001600160a01b0316146114e45760405162461bcd60e51b815260040180806020018281038252602a8152602001806142a9602a913960400191505060405180910390fd5b7f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c58161150e6128f4565b604080516001600160a01b03938416815291909216602082015281519081900390910190a161153b6128f4565b6001600160a01b0316816001600160a01b03161461161b57600061155d6128f4565b6001600160a01b0316146115f1576115966115766128f4565b6000611580611aff565b6001600160a01b0316919063ffffffff6135ee16565b61159e6128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115d857600080fd5b505af11580156115ec573d6000803e3d6000fd5b505050505b6115fa81613701565b6116056115766128f4565b61161b6116106128f4565b600019611580611aff565b610ca6612d24565b333214806116b75750611634612ef7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561168957600080fd5b505afa15801561169d573d6000803e3d6000fd5b505050506040513d60208110156116b357600080fd5b5051155b6116f25760405162461bcd60e51b81526004018080602001828103825260288152602001806143336028913960400191505060405180910390fd5b6116fd82338361372b565b5050565b60006109d261170e612f39565b84610eb5856034600061171f612f39565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61307916565b600054610100900460ff168061176e575061176e6131ad565b8061177c575060005460ff16155b6117b75760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff161580156117e2576000805460ff1961ff0019909116610100171660011790555b6117eb8761393a565b6117f486613964565b6117fd8561398e565b611806846139b8565b61180f836139e2565b61181882613a0c565b61182260006130da565b61182c6000613104565b6118366000613a36565b6118406000613a60565b8015611852576000805461ff00191690555b50505050505050565b60006109e6613a8a565b600061186f6128f4565b6001600160a01b031614156118c6576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6118ce613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d602081101561194d57600080fd5b5051806119df575061195d613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119b257600080fd5b505afa1580156119c6573d6000803e3d6000fd5b505050506040513d60208110156119dc57600080fd5b50515b611a1a5760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b611a22613ab5565b611a2a6128f4565b6001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a6457600080fd5b505af1158015610d7f573d6000803e3d6000fd5b60006109e6613b72565b6000611a8c613054565b6001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b505afa158015611ad8573d6000803e3d6000fd5b505050506040513d6020811015611aee57600080fd5b5051905090565b60006109e6613b9d565b60006109e6613bc8565b6001600160a01b0381166000908152603360205260409020545b919050565b6000611b32610d85565b15611b5a57611b55611b42610d85565b610f89611b4d610d8b565b610f7d611a78565b6109e6565b6109e6611a78565b611b6a613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611bbf57600080fd5b505afa158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b505180611c7b5750611bf9613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c4e57600080fd5b505afa158015611c62573d6000803e3d6000fd5b505050506040513d6020811015611c7857600080fd5b50515b611cb65760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b611cbe611cd2565b611cc6613ab5565b565b60006109e6613bf3565b611cda613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611d2f57600080fd5b505afa158015611d43573d6000803e3d6000fd5b505050506040513d6020811015611d5957600080fd5b505180611deb5750611d69613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611dbe57600080fd5b505afa158015611dd2573d6000803e3d6000fd5b505050506040513d6020811015611de857600080fd5b50515b611e265760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b6000611e306128f4565b6001600160a01b03161415611e87576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b611e8f6128f4565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a6457600080fd5b6000611ed3610d85565b611edf57506000611b23565b6109d6611eea610d85565b610f89611ef685611b09565b610f7d610d8b565b600054610100900460ff1680611f175750611f176131ad565b80611f25575060005460ff16155b611f605760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015611f8b576000805460ff1961ff0019909116610100171660011790555b81831115611fe0576040805162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420696e76657374206d6f7265207468616e203130302500000000604482015290519081900360640190fd5b81612027576040805162461bcd60e51b8152602060048201526012602482015271063616e6e6f742064697669646520627920360741b604482015290519081900360640190fd5b6123c0846001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561206357600080fd5b505afa158015612077573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156120a057600080fd5b8101908080516040519392919084600160201b8211156120bf57600080fd5b9083019060208201858111156120d457600080fd5b8251600160201b8111828201881017156120ed57600080fd5b82525081516020918201929091019080838360005b8381101561211a578181015183820152602001612102565b50505050905090810190601f1680156121475780820380516001836020036101000a031916815260200191505b506040525050506040516020018080606960f81b81525060010182805190602001908083835b6020831061218c5780518252601f19909201916020918201910161216d565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052856001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156121f957600080fd5b505afa15801561220d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561223657600080fd5b8101908080516040519392919084600160201b82111561225557600080fd5b90830190602082018581111561226a57600080fd5b8251600160201b81118282018810171561228357600080fd5b82525081516020918201929091019080838360005b838110156122b0578181015183820152602001612298565b50505050905090810190601f1680156122dd5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080606960f81b81525060010182805190602001908083835b602083106123225780518252601f199092019160209182019101612303565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561238f57600080fd5b505afa1580156123a3573d6000803e3d6000fd5b505050506040513d60208110156123b957600080fd5b5051610ca9565b6123c985612c4e565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561240457600080fd5b505afa158015612418573d6000803e3d6000fd5b505050506040513d602081101561242e57600080fd5b505160ff16600a0a905061a8c08061244a878787868580611755565b505050801561245f576000805461ff00191690555b5050505050565b61246e613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156124c357600080fd5b505afa1580156124d7573d6000803e3d6000fd5b505050506040513d60208110156124ed57600080fd5b5051612531576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b03811661258c576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b610ca681613c1e565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109b35780601f10610988576101008083540402835291602001916109b3565b6125fe613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265357600080fd5b505afa158015612667573d6000803e3d6000fd5b505050506040513d602081101561267d57600080fd5b50516126c1576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6126cb6000613159565b611cc66000613183565b6000806126e0611cc8565b158015906126f457506126f1611cc8565b42115b8015612711575060006127056109dc565b6001600160a01b031614155b6127196109dc565b915091509091565b60006109d261272e612f39565b84610eb58560405180606001604052806025815260200161452a6025913960346000612758612f39565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61331116565b612797613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156127ec57600080fd5b505afa158015612800573d6000803e3d6000fd5b505050506040513d602081101561281657600080fd5b505161285a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116128995760405162461bcd60e51b81526004018080602001828103825260228152602001806142436022913960400191505060405180910390fd5b808211156128d85760405162461bcd60e51b815260040180806020018281038252603a8152602001806142d3603a913960400191505060405180910390fd5b6128e182613964565b6116fd8161398e565b60006109e6613c42565b60006109e6613c6d565b60006109d261290b612f39565b84846131b3565b60006109e6613c98565b60008061293561292a612eed565b610f89611ef661185b565b905060006129416128f4565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b505190508181106129b9576000925050506109bb565b60006129cb838363ffffffff61353f16565b90506129d5612bef565b8111156129e9576129e4612bef565b6129eb565b805b93505050506109bb565b6129fd613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612a5257600080fd5b505afa158015612a66573d6000803e3d6000fd5b505050506040513d6020811015612a7c57600080fd5b5051612ac0576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610ca67f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c764416082613cc3565b33321480612b7e5750612afb612ef7565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b5051155b612bb95760405162461bcd60e51b81526004018080602001828103825260288152602001806143336028913960400191505060405180910390fd5b610ca681333361372b565b60006109e67f158e3584387f31a4bfc2a994fe2a56ca1db54829287d1cf620c6cc66c7644160613cde565b6000612bf9611aff565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611ac457600080fd5b600054610100900460ff1680612c675750612c676131ad565b80612c75575060005460ff16155b612cb05760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015612cdb576000805460ff1961ff0019909116610100171660011790555b612ce482613cf2565b80156116fd576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b612d2c613054565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612d8157600080fd5b505afa158015612d95573d6000803e3d6000fd5b505050506040513d6020811015612dab57600080fd5b505180612e3d5750612dbb613054565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612e1057600080fd5b505afa158015612e24573d6000803e3d6000fd5b505050506040513d6020811015612e3a57600080fd5b50515b612e785760405162461bcd60e51b815260040180806020018281038252602b8152602001806141f5602b913960400191505060405180910390fd5b612e8260006130da565b611cc66000613104565b600080612e976128f4565b6001600160a01b031614806109d65750612eaf611af5565b6001600160a01b0316826001600160a01b0316148015612ed55750612ed2612912565b42115b80156109d657506000612ee6612912565b1192915050565b60006109e6613d88565b6000612f01613054565b6001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b3390565b6001600160a01b038316612f825760405162461bcd60e51b81526004018080602001828103825260248152602001806144a66024913960400191505060405180910390fd5b6001600160a01b038216612fc75760405162461bcd60e51b81526004018080602001828103825260228152602001806142876022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006109e67fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df613daf565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc5490565b6000828201838110156130d3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610ca67f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e7282613db3565b610ca67fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc859061082613db3565b60006109e67f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b613daf565b610ca67fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df82613db3565b610ca67f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c982613db3565b303b1590565b6001600160a01b0383166131f85760405162461bcd60e51b81526004018080602001828103825260258152602001806144816025913960400191505060405180910390fd5b6001600160a01b03821661323d5760405162461bcd60e51b81526004018080602001828103825260238152602001806142206023913960400191505060405180910390fd5b6132808160405180606001604052806026815260200161430d602691396001600160a01b038616600090815260336020526040902054919063ffffffff61331116565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546132b5908263ffffffff61307916565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156133a05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561336557818101518382015260200161334d565b50505050905090810190601f1680156133925780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166133ed5760405162461bcd60e51b81526004018080602001828103825260218152602001806144606021913960400191505060405180910390fd5b61343081604051806060016040528060228152602001614265602291396001600160a01b038516600090815260336020526040902054919063ffffffff61331116565b6001600160a01b03831660009081526033602052604090205560355461345c908263ffffffff61353f16565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826134b3575060006109d6565b828202828482816134c057fe5b04146130d35760405162461bcd60e51b815260040180806020018281038252602181526020018061438a6021913960400191505060405180910390fd5b60006130d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613db7565b60006130d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613311565b600081831061359057816130d3565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526135e9908490613e1c565b505050565b801580613674575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561364657600080fd5b505afa15801561365a573d6000803e3d6000fd5b505050506040513d602081101561367057600080fd5b5051155b6136af5760405162461bcd60e51b81526004018080602001828103825260368152602001806144f46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526135e9908490613e1c565b610ca67ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea82613db3565b60008311613773576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b0381166137c7576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b60006137d16128f4565b6001600160a01b03161461388b576137e76128f4565b6001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561381f57600080fd5b505afa158015613833573d6000803e3d6000fd5b505050506040513d602081101561384957600080fd5b505161388b576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b6000613895610d85565b156138c2576138bd6138a5610d8b565b610f896138b0610d85565b879063ffffffff6134a416565b6138c4565b835b90506138d08282613fd4565b6138f58330866138de611aff565b6001600160a01b031692919063ffffffff6140c616565b6040805185815290516001600160a01b038416917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b610ca67f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a737182613db3565b610ca67f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a82613db3565b610ca67f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed3230882613db3565b610ca67fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff82613db3565b610ca67f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf082613db3565b610ca67f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b82613db3565b610ca67f22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed82613cc3565b610ca67f4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a7982613cc3565b60006109e67f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a613daf565b6000613abf6128f4565b6001600160a01b03161415613b16576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b6000613b2061291c565b90508015610ca657613b3c613b336128f4565b826110c0611aff565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b60006109e67fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff613daf565b60006109e67fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc8590610613daf565b60006109e67f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371613daf565b60006109e67f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9613daf565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc55565b60006109e67f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf0613daf565b60006109e67ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea613daf565b60006109e67f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e72613daf565b6116fd8282613cd3576000613cd6565b60015b60ff16613db3565b6000613ce982613daf565b60011492915050565b600054610100900460ff1680613d0b5750613d0b6131ad565b80613d19575060005460ff16155b613d545760405162461bcd60e51b815260040180806020018281038252602e8152602001806143d3602e913960400191505060405180910390fd5b600054610100900460ff16158015613d7f576000805460ff1961ff0019909116610100171660011790555b612ce482613c1e565b60006109e67f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed323085b5490565b9055565b60008183613e065760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561336557818101518382015260200161334d565b506000838581613e1257fe5b0495945050505050565b613e2e826001600160a01b0316614120565b613e7f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613ebd5780518252601f199092019160209182019101613e9e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f1f576040519150601f19603f3d011682016040523d82523d6000602084013e613f24565b606091505b509150915081613f7b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610d7f57808060200190516020811015613f9757600080fd5b5051610d7f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806144ca602a913960400191505060405180910390fd5b6001600160a01b03821661402f576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b603554614042908263ffffffff61307916565b6035556001600160a01b03821660009081526033602052604090205461406e908263ffffffff61307916565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d7f908590613e1c565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061415457508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061419d57805160ff19168380011785556141ca565b828001600101855582156141ca579182015b828111156141ca5782518255916020019190600101906141af565b506141d69291506141da565b5090565b6109bb91905b808211156141d657600081556001016141e056fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737374686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7464656e6f6d696e61746f72206d7573742062652067726561746572207468616e206f7220657175616c20746f20746865206e756d657261746f7245524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645468652073747261746567792065786973747320616e64207377697463682074696d656c6f636b20646964206e6f7420656c61707365207965746e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820a7e08d6be18da9085daf733e25e4c3e4b5ce8a48f9dc5f103fc011429fe4ae1c64736f6c63430005100032
Deployed Bytecode Sourcemap
46116:12557:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46116:12557:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28771:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28771:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22214:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22214:152:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;48546:100;;;:::i;:::-;;;;-1:-1:-1;;;;;48546:100:0;;;;;;;;;;;;;;52122:301;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52122:301:0;-1:-1:-1;;;;;52122:301:0;;:::i;:::-;;51336:97;;;:::i;:::-;;;;;;;;;;;;;;;;58062:188;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58062:188:0;-1:-1:-1;;;;;58062:188:0;;:::i;28515:186::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28515:186:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;28515:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28515:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;28515:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28515:186:0;;;;;;;;-1:-1:-1;28515:186:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;28515:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28515:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;28515:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28515:186:0;;-1:-1:-1;;;28515:186:0;;;;;-1:-1:-1;28515:186:0;;-1:-1:-1;28515:186:0:i;21235:91::-;;;:::i;50274:307::-;;;:::i;22838:304::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22838:304:0;;;;;;;;;;;;;;;;;:::i;55854:1457::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55854:1457:0;;:::i;29623:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52661:1045;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52661:1045:0;-1:-1:-1;;;;;52661:1045:0;;:::i;55594:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55594:116:0;;;;;;-1:-1:-1;;;;;55594:116:0;;:::i;23551:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23551:210:0;;;;;;;;:::i;41000:716::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;41000:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48282:124::-;;;:::i;49714:187::-;;;:::i;48184:92::-;;;:::i;36685:104::-;;;:::i;51130:93::-;;;:::i;48094:84::-;;;:::i;21389:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21389:110:0;-1:-1:-1;;;;;21389:110:0;;:::i;50587:214::-;;;:::i;54101:98::-;;;:::i;48652:118::-;;;:::i;55716:132::-;;;:::i;50856:268::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50856:268:0;-1:-1:-1;;;;;50856:268:0;;:::i;47012:990::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;47012:990:0;;;;;;;;;;;;;;;;;;;;;;:::i;36314:160::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36314:160:0;-1:-1:-1;;;;;36314:160:0;;:::i;28973:87::-;;;:::i;58531:139::-;;;:::i;58256:269::-;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;58256:269:0;;;;;;;;;;;;;;;;24264:261;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24264:261:0;;;;;;;;:::i;53712:383::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53712:383:0;;;;;;;:::i;48776:110::-;;;:::i;48008:80::-;;;:::i;21712:158::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21712:158:0;;;;;;;;:::i;51229:101::-;;;:::i;54205:710::-;;;:::i;51586:138::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51586:138:0;;;;:::i;55301:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55301:103:0;;:::i;51461:121::-;;;:::i;49984:131::-;;;:::i;37029:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37029:105:0;-1:-1:-1;;;;;37029:105:0;;:::i;21933:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21933:134:0;;;;;;;;;;:::i;52512:143::-;;;:::i;51730:307::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51730:307:0;-1:-1:-1;;;;;51730:307:0;;:::i;48412:128::-;;;:::i;37487:104::-;;;:::i;28771:83::-;28841:5;28834:12;;;;;;;;-1:-1:-1;;28834:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28808:13;;28834:12;;28841:5;;28834:12;;28841:5;28834:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28771:83;;:::o;22214:152::-;22280:4;22297:39;22306:12;:10;:12::i;:::-;22320:7;22329:6;22297:8;:39::i;:::-;-1:-1:-1;22354:4:0;22214:152;;;;;:::o;48546:100::-;48596:7;48619:21;:19;:21::i;:::-;48612:28;;48546:100;:::o;52122:301::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52246:12;52261:39;52281:18;:16;:18::i;:::-;52261:15;;:39;:19;:39;:::i;:::-;52246:54;;52307:28;52330:4;52307:22;:28::i;:::-;52342:29;52361:9;52342:18;:29::i;:::-;52383:34;;;-1:-1:-1;;;;;52383:34:0;;;;;;;;;;;;;;;;;;;;;;;37474:1;52122:301;:::o;51336:97::-;51385:7;51408:19;:17;:19::i;58062:188::-;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;58130:28;58153:4;58130:22;:28::i;:::-;58165:79;58197:46;58217:25;:23;:25::i;58197:46::-;58165:31;:79::i;:::-;58062:188;:::o;28515:186::-;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;28623:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;28646:16:0;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;28673:9:0;:20;;-1:-1:-1;;28673:20:0;;;;;;;17636:57;;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;17636:57;28515:186;;;;:::o;21235:91::-;21306:12;;21235:91;:::o;50274:307::-;50338:7;;50366:10;:8;:10::i;:::-;-1:-1:-1;;;;;50358:33:0;;50354:127;;;50447:26;:24;:26::i;:::-;50440:33;;;;50354:127;50494:81;50535:10;:8;:10::i;:::-;-1:-1:-1;;;;;50525:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50525:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50525:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50525:49:0;50494:26;:24;:26::i;:::-;:30;:81;:30;:81;:::i;22838:304::-;22927:4;22944:36;22954:6;22962:9;22973:6;22944:9;:36::i;:::-;22991:121;23000:6;23008:12;:10;:12::i;:::-;23022:89;23060:6;23022:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23022:19:0;;;;;;:11;:19;;;;;;23042:12;:10;:12::i;:::-;-1:-1:-1;;;;;23022:33:0;;;;;;;;;;;;-1:-1:-1;23022:33:0;;;:89;;:37;:89;:::i;:::-;22991:8;:121::i;:::-;-1:-1:-1;23130:4:0;22838:304;;;;;:::o;55854:1457::-;55936:1;55920:13;:11;:13::i;:::-;:17;55912:49;;;;;-1:-1:-1;;;55912:49:0;;;;;;;;;;;;-1:-1:-1;;;55912:49:0;;;;;;;;;;;;;;;55993:1;55976:14;:18;55968:68;;;;-1:-1:-1;;;55968:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56043:19;56065:13;:11;:13::i;:::-;56043:35;;56085:33;56091:10;56103:14;56085:5;:33::i;:::-;56127:34;56164:90;56242:11;56164:63;56212:14;56164:33;:31;:33::i;:::-;:47;:63;:47;:63;:::i;:::-;:77;:90;:77;:90;:::i;:::-;56127:127;;56294:26;:24;:26::i;:::-;56265;:55;56261:631;;;56437:11;56419:14;:29;56415:258;;;56471:10;:8;:10::i;:::-;-1:-1:-1;;;;;56461:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56461:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56461:42:0;;;;56415:258;;;56530:15;56548:58;56579:26;:24;:26::i;:::-;56548;;:58;:30;:58;:::i;:::-;56530:76;;56627:10;:8;:10::i;:::-;-1:-1:-1;;;;;56617:37:0;;56655:7;56617:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56617:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56617:46:0;;;;56415:258;;56752:132;56761:94;56843:11;56761:65;56811:14;56761:33;:31;:33::i;:94::-;56857:26;:24;:26::i;:::-;56752:8;:132::i;:::-;56723:161;;56261:631;56900:73;56934:10;56946:26;56907:12;:10;:12::i;:::-;-1:-1:-1;;;;;56900:33:0;;:73;;:33;:73;:::i;:::-;57101:25;:23;:25::i;:::-;57097:95;;;57152:10;:8;:10::i;:::-;-1:-1:-1;;;;;57137:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57137:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57137:47:0;;;;57097:95;57257:48;;;;;;;;57266:10;;57257:48;;;;;;;;;;55854:1457;;;:::o;29623:83::-;29689:9;;;;29623:83;:::o;52661:1045::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52750:28;52768:9;52750:17;:28::i;:::-;52742:106;;;;-1:-1:-1;;;52742:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52863:23:0;;52855:65;;;;;-1:-1:-1;;;52855:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52980:12;:10;:12::i;:::-;-1:-1:-1;;;;;52935:58:0;52945:9;-1:-1:-1;;;;;52935:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52935:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52935:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52935:33:0;-1:-1:-1;;;;;52935:58:0;;52927:118;;;;-1:-1:-1;;;52927:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53100:4;-1:-1:-1;;;;;53060:45:0;53070:9;-1:-1:-1;;;;;53060:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53060:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53060:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53060:28:0;-1:-1:-1;;;;;53060:45:0;;53052:100;;;;-1:-1:-1;;;53052:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53166:38;53182:9;53193:10;:8;:10::i;:::-;53166:38;;;-1:-1:-1;;;;;53166:38:0;;;;;;;;;;;;;;;;;;;;;;;;53245:10;:8;:10::i;:::-;-1:-1:-1;;;;;53215:41:0;53223:9;-1:-1:-1;;;;;53215:41:0;;53211:459;;53302:1;53279:10;:8;:10::i;:::-;-1:-1:-1;;;;;53271:33:0;;53267:224;;53372:56;53413:10;:8;:10::i;:::-;53426:1;53379:12;:10;:12::i;:::-;-1:-1:-1;;;;;53372:32:0;;:56;;:32;:56;:::i;:::-;53449:10;:8;:10::i;:::-;-1:-1:-1;;;;;53439:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53439:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53439:42:0;;;;53267:224;53499:23;53512:9;53499:12;:23::i;:::-;53531:56;53572:10;:8;:10::i;53531:56::-;53596:66;53637:10;:8;:10::i;:::-;-1:-1:-1;;53603:12:0;:10;:12::i;53596:66::-;53676:24;:22;:24::i;55594:116::-;49124:10;49138:9;49124:23;;49123:233;;;49322:12;:10;:12::i;:::-;-1:-1:-1;;;;;49310:34:0;;49345:10;49310:46;;;;;;;;;;;;;-1:-1:-1;;;;;49310:46:0;-1:-1:-1;;;;;49310:46:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49310:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49310:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49310:46:0;49309:47;49123:233;49107:388;;;;-1:-1:-1;;;49107:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55668:36;55677:6;55685:10;55697:6;55668:8;:36::i;:::-;55594:116;;:::o;23551:210::-;23631:4;23648:83;23657:12;:10;:12::i;:::-;23671:7;23680:50;23719:10;23680:11;:25;23692:12;:10;:12::i;:::-;-1:-1:-1;;;;;23680:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;23680:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;41000:716::-;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;41251:27;41266:11;41251:14;:27::i;:::-;41285:54;41320:18;41285:34;:54::i;:::-;41346:58;41383:20;41346:36;:58::i;:::-;41411:35;41430:15;41411:18;:35::i;:::-;41453:55;41481:26;41453:27;:55::i;:::-;41515:42;41536:20;41515;:42::i;:::-;41564:25;41587:1;41564:22;:25::i;:::-;41596:30;41623:1;41596:18;:30::i;:::-;41633:34;41661:5;41633:27;:34::i;:::-;41674:36;41704:5;41674:29;:36::i;:::-;17640:14;17636:57;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;17636:57;41000:716;;;;;;;:::o;48282:124::-;48344:7;48367:33;:31;:33::i;49714:187::-;48969:1;48946:10;:8;:10::i;:::-;-1:-1:-1;;;;;48938:33:0;;;48930:70;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;;;;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49846:8;:6;:8::i;:::-;49871:10;:8;:10::i;:::-;-1:-1:-1;;;;;49861:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49861:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;48184:92:0;48230:7;48253:17;:15;:17::i;36685:104::-;36728:7;36759:10;:8;:10::i;:::-;-1:-1:-1;;;;;36751:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36751:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36751:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36751:32:0;;-1:-1:-1;36685:104:0;:::o;51130:93::-;51177:7;51200:17;:15;:17::i;48094:84::-;48136:7;48159:13;:11;:13::i;21389:110::-;-1:-1:-1;;;;;21473:18:0;;21446:7;21473:18;;;:9;:18;;;;;;21389:110;;;;:::o;50587:214::-;50640:7;50663:13;:11;:13::i;:::-;:18;:132;;50721:74;50781:13;:11;:13::i;:::-;50721:55;50742:33;:31;:33::i;:::-;50721:16;:14;:16::i;:74::-;50663:132;;;50693:16;:14;:16::i;54101:98::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54165:13;:11;:13::i;:::-;54185:8;:6;:8::i;:::-;54101:98::o;48652:118::-;48711:7;48734:30;:28;:30::i;55716:132::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48969:1;48946:10;:8;:10::i;:::-;-1:-1:-1;;;;;48938:33:0;;;48930:70;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;;;;55810:10;:8;:10::i;:::-;-1:-1:-1;;;;;55800:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;50856:268:0;50945:7;50965:13;:11;:13::i;:::-;50961:49;;-1:-1:-1;51001:1:0;50994:8;;50961:49;51023:95;51104:13;:11;:13::i;:::-;51023:66;51071:17;51081:6;51071:9;:17::i;:::-;51023:33;:31;:33::i;47012:990::-;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;47209:20;47187:18;:42;;47179:83;;;;;-1:-1:-1;;;47179:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47277:25;47269:56;;;;;-1:-1:-1;;;47269:56:0;;;;;;;;;;;;-1:-1:-1;;;47269:56:0;;;;;;;;;;;;;;;47334:227;47410:11;-1:-1:-1;;;;;47396:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47396:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47396:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;47396:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;47396:35:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;47396:35:0;;420:4:-1;411:14;;;;47396:35:0;;;;;411:14:-1;47396:35:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;47396:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47374:58;;;;;;-1:-1:-1;;;47374:58:0;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47374:58:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47374:58:0;;;47485:11;-1:-1:-1;;;;;47471:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47471:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47471:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;47471:35:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;47471:35:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;47471:35:0;;420:4:-1;411:14;;;;47471:35:0;;;;;411:14:-1;47471:35:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;47471:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47449:58;;;;;;-1:-1:-1;;;47449:58:0;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;47449:58:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47449:58:0;;;47531:11;-1:-1:-1;;;;;47517:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47517:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47517:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47517:37:0;47334:24;:227::i;:::-;47568:51;47604:8;47568:27;:51::i;:::-;47628:22;47689:11;-1:-1:-1;;;;;47667:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47667:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47667:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47667:46:0;47659:55;;47653:2;:61;;-1:-1:-1;47751:8:0;;47811:185;47843:11;47863:18;47890:20;47653:61;47751:8;;47811:23;:185::i;:::-;17626:1;;;17640:14;17636:57;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;17636:57;47012:990;;;;;:::o;36314:160::-;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36387:20:0;;36379:63;;;;;-1:-1:-1;;;36379:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36449:19;36461:6;36449:11;:19::i;28973:87::-;29045:7;29038:14;;;;;;;;-1:-1:-1;;29038:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29012:13;;29038:14;;29045:7;;29038:14;;29045:7;29038:14;;;;;;;;;;;;;;;;;;;;;;;;58531:139;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;58589:34;58620:1;58589:22;:34::i;:::-;58630;58662:1;58630:31;:34::i;58256:269::-;58304:4;58310:7;58342:29;:27;:29::i;:::-;:34;;;;:94;;;58407:29;:27;:29::i;:::-;58389:15;:47;58342:94;:141;;;;-1:-1:-1;58481:1:0;58449:20;:18;:20::i;:::-;-1:-1:-1;;;;;58449:34:0;;;58342:141;58492:20;:18;:20::i;:::-;58326:193;;;;58256:269;;:::o;24264:261::-;24349:4;24366:129;24375:12;:10;:12::i;:::-;24389:7;24398:96;24437:15;24398:96;;;;;;;;;;;;;;;;;:11;:25;24410:12;:10;:12::i;:::-;-1:-1:-1;;;;;24398:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;24398:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;53712:383::-;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;53839:1;53825:11;:15;53817:62;;;;-1:-1:-1;;;53817:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53907:11;53894:9;:24;;53886:95;;;;-1:-1:-1;;;53886:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53988:45;54023:9;53988:34;:45::i;:::-;54040:49;54077:11;54040:36;:49::i;48776:110::-;48831:7;48854:26;:24;:26::i;48008:80::-;48048:7;48071:11;:9;:11::i;21712:158::-;21781:4;21798:42;21808:12;:10;:12::i;:::-;21822:9;21833:6;21798:9;:42::i;51229:101::-;51280:7;51303:21;:19;:21::i;54205:710::-;54258:7;54274:25;54302:131;54398:34;:32;:34::i;:::-;54302:81;54350:32;:30;:32::i;54302:131::-;54274:159;;54440:23;54476:10;:8;:10::i;:::-;-1:-1:-1;;;;;54466:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54466:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54466:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54466:49:0;;-1:-1:-1;54526:36:0;;;54522:388;;54580:1;54573:8;;;;;;54522:388;54604:25;54632:38;:17;54654:15;54632:38;:21;:38;:::i;:::-;54604:66;;54707:26;:24;:26::i;:::-;54686:17;:47;;:216;;54876:26;:24;:26::i;:::-;54686:216;;;54856:17;54686:216;54679:223;;;;;;;51586:138;35812:10;:8;:10::i;:::-;-1:-1:-1;;;;;35804:32:0;;35837:10;35804:44;;;;;;;;;;;;;-1:-1:-1;;;;;35804:44:0;-1:-1:-1;;;;;35804:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35804:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35804:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35804:44:0;35796:71;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;-1:-1:-1;;;35796:71:0;;;;;;;;;;;;;;;51671:47;46685:66;51711:6;51671:10;:47::i;55301:103::-;49124:10;49138:9;49124:23;;49123:233;;;49322:12;:10;:12::i;:::-;-1:-1:-1;;;;;49310:34:0;;49345:10;49310:46;;;;;;;;;;;;;-1:-1:-1;;;;;49310:46:0;-1:-1:-1;;;;;49310:46:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49310:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49310:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49310:46:0;49309:47;49123:233;49107:388;;;;-1:-1:-1;;;49107:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55358:40;55367:6;55375:10;55387;55358:8;:40::i;51461:121::-;51517:4;51537:39;46685:66;51537:10;:39::i;49984:131::-;50041:7;50071:12;:10;:12::i;:::-;-1:-1:-1;;;;;50064:30:0;;50103:4;50064:45;;;;;;;;;;;;;-1:-1:-1;;;;;50064:45:0;-1:-1:-1;;;;;50064:45:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;37029:105:0;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;37093:35;37119:8;37093:25;:35::i;:::-;17640:14;17636:57;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;37029:105;;:::o;21933:134::-;-1:-1:-1;;;;;22032:18:0;;;22005:7;22032:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21933:134::o;52512:143::-;37327:10;:8;:10::i;:::-;-1:-1:-1;;;;;37319:32:0;;37352:10;37319:44;;;;;;;;;;;;;-1:-1:-1;;;;;37319:44:0;-1:-1:-1;;;;;37319:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37319:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37319:44:0;;:92;;;37375:10;:8;:10::i;:::-;-1:-1:-1;;;;;37367:32:0;;37400:10;37367:44;;;;;;;;;;;;;-1:-1:-1;;;;;37367:44:0;-1:-1:-1;;;;;37367:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37367:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37367:44:0;37319:92;37310:157;;;;-1:-1:-1;;;37310:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52587:25;52610:1;52587:22;:25::i;:::-;52619:30;52646:1;52619:18;:30::i;51730:307::-;51796:4;;51816:10;:8;:10::i;:::-;-1:-1:-1;;;;;51816:24:0;;:185;;;;51892:16;:14;:16::i;:::-;-1:-1:-1;;;;;51879:29:0;:9;-1:-1:-1;;;;;51879:29:0;;:82;;;;;51941:20;:18;:20::i;:::-;51923:15;:38;51879:82;:121;;;;;51999:1;51976:20;:18;:20::i;:::-;:24;;51730:307;-1:-1:-1;;51730:307:0:o;48412:128::-;48476:7;48499:35;:33;:35::i;37487:104::-;37530:7;37561:10;:8;:10::i;:::-;-1:-1:-1;;;;;37553:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;19282:98:0;19362:10;19282:98;:::o;27195:338::-;-1:-1:-1;;;;;27289:19:0;;27281:68;;;;-1:-1:-1;;;27281:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27368:21:0;;27360:68;;;;-1:-1:-1;;;27360:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27441:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;27493:32;;;;;;;;;;;;;;;;;27195:338;;;:::o;43650:120::-;43704:7;43727:37;38399:66;43727:10;:37::i;36480:199::-;35690:66;36656:11;;36640:34::o;1816:181::-;1874:7;1906:5;;;1930:6;;;;1922:46;;;;;-1:-1:-1;;;1922:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1988:1;1816:181;-1:-1:-1;;;1816:181:0:o;44802:116::-;44866:46;39036:66;44905:6;44866:10;:46::i;44571:107::-;44631:41;38910:66;44665:6;44631:10;:41::i;44448:117::-;44500:7;44523:36;38789:66;44523:10;:36::i;43525:119::-;43591:47;38399:66;43629:8;43591:10;:47::i;43776:134::-;43849:55;38534:66;43897:6;43849:10;:55::i;17787:476::-;18227:7;18215:20;18250:7;17787:476;:::o;25015:471::-;-1:-1:-1;;;;;25113:20:0;;25105:70;;;;-1:-1:-1;;;25105:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25194:23:0;;25186:71;;;;-1:-1:-1;;;25186:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25290;25312:6;25290:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25290:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;25270:17:0;;;;;;;:9;:17;;;;;;:91;;;;25395:20;;;;;;;:32;;25420:6;25395:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;25372:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;25443:35;;;;;;;25372:20;;25443:35;;;;;;;;;;;;;25015:471;;;:::o;2745:192::-;2831:7;2867:12;2859:6;;;;2851:29;;;;-1:-1:-1;;;2851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2903:5:0;;;2745:192::o;26407:348::-;-1:-1:-1;;;;;26483:21:0;;26475:67;;;;-1:-1:-1;;;26475:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26576:68;26599:6;26576:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26576:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;26555:18:0;;;;;;:9;:18;;;;;:89;26670:12;;:24;;26687:6;26670:24;:16;:24;:::i;:::-;26655:12;:39;26710:37;;;;;;;;26736:1;;-1:-1:-1;;;;;26710:37:0;;;;;;;;;;;;26407:348;;:::o;3188:471::-;3246:7;3491:6;3487:47;;-1:-1:-1;3521:1:0;3514:8;;3487:47;3558:5;;;3562:1;3558;:5;:1;3582:5;;;;;:10;3574:56;;;;-1:-1:-1;;;3574:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4127:132;4185:7;4212:39;4216:1;4219;4212:39;;;;;;;;;;;;;;;;;:3;:39::i;2272:136::-;2330:7;2357:43;2361:1;2364;2357:43;;;;;;;;;;;;;;;;;:3;:43::i;451:106::-;509:7;540:1;536;:5;:13;;548:1;536:13;;;-1:-1:-1;544:1:0;;451:106;-1:-1:-1;451:106:0:o;13108:176::-;13217:58;;;-1:-1:-1;;;;;13217:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13217:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13191:85:0;;13210:5;;13191:18;:85::i;:::-;13108:176;;;:::o;13504:621::-;13874:10;;;13873:62;;-1:-1:-1;13890:39:0;;;-1:-1:-1;;;13890:39:0;;13914:4;13890:39;;;;-1:-1:-1;;;;;13890:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;13890:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13890:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13890:39:0;:44;13873:62;13865:152;;;;-1:-1:-1;;;13865:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14054:62;;;-1:-1:-1;;;;;14054:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14054:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;14028:89:0;;14047:5;;14028:18;:89::i;41722:98::-;41778:36;37755:66;41805:8;41778:10;:36::i;57317:676::-;57421:1;57412:6;:10;57404:39;;;;;-1:-1:-1;;;57404:39:0;;;;;;;;;;;;-1:-1:-1;;;57404:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57458:25:0;;57450:60;;;;;-1:-1:-1;;;57450:60:0;;;;;;;;;;;;-1:-1:-1;;;57450:60:0;;;;;;;;;;;;;;;57554:1;57531:10;:8;:10::i;:::-;-1:-1:-1;;;;;57523:33:0;;57519:120;;57585:10;:8;:10::i;:::-;-1:-1:-1;;;;;57575:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57575:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57575:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57575:39:0;57567:64;;;;;-1:-1:-1;;;57567:64:0;;;;;;;;;;;;-1:-1:-1;;;57567:64:0;;;;;;;;;;;;;;;57647:14;57664:13;:11;:13::i;:::-;:18;:112;;57712:64;57742:33;:31;:33::i;:::-;57712:25;57723:13;:11;:13::i;:::-;57712:6;;:25;:10;:25;:::i;:64::-;57664:112;;;57694:6;57664:112;57647:129;;57783:26;57789:11;57802:6;57783:5;:26::i;:::-;57818:68;57856:6;57872:4;57879:6;57825:12;:10;:12::i;:::-;-1:-1:-1;;;;;57818:37:0;;:68;;;:37;:68;:::i;:::-;57959:28;;;;;;;;-1:-1:-1;;;;;57959:28:0;;;;;;;;;;;;;57317:676;;;;:::o;41931:102::-;41989:38;37871:66;42018:8;41989:10;:38::i;42379:142::-;42455:60;38132:66;42508:6;42455:10;:60::i;42680:146::-;42758:62;38274:66;42813:6;42758:10;:62::i;42148:107::-;42208:41;37992:66;42242:6;42208:10;:41::i;44061:126::-;44130:51;38665:66;44174:6;44130:10;:51::i;44330:112::-;44392:44;38789:66;44429:6;44392:10;:44::i;42989:124::-;43055:52;39168:66;43100:6;43055:10;:52::i;43254:127::-;43322:53;39301:66;43368:6;43322:10;:53::i;42527:147::-;42593:7;42616:52;38132:66;42616:10;:52::i;54921:264::-;48969:1;48946:10;:8;:10::i;:::-;-1:-1:-1;;;;;48938:33:0;;;48930:70;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;-1:-1:-1;;;48930:70:0;;;;;;;;;;;;;;;54975:23;55001:22;:20;:22::i;:::-;54975:48;-1:-1:-1;55034:19:0;;55030:150;;55064:71;55106:10;:8;:10::i;:::-;55119:15;55071:12;:10;:12::i;55064:71::-;55149:23;;;;;;;;;;;;;;;;;49007:1;54921:264::o;42261:112::-;42311:7;42334:33;37992:66;42334:10;:33::i;44684:112::-;44734:7;44757:33;38910:66;44757:10;:33::i;42039:103::-;42085:7;42108:28;37871:66;42108:10;:28::i;43916:139::-;43979:7;44002:47;38534:66;44002:10;:47::i;36110:198::-;35690:66;36272:24;36263:40::o;44193:131::-;44252:7;44275:43;38665:66;44275:10;:43::i;41826:99::-;41870:7;41893:26;37755:66;41893:10;:26::i;44924:121::-;44978:7;45001:38;39036:66;45001:10;:38::i;45051:101::-;45114:32;45125:4;45131:6;:14;;45144:1;45131:14;;;45140:1;45131:14;45114:32;;:10;:32::i;45158:106::-;45215:4;45236:16;45247:4;45236:10;:16::i;:::-;45256:1;45236:21;;45158:106;-1:-1:-1;;45158:106:0:o;36017:87::-;17386:12;;;;;;;;:31;;;17402:15;:13;:15::i;:::-;17386:47;;;-1:-1:-1;17422:11:0;;;;17421:12;17386:47;17378:106;;;;-1:-1:-1;;;17378:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:19;17516:12;;;;;;17515:13;17535:83;;;;17564:12;:19;;-1:-1:-1;;;;17564:19:0;;;;;17592:18;17579:4;17592:18;;;17535:83;36079:19;36091:6;36079:11;:19::i;42832:151::-;42900:7;42923:54;38274:66;45622:177;45776:11;;45760:34::o;45448:168::-;45584:20;;45575:36::o;4789:345::-;4875:7;4977:12;4970:5;4962:28;;;;-1:-1:-1;;;4962:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4962:28:0;;5001:9;5017:1;5013;:5;;;;;;;4789:345;-1:-1:-1;;;;;4789:345:0:o;15147:1114::-;15751:27;15759:5;-1:-1:-1;;;;;15751:25:0;;:27::i;:::-;15743:71;;;;;-1:-1:-1;;;15743:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15888:12;15902:23;15937:5;-1:-1:-1;;;;;15929:19:0;15949:4;15929:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15929:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15887:67:0;;;;15973:7;15965:52;;;;;-1:-1:-1;;;15965:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16034:17;;:21;16030:224;;16176:10;16165:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16165:30:0;16157:85;;;;-1:-1:-1;;;16157:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25767:308;-1:-1:-1;;;;;25843:21:0;;25835:65;;;;;-1:-1:-1;;;25835:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25928:12;;:24;;25945:6;25928:24;:16;:24;:::i;:::-;25913:12;:39;-1:-1:-1;;;;;25984:18:0;;;;;;:9;:18;;;;;;:30;;26007:6;25984:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;25963:18:0;;;;;;:9;:18;;;;;;;;:51;;;;26030:37;;;;;;;25963:18;;;;26030:37;;;;;;;;;;25767:308;;:::o;13292:204::-;13419:68;;;-1:-1:-1;;;;;13419:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13419:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13393:95:0;;13412:5;;13393:18;:95::i;10110:619::-;10170:4;10638:20;;10481:66;10678:23;;;;;;:42;;-1:-1:-1;10705:15:0;;;10678:42;10670:51;10110:619;-1:-1:-1;;;;10110:619:0:o;46116:12557::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46116:12557:0;;;-1:-1:-1;46116:12557:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://a7e08d6be18da9085daf733e25e4c3e4b5ce8a48f9dc5f103fc011429fe4ae1c
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.