Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 17187038 | 564 days ago | IN | 0 ETH | 0.00495452 | ||||
Deposit | 17170430 | 566 days ago | IN | 0 ETH | 0.00579112 | ||||
Deposit | 14889297 | 900 days ago | IN | 0 ETH | 0.00382186 | ||||
Deposit | 14889114 | 900 days ago | IN | 0 ETH | 0.00226477 | ||||
Initialize Vault | 11881601 | 1369 days ago | IN | 0 ETH | 0.06365143 | ||||
Approve | 11661487 | 1402 days ago | IN | 0 ETH | 0.0022504 | ||||
Approve | 11661406 | 1402 days ago | IN | 0 ETH | 0.00296314 | ||||
0x60806040 | 10997712 | 1504 days ago | IN | 0 ETH | 0.38277151 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Vault
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-05 */ // 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/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) 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/IVault.sol pragma solidity 0.5.16; interface IVault { function underlyingBalanceInVault() external view returns (uint256); function underlyingBalanceWithInvestment() external view returns (uint256); 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; function rebalance() external; } // File: contracts/hardworkInterface/IUpgradeSource.sol pragma solidity 0.5.16; interface IUpgradeSource { function shouldUpgrade() external view returns (bool, address); function finalizeUpgrade() 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; 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)); } 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)); } 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 _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 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/Vault.sol pragma solidity 0.5.16; contract Vault 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); constructor() public { } // 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("FARM_", ERC20Detailed(_underlying).symbol())), string(abi.encodePacked("f", 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(); } 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); // 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
[{"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":"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":"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
60806040523480156200001157600080fd5b50604080517f656970313936372e676f7665726e61626c65496e69742e73746f7261676500008152905190819003601e0190207fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc600019909101146200007357fe5b604080517f656970313936372e7661756c7453746f726167652e73747261746567790000008152905190819003601d0190207ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea60001990910114620000d457fe5b604080517f656970313936372e7661756c7453746f726167652e756e6465726c79696e67008152905190819003601f0190207f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371600019909101146200013557fe5b6001604051808062004847602391396023019050604051809103902060001c0360001b7fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff60001b146200018457fe5b6001604051808062004737603391396033019050604051809103902060001c0360001b7f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a60001b14620001d357fe5b600160405180806200479a603591396035019050604051809103902060001c0360001b7f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed3230860001b146200022257fe5b600160405180806200486a602791396027019050604051809103902060001c0360001b7fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df60001b146200027157fe5b600160405180806200476a603091396030019050604051809103902060001c0360001b7f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c960001b14620002c057fe5b600160405180806200481b602c9139602c019050604051809103902060001c0360001b7f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf060001b146200030f57fe5b60016040518080620047f6602591396025019050604051809103902060001c0360001b7f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b60001b146200035e57fe5b6001604051808062004891602391396023019050604051809103902060001c0360001b7fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc859061060001b14620003ad57fe5b60016040518080620047cf602791396027019050604051809103902060001c0360001b7f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e7260001b14620003fc57fe5b61432b806200040c6000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c80637d7c2a1c11610167578063a8c62e76116100ce578063c4d66de811610087578063c4d66de814610858578063dd62ed3e1461087e578063eda199aa146108ac578063f0cf91e7146108b4578063f2768c1e146108da578063f77c4791146108e2576102a0565b8063a8c62e76146107ef578063a9059cbb146107f7578063aa04462514610823578063b592c3901461082b578063b6b55f2514610833578063c2baf35614610850576102a0565b806395d89b411161012057806395d89b411461075d5780639a508c8e146107655780639d16acfd1461076d578063a457c2d714610798578063a5b1a24d146107c4578063a8365693146107e7576102a0565b80637d7c2a1c146106bd57806382de9c1b146106c5578063853828b6146106cd5780638cb1d67f146106d55780638fc1708c146106fb5780639137c1a714610737576102a0565b806333a100ca1161020b57806353ceb01c116101c457806353ceb01c1461066f5780635aa6e675146106775780635fe51e6d1461067f5780636f307dc31461068757806370a082311461068f57806377c7b8fc146106b5576102a0565b806333a100ca1461059d57806336efd16f146105c357806339509351146105ef57806345ff4c801461061b5780634af1758b1461065f5780634fa5d85414610667576102a0565b80631624f6c61161025d5780631624f6c6146103ee57806318160ddd1461051c5780631bf8e7be1461052457806323b872dd1461052c5780632e1a7d4d14610562578063313ce5671461057f576102a0565b806306fdde03146102a5578063095ea7b31461032257806309ff18f0146103625780630a6bbeb3146103865780630ad2239d146103ae5780630c80447a146103c8575b600080fd5b6102ad6108ea565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102e75781810151838201526020016102cf565b50505050905090810190601f1680156103145780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034e6004803603604081101561033857600080fd5b506001600160a01b038135169060200135610981565b604080519115158252519081900360200190f35b61036a61099f565b604080516001600160a01b039092168252519081900360200190f35b6103ac6004803603602081101561039c57600080fd5b50356001600160a01b03166109ae565b005b6103b6610b78565b60408051918252519081900360200190f35b6103ac600480360360208110156103de57600080fd5b50356001600160a01b0316610b82565b6103ac6004803603606081101561040457600080fd5b810190602081018135600160201b81111561041e57600080fd5b82018360208201111561043057600080fd5b803590602001918460018302840111600160201b8311171561045157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460018302840111600160201b831117156104d657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610c6c9050565b6103b6610d48565b6103b6610d4e565b61034e6004803603606081101561054257600080fd5b506001600160a01b03813581169160208101359091169060400135610dfa565b6103ac6004803603602081101561057857600080fd5b5035610e87565b6105876110d4565b6040805160ff9092168252519081900360200190f35b6103ac600480360360208110156105b357600080fd5b50356001600160a01b03166110dd565b6103ac600480360360408110156105d957600080fd5b50803590602001356001600160a01b031661157e565b61034e6004803603604081101561060557600080fd5b506001600160a01b03813516906020013561165c565b6103ac600480360360c081101561063157600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a001356116b0565b6103b66117a2565b6103ac6117ac565b6103b66119bf565b61036a6119c9565b61036a611a3c565b61036a611a46565b6103b6600480360360208110156106a557600080fd5b50356001600160a01b0316611a50565b6103b6611a6f565b6103ac611aa9565b6103b6611c0f565b6103ac611c19565b6103b6600480360360208110156106eb57600080fd5b50356001600160a01b0316611e10565b6103ac6004803603608081101561071157600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611e45565b6103ac6004803603602081101561074d57600080fd5b50356001600160a01b03166123b1565b6102ad6124e0565b6103ac612541565b610775612620565b6040805192151583526001600160a01b0390911660208301528051918290030190f35b61034e600480360360408110156107ae57600080fd5b506001600160a01b03813516906020013561266c565b6103ac600480360360408110156107da57600080fd5b50803590602001356126da565b6103b6612835565b61036a61283f565b61034e6004803603604081101561080d57600080fd5b506001600160a01b038135169060200135612849565b6103b661285d565b6103b6612867565b6103ac6004803603602081101561084957600080fd5b5035612940565b6103b6612a1a565b6103ac6004803603602081101561086e57600080fd5b50356001600160a01b0316612a79565b6103b66004803603604081101561089457600080fd5b506001600160a01b0381358116916020013516612b24565b6103ac612b4f565b61034e600480360360208110156108ca57600080fd5b50356001600160a01b0316612cb7565b6103b6612d18565b61036a612d22565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b505050505090505b90565b600061099561098e612d64565b8484612d68565b5060015b92915050565b60006109a9612e54565b905090565b6109b6612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610a0b57600080fd5b505afa158015610a1f573d6000803e3d6000fd5b505050506040513d6020811015610a3557600080fd5b505180610ac75750610a45612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610a9a57600080fd5b505afa158015610aae573d6000803e3d6000fd5b505050506040513d6020811015610ac457600080fd5b50515b610b025760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b6000610b1c610b0f610b78565b429063ffffffff612ea416565b9050610b2781612f05565b610b3082612f2f565b604080516001600160a01b03841681526020810183905281517f7d5e1cfe55788983acd19d248da36a27c9413e8e43445ed36a76ae0e741a04ed929181900390910190a15050565b60006109a9612f59565b610b8a612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610bdf57600080fd5b505afa158015610bf3573d6000803e3d6000fd5b505050506040513d6020811015610c0957600080fd5b5051610c4d576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610c5681612f84565b610c69610c64610b0f612835565b612fae565b50565b600054610100900460ff1680610c855750610c85612fd8565b80610c93575060005460ff16155b610cce5760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff16158015610cf9576000805460ff1961ff0019909116610100171660011790555b8351610d0c906068906020870190613f04565b508251610d20906069906020860190613f04565b50606a805460ff191660ff84161790558015610d42576000805461ff00191690555b50505050565b60355490565b600080610d5961283f565b6001600160a01b03161415610d7757610d70612a1a565b905061097e565b6109a9610d8261283f565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dba57600080fd5b505afa158015610dce573d6000803e3d6000fd5b505050506040513d6020811015610de457600080fd5b5051610dee612a1a565b9063ffffffff612ea416565b6000610e07848484612fde565b610e7d84610e13612d64565b610e7885604051806060016040528060288152602001614153602891396001600160a01b038a16600090815260346020526040812090610e51612d64565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61313c16565b612d68565b5060019392505050565b6000610e91610d48565b11610ed9576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b60008111610f185760405162461bcd60e51b81526004018080602001828103825260258152602001806141e36025913960400191505060405180910390fd5b6000610f22610d48565b9050610f2e33836131d3565b6000610f5882610f4c85610f40610d4e565b9063ffffffff6132cf16565b9063ffffffff61332816565b9050610f62612a1a565b8111156110765781831415610fd057610f7961283f565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fb357600080fd5b505af1158015610fc7573d6000803e3d6000fd5b50505050611053565b6000610fea610fdd612a1a565b839063ffffffff61336a16565b9050610ff461283f565b6001600160a01b031663ce8c42e8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561103957600080fd5b505af115801561104d573d6000803e3d6000fd5b50505050505b61107361106683610f4c86610f40610d4e565b61106e612a1a565b6133ac565b90505b6110993382611083611a46565b6001600160a01b0316919063ffffffff6133c216565b60408051828152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b606a5460ff1690565b6110e5612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561113a57600080fd5b505afa15801561114e573d6000803e3d6000fd5b505050506040513d602081101561116457600080fd5b5051806111f65750611174612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50515b6112315760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b61123a81612cb7565b6112755760405162461bcd60e51b815260040180806020018281038252603a8152602001806141a9603a913960400191505060405180910390fd5b6001600160a01b0381166112d0576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b6112d8611a46565b6001600160a01b0316816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d602081101561134457600080fd5b50516001600160a01b03161461138b5760405162461bcd60e51b815260040180806020018281038252602f815260200180614103602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ce57600080fd5b505afa1580156113e2573d6000803e3d6000fd5b505050506040513d60208110156113f857600080fd5b50516001600160a01b03161461143f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614051602a913960400191505060405180910390fd5b7f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c58161146961283f565b604080516001600160a01b03938416815291909216602082015281519081900390910190a161149661283f565b6001600160a01b0316816001600160a01b0316146115765760006114b861283f565b6001600160a01b03161461154c576114f16114d161283f565b60006114db611a46565b6001600160a01b0316919063ffffffff61341916565b6114f961283f565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561153357600080fd5b505af1158015611547573d6000803e3d6000fd5b505050505b6115558161352c565b6115606114d161283f565b61157661156b61283f565b6000196114db611a46565b610c69612b4f565b33321480611612575061158f612d22565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156115e457600080fd5b505afa1580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b5051155b61164d5760405162461bcd60e51b81526004018080602001828103825260288152602001806140db6028913960400191505060405180910390fd5b611658823383613556565b5050565b6000610995611669612d64565b84610e78856034600061167a612d64565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff612ea416565b600054610100900460ff16806116c957506116c9612fd8565b806116d7575060005460ff16155b6117125760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff1615801561173d576000805460ff1961ff0019909116610100171660011790555b61174687613765565b61174f8661378f565b611758856137b9565b611761846137e3565b61176a8361380d565b61177382613837565b61177d6000612f05565b6117876000612f2f565b8015611799576000805461ff00191690555b50505050505050565b60006109a9613861565b60006117b661283f565b6001600160a01b0316141561180d576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b611815612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561186a57600080fd5b505afa15801561187e573d6000803e3d6000fd5b505050506040513d602081101561189457600080fd5b50518061192657506118a4612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d602081101561192357600080fd5b50515b6119615760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b61196961388c565b61197161283f565b6001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156119ab57600080fd5b505af1158015610d42573d6000803e3d6000fd5b60006109a9613949565b60006119d3612e7f565b6001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0b57600080fd5b505afa158015611a1f573d6000803e3d6000fd5b505050506040513d6020811015611a3557600080fd5b5051905090565b60006109a9613974565b60006109a961399f565b6001600160a01b0381166000908152603360205260409020545b919050565b6000611a79610d48565b15611aa157611a9c611a89610d48565b610f4c611a94610d4e565b610f406119bf565b6109a9565b6109a96119bf565b611ab1612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b0657600080fd5b505afa158015611b1a573d6000803e3d6000fd5b505050506040513d6020811015611b3057600080fd5b505180611bc25750611b40612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b9557600080fd5b505afa158015611ba9573d6000803e3d6000fd5b505050506040513d6020811015611bbf57600080fd5b50515b611bfd5760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b611c05611c19565b611c0d61388c565b565b60006109a96139ca565b611c21612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c7657600080fd5b505afa158015611c8a573d6000803e3d6000fd5b505050506040513d6020811015611ca057600080fd5b505180611d325750611cb0612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611d0557600080fd5b505afa158015611d19573d6000803e3d6000fd5b505050506040513d6020811015611d2f57600080fd5b50515b611d6d5760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b6000611d7761283f565b6001600160a01b03161415611dce576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b611dd661283f565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156119ab57600080fd5b6000611e1a610d48565b611e2657506000611a6a565b610999611e31610d48565b610f4c611e3d85611a50565b610f40610d4e565b600054610100900460ff1680611e5e5750611e5e612fd8565b80611e6c575060005460ff16155b611ea75760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff16158015611ed2576000805460ff1961ff0019909116610100171660011790555b81831115611f27576040805162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420696e76657374206d6f7265207468616e203130302500000000604482015290519081900360640190fd5b81611f6e576040805162461bcd60e51b8152602060048201526012602482015271063616e6e6f742064697669646520627920360741b604482015290519081900360640190fd5b61230b846001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015611faa57600080fd5b505afa158015611fbe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611fe757600080fd5b8101908080516040519392919084600160201b82111561200657600080fd5b90830190602082018581111561201b57600080fd5b8251600160201b81118282018810171561203457600080fd5b82525081516020918201929091019080838360005b83811015612061578181015183820152602001612049565b50505050905090810190601f16801561208e5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080644641524d5f60d81b81525060050182805190602001908083835b602083106120d75780518252601f1990920191602091820191016120b8565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052856001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561214457600080fd5b505afa158015612158573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561218157600080fd5b8101908080516040519392919084600160201b8211156121a057600080fd5b9083019060208201858111156121b557600080fd5b8251600160201b8111828201881017156121ce57600080fd5b82525081516020918201929091019080838360005b838110156121fb5781810151838201526020016121e3565b50505050905090810190601f1680156122285780820380516001836020036101000a031916815260200191505b506040525050506040516020018080603360f91b81525060010182805190602001908083835b6020831061226d5780518252601f19909201916020918201910161224e565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156122da57600080fd5b505afa1580156122ee573d6000803e3d6000fd5b505050506040513d602081101561230457600080fd5b5051610c6c565b61231485612a79565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561234f57600080fd5b505afa158015612363573d6000803e3d6000fd5b505050506040513d602081101561237957600080fd5b505160ff16600a0a905061a8c0806123958787878685806116b0565b50505080156123aa576000805461ff00191690555b5050505050565b6123b9612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561240e57600080fd5b505afa158015612422573d6000803e3d6000fd5b505050506040513d602081101561243857600080fd5b505161247c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0381166124d7576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b610c69816139f5565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109765780601f1061094b57610100808354040283529160200191610976565b612549612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561259e57600080fd5b505afa1580156125b2573d6000803e3d6000fd5b505050506040513d60208110156125c857600080fd5b505161260c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6126166000612f84565b611c0d6000612fae565b60008061262b611c0f565b1580159061263f575061263c611c0f565b42115b801561265c5750600061265061099f565b6001600160a01b031614155b61266461099f565b915091509091565b6000610995612679612d64565b84610e78856040518060600160405280602581526020016142d260259139603460006126a3612d64565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61313c16565b6126e2612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561273757600080fd5b505afa15801561274b573d6000803e3d6000fd5b505050506040513d602081101561276157600080fd5b50516127a5576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116127e45760405162461bcd60e51b8152600401808060200182810382526022815260200180613feb6022913960400191505060405180910390fd5b808211156128235760405162461bcd60e51b815260040180806020018281038252603a81526020018061407b603a913960400191505060405180910390fd5b61282c8261378f565b611658816137b9565b60006109a9613a19565b60006109a9613a44565b6000610995612856612d64565b8484612fde565b60006109a9613a6f565b600080612880612875612d18565b610f4c611e3d6117a2565b9050600061288c61283f565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128c457600080fd5b505afa1580156128d8573d6000803e3d6000fd5b505050506040513d60208110156128ee57600080fd5b505190508181106129045760009250505061097e565b6000612916838363ffffffff61336a16565b9050612920612a1a565b8111156129345761292f612a1a565b612936565b805b935050505061097e565b333214806129d45750612951612d22565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156129a657600080fd5b505afa1580156129ba573d6000803e3d6000fd5b505050506040513d60208110156129d057600080fd5b5051155b612a0f5760405162461bcd60e51b81526004018080602001828103825260288152602001806140db6028913960400191505060405180910390fd5b610c69813333613556565b6000612a24611a46565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611a0b57600080fd5b600054610100900460ff1680612a925750612a92612fd8565b80612aa0575060005460ff16155b612adb5760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff16158015612b06576000805460ff1961ff0019909116610100171660011790555b612b0f82613a9a565b8015611658576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b612b57612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612bac57600080fd5b505afa158015612bc0573d6000803e3d6000fd5b505050506040513d6020811015612bd657600080fd5b505180612c685750612be6612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612c3b57600080fd5b505afa158015612c4f573d6000803e3d6000fd5b505050506040513d6020811015612c6557600080fd5b50515b612ca35760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b612cad6000612f05565b611c0d6000612f2f565b600080612cc261283f565b6001600160a01b031614806109995750612cda611a3c565b6001600160a01b0316826001600160a01b0316148015612d005750612cfd61285d565b42115b801561099957506000612d1161285d565b1192915050565b60006109a9613b30565b6000612d2c612e7f565b6001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0b57600080fd5b3390565b6001600160a01b038316612dad5760405162461bcd60e51b815260040180806020018281038252602481526020018061424e6024913960400191505060405180910390fd5b6001600160a01b038216612df25760405162461bcd60e51b815260040180806020018281038252602281526020018061402f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006109a97fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df613b57565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc5490565b600082820183811015612efe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610c697f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e7282613b5b565b610c697fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc859061082613b5b565b60006109a97f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b613b57565b610c697fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df82613b5b565b610c697f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c982613b5b565b303b1590565b6001600160a01b0383166130235760405162461bcd60e51b81526004018080602001828103825260258152602001806142296025913960400191505060405180910390fd5b6001600160a01b0382166130685760405162461bcd60e51b8152600401808060200182810382526023815260200180613fc86023913960400191505060405180910390fd5b6130ab816040518060600160405280602681526020016140b5602691396001600160a01b038616600090815260336020526040902054919063ffffffff61313c16565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546130e0908263ffffffff612ea416565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156131cb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613190578181015183820152602001613178565b50505050905090810190601f1680156131bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166132185760405162461bcd60e51b81526004018080602001828103825260218152602001806142086021913960400191505060405180910390fd5b61325b8160405180606001604052806022815260200161400d602291396001600160a01b038516600090815260336020526040902054919063ffffffff61313c16565b6001600160a01b038316600090815260336020526040902055603554613287908263ffffffff61336a16565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826132de57506000610999565b828202828482816132eb57fe5b0414612efe5760405162461bcd60e51b81526004018080602001828103825260218152602001806141326021913960400191505060405180910390fd5b6000612efe83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b5f565b6000612efe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061313c565b60008183106133bb5781612efe565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613414908490613bc4565b505050565b80158061349f575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561347157600080fd5b505afa158015613485573d6000803e3d6000fd5b505050506040513d602081101561349b57600080fd5b5051155b6134da5760405162461bcd60e51b815260040180806020018281038252603681526020018061429c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052613414908490613bc4565b610c697ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea82613b5b565b6000831161359e576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b0381166135f2576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b60006135fc61283f565b6001600160a01b0316146136b65761361261283f565b6001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561364a57600080fd5b505afa15801561365e573d6000803e3d6000fd5b505050506040513d602081101561367457600080fd5b50516136b6576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b60006136c0610d48565b156136ed576136e86136d0610d4e565b610f4c6136db610d48565b879063ffffffff6132cf16565b6136ef565b835b90506136fb8282613d7c565b613720833086613709611a46565b6001600160a01b031692919063ffffffff613e6e16565b6040805185815290516001600160a01b038416917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b610c697f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a737182613b5b565b610c697f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a82613b5b565b610c697f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed3230882613b5b565b610c697fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff82613b5b565b610c697f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf082613b5b565b610c697f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b82613b5b565b60006109a97f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a613b57565b600061389661283f565b6001600160a01b031614156138ed576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b60006138f7612867565b90508015610c695761391361390a61283f565b82611083611a46565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b60006109a97fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff613b57565b60006109a97fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc8590610613b57565b60006109a97f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371613b57565b60006109a97f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9613b57565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc55565b60006109a97f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf0613b57565b60006109a97ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea613b57565b60006109a97f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e72613b57565b600054610100900460ff1680613ab35750613ab3612fd8565b80613ac1575060005460ff16155b613afc5760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff16158015613b27576000805460ff1961ff0019909116610100171660011790555b612b0f826139f5565b60006109a97f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed323085b5490565b9055565b60008183613bae5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613190578181015183820152602001613178565b506000838581613bba57fe5b0495945050505050565b613bd6826001600160a01b0316613ec8565b613c27576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613c655780518252601f199092019160209182019101613c46565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613cc7576040519150601f19603f3d011682016040523d82523d6000602084013e613ccc565b606091505b509150915081613d23576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610d4257808060200190516020811015613d3f57600080fd5b5051610d425760405162461bcd60e51b815260040180806020018281038252602a815260200180614272602a913960400191505060405180910390fd5b6001600160a01b038216613dd7576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b603554613dea908263ffffffff612ea416565b6035556001600160a01b038216600090815260336020526040902054613e16908263ffffffff612ea416565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d42908590613bc4565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590613efc57508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613f4557805160ff1916838001178555613f72565b82800160010185558215613f72579182015b82811115613f72578251825591602001919060010190613f57565b50613f7e929150613f82565b5090565b61097e91905b80821115613f7e5760008155600101613f8856fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737374686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7464656e6f6d696e61746f72206d7573742062652067726561746572207468616e206f7220657175616c20746f20746865206e756d657261746f7245524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645468652073747261746567792065786973747320616e64207377697463682074696d656c6f636b20646964206e6f7420656c61707365207965746e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582065bf131d46f99b6840e177f089570b17723fab1afc9732616215877836dc859064736f6c63430005100032656970313936372e7661756c7453746f726167652e7661756c744672616374696f6e546f496e766573744e756d657261746f72656970313936372e7661756c7453746f726167652e6e657874496d706c656d656e746174696f6e54696d657374616d70656970313936372e7661756c7453746f726167652e7661756c744672616374696f6e546f496e7665737444656e6f6d696e61746f72656970313936372e7661756c7453746f726167652e737472617465677955706461746554696d65656970313936372e7661756c7453746f726167652e737472617465677954696d654c6f636b656970313936372e7661756c7453746f726167652e6e657874496d706c656d656e746174696f6e44656c6179656970313936372e7661756c7453746f726167652e756e6465726c79696e67556e6974656970313936372e7661756c7453746f726167652e6e657874496d706c656d656e746174696f6e656970313936372e7661756c7453746f726167652e6675747572655374726174656779
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c80637d7c2a1c11610167578063a8c62e76116100ce578063c4d66de811610087578063c4d66de814610858578063dd62ed3e1461087e578063eda199aa146108ac578063f0cf91e7146108b4578063f2768c1e146108da578063f77c4791146108e2576102a0565b8063a8c62e76146107ef578063a9059cbb146107f7578063aa04462514610823578063b592c3901461082b578063b6b55f2514610833578063c2baf35614610850576102a0565b806395d89b411161012057806395d89b411461075d5780639a508c8e146107655780639d16acfd1461076d578063a457c2d714610798578063a5b1a24d146107c4578063a8365693146107e7576102a0565b80637d7c2a1c146106bd57806382de9c1b146106c5578063853828b6146106cd5780638cb1d67f146106d55780638fc1708c146106fb5780639137c1a714610737576102a0565b806333a100ca1161020b57806353ceb01c116101c457806353ceb01c1461066f5780635aa6e675146106775780635fe51e6d1461067f5780636f307dc31461068757806370a082311461068f57806377c7b8fc146106b5576102a0565b806333a100ca1461059d57806336efd16f146105c357806339509351146105ef57806345ff4c801461061b5780634af1758b1461065f5780634fa5d85414610667576102a0565b80631624f6c61161025d5780631624f6c6146103ee57806318160ddd1461051c5780631bf8e7be1461052457806323b872dd1461052c5780632e1a7d4d14610562578063313ce5671461057f576102a0565b806306fdde03146102a5578063095ea7b31461032257806309ff18f0146103625780630a6bbeb3146103865780630ad2239d146103ae5780630c80447a146103c8575b600080fd5b6102ad6108ea565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102e75781810151838201526020016102cf565b50505050905090810190601f1680156103145780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034e6004803603604081101561033857600080fd5b506001600160a01b038135169060200135610981565b604080519115158252519081900360200190f35b61036a61099f565b604080516001600160a01b039092168252519081900360200190f35b6103ac6004803603602081101561039c57600080fd5b50356001600160a01b03166109ae565b005b6103b6610b78565b60408051918252519081900360200190f35b6103ac600480360360208110156103de57600080fd5b50356001600160a01b0316610b82565b6103ac6004803603606081101561040457600080fd5b810190602081018135600160201b81111561041e57600080fd5b82018360208201111561043057600080fd5b803590602001918460018302840111600160201b8311171561045157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460018302840111600160201b831117156104d657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610c6c9050565b6103b6610d48565b6103b6610d4e565b61034e6004803603606081101561054257600080fd5b506001600160a01b03813581169160208101359091169060400135610dfa565b6103ac6004803603602081101561057857600080fd5b5035610e87565b6105876110d4565b6040805160ff9092168252519081900360200190f35b6103ac600480360360208110156105b357600080fd5b50356001600160a01b03166110dd565b6103ac600480360360408110156105d957600080fd5b50803590602001356001600160a01b031661157e565b61034e6004803603604081101561060557600080fd5b506001600160a01b03813516906020013561165c565b6103ac600480360360c081101561063157600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a001356116b0565b6103b66117a2565b6103ac6117ac565b6103b66119bf565b61036a6119c9565b61036a611a3c565b61036a611a46565b6103b6600480360360208110156106a557600080fd5b50356001600160a01b0316611a50565b6103b6611a6f565b6103ac611aa9565b6103b6611c0f565b6103ac611c19565b6103b6600480360360208110156106eb57600080fd5b50356001600160a01b0316611e10565b6103ac6004803603608081101561071157600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611e45565b6103ac6004803603602081101561074d57600080fd5b50356001600160a01b03166123b1565b6102ad6124e0565b6103ac612541565b610775612620565b6040805192151583526001600160a01b0390911660208301528051918290030190f35b61034e600480360360408110156107ae57600080fd5b506001600160a01b03813516906020013561266c565b6103ac600480360360408110156107da57600080fd5b50803590602001356126da565b6103b6612835565b61036a61283f565b61034e6004803603604081101561080d57600080fd5b506001600160a01b038135169060200135612849565b6103b661285d565b6103b6612867565b6103ac6004803603602081101561084957600080fd5b5035612940565b6103b6612a1a565b6103ac6004803603602081101561086e57600080fd5b50356001600160a01b0316612a79565b6103b66004803603604081101561089457600080fd5b506001600160a01b0381358116916020013516612b24565b6103ac612b4f565b61034e600480360360208110156108ca57600080fd5b50356001600160a01b0316612cb7565b6103b6612d18565b61036a612d22565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b505050505090505b90565b600061099561098e612d64565b8484612d68565b5060015b92915050565b60006109a9612e54565b905090565b6109b6612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610a0b57600080fd5b505afa158015610a1f573d6000803e3d6000fd5b505050506040513d6020811015610a3557600080fd5b505180610ac75750610a45612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610a9a57600080fd5b505afa158015610aae573d6000803e3d6000fd5b505050506040513d6020811015610ac457600080fd5b50515b610b025760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b6000610b1c610b0f610b78565b429063ffffffff612ea416565b9050610b2781612f05565b610b3082612f2f565b604080516001600160a01b03841681526020810183905281517f7d5e1cfe55788983acd19d248da36a27c9413e8e43445ed36a76ae0e741a04ed929181900390910190a15050565b60006109a9612f59565b610b8a612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610bdf57600080fd5b505afa158015610bf3573d6000803e3d6000fd5b505050506040513d6020811015610c0957600080fd5b5051610c4d576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b610c5681612f84565b610c69610c64610b0f612835565b612fae565b50565b600054610100900460ff1680610c855750610c85612fd8565b80610c93575060005460ff16155b610cce5760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff16158015610cf9576000805460ff1961ff0019909116610100171660011790555b8351610d0c906068906020870190613f04565b508251610d20906069906020860190613f04565b50606a805460ff191660ff84161790558015610d42576000805461ff00191690555b50505050565b60355490565b600080610d5961283f565b6001600160a01b03161415610d7757610d70612a1a565b905061097e565b6109a9610d8261283f565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dba57600080fd5b505afa158015610dce573d6000803e3d6000fd5b505050506040513d6020811015610de457600080fd5b5051610dee612a1a565b9063ffffffff612ea416565b6000610e07848484612fde565b610e7d84610e13612d64565b610e7885604051806060016040528060288152602001614153602891396001600160a01b038a16600090815260346020526040812090610e51612d64565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61313c16565b612d68565b5060019392505050565b6000610e91610d48565b11610ed9576040805162461bcd60e51b81526020600482015260136024820152725661756c7420686173206e6f2073686172657360681b604482015290519081900360640190fd5b60008111610f185760405162461bcd60e51b81526004018080602001828103825260258152602001806141e36025913960400191505060405180910390fd5b6000610f22610d48565b9050610f2e33836131d3565b6000610f5882610f4c85610f40610d4e565b9063ffffffff6132cf16565b9063ffffffff61332816565b9050610f62612a1a565b8111156110765781831415610fd057610f7961283f565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fb357600080fd5b505af1158015610fc7573d6000803e3d6000fd5b50505050611053565b6000610fea610fdd612a1a565b839063ffffffff61336a16565b9050610ff461283f565b6001600160a01b031663ce8c42e8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561103957600080fd5b505af115801561104d573d6000803e3d6000fd5b50505050505b61107361106683610f4c86610f40610d4e565b61106e612a1a565b6133ac565b90505b6110993382611083611a46565b6001600160a01b0316919063ffffffff6133c216565b60408051828152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b606a5460ff1690565b6110e5612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561113a57600080fd5b505afa15801561114e573d6000803e3d6000fd5b505050506040513d602081101561116457600080fd5b5051806111f65750611174612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156111c957600080fd5b505afa1580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50515b6112315760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b61123a81612cb7565b6112755760405162461bcd60e51b815260040180806020018281038252603a8152602001806141a9603a913960400191505060405180910390fd5b6001600160a01b0381166112d0576040805162461bcd60e51b815260206004820152601d60248201527f6e6577205f73747261746567792063616e6e6f7420626520656d707479000000604482015290519081900360640190fd5b6112d8611a46565b6001600160a01b0316816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d602081101561134457600080fd5b50516001600160a01b03161461138b5760405162461bcd60e51b815260040180806020018281038252602f815260200180614103602f913960400191505060405180910390fd5b306001600160a01b0316816001600160a01b031663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ce57600080fd5b505afa1580156113e2573d6000803e3d6000fd5b505050506040513d60208110156113f857600080fd5b50516001600160a01b03161461143f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614051602a913960400191505060405180910390fd5b7f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c58161146961283f565b604080516001600160a01b03938416815291909216602082015281519081900390910190a161149661283f565b6001600160a01b0316816001600160a01b0316146115765760006114b861283f565b6001600160a01b03161461154c576114f16114d161283f565b60006114db611a46565b6001600160a01b0316919063ffffffff61341916565b6114f961283f565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561153357600080fd5b505af1158015611547573d6000803e3d6000fd5b505050505b6115558161352c565b6115606114d161283f565b61157661156b61283f565b6000196114db611a46565b610c69612b4f565b33321480611612575061158f612d22565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156115e457600080fd5b505afa1580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b5051155b61164d5760405162461bcd60e51b81526004018080602001828103825260288152602001806140db6028913960400191505060405180910390fd5b611658823383613556565b5050565b6000610995611669612d64565b84610e78856034600061167a612d64565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff612ea416565b600054610100900460ff16806116c957506116c9612fd8565b806116d7575060005460ff16155b6117125760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff1615801561173d576000805460ff1961ff0019909116610100171660011790555b61174687613765565b61174f8661378f565b611758856137b9565b611761846137e3565b61176a8361380d565b61177382613837565b61177d6000612f05565b6117876000612f2f565b8015611799576000805461ff00191690555b50505050505050565b60006109a9613861565b60006117b661283f565b6001600160a01b0316141561180d576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b611815612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561186a57600080fd5b505afa15801561187e573d6000803e3d6000fd5b505050506040513d602081101561189457600080fd5b50518061192657506118a4612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d602081101561192357600080fd5b50515b6119615760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b61196961388c565b61197161283f565b6001600160a01b0316634fa5d8546040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156119ab57600080fd5b505af1158015610d42573d6000803e3d6000fd5b60006109a9613949565b60006119d3612e7f565b6001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0b57600080fd5b505afa158015611a1f573d6000803e3d6000fd5b505050506040513d6020811015611a3557600080fd5b5051905090565b60006109a9613974565b60006109a961399f565b6001600160a01b0381166000908152603360205260409020545b919050565b6000611a79610d48565b15611aa157611a9c611a89610d48565b610f4c611a94610d4e565b610f406119bf565b6109a9565b6109a96119bf565b611ab1612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b0657600080fd5b505afa158015611b1a573d6000803e3d6000fd5b505050506040513d6020811015611b3057600080fd5b505180611bc25750611b40612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b9557600080fd5b505afa158015611ba9573d6000803e3d6000fd5b505050506040513d6020811015611bbf57600080fd5b50515b611bfd5760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b611c05611c19565b611c0d61388c565b565b60006109a96139ca565b611c21612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c7657600080fd5b505afa158015611c8a573d6000803e3d6000fd5b505050506040513d6020811015611ca057600080fd5b505180611d325750611cb0612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611d0557600080fd5b505afa158015611d19573d6000803e3d6000fd5b505050506040513d6020811015611d2f57600080fd5b50515b611d6d5760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b6000611d7761283f565b6001600160a01b03161415611dce576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b611dd661283f565b6001600160a01b031663bfd131f16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156119ab57600080fd5b6000611e1a610d48565b611e2657506000611a6a565b610999611e31610d48565b610f4c611e3d85611a50565b610f40610d4e565b600054610100900460ff1680611e5e5750611e5e612fd8565b80611e6c575060005460ff16155b611ea75760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff16158015611ed2576000805460ff1961ff0019909116610100171660011790555b81831115611f27576040805162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420696e76657374206d6f7265207468616e203130302500000000604482015290519081900360640190fd5b81611f6e576040805162461bcd60e51b8152602060048201526012602482015271063616e6e6f742064697669646520627920360741b604482015290519081900360640190fd5b61230b846001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015611faa57600080fd5b505afa158015611fbe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611fe757600080fd5b8101908080516040519392919084600160201b82111561200657600080fd5b90830190602082018581111561201b57600080fd5b8251600160201b81118282018810171561203457600080fd5b82525081516020918201929091019080838360005b83811015612061578181015183820152602001612049565b50505050905090810190601f16801561208e5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080644641524d5f60d81b81525060050182805190602001908083835b602083106120d75780518252601f1990920191602091820191016120b8565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052856001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561214457600080fd5b505afa158015612158573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561218157600080fd5b8101908080516040519392919084600160201b8211156121a057600080fd5b9083019060208201858111156121b557600080fd5b8251600160201b8111828201881017156121ce57600080fd5b82525081516020918201929091019080838360005b838110156121fb5781810151838201526020016121e3565b50505050905090810190601f1680156122285780820380516001836020036101000a031916815260200191505b506040525050506040516020018080603360f91b81525060010182805190602001908083835b6020831061226d5780518252601f19909201916020918201910161224e565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156122da57600080fd5b505afa1580156122ee573d6000803e3d6000fd5b505050506040513d602081101561230457600080fd5b5051610c6c565b61231485612a79565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561234f57600080fd5b505afa158015612363573d6000803e3d6000fd5b505050506040513d602081101561237957600080fd5b505160ff16600a0a905061a8c0806123958787878685806116b0565b50505080156123aa576000805461ff00191690555b5050505050565b6123b9612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561240e57600080fd5b505afa158015612422573d6000803e3d6000fd5b505050506040513d602081101561243857600080fd5b505161247c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0381166124d7576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b610c69816139f5565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109765780601f1061094b57610100808354040283529160200191610976565b612549612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561259e57600080fd5b505afa1580156125b2573d6000803e3d6000fd5b505050506040513d60208110156125c857600080fd5b505161260c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6126166000612f84565b611c0d6000612fae565b60008061262b611c0f565b1580159061263f575061263c611c0f565b42115b801561265c5750600061265061099f565b6001600160a01b031614155b61266461099f565b915091509091565b6000610995612679612d64565b84610e78856040518060600160405280602581526020016142d260259139603460006126a3612d64565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61313c16565b6126e2612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561273757600080fd5b505afa15801561274b573d6000803e3d6000fd5b505050506040513d602081101561276157600080fd5b50516127a5576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b600081116127e45760405162461bcd60e51b8152600401808060200182810382526022815260200180613feb6022913960400191505060405180910390fd5b808211156128235760405162461bcd60e51b815260040180806020018281038252603a81526020018061407b603a913960400191505060405180910390fd5b61282c8261378f565b611658816137b9565b60006109a9613a19565b60006109a9613a44565b6000610995612856612d64565b8484612fde565b60006109a9613a6f565b600080612880612875612d18565b610f4c611e3d6117a2565b9050600061288c61283f565b6001600160a01b03166345d01e4a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128c457600080fd5b505afa1580156128d8573d6000803e3d6000fd5b505050506040513d60208110156128ee57600080fd5b505190508181106129045760009250505061097e565b6000612916838363ffffffff61336a16565b9050612920612a1a565b8111156129345761292f612a1a565b612936565b805b935050505061097e565b333214806129d45750612951612d22565b6001600160a01b03166330e412ad336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156129a657600080fd5b505afa1580156129ba573d6000803e3d6000fd5b505050506040513d60208110156129d057600080fd5b5051155b612a0f5760405162461bcd60e51b81526004018080602001828103825260288152602001806140db6028913960400191505060405180910390fd5b610c69813333613556565b6000612a24611a46565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611a0b57600080fd5b600054610100900460ff1680612a925750612a92612fd8565b80612aa0575060005460ff16155b612adb5760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff16158015612b06576000805460ff1961ff0019909116610100171660011790555b612b0f82613a9a565b8015611658576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b612b57612e7f565b6001600160a01b031663b429afeb336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612bac57600080fd5b505afa158015612bc0573d6000803e3d6000fd5b505050506040513d6020811015612bd657600080fd5b505180612c685750612be6612e7f565b6001600160a01b031663dee1f0e4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612c3b57600080fd5b505afa158015612c4f573d6000803e3d6000fd5b505050506040513d6020811015612c6557600080fd5b50515b612ca35760405162461bcd60e51b815260040180806020018281038252602b815260200180613f9d602b913960400191505060405180910390fd5b612cad6000612f05565b611c0d6000612f2f565b600080612cc261283f565b6001600160a01b031614806109995750612cda611a3c565b6001600160a01b0316826001600160a01b0316148015612d005750612cfd61285d565b42115b801561099957506000612d1161285d565b1192915050565b60006109a9613b30565b6000612d2c612e7f565b6001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0b57600080fd5b3390565b6001600160a01b038316612dad5760405162461bcd60e51b815260040180806020018281038252602481526020018061424e6024913960400191505060405180910390fd5b6001600160a01b038216612df25760405162461bcd60e51b815260040180806020018281038252602281526020018061402f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006109a97fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df613b57565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc5490565b600082820183811015612efe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610c697f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e7282613b5b565b610c697fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc859061082613b5b565b60006109a97f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b613b57565b610c697fb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df82613b5b565b610c697f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c982613b5b565b303b1590565b6001600160a01b0383166130235760405162461bcd60e51b81526004018080602001828103825260258152602001806142296025913960400191505060405180910390fd5b6001600160a01b0382166130685760405162461bcd60e51b8152600401808060200182810382526023815260200180613fc86023913960400191505060405180910390fd5b6130ab816040518060600160405280602681526020016140b5602691396001600160a01b038616600090815260336020526040902054919063ffffffff61313c16565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546130e0908263ffffffff612ea416565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156131cb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613190578181015183820152602001613178565b50505050905090810190601f1680156131bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166132185760405162461bcd60e51b81526004018080602001828103825260218152602001806142086021913960400191505060405180910390fd5b61325b8160405180606001604052806022815260200161400d602291396001600160a01b038516600090815260336020526040902054919063ffffffff61313c16565b6001600160a01b038316600090815260336020526040902055603554613287908263ffffffff61336a16565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826132de57506000610999565b828202828482816132eb57fe5b0414612efe5760405162461bcd60e51b81526004018080602001828103825260218152602001806141326021913960400191505060405180910390fd5b6000612efe83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b5f565b6000612efe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061313c565b60008183106133bb5781612efe565b5090919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613414908490613bc4565b505050565b80158061349f575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561347157600080fd5b505afa158015613485573d6000803e3d6000fd5b505050506040513d602081101561349b57600080fd5b5051155b6134da5760405162461bcd60e51b815260040180806020018281038252603681526020018061429c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052613414908490613bc4565b610c697ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea82613b5b565b6000831161359e576040805162461bcd60e51b815260206004820152601060248201526f043616e6e6f74206465706f73697420360841b604482015290519081900360640190fd5b6001600160a01b0381166135f2576040805162461bcd60e51b81526020600482015260166024820152751a1bdb19195c881b5d5cdd081899481919599a5b995960521b604482015290519081900360640190fd5b60006135fc61283f565b6001600160a01b0316146136b65761361261283f565b6001600160a01b031663c2a2a07b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561364a57600080fd5b505afa15801561365e573d6000803e3d6000fd5b505050506040513d602081101561367457600080fd5b50516136b6576040805162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41030b93160a11b604482015290519081900360640190fd5b60006136c0610d48565b156136ed576136e86136d0610d4e565b610f4c6136db610d48565b879063ffffffff6132cf16565b6136ef565b835b90506136fb8282613d7c565b613720833086613709611a46565b6001600160a01b031692919063ffffffff613e6e16565b6040805185815290516001600160a01b038416917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b610c697f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a737182613b5b565b610c697f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a82613b5b565b610c697f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed3230882613b5b565b610c697fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff82613b5b565b610c697f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf082613b5b565b610c697f6d02338b2e4c913c0f7d380e2798409838a48a2c4d57d52742a808c82d713d8b82613b5b565b60006109a97f39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a613b57565b600061389661283f565b6001600160a01b031614156138ed576040805162461bcd60e51b815260206004820152601860248201527714dd1c985d1959de481b5d5cdd081899481919599a5b995960421b604482015290519081900360640190fd5b60006138f7612867565b90508015610c695761391361390a61283f565b82611083611a46565b6040805182815290517fa09b7ae452b7bffb9e204c3a016e80caeecf46f554d112644f36fa114dac6ffa9181900360200190a150565b60006109a97fa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff613b57565b60006109a97fb441b53a4e42c2ca9182bc7ede99bedba7a5d9360d9dfbd31fa8ee2dc8590610613b57565b60006109a97f1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371613b57565b60006109a97f3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9613b57565b7fa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc55565b60006109a97f82ddc3be3f0c1a6870327f78f4979a0b37b21b16736ef5be6a7a7a35e530bcf0613b57565b60006109a97ff1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea613b57565b60006109a97f56e7c0e75875c6497f0de657009613a32558904b5c10771a825cc330feff7e72613b57565b600054610100900460ff1680613ab35750613ab3612fd8565b80613ac1575060005460ff16155b613afc5760405162461bcd60e51b815260040180806020018281038252602e81526020018061417b602e913960400191505060405180910390fd5b600054610100900460ff16158015613b27576000805460ff1961ff0019909116610100171660011790555b612b0f826139f5565b60006109a97f469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed323085b5490565b9055565b60008183613bae5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613190578181015183820152602001613178565b506000838581613bba57fe5b0495945050505050565b613bd6826001600160a01b0316613ec8565b613c27576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613c655780518252601f199092019160209182019101613c46565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613cc7576040519150601f19603f3d011682016040523d82523d6000602084013e613ccc565b606091505b509150915081613d23576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610d4257808060200190516020811015613d3f57600080fd5b5051610d425760405162461bcd60e51b815260040180806020018281038252602a815260200180614272602a913960400191505060405180910390fd5b6001600160a01b038216613dd7576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b603554613dea908263ffffffff612ea416565b6035556001600160a01b038216600090815260336020526040902054613e16908263ffffffff612ea416565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d42908590613bc4565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590613efc57508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613f4557805160ff1916838001178555613f72565b82800160010185558215613f72579182015b82811115613f72578251825591602001919060010190613f57565b50613f7e929150613f82565b5090565b61097e91905b80821115613f7e5760008155600101613f8856fe5468652063616c6c6572206d75737420626520636f6e74726f6c6c6572206f7220676f7665726e616e636545524332303a207472616e7366657220746f20746865207a65726f206164647265737364656e6f6d696e61746f72206d7573742062652067726561746572207468616e203045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737374686520737472617465677920646f6573206e6f742062656c6f6e6720746f2074686973207661756c7464656e6f6d696e61746f72206d7573742062652067726561746572207468616e206f7220657175616c20746f20746865206e756d657261746f7245524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655468697320736d61727420636f6e747261637420686173206265656e2067726579206c69737465645661756c7420756e6465726c79696e67206d757374206d6174636820537472617465677920756e6465726c79696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645468652073747261746567792065786973747320616e64207377697463682074696d656c6f636b20646964206e6f7420656c61707365207965746e756d6265724f66536861726573206d7573742062652067726561746572207468616e203045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582065bf131d46f99b6840e177f089570b17723fab1afc9732616215877836dc859064736f6c63430005100032
Deployed Bytecode Sourcemap
43598:11774:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43598:11774: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;:::-;;;;;;;;;;;;;;;;;;45754:100;;;:::i;:::-;;;;-1:-1:-1;;;;;45754:100:0;;;;;;;;;;;;;;49039:301;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49039:301:0;-1:-1:-1;;;;;49039:301:0;;:::i;:::-;;48544:97;;;:::i;:::-;;;;;;;;;;;;;;;;54761:188;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54761:188:0;-1:-1:-1;;;;;54761: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;47482: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;52771:1239::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52771:1239:0;;:::i;29623:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49578:1045;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49578:1045:0;-1:-1:-1;;;;;49578:1045:0;;:::i;52511:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52511:116:0;;;;;;-1:-1:-1;;;;;52511: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;39329:632::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39329:632:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45490:124::-;;;:::i;46922:187::-;;;:::i;45392:92::-;;;:::i;35542:104::-;;;:::i;48338:93::-;;;:::i;45302: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;47795:214::-;;;:::i;51018:98::-;;;:::i;45860:118::-;;;:::i;52633:132::-;;;:::i;48064:268::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48064:268:0;-1:-1:-1;;;;;48064:268:0;;:::i;44216:994::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;44216:994:0;;;;;;;;;;;;;;;;;;;;;;:::i;35171:160::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35171:160:0;-1:-1:-1;;;;;35171:160:0;;:::i;28973:87::-;;;:::i;55230:139::-;;;:::i;54955:269::-;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;54955: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;50629:383::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50629:383:0;;;;;;;:::i;45984:110::-;;;:::i;45216: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;48437:101::-;;;:::i;51122:710::-;;;:::i;52218:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52218:103:0;;:::i;47192:131::-;;;:::i;35886:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35886:105:0;-1:-1:-1;;;;;35886: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;49429:143::-;;;:::i;48647:307::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48647:307:0;-1:-1:-1;;;;;48647:307:0;;:::i;45620:128::-;;;:::i;36344: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;45754:100::-;45804:7;45827:21;:19;:21::i;:::-;45820:28;;45754:100;:::o;49039:301::-;36184:10;:8;:10::i;:::-;-1:-1:-1;;;;;36176:32:0;;36209:10;36176:44;;;;;;;;;;;;;-1:-1:-1;;;;;36176:44:0;-1:-1:-1;;;;;36176:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36176:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36176:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36176:44:0;;:92;;;36232:10;:8;:10::i;:::-;-1:-1:-1;;;;;36224:32:0;;36257:10;36224:44;;;;;;;;;;;;;-1:-1:-1;;;;;36224:44:0;-1:-1:-1;;;;;36224:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36224:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36224:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36224:44:0;36176:92;36167:157;;;;-1:-1:-1;;;36167:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49163:12;49178:39;49198:18;:16;:18::i;:::-;49178:15;;:39;:19;:39;:::i;:::-;49163:54;;49224:28;49247:4;49224:22;:28::i;:::-;49259:29;49278:9;49259:18;:29::i;:::-;49300:34;;;-1:-1:-1;;;;;49300:34:0;;;;;;;;;;;;;;;;;;;;;;;36331:1;49039:301;:::o;48544:97::-;48593:7;48616:19;:17;:19::i;54761:188::-;34669:10;:8;:10::i;:::-;-1:-1:-1;;;;;34661:32:0;;34694:10;34661:44;;;;;;;;;;;;;-1:-1:-1;;;;;34661:44:0;-1:-1:-1;;;;;34661:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34661:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34661:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34661:44:0;34653:71;;;;;-1:-1:-1;;;34653:71:0;;;;;;;;;;;;-1:-1:-1;;;34653:71:0;;;;;;;;;;;;;;;54829:28;54852:4;54829:22;:28::i;:::-;54864:79;54896:46;54916:25;:23;:25::i;54896:46::-;54864:31;:79::i;:::-;54761: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;47482:307::-;47546:7;;47574:10;:8;:10::i;:::-;-1:-1:-1;;;;;47566:33:0;;47562:127;;;47655:26;:24;:26::i;:::-;47648:33;;;;47562:127;47702:81;47743:10;:8;:10::i;:::-;-1:-1:-1;;;;;47733:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47733:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47733:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47733:49:0;47702: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;52771:1239::-;52853:1;52837:13;:11;:13::i;:::-;:17;52829:49;;;;;-1:-1:-1;;;52829:49:0;;;;;;;;;;;;-1:-1:-1;;;52829:49:0;;;;;;;;;;;;;;;52910:1;52893:14;:18;52885:68;;;;-1:-1:-1;;;52885:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52960:19;52982:13;:11;:13::i;:::-;52960:35;;53002:33;53008:10;53020:14;53002:5;:33::i;:::-;53044:34;53081:90;53159:11;53081:63;53129:14;53081:33;:31;:33::i;:::-;:47;:63;:47;:63;:::i;:::-;:77;:90;:77;:90;:::i;:::-;53044:127;;53211:26;:24;:26::i;:::-;53182;:55;53178:631;;;53354:11;53336:14;:29;53332:258;;;53388:10;:8;:10::i;:::-;-1:-1:-1;;;;;53378:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53378:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53378:42:0;;;;53332:258;;;53447:15;53465:58;53496:26;:24;:26::i;:::-;53465;;:58;:30;:58;:::i;:::-;53447:76;;53544:10;:8;:10::i;:::-;-1:-1:-1;;;;;53534:37:0;;53572:7;53534:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53534:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53534:46:0;;;;53332:258;;53669:132;53678:94;53760:11;53678:65;53728:14;53678:33;:31;:33::i;:94::-;53774:26;:24;:26::i;:::-;53669:8;:132::i;:::-;53640:161;;53178:631;53817:73;53851:10;53863:26;53824:12;:10;:12::i;:::-;-1:-1:-1;;;;;53817:33:0;;:73;;:33;:73;:::i;:::-;53956:48;;;;;;;;53965:10;;53956:48;;;;;;;;;;52771:1239;;;:::o;29623:83::-;29689:9;;;;29623:83;:::o;49578:1045::-;36184:10;:8;:10::i;:::-;-1:-1:-1;;;;;36176:32:0;;36209:10;36176:44;;;;;;;;;;;;;-1:-1:-1;;;;;36176:44:0;-1:-1:-1;;;;;36176:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36176:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36176:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36176:44:0;;:92;;;36232:10;:8;:10::i;:::-;-1:-1:-1;;;;;36224:32:0;;36257:10;36224:44;;;;;;;;;;;;;-1:-1:-1;;;;;36224:44:0;-1:-1:-1;;;;;36224:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36224:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36224:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36224:44:0;36176:92;36167:157;;;;-1:-1:-1;;;36167:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49667:28;49685:9;49667:17;:28::i;:::-;49659:106;;;;-1:-1:-1;;;49659:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49780:23:0;;49772:65;;;;;-1:-1:-1;;;49772:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49897:12;:10;:12::i;:::-;-1:-1:-1;;;;;49852:58:0;49862:9;-1:-1:-1;;;;;49852:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49852:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49852:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49852:33:0;-1:-1:-1;;;;;49852:58:0;;49844:118;;;;-1:-1:-1;;;49844:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50017:4;-1:-1:-1;;;;;49977:45:0;49987:9;-1:-1:-1;;;;;49977:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49977:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49977:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49977:28:0;-1:-1:-1;;;;;49977:45:0;;49969:100;;;;-1:-1:-1;;;49969:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50083:38;50099:9;50110:10;:8;:10::i;:::-;50083:38;;;-1:-1:-1;;;;;50083:38:0;;;;;;;;;;;;;;;;;;;;;;;;50162:10;:8;:10::i;:::-;-1:-1:-1;;;;;50132:41:0;50140:9;-1:-1:-1;;;;;50132:41:0;;50128:459;;50219:1;50196:10;:8;:10::i;:::-;-1:-1:-1;;;;;50188:33:0;;50184:224;;50289:56;50330:10;:8;:10::i;:::-;50343:1;50296:12;:10;:12::i;:::-;-1:-1:-1;;;;;50289:32:0;;:56;;:32;:56;:::i;:::-;50366:10;:8;:10::i;:::-;-1:-1:-1;;;;;50356:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50356:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50356:42:0;;;;50184:224;50416:23;50429:9;50416:12;:23::i;:::-;50448:56;50489:10;:8;:10::i;50448:56::-;50513:66;50554:10;:8;:10::i;:::-;-1:-1:-1;;50520:12:0;:10;:12::i;50513:66::-;50593:24;:22;:24::i;52511:116::-;46332:10;46346:9;46332:23;;46331:233;;;46530:12;:10;:12::i;:::-;-1:-1:-1;;;;;46518:34:0;;46553:10;46518:46;;;;;;;;;;;;;-1:-1:-1;;;;;46518:46:0;-1:-1:-1;;;;;46518:46:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46518:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46518:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46518:46:0;46517:47;46331:233;46315:388;;;;-1:-1:-1;;;46315:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52585:36;52594:6;52602:10;52614:6;52585:8;:36::i;:::-;52511: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;39329:632::-;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;39580:27;39595:11;39580:14;:27::i;:::-;39614:54;39649:18;39614:34;:54::i;:::-;39675:58;39712:20;39675:36;:58::i;:::-;39740:35;39759:15;39740:18;:35::i;:::-;39782:55;39810:26;39782:27;:55::i;:::-;39844:42;39865:20;39844;:42::i;:::-;39893:25;39916:1;39893:22;:25::i;:::-;39925:30;39952:1;39925:18;:30::i;:::-;17640:14;17636:57;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;17636:57;39329:632;;;;;;;:::o;45490:124::-;45552:7;45575:33;:31;:33::i;46922:187::-;46177:1;46154:10;:8;:10::i;:::-;-1:-1:-1;;;;;46146:33:0;;;46138:70;;;;;-1:-1:-1;;;46138:70:0;;;;;;;;;;;;-1:-1:-1;;;46138:70:0;;;;;;;;;;;;;;;36184:10;:8;:10::i;:::-;-1:-1:-1;;;;;36176:32:0;;36209:10;36176:44;;;;;;;;;;;;;-1:-1:-1;;;;;36176:44:0;-1:-1:-1;;;;;36176:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36176:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36176:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36176:44:0;;:92;;;36232:10;:8;:10::i;:::-;-1:-1:-1;;;;;36224:32:0;;36257:10;36224:44;;;;;;;;;;;;;-1:-1:-1;;;;;36224:44:0;-1:-1:-1;;;;;36224:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36224:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36224:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36224:44:0;36176:92;36167:157;;;;-1:-1:-1;;;36167:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47054:8;:6;:8::i;:::-;47079:10;:8;:10::i;:::-;-1:-1:-1;;;;;47069:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47069:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;45392:92:0;45438:7;45461:17;:15;:17::i;35542:104::-;35585:7;35616:10;:8;:10::i;:::-;-1:-1:-1;;;;;35608:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35608:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35608:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35608:32:0;;-1:-1:-1;35542:104:0;:::o;48338:93::-;48385:7;48408:17;:15;:17::i;45302:84::-;45344:7;45367:13;:11;:13::i;21389:110::-;-1:-1:-1;;;;;21473:18:0;;21446:7;21473:18;;;:9;:18;;;;;;21389:110;;;;:::o;47795:214::-;47848:7;47871:13;:11;:13::i;:::-;:18;:132;;47929:74;47989:13;:11;:13::i;:::-;47929:55;47950:33;:31;:33::i;:::-;47929:16;:14;:16::i;:74::-;47871:132;;;47901:16;:14;:16::i;51018:98::-;36184:10;:8;:10::i;:::-;-1:-1:-1;;;;;36176:32:0;;36209:10;36176:44;;;;;;;;;;;;;-1:-1:-1;;;;;36176:44:0;-1:-1:-1;;;;;36176:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36176:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36176:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36176:44:0;;:92;;;36232:10;:8;:10::i;:::-;-1:-1:-1;;;;;36224:32:0;;36257:10;36224:44;;;;;;;;;;;;;-1:-1:-1;;;;;36224:44:0;-1:-1:-1;;;;;36224:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36224:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36224:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36224:44:0;36176:92;36167:157;;;;-1:-1:-1;;;36167:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51082:13;:11;:13::i;:::-;51102:8;:6;:8::i;:::-;51018:98::o;45860:118::-;45919:7;45942:30;:28;:30::i;52633:132::-;36184:10;:8;:10::i;:::-;-1:-1:-1;;;;;36176:32:0;;36209:10;36176:44;;;;;;;;;;;;;-1:-1:-1;;;;;36176:44:0;-1:-1:-1;;;;;36176:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36176:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36176:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36176:44:0;;:92;;;36232:10;:8;:10::i;:::-;-1:-1:-1;;;;;36224:32:0;;36257:10;36224:44;;;;;;;;;;;;;-1:-1:-1;;;;;36224:44:0;-1:-1:-1;;;;;36224:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36224:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36224:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36224:44:0;36176:92;36167:157;;;;-1:-1:-1;;;36167:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46177:1;46154:10;:8;:10::i;:::-;-1:-1:-1;;;;;46146:33:0;;;46138:70;;;;;-1:-1:-1;;;46138:70:0;;;;;;;;;;;;-1:-1:-1;;;46138:70:0;;;;;;;;;;;;;;;52727:10;:8;:10::i;:::-;-1:-1:-1;;;;;52717:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;48064:268:0;48153:7;48173:13;:11;:13::i;:::-;48169:49;;-1:-1:-1;48209:1:0;48202:8;;48169:49;48231:95;48312:13;:11;:13::i;:::-;48231:66;48279:17;48289:6;48279:9;:17::i;:::-;48231:33;:31;:33::i;44216:994::-;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;44413:20;44391:18;:42;;44383:83;;;;;-1:-1:-1;;;44383:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44481:25;44473:56;;;;;-1:-1:-1;;;44473:56:0;;;;;;;;;;;;-1:-1:-1;;;44473:56:0;;;;;;;;;;;;;;;44538:231;44618:11;-1:-1:-1;;;;;44604:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44604:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44604:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;44604: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;44604: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;44604:35:0;;420:4:-1;411:14;;;;44604:35:0;;;;;411:14:-1;44604: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;44604:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44578:62;;;;;;-1:-1:-1;;;44578:62: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;;;44578:62:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;44578:62:0;;;44693:11;-1:-1:-1;;;;;44679:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44679:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44679:35:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;44679: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;44679: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;44679:35:0;;420:4:-1;411:14;;;;44679:35:0;;;;;411:14:-1;44679: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;44679:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44657:58;;;;;;-1:-1:-1;;;44657: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;;;44657:58:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;44657:58:0;;;44739:11;-1:-1:-1;;;;;44725:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44725:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44725:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44725:37:0;44538:24;:231::i;:::-;44776:51;44812:8;44776:27;:51::i;:::-;44836:22;44897:11;-1:-1:-1;;;;;44875:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44875:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44875:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44875:46:0;44867:55;;44861:2;:61;;-1:-1:-1;44959:8:0;;45019:185;45051:11;45071:18;45098:20;44861:61;44959:8;;45019:23;:185::i;:::-;17626:1;;;17640:14;17636:57;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;17636:57;44216:994;;;;;:::o;35171:160::-;34669:10;:8;:10::i;:::-;-1:-1:-1;;;;;34661:32:0;;34694:10;34661:44;;;;;;;;;;;;;-1:-1:-1;;;;;34661:44:0;-1:-1:-1;;;;;34661:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34661:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34661:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34661:44:0;34653:71;;;;;-1:-1:-1;;;34653:71:0;;;;;;;;;;;;-1:-1:-1;;;34653:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35244:20:0;;35236:63;;;;;-1:-1:-1;;;35236:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35306:19;35318:6;35306: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;;;;;;;;;;;;;;;;;;;;;;;;55230:139;34669:10;:8;:10::i;:::-;-1:-1:-1;;;;;34661:32:0;;34694:10;34661:44;;;;;;;;;;;;;-1:-1:-1;;;;;34661:44:0;-1:-1:-1;;;;;34661:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34661:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34661:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34661:44:0;34653:71;;;;;-1:-1:-1;;;34653:71:0;;;;;;;;;;;;-1:-1:-1;;;34653:71:0;;;;;;;;;;;;;;;55288:34;55319:1;55288:22;:34::i;:::-;55329;55361:1;55329:31;:34::i;54955:269::-;55003:4;55009:7;55041:29;:27;:29::i;:::-;:34;;;;:94;;;55106:29;:27;:29::i;:::-;55088:15;:47;55041:94;:141;;;;-1:-1:-1;55180:1:0;55148:20;:18;:20::i;:::-;-1:-1:-1;;;;;55148:34:0;;;55041:141;55191:20;:18;:20::i;:::-;55025:193;;;;54955: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;50629:383::-;34669:10;:8;:10::i;:::-;-1:-1:-1;;;;;34661:32:0;;34694:10;34661:44;;;;;;;;;;;;;-1:-1:-1;;;;;34661:44:0;-1:-1:-1;;;;;34661:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34661:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34661:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34661:44:0;34653:71;;;;;-1:-1:-1;;;34653:71:0;;;;;;;;;;;;-1:-1:-1;;;34653:71:0;;;;;;;;;;;;;;;50756:1;50742:11;:15;50734:62;;;;-1:-1:-1;;;50734:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50824:11;50811:9;:24;;50803:95;;;;-1:-1:-1;;;50803:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50905:45;50940:9;50905:34;:45::i;:::-;50957:49;50994:11;50957:36;:49::i;45984:110::-;46039:7;46062:26;:24;:26::i;45216:80::-;45256:7;45279:11;:9;:11::i;21712:158::-;21781:4;21798:42;21808:12;:10;:12::i;:::-;21822:9;21833:6;21798:9;:42::i;48437:101::-;48488:7;48511:21;:19;:21::i;51122:710::-;51175:7;51191:25;51219:131;51315:34;:32;:34::i;:::-;51219:81;51267:32;:30;:32::i;51219:131::-;51191:159;;51357:23;51393:10;:8;:10::i;:::-;-1:-1:-1;;;;;51383:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51383:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51383:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51383:49:0;;-1:-1:-1;51443:36:0;;;51439:388;;51497:1;51490:8;;;;;;51439:388;51521:25;51549:38;:17;51571:15;51549:38;:21;:38;:::i;:::-;51521:66;;51624:26;:24;:26::i;:::-;51603:17;:47;;:216;;51793:26;:24;:26::i;:::-;51603:216;;;51773:17;51603:216;51596:223;;;;;;;52218:103;46332:10;46346:9;46332:23;;46331:233;;;46530:12;:10;:12::i;:::-;-1:-1:-1;;;;;46518:34:0;;46553:10;46518:46;;;;;;;;;;;;;-1:-1:-1;;;;;46518:46:0;-1:-1:-1;;;;;46518:46:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46518:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46518:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46518:46:0;46517:47;46331:233;46315:388;;;;-1:-1:-1;;;46315:388:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52275:40;52284:6;52292:10;52304;52275:8;:40::i;47192:131::-;47249:7;47279:12;:10;:12::i;:::-;-1:-1:-1;;;;;47272:30:0;;47311:4;47272:45;;;;;;;;;;;;;-1:-1:-1;;;;;47272:45:0;-1:-1:-1;;;;;47272:45:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;35886: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;35950:35;35976:8;35950:25;:35::i;:::-;17640:14;17636:57;;;17680:5;17665:20;;-1:-1:-1;;17665:20:0;;;35886:105;;:::o;21933:134::-;-1:-1:-1;;;;;22032:18:0;;;22005:7;22032:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21933:134::o;49429:143::-;36184:10;:8;:10::i;:::-;-1:-1:-1;;;;;36176:32:0;;36209:10;36176:44;;;;;;;;;;;;;-1:-1:-1;;;;;36176:44:0;-1:-1:-1;;;;;36176:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36176:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36176:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36176:44:0;;:92;;;36232:10;:8;:10::i;:::-;-1:-1:-1;;;;;36224:32:0;;36257:10;36224:44;;;;;;;;;;;;;-1:-1:-1;;;;;36224:44:0;-1:-1:-1;;;;;36224:44:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36224:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36224:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36224:44:0;36176:92;36167:157;;;;-1:-1:-1;;;36167:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49504:25;49527:1;49504:22;:25::i;:::-;49536:30;49563:1;49536:18;:30::i;48647:307::-;48713:4;;48733:10;:8;:10::i;:::-;-1:-1:-1;;;;;48733:24:0;;:185;;;;48809:16;:14;:16::i;:::-;-1:-1:-1;;;;;48796:29:0;:9;-1:-1:-1;;;;;48796:29:0;;:82;;;;;48858:20;:18;:20::i;:::-;48840:15;:38;48796:82;:121;;;;;48916:1;48893:20;:18;:20::i;:::-;:24;;48647:307;-1:-1:-1;;48647:307:0:o;45620:128::-;45684:7;45707:35;:33;:35::i;36344:104::-;36387:7;36418:10;:8;:10::i;:::-;-1:-1:-1;;;;;36410: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;41359:120::-;41413:7;41436:37;37256:66;41436:10;:37::i;35337:199::-;34547:66;35513:11;;35497: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;42511:116::-;42575:46;37893:66;42614:6;42575:10;:46::i;42280:107::-;42340:41;37767:66;42374:6;42340:10;:41::i;42157:117::-;42209:7;42232:36;37646:66;42232:10;:36::i;41234:119::-;41300:47;37256:66;41338:8;41300:10;:47::i;41485:134::-;41558:55;37391:66;41606:6;41558: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;39967:98::-;40023:36;36612:66;40050:8;40023:10;:36::i;54016:676::-;54120:1;54111:6;:10;54103:39;;;;;-1:-1:-1;;;54103:39:0;;;;;;;;;;;;-1:-1:-1;;;54103:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54157:25:0;;54149:60;;;;;-1:-1:-1;;;54149:60:0;;;;;;;;;;;;-1:-1:-1;;;54149:60:0;;;;;;;;;;;;;;;54253:1;54230:10;:8;:10::i;:::-;-1:-1:-1;;;;;54222:33:0;;54218:120;;54284:10;:8;:10::i;:::-;-1:-1:-1;;;;;54274:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54274:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54274:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54274:39:0;54266:64;;;;;-1:-1:-1;;;54266:64:0;;;;;;;;;;;;-1:-1:-1;;;54266:64:0;;;;;;;;;;;;;;;54346:14;54363:13;:11;:13::i;:::-;:18;:112;;54411:64;54441:33;:31;:33::i;:::-;54411:25;54422:13;:11;:13::i;:::-;54411:6;;:25;:10;:25;:::i;:64::-;54363:112;;;54393:6;54363:112;54346:129;;54482:26;54488:11;54501:6;54482:5;:26::i;:::-;54517:68;54555:6;54571:4;54578:6;54524:12;:10;:12::i;:::-;-1:-1:-1;;;;;54517:37:0;;:68;;;:37;:68;:::i;:::-;54658:28;;;;;;;;-1:-1:-1;;;;;54658:28:0;;;;;;;;;;;;;54016:676;;;;:::o;40176:102::-;40234:38;36728:66;40263:8;40234:10;:38::i;40624:142::-;40700:60;36989:66;40753:6;40700:10;:60::i;40925:146::-;41003:62;37131:66;41058:6;41003:10;:62::i;40393:107::-;40453:41;36849:66;40487:6;40453:10;:41::i;41770:126::-;41839:51;37522:66;41883:6;41839:10;:51::i;42039:112::-;42101:44;37646:66;42138:6;42101:10;:44::i;40772:147::-;40838:7;40861:52;36989:66;40861:10;:52::i;51838:264::-;46177:1;46154:10;:8;:10::i;:::-;-1:-1:-1;;;;;46146:33:0;;;46138:70;;;;;-1:-1:-1;;;46138:70:0;;;;;;;;;;;;-1:-1:-1;;;46138:70:0;;;;;;;;;;;;;;;51892:23;51918:22;:20;:22::i;:::-;51892:48;-1:-1:-1;51951:19:0;;51947:150;;51981:71;52023:10;:8;:10::i;:::-;52036:15;51988:12;:10;:12::i;51981:71::-;52066:23;;;;;;;;;;;;;;;;;46215:1;51838:264::o;40506:112::-;40556:7;40579:33;36849:66;40579:10;:33::i;42393:112::-;42443:7;42466:33;37767:66;42466:10;:33::i;40284:103::-;40330:7;40353:28;36728:66;40353:10;:28::i;41625:139::-;41688:7;41711:47;37391:66;41711:10;:47::i;34967:198::-;34547:66;35129:24;35120:40::o;41902:131::-;41961:7;41984:43;37522:66;41984:10;:43::i;40071:99::-;40115:7;40138:26;36612:66;40138:10;:26::i;42633:121::-;42687:7;42710:38;37893:66;42710:10;:38::i;34874: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;34936:19;34948:6;34936:11;:19::i;41077:151::-;41145:7;41168:54;37131:66;43112:177;43266:11;;43250:34::o;42938:168::-;43074:20;;43065: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;43598:11774::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43598:11774:0;;;-1:-1:-1;43598:11774:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://65bf131d46f99b6840e177f089570b17723fab1afc9732616215877836dc8590
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.