Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 224 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Keeper | 12883380 | 1139 days ago | IN | 0 ETH | 0.00036287 | ||||
Deleverage To Mi... | 12882671 | 1140 days ago | IN | 0 ETH | 0.11892168 | ||||
Leverage To Max | 12881968 | 1140 days ago | IN | 0 ETH | 0.00616834 | ||||
Harvest | 12881967 | 1140 days ago | IN | 0 ETH | 0.01472273 | ||||
Leverage To Max | 12875465 | 1141 days ago | IN | 0 ETH | 0.00835427 | ||||
Harvest | 12875464 | 1141 days ago | IN | 0 ETH | 0.01914268 | ||||
Harvest | 12869011 | 1142 days ago | IN | 0 ETH | 0.01076129 | ||||
Leverage To Max | 12862647 | 1143 days ago | IN | 0 ETH | 0.00382698 | ||||
Harvest | 12862646 | 1143 days ago | IN | 0 ETH | 0.02016021 | ||||
Leverage To Max | 12861154 | 1143 days ago | IN | 0 ETH | 0.01445748 | ||||
Harvest | 12861153 | 1143 days ago | IN | 0 ETH | 0.0682996 | ||||
Leverage To Max | 12860878 | 1143 days ago | IN | 0 ETH | 0.00765396 | ||||
Harvest | 12860876 | 1143 days ago | IN | 0 ETH | 0.03484743 | ||||
Leverage To Max | 12854451 | 1144 days ago | IN | 0 ETH | 0.00368524 | ||||
Harvest | 12854449 | 1144 days ago | IN | 0 ETH | 0.01640731 | ||||
Leverage To Max | 12837270 | 1147 days ago | IN | 0 ETH | 0.00396872 | ||||
Harvest | 12837269 | 1147 days ago | IN | 0 ETH | 0.02012937 | ||||
Leverage To Max | 12830898 | 1148 days ago | IN | 0 ETH | 0.01542086 | ||||
Harvest | 12830896 | 1148 days ago | IN | 0 ETH | 0.02436023 | ||||
Set Ratio Buff | 12819459 | 1149 days ago | IN | 0 ETH | 0.00094696 | ||||
Set Ratio Buff | 12819444 | 1149 days ago | IN | 0 ETH | 0.00151087 | ||||
Set Ratio Buff | 12819430 | 1149 days ago | IN | 0 ETH | 0.00047308 | ||||
Leverage To Max | 12818194 | 1150 days ago | IN | 0 ETH | 0.01367555 | ||||
Harvest | 12818193 | 1150 days ago | IN | 0 ETH | 0.01387665 | ||||
Harvest | 12811847 | 1151 days ago | IN | 0 ETH | 0.02254457 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StrategyMakerWETHV1
Compiler Version
v0.6.7+commit.b8d736ae
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-26 */ /** *Submitted for verification at Etherscan.io on 2020-11-16 */ pragma solidity ^0.6.2; // SPDX-License-Identifier: MIT /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // SPDX-License-Identifier: MIT /* * @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. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: contracts/GSN/Context.sol // SPDX-License-Identifier: MIT // File: contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/token/ERC20/ERC20.sol /** * @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 {ERC20PresetMinterPauser}. * * 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 Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @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. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * 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; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override 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 virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override 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 virtual override 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 virtual 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 virtual 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 virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _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 virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _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 virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _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 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 virtual { 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 Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @title Careful Math * @author Compound * @notice Derived from OpenZeppelin's SafeMath library * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol */ contract CarefulMath { /** * @dev Possible error codes that we can return */ enum MathError { NO_ERROR, DIVISION_BY_ZERO, INTEGER_OVERFLOW, INTEGER_UNDERFLOW } /** * @dev Multiplies two numbers, returns an error on overflow. */ function mulUInt(uint a, uint b) internal pure returns (MathError, uint) { if (a == 0) { return (MathError.NO_ERROR, 0); } uint c = a * b; if (c / a != b) { return (MathError.INTEGER_OVERFLOW, 0); } else { return (MathError.NO_ERROR, c); } } /** * @dev Integer division of two numbers, truncating the quotient. */ function divUInt(uint a, uint b) internal pure returns (MathError, uint) { if (b == 0) { return (MathError.DIVISION_BY_ZERO, 0); } return (MathError.NO_ERROR, a / b); } } /** * @title Exponential module for storing fixed-precision decimals * @author Compound * @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places. * Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is: * `Exp({mantissa: 5100000000000000000})`. */ contract Exponential is CarefulMath { uint constant expScale = 1e18; uint constant doubleScale = 1e36; uint constant halfExpScale = expScale/2; uint constant mantissaOne = expScale; struct Exp { uint mantissa; } struct Double { uint mantissa; } /** * @dev Multiply an Exp by a scalar, returning a new Exp. */ function mulScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) { (MathError err0, uint scaledMantissa) = mulUInt(a.mantissa, scalar); if (err0 != MathError.NO_ERROR) { return (err0, Exp({mantissa: 0})); } return (MathError.NO_ERROR, Exp({mantissa: scaledMantissa})); } /** * @dev Multiply an Exp by a scalar, then truncate to return an unsigned integer. */ function mulScalarTruncate(Exp memory a, uint scalar) pure internal returns (MathError, uint) { (MathError err, Exp memory product) = mulScalar(a, scalar); if (err != MathError.NO_ERROR) { return (err, 0); } return (MathError.NO_ERROR, truncate(product)); } /** * @dev Truncates the given exp to a whole number value. * For example, truncate(Exp{mantissa: 15 * expScale}) = 15 */ function truncate(Exp memory exp) pure internal returns (uint) { // Note: We are not using careful math here as we're performing a division that cannot fail return exp.mantissa / expScale; } } // SPDX-License-Identifier: MIT interface IVault is IERC20 { function token() external view returns (address); function claimInsurance() external; // NOTE: Only yDelegatedVault implements this function getRatio() external view returns (uint256); function deposit(uint256) external; function withdraw(uint256) external; function earn() external; } interface UniswapRouterV2 { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); } interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; } interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function createPair(address tokenA, address tokenB) external returns (address pair); } // SPDX-License-Identifier: MIT interface IController { function vaults(address) external view returns (address); function devfund() external view returns (address); function treasury() external view returns (address); } // SPDX-License-Identifier: MIT interface IMasterchef { function notifyBuybackReward(uint256 _amount) external; } // Strategy Contract Basics abstract contract StrategyBase { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; // Perfomance fee 30% to buyback uint256 public performanceFee = 30000; uint256 public constant performanceMax = 100000; // Withdrawal fee 0.2% to buyback // - 0.14% to treasury // - 0.06% to dev fund uint256 public treasuryFee = 140; uint256 public constant treasuryMax = 100000; uint256 public devFundFee = 60; uint256 public constant devFundMax = 100000; // buyback ready bool public buybackEnabled = true; address public mmToken = 0xa283aA7CfBB27EF0cfBcb2493dD9F4330E0fd304; address public masterChef = 0xf8873a6080e8dbF41ADa900498DE0951074af577; // Tokens address public want; address public constant weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // buyback coins address public constant usdcBuyback = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address public wbtcBuyback = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599; address public renbtcBuyback = 0xEB4C2781e4ebA804CE9a9803C67d0893436bB27D; // User accounts address public governance; address public controller; address public strategist; address public timelock; // Dex address public univ2Router2 = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; constructor( address _want, address _governance, address _strategist, address _controller, address _timelock ) public { require(_want != address(0)); require(_governance != address(0)); require(_strategist != address(0)); require(_controller != address(0)); require(_timelock != address(0)); want = _want; governance = _governance; strategist = _strategist; controller = _controller; timelock = _timelock; } // **** Modifiers **** // modifier onlyBenevolent { require( msg.sender == tx.origin || msg.sender == governance || msg.sender == strategist ); _; } // **** Views **** // function balanceOfWant() public view returns (uint256) { return IERC20(want).balanceOf(address(this)); } function balanceOfPool() public virtual view returns (uint256); function balanceOf() public view returns (uint256) { return balanceOfWant().add(balanceOfPool()); } function getName() external virtual pure returns (string memory); // **** Setters **** // function setDevFundFee(uint256 _devFundFee) external { require(msg.sender == timelock, "!timelock"); devFundFee = _devFundFee; } function setTreasuryFee(uint256 _treasuryFee) external { require(msg.sender == timelock, "!timelock"); treasuryFee = _treasuryFee; } function setPerformanceFee(uint256 _performanceFee) external { require(msg.sender == timelock, "!timelock"); performanceFee = _performanceFee; } function setStrategist(address _strategist) external { require(msg.sender == governance, "!governance"); strategist = _strategist; } function setGovernance(address _governance) external { require(msg.sender == governance, "!governance"); governance = _governance; } function setTimelock(address _timelock) external { require(msg.sender == timelock, "!timelock"); timelock = _timelock; } function setController(address _controller) external { require(msg.sender == timelock, "!timelock"); controller = _controller; } function setMmToken(address _mmToken) external { require(msg.sender == governance, "!governance"); mmToken = _mmToken; } function setBuybackEnabled(bool _buybackEnabled) external { require(msg.sender == governance, "!governance"); buybackEnabled = _buybackEnabled; } function setMasterChef(address _masterChef) external { require(msg.sender == governance, "!governance"); masterChef = _masterChef; } // **** State mutations **** // function deposit() public virtual; // Controller only function for creating additional rewards from dust function withdraw(IERC20 _asset) external returns (uint256 balance) { require(msg.sender == controller, "!controller"); require(want != address(_asset), "want"); balance = _asset.balanceOf(address(this)); _asset.safeTransfer(controller, balance); } // Withdraw partial funds, normally used with a vault withdrawal function withdraw(uint256 _amount) external { require(msg.sender == controller, "!controller"); uint256 _balance = IERC20(want).balanceOf(address(this)); if (_balance < _amount) { _amount = _withdrawSome(_amount.sub(_balance)); _amount = _amount.add(_balance); } uint256 _feeDev = _amount.mul(devFundFee).div(devFundMax); uint256 _feeTreasury = _amount.mul(treasuryFee).div(treasuryMax); if (buybackEnabled == true) { // we want buyback mm using LP token (address _buybackPrinciple, uint256 _buybackAmount) = _convertWantToBuyback(_feeDev.add(_feeTreasury)); buybackAndNotify(_buybackPrinciple, _buybackAmount); } else { IERC20(want).safeTransfer(IController(controller).devfund(), _feeDev); IERC20(want).safeTransfer(IController(controller).treasury(), _feeTreasury); } address _vault = IController(controller).vaults(address(want)); require(_vault != address(0), "!vault"); // additional protection so we don't burn the funds IERC20(want).safeTransfer(_vault, _amount.sub(_feeDev).sub(_feeTreasury)); } // buyback MM and notify MasterChef function buybackAndNotify(address _buybackPrinciple, uint256 _buybackAmount) internal { if (buybackEnabled == true) { _swapUniswap(_buybackPrinciple, mmToken, _buybackAmount); uint256 _mmBought = IERC20(mmToken).balanceOf(address(this)); IERC20(mmToken).safeTransfer(masterChef, _mmBought); IMasterchef(masterChef).notifyBuybackReward(_mmBought); } } // Withdraw all funds, normally used when migrating strategies function withdrawAll() external returns (uint256 balance) { require(msg.sender == controller, "!controller"); _withdrawAll(); balance = IERC20(want).balanceOf(address(this)); address _vault = IController(controller).vaults(address(want)); require(_vault != address(0), "!vault"); // additional protection so we don't burn the funds IERC20(want).safeTransfer(_vault, balance); } function _withdrawAll() internal { _withdrawSome(balanceOfPool()); } function _withdrawSome(uint256 _amount) internal virtual returns (uint256); // convert LP to buyback principle token function _convertWantToBuyback(uint256 _lpAmount) internal virtual returns (address, uint256); function harvest() public virtual; // **** Emergency functions **** // comment-out function execute(address _target, bytes memory _data) // **** Internal functions **** function _swapUniswap( address _from, address _to, uint256 _amount ) internal { require(_to != address(0)); // Swap with uniswap IERC20(_from).safeApprove(univ2Router2, 0); IERC20(_from).safeApprove(univ2Router2, _amount); address[] memory path; if (_to == mmToken && buybackEnabled == true) { if (_from == usdcBuyback){ path = new address[](2); path[0] = _from; path[1] = _to; }else{ path = new address[](3); path[0] = _from; path[1] = usdcBuyback; path[2] = _to; } } else{ if (_from == weth || _to == weth) { path = new address[](2); path[0] = _from; path[1] = _to; } else { path = new address[](3); path[0] = _from; path[1] = weth; path[2] = _to; } } UniswapRouterV2(univ2Router2).swapExactTokensForTokens( _amount, 0, path, address(this), now.add(60) ); } } // SPDX-License-Identifier: MIT interface ICToken { function totalSupply() external view returns (uint256); function totalBorrows() external returns (uint256); function borrowIndex() external returns (uint256); function repayBorrow(uint256 repayAmount) external returns (uint256); function redeemUnderlying(uint256 redeemAmount) external returns (uint256); function borrow(uint256 borrowAmount) external returns (uint256); function mint(uint256 mintAmount) external returns (uint256); function transfer(address dst, uint256 amount) external returns (bool); function transferFrom( address src, address dst, uint256 amount ) external returns (bool); function approve(address spender, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function balanceOfUnderlying(address owner) external returns (uint256); function getAccountSnapshot(address account) external view returns ( uint256, uint256, uint256, uint256 ); function borrowRatePerBlock() external view returns (uint256); function supplyRatePerBlock() external view returns (uint256); function totalBorrowsCurrent() external returns (uint256); function borrowBalanceCurrent(address account) external returns (uint256); function borrowBalanceStored(address account) external view returns (uint256); function exchangeRateCurrent() external returns (uint256); function exchangeRateStored() external view returns (uint256); function getCash() external view returns (uint256); function accrueInterest() external returns (uint256); function seize( address liquidator, address borrower, uint256 seizeTokens ) external returns (uint256); } interface IComptroller { /*** Assets You Are In ***/ function enterMarkets(address[] calldata cTokens) external returns (uint256[] memory); // Claim all the COMP accrued by holder in all markets function claimComp(address holder) external; // Claim all the COMP accrued by holder in specific markets function claimComp(address holder, address[] calldata cTokens) external; // Claim all the COMP accrued by specific holders in specific markets for their supplies and/or borrows function claimComp( address[] calldata holders, address[] calldata cTokens, bool borrowers, bool suppliers ) external; function markets(address cTokenAddress) external view returns (bool, uint256); } interface ICompoundLens { function getCompBalanceMetadataExt( address comp, address comptroller, address account ) external returns ( uint256 balance, uint256 votes, address delegate, uint256 allocated ); } abstract contract StrategyCmpdDaiBase is Exponential{ using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; address public constant comptroller = 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B; address public constant lens = 0xd513d22422a3062Bd342Ae374b4b9c20E0a9a074; address public constant dai = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address public constant comp = 0xc00e94Cb662C3520282E6f5717214004A7f26888; address public constant cdai = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643; address public constant cether = 0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5; // Require a 0.1 buffer between market collateral factor and strategy's collateral factor when leveraging uint256 colFactorLeverageBuffer = 100; uint256 colFactorLeverageBufferMax = 1000; // Allow a 0.05 buffer between market collateral factor and strategy's collateral factor until we have to deleverage // This is so we can hit max leverage and keep accruing interest uint256 colFactorSyncBuffer = 50; uint256 colFactorSyncBufferMax = 1000; constructor() public { // Enter cDAI Market address[] memory ctokens = new address[](1); ctokens[0] = cdai; IComptroller(comptroller).enterMarkets(ctokens); } // **** Modifiers **** // // **** Views **** // function getSuppliedView() public view returns (uint256) { (, uint256 cTokenBal, , uint256 exchangeRate) = ICToken(cdai).getAccountSnapshot(address(this)); (, uint256 bal) = mulScalarTruncate(Exp({mantissa: exchangeRate}), cTokenBal); return bal; } function getBorrowedView() public view returns (uint256) { return ICToken(cdai).borrowBalanceStored(address(this)); } // Given an unleveraged supply balance, return the target leveraged supply balance which is still within the safety buffer function getLeveragedSupplyTarget(uint256 supplyBalance) public view returns (uint256) { uint256 leverage = getMaxLeverage(); return supplyBalance.mul(leverage).div(1e18); } function getSafeLeverageColFactor() public view returns (uint256) { uint256 colFactor = getMarketColFactor(); // Collateral factor within the buffer uint256 safeColFactor = colFactor.sub(colFactorLeverageBuffer.mul(1e18).div(colFactorLeverageBufferMax)); return safeColFactor; } function getSafeSyncColFactor() public view returns (uint256) { uint256 colFactor = getMarketColFactor(); // Collateral factor within the buffer uint256 safeColFactor = colFactor.sub(colFactorSyncBuffer.mul(1e18).div(colFactorSyncBufferMax)); return safeColFactor; } function getMarketColFactor() public view returns (uint256) { (, uint256 colFactor) = IComptroller(comptroller).markets(cdai); return colFactor; } // Max leverage we can go up to, w.r.t safe buffer function getMaxLeverage() public view returns (uint256) { uint256 safeLeverageColFactor = getSafeLeverageColFactor(); // Infinite geometric series uint256 leverage = uint256(1e36).div(1e18 - safeLeverageColFactor); return leverage; } // If we have a strategy position at this SOS borrow rate and left unmonitored for 24+ hours, we might get liquidated // To safeguard with enough buffer, we divide the borrow rate by 2 which indicates allowing 48 hours response time function getSOSBorrowRate() public view returns (uint256) { uint256 safeColFactor = getSafeLeverageColFactor(); return (colFactorLeverageBuffer.mul(182).mul(1e36).div(colFactorLeverageBufferMax)).div(safeColFactor); } // **** Pseudo-view functions (use `callStatic` on these) **** // /* The reason why these exists is because of the nature of the interest accruing supply + borrow balance. The "view" methods are technically snapshots and don't represent the real value. As such there are pseudo view methods where you can retrieve the results by calling `callStatic`. */ function getCompAccrued() public returns (uint256) { (, , , uint256 accrued) = ICompoundLens(lens).getCompBalanceMetadataExt(comp, comptroller, address(this)); return accrued; } function getColFactor() public returns (uint256) { uint256 supplied = getSupplied(); uint256 borrowed = getBorrowed(); return borrowed.mul(1e18).div(supplied); } function getSuppliedUnleveraged() public returns (uint256) { uint256 supplied = getSupplied(); uint256 borrowed = getBorrowed(); return supplied.sub(borrowed); } function getSupplied() public returns (uint256) { return ICToken(cdai).balanceOfUnderlying(address(this)); } function getBorrowed() public returns (uint256) { return ICToken(cdai).borrowBalanceCurrent(address(this)); } function getBorrowable() public returns (uint256) { uint256 supplied = getSupplied(); uint256 borrowed = getBorrowed(); (, uint256 colFactor) = IComptroller(comptroller).markets(cdai); // 99.99% just in case some dust accumulates return supplied.mul(colFactor).div(1e18).sub(borrowed).mul(9999).div(10000); } function getCurrentLeverage() public returns (uint256) { uint256 supplied = getSupplied(); uint256 borrowed = getBorrowed(); return supplied.mul(1e18).div(supplied.sub(borrowed)); } // **** Setters **** // // **** State mutations **** // // comment-out function sync() public returns (bool) // Leverages until we're supplying <x> amount // 1. Redeem <x> DAI // 2. Repay <x> DAI function _lUntil(uint256 _supplyAmount) internal { // 1. Borrow out <X> DAI // 2. Supply <X> DAI uint256 leverage = getMaxLeverage(); uint256 unleveragedSupply = getSuppliedUnleveraged(); require(_supplyAmount >= unleveragedSupply && _supplyAmount <= unleveragedSupply.mul(leverage).div(1e18), "!leverage"); // Since we're only leveraging one asset // Supplied = borrowed uint256 _borrowAndSupply; uint256 supplied = getSupplied(); while (supplied < _supplyAmount) { _borrowAndSupply = getBorrowable(); if (supplied.add(_borrowAndSupply) > _supplyAmount) { _borrowAndSupply = _supplyAmount.sub(supplied); } ICToken(cdai).borrow(_borrowAndSupply); _supplyAllDAI(); supplied = supplied.add(_borrowAndSupply); } } // Deleverages until we're supplying <x> amount // 1. Redeem <x> DAI // 2. Repay <x> DAI function _dlUntil(uint256 _supplyAmount) internal { uint256 unleveragedSupply = getSuppliedUnleveraged(); uint256 supplied = getSupplied(); require(_supplyAmount >= unleveragedSupply && _supplyAmount <= supplied, "!deleverage"); // Since we're only leveraging on 1 asset // redeemable = borrowable uint256 _redeemAndRepay = getBorrowable(); do { if (supplied.sub(_redeemAndRepay) < _supplyAmount) { _redeemAndRepay = supplied.sub(_supplyAmount); } require(ICToken(cdai).redeemUnderlying(_redeemAndRepay) == 0, "!redeemDlUntil"); IERC20(dai).safeApprove(cdai, 0); IERC20(dai).safeApprove(cdai, _redeemAndRepay); require(ICToken(cdai).repayBorrow(_redeemAndRepay) == 0, "!repay"); supplied = supplied.sub(_redeemAndRepay); } while (supplied > _supplyAmount); } // **** internal state changer **** // for redeem supplied (unleveraged) DAI from compound function _redeemDAI(uint256 _want) internal { uint256 maxRedeem = getSuppliedUnleveraged(); _want = _want > maxRedeem? maxRedeem : _want; uint256 _redeem = _want; if (_redeem > 0) { // Make sure market can cover liquidity require(ICToken(cdai).getCash() >= _redeem, "!cash-liquidity"); // How much borrowed amount do we need to free? uint256 borrowed = getBorrowed(); uint256 supplied = getSupplied(); uint256 curLeverage = getCurrentLeverage(); uint256 borrowedToBeFree = _redeem.mul(curLeverage).div(1e18); // If the amount we need to free is > borrowed, Just free up all the borrowed amount if (borrowedToBeFree > borrowed) { _dlUntil(getSuppliedUnleveraged()); } else { // Otherwise just keep freeing up borrowed amounts until we hit a safe number to redeem our underlying _dlUntil(supplied.sub(borrowedToBeFree)); } // Redeems underlying require(ICToken(cdai).redeemUnderlying(_redeem) == 0, "!redeem"); } } function _supplyAllDAI() internal { uint256 _wad = IERC20(dai).balanceOf(address(this)); _supplyDAI(_wad); } function _supplyDAI(uint256 _wad) internal { if (_wad > 0) { IERC20(dai).safeApprove(cdai, 0); IERC20(dai).safeApprove(cdai, _wad); require(ICToken(cdai).mint(_wad) == 0, "!depositIntoCmpd"); } } function _claimComp() internal { address[] memory ctokens = new address[](1); ctokens[0] = cdai; IComptroller(comptroller).claimComp(address(this), ctokens); } } interface AggregatorV3Interface { function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } interface ManagerLike { function ilks(uint256) external view returns (bytes32); function owns(uint256) external view returns (address); function urns(uint256) external view returns (address); function vat() external view returns (address); function open(bytes32, address) external returns (uint256); function give(uint256, address) external; function frob(uint256, int256, int256) external; function flux(uint256, address, uint256) external; function move(uint256, address, uint256) external; function exit(address, uint256, address, uint256) external; function quit(uint256, address) external; function enter(address, uint256) external; } interface VatLike { function can(address, address) external view returns (uint256); function ilks(bytes32) external view returns (uint256, uint256, uint256, uint256, uint256); function dai(address) external view returns (uint256); function urns(bytes32, address) external view returns (uint256, uint256); function frob(bytes32, address, address, address, int256, int256) external; function hope(address) external; function move(address, address, uint256) external; } interface GemJoinLike { function dec() external returns (uint256); function join(address, uint256) external payable; function exit(address, uint256) external; } interface DaiJoinLike { function join(address, uint256) external payable; function exit(address, uint256) external; } interface JugLike { function drip(bytes32) external returns (uint256); } // Base contract for MakerDAO based DAI-minting strategies abstract contract StrategyMakerBase is StrategyBase { // MakerDAO modules address public dssCdpManager = 0x5ef30b9986345249bc32d8928B7ee64DE9435E39; address public daiJoin = 0x9759A6Ac90977b93B58547b4A71c78317f391A28; address public jug = 0x19c0976f590D67707E62397C87829d896Dc0f1F1; address public vat = 0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B; address public debtToken = 0x6B175474E89094C44Da98b954EedeAC495271d0F; uint256 public minDebt = 501000000000000000000; // sub-strategy related constants address public collateral; uint256 public collateralDecimal = 1e18; address public gemJoin; address public collateralOracle; bytes32 public collateralIlk; AggregatorV3Interface internal priceFeed; // singleton CDP for this strategy uint256 public cdpId = 0; // configurable minimum collateralization percent this strategy would hold for CDP uint256 public minRatio = 300; // collateralization percent buffer in CDP debt actions uint256 public ratioBuff = 500; uint256 public ratioBuffMax = 10000; // Keeper bots, maintain ratio above minimum requirement mapping(address => bool) keepers; constructor( address _collateralJoin, bytes32 _collateralIlk, address _collateral, uint256 _collateralDecimal, address _collateralOracle, address _want, address _governance, address _strategist, address _controller, address _timelock ) public StrategyBase(_want, _governance, _strategist, _controller, _timelock) { require(_want == _collateral, '!mismatchWant'); gemJoin = _collateralJoin; collateralIlk = _collateralIlk; collateral = _collateral; collateralDecimal = _collateralDecimal; collateralOracle = _collateralOracle; priceFeed = AggregatorV3Interface(collateralOracle); } // **** Modifiers **** // modifier onlyKeepers { require( keepers[msg.sender] || msg.sender == address(this) || msg.sender == strategist || msg.sender == governance, "!keepers" ); _; } modifier onlyGovernanceAndStrategist { require(msg.sender == governance || msg.sender == strategist, "!governance"); _; } modifier onlyCDPInUse { uint256 collateralAmt = getCollateralBalance(); require(collateralAmt > 0, '!zeroCollateral'); uint256 debtAmt = getDebtBalance(); require(debtAmt > 0, '!zeroDebt'); _; } modifier onlyCDPInitiated { require(cdpId > 0, '!noCDP'); _; } modifier onlyAboveMinDebt(uint256 _daiAmt) { uint256 debtAmt = getDebtBalance(); require((_daiAmt < debtAmt && (debtAmt.sub(_daiAmt) >= minDebt)) || debtAmt <= _daiAmt, '!minDebt'); _; } function getCollateralBalance() public view returns (uint256) { uint256 ink; address urnHandler = ManagerLike(dssCdpManager).urns(cdpId); (ink, ) = VatLike(vat).urns(collateralIlk, urnHandler); return ink; } function getDebtBalance() public view returns (uint256) { uint256 art; uint256 rate; address urnHandler = ManagerLike(dssCdpManager).urns(cdpId); (, art) = VatLike(vat).urns(collateralIlk, urnHandler); (, rate, , , ) = VatLike(vat).ilks(collateralIlk); return art.mul(rate).div(1e27); } // **** Getters **** function balanceOfPool() public override view returns (uint256){ return getCollateralBalance(); } function collateralValue(uint256 collateralAmt) public view returns (uint256){ uint256 collateralPrice = getLatestCollateralPrice(); return collateralAmt.mul(collateralPrice).mul(1e18).div(collateralDecimal); } function currentRatio() public onlyCDPInUse view returns (uint256) { uint256 collateralAmt = collateralValue(getCollateralBalance()).mul(100); uint256 debtAmt = getDebtBalance(); return collateralAmt.div(debtAmt); } // if borrow is true (for lockAndDraw): return (maxDebt - currentDebt) if positive value, otherwise return 0 // if borrow is false (for redeemAndFree): return (currentDebt - maxDebt) if positive value, otherwise return 0 function calculateDebtFor(uint256 collateralAmt, bool borrow) public view returns (uint256) { uint256 maxDebt = collateralValue(collateralAmt).mul(10000).div(minRatio.mul(10000).mul(ratioBuffMax + ratioBuff).div(ratioBuffMax).div(100)); uint256 debtAmt = getDebtBalance(); uint256 debt = 0; if (borrow && maxDebt >= debtAmt){ debt = maxDebt.sub(debtAmt); } else if (!borrow && debtAmt >= maxDebt){ debt = debtAmt.sub(maxDebt); } return (debt > 0)? debt : 0; } function borrowableDebt() public view returns (uint256) { uint256 collateralAmt = getCollateralBalance(); return calculateDebtFor(collateralAmt, true); } function requiredPaidDebt(uint256 _redeemCollateralAmt) public view returns (uint256) { uint256 collateralAmt = getCollateralBalance().sub(_redeemCollateralAmt); return calculateDebtFor(collateralAmt, false); } // **** sub-strategy implementation **** function _convertWantToBuyback(uint256 _lpAmount) internal virtual override returns (address, uint256); function _depositDAI(uint256 _daiAmt) internal virtual; function _withdrawDAI(uint256 _daiAmt) internal virtual; // **** Oracle (using chainlink) **** function getLatestCollateralPrice() public view returns (uint256){ require(collateralOracle != address(0), '!_collateralOracle'); ( uint80 roundID, int price, uint startedAt, uint timeStamp, uint80 answeredInRound ) = priceFeed.latestRoundData(); if (price > 0){ return uint256(price)/1e8; } else{ return 0; } } // **** Setters **** function setMinDebt(uint256 _minDebt) external onlyGovernanceAndStrategist { minDebt = _minDebt; } function setMinRatio(uint256 _minRatio) external onlyGovernanceAndStrategist { minRatio = _minRatio; } function setRatioBuff(uint256 _ratioBuff) external onlyGovernanceAndStrategist { ratioBuff = _ratioBuff; } function addKeeper(address _keeper) external onlyGovernanceAndStrategist { keepers[_keeper] = true; } function removeKeeper(address _keeper) external onlyGovernanceAndStrategist { keepers[_keeper] = false; } // **** MakerDAO CDP actions **** uint256 constant RAY = 10 ** 27; function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "mul-overflow"); } function toRad(uint256 wad) internal pure returns (uint256 rad) { rad = mul(wad, RAY); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "sub-overflow"); } function toInt(uint256 x) internal pure returns (int256 y) { y = int256(x); require(y >= 0, "int-overflow"); } function convertTo18(address gemJoin, uint256 amt) internal returns (uint256 wad) { wad = mul(amt, 10 ** (18 - GemJoinLike(gemJoin).dec())); } function _getDrawDart(address vat, address jug, address urn, bytes32 ilk, uint wad) internal returns (int256 dart) { uint256 rate = JugLike(jug).drip(ilk); uint256 dai = VatLike(vat).dai(urn); if (dai < toRad(wad)) { dart = toInt(sub(toRad(wad), dai).div(rate)); dart = mul(uint256(dart), rate) < toRad(wad) ? dart + 1 : dart; } } function _getWipeDart(address vat, uint dai, address urn, bytes32 ilk) internal view returns (int256 dart) { (, uint256 rate,,,) = VatLike(vat).ilks(ilk); (, uint256 art) = VatLike(vat).urns(ilk, urn); dart = toInt(dai.div(rate)); dart = uint256(dart) <= art ? - dart : - toInt(art); } function openCDP() external { require(msg.sender == governance, "!governance"); require(cdpId <= 0, "!cdpAlreadyOpened"); cdpId = ManagerLike(dssCdpManager).open(collateralIlk, address(this)); IERC20(collateral).approve(gemJoin, uint256(-1)); IERC20(debtToken).approve(daiJoin, uint256(-1)); } function getUrnVatIlk() internal returns (address, address, bytes32){ return (ManagerLike(dssCdpManager).urns(cdpId), ManagerLike(dssCdpManager).vat(), ManagerLike(dssCdpManager).ilks(cdpId)); } function addCollateralAndBorrow(uint256 _collateralAmt, uint256 _daiAmt) internal onlyCDPInitiated { require(_daiAmt.add(getDebtBalance()) >= minDebt, '!minDebt'); (address urn, address vat, bytes32 ilk) = getUrnVatIlk(); GemJoinLike(gemJoin).join(urn, _collateralAmt); ManagerLike(dssCdpManager).frob(cdpId, toInt(convertTo18(gemJoin, _collateralAmt)), _getDrawDart(vat, jug, urn, ilk, _daiAmt)); ManagerLike(dssCdpManager).move(cdpId, address(this), toRad(_daiAmt)); if (VatLike(vat).can(address(this), address(daiJoin)) == 0) { VatLike(vat).hope(daiJoin); } DaiJoinLike(daiJoin).exit(address(this), _daiAmt); } function repayDAI(uint256 _daiAmt) internal onlyCDPInitiated onlyAboveMinDebt(_daiAmt) { (address urn, address vat, bytes32 ilk) = getUrnVatIlk(); DaiJoinLike(daiJoin).join(urn, _daiAmt); ManagerLike(dssCdpManager).frob(cdpId, 0, _getWipeDart(vat, VatLike(vat).dai(urn), urn, ilk)); } function repayAndRedeemCollateral(uint256 _collateralAmt, uint _daiAmt) internal onlyCDPInitiated onlyAboveMinDebt(_daiAmt) { (address urn, address vat, bytes32 ilk) = getUrnVatIlk(); if (_daiAmt > 0){ DaiJoinLike(daiJoin).join(urn, _daiAmt); } uint256 wad18 = convertTo18(gemJoin, _collateralAmt); ManagerLike(dssCdpManager).frob(cdpId, -toInt(wad18), _getWipeDart(vat, VatLike(vat).dai(urn), urn, ilk)); ManagerLike(dssCdpManager).flux(cdpId, address(this), wad18); GemJoinLike(gemJoin).exit(address(this), _collateralAmt); } // **** State Mutation functions **** function keepMinRatio() external onlyCDPInUse onlyKeepers { uint256 requiredPaidback = requiredPaidDebt(0); if (requiredPaidback > 0){ _withdrawDAI(requiredPaidback); uint256 wad = IERC20(debtToken).balanceOf(address(this)); require(wad >= requiredPaidback, '!mismatchAfterWithdraw'); repayDAI(requiredPaidback); uint256 goodRatio = currentRatio(); require(goodRatio >= minRatio.sub(1), '!stillBelowMinRatio'); } } function deposit() public override { uint256 _want = IERC20(want).balanceOf(address(this)); if (_want > 0) { uint256 _newDebt = calculateDebtFor(_want.add(getCollateralBalance()), true); if(_newDebt.add(getDebtBalance()) >= minDebt){ addCollateralAndBorrow(_want, _newDebt); uint256 wad = IERC20(debtToken).balanceOf(address(this)); if(wad < _newDebt){ _newDebt = wad; } _depositDAI(_newDebt); } } } function _withdrawSome(uint256 _amount) internal override returns (uint256) { uint256 requiredPaidback = requiredPaidDebt(_amount); if (requiredPaidback > 0){ _withdrawDAI(requiredPaidback); } uint256 wad = IERC20(debtToken).balanceOf(address(this)); require(wad >= requiredPaidback, '!mismatchAfterWithdraw'); repayAndRedeemCollateral(_amount, requiredPaidback); return _amount; } } contract StrategyMakerWETHV1 is StrategyMakerBase, StrategyCmpdDaiBase { // strategy specific address public weth_collateral = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public link_eth_usd = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419; uint256 public weth_collateral_decimal = 1e18; bytes32 public weth_ilk = "ETH-A"; address public weth_apt = 0x2F0b23f53734252Bda2277357e97e1517d6B042A; constructor(address _governance, address _strategist, address _controller, address _timelock) public StrategyMakerBase( weth_apt, weth_ilk, weth_collateral, weth_collateral_decimal, link_eth_usd, weth_collateral, _governance, _strategist, _controller, _timelock ) { } // **** Setters **** function setColFactorLeverageBuffer(uint256 _colFactorLeverageBuffer) public onlyGovernanceAndStrategist { colFactorLeverageBuffer = _colFactorLeverageBuffer; } function setColFactorSyncBuffer(uint256 _colFactorSyncBuffer) public onlyGovernanceAndStrategist { colFactorSyncBuffer = _colFactorSyncBuffer; } // **** State Mutation functions **** function leverageToMax() public onlyKeepers{ uint256 unleveragedSupply = getSuppliedUnleveraged(); uint256 idealSupply = getLeveragedSupplyTarget(unleveragedSupply); _lUntil(idealSupply); } function deleverageToMin() public onlyKeepers{ uint256 unleveragedSupply = getSuppliedUnleveraged(); _dlUntil(unleveragedSupply); } function leverageUntil(uint256 _supplyAmount) public onlyKeepers { _lUntil(_supplyAmount); } function deleverageUntil(uint256 _supplyAmount) public onlyKeepers { _dlUntil(_supplyAmount); } function harvest() public override onlyBenevolent { _claimComp(); uint256 _comp = IERC20(comp).balanceOf(address(this)); if (_comp > 0) { _swapUniswap(comp, want, _comp); } uint256 _want = IERC20(want).balanceOf(address(this)); uint256 _buybackAmount = _want.mul(performanceFee).div(performanceMax); if (buybackEnabled == true && _buybackAmount > 0) { buybackAndNotify(want, _buybackAmount); } else { // We want to get back WETH if (_want > 0) { // Performance Fees goes to treasury IERC20(want).safeTransfer(IController(controller).treasury(), _want.mul(performanceFee).div(performanceMax)); } } // re-invest to compounding profit if (_want > 0) { deposit(); } } function _convertWantToBuyback(uint256 _lpAmount) internal override returns (address, uint256){ return (weth_collateral, _lpAmount); } function _depositDAI(uint256 _daiAmt) internal override{ if (_daiAmt > 0){ _supplyDAI(_daiAmt); } } function _withdrawDAI(uint256 _daiAmt) internal override{ if (_daiAmt > 0){ _redeemDAI(_daiAmt); } } // **** Views **** function getName() external override pure returns (string memory) { return "StrategyMakerWETHV1"; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"addKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowableDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collateralAmt","type":"uint256"},{"internalType":"bool","name":"borrow","type":"bool"}],"name":"calculateDebtFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdpId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cether","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralIlk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collateralAmt","type":"uint256"}],"name":"collateralValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"comp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"comptroller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daiJoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleverageToMin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyAmount","type":"uint256"}],"name":"deleverageUntil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFundMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dssCdpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gemJoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBorrowable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBorrowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBorrowedView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getColFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCollateralBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCompAccrued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentLeverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDebtBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestCollateralPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"supplyBalance","type":"uint256"}],"name":"getLeveragedSupplyTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketColFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxLeverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getSOSBorrowRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSafeLeverageColFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSafeSyncColFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupplied","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getSuppliedUnleveraged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getSuppliedView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jug","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepMinRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leverageToMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyAmount","type":"uint256"}],"name":"leverageUntil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"link_eth_usd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mmToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openCDP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratioBuff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratioBuffMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"removeKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renbtcBuyback","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_redeemCollateralAmt","type":"uint256"}],"name":"requiredPaidDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_buybackEnabled","type":"bool"}],"name":"setBuybackEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_colFactorLeverageBuffer","type":"uint256"}],"name":"setColFactorLeverageBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_colFactorSyncBuffer","type":"uint256"}],"name":"setColFactorSyncBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFundFee","type":"uint256"}],"name":"setDevFundFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterChef","type":"address"}],"name":"setMasterChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minDebt","type":"uint256"}],"name":"setMinDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minRatio","type":"uint256"}],"name":"setMinRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mmToken","type":"address"}],"name":"setMmToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ratioBuff","type":"uint256"}],"name":"setRatioBuff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"setTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"univ2Router2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcBuyback","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtcBuyback","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth_apt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth_collateral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth_collateral_decimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth_ilk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_asset","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526175306000908155608c6001908155603c6002556003805474a283aa7cfbb27ef0cfbcb2493dd9f4330e0fd30400610100600160a81b031960ff1990921690931716919091179055600480546001600160a01b031990811673f8873a6080e8dbf41ada900498de0951074af57717909155600680548216732260fac5e5542a773aa44fbcfedf7c193bc2c59917905560078054821673eb4c2781e4eba804ce9a9803c67d0893436bb27d179055600c80548216737a250d5630b4cf539739df2c5dacb4c659f2488d179055600d80548216735ef30b9986345249bc32d8928b7ee64de9435e39179055600e80548216739759a6ac90977b93b58547b4a71c78317f391a28179055600f805482167319c0976f590d67707e62397c87829d896dc0f1f11790556010805482167335d1b3f3d7966a1dfe207aa4514c12a259a0492b179055601180548216736b175474e89094c44da98b954eedeac495271d0f179055681b28c58d9696b40000601255670de0b6b3a7640000601481905560199290925561012c601a556101f4601b55612710601c556064601e556103e8601f819055603260205560215560228054821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2179055602380548216735f4ec3df9cbd43714fe2740f5e3616155c5b8419179055602491909155644554482d4160d81b60255560268054909116732f0b23f53734252bda2277357e97e1517d6b042a1790553480156200022757600080fd5b5060405162005f8138038062005f81833981810160405260808110156200024d57600080fd5b50805160208201516040830151606090930151602654602554602254602454602354969795966001600160a01b0394851694928316921682898989898484848484846200029957600080fd5b6001600160a01b038416620002ad57600080fd5b6001600160a01b038316620002c157600080fd5b6001600160a01b038216620002d557600080fd5b6001600160a01b038116620002e957600080fd5b600580546001600160a01b03199081166001600160a01b039788161790915560088054821695871695909517909455600a8054851693861693909317909255600980548416918516919091179055600b8054909216908316179055888116908616146200038d576040805162461bcd60e51b815260206004820152600d60248201526c085b5a5cdb585d18da15d85b9d609a1b604482015290519081900360640190fd5b5050601580546001600160a01b03998a166001600160a01b031991821617909155601797909755505060138054948716948616949094179093556014919091556016805491851691841691909117908190556018805490931693169290921790555060408051600180825281830190925260609160208083019080368337019050509050735d3a536e4d6dbd6114cc1ead35777bab948e3643816000815181106200043457fe5b6001600160a01b03909216602092830291909101820152604051631853304760e31b815260048101828152835160248301528351733d9819210a31b4961b30ef54be2aed79b9c9cd3b9363c2998238938693928392604490920191858101910280838360005b83811015620004b45781810151838201526020016200049a565b5050505090500192505050600060405180830381600087803b158015620004da57600080fd5b505af1158015620004ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200051957600080fd5b81019080805160405193929190846401000000008211156200053a57600080fd5b9083019060208201858111156200055057600080fd5b82518660208202830111640100000000821117156200056e57600080fd5b82525081516020918201928201910280838360005b838110156200059d57818101518382015260200162000583565b505050509050016040525050505050505050506159c180620005c06000396000f3fe608060405234801561001057600080fd5b506004361061059c5760003560e01c806377e741c7116102e5578063b131da401161018d578063d0e30db0116100f4578063f17336d7116100ad578063f53f135011610087578063f53f135014610b95578063f6ff935214610b9d578063f77c479114610bc2578063f8d8989814610bca5761059c565b8063f17336d714610b68578063f4aa3a8d14610b70578063f4b9fa7514610b8d5761059c565b8063d0e30db014610b0e578063d33219b414610b16578063d8dfeb4514610b1e578063eb514af914610b26578063ec029a4414610b43578063ef55105014610b605761059c565b8063c11645bc11610146578063c11645bc14610ac0578063c1a3d44c14610ac8578063c7b9d53014610ad0578063cc32d17614610af6578063ce7079ba14610afe578063cec2064014610b065761059c565b8063b131da4014610a72578063b635b8ae14610a7a578063b9e3748914610a82578063bdacb30314610a8a578063be0ce30f14610ab0578063bf0e4f1b14610ab85761059c565b80639ac9752c1161024c578063a36f063e11610205578063ab43be71116101df578063ab43be7114610a52578063ac41ceb314610a5a578063af4f170514610a62578063b01db4ec14610a6a5761059c565b8063a36f063e14610a1c578063a890dd9014610a24578063ab033ea914610a2c5761059c565b80639ac9752c146109b95780639c4b8163146109c15780639eb52f61146109c9578063a1e003e4146109d1578063a217d5ce146109ee578063a2d9f4dc146109f65761059c565b806386d8745b1161029e57806386d8745b14610954578063877887821461095c5780638e54edd91461096457806392eefe9b1461096c57806394d0737b146109925780639a9b567d1461099a5761059c565b806377e741c7146109175780637cc79113146106275780638081e1cf1461093457806384718d891461093c578063853828b614610944578063857a52b81461094c5761059c565b80633c5dae941161044857806359bca679116103af5780635fe3b5671161036857806370897b231161034257806370897b23146108e2578063722713f7146108ff5780637396a6261461090757806377da835a1461090f5761059c565b80635fe3b567146108a05780636234dc21146108a85780636765d6fb146108c55761059c565b806359bca6791461085b5780635aa6e675146108785780635bfb92ce146108805780635c208490146108885780635ccbbdf1146108905780635eefb092146108985761059c565b8063475411ab11610401578063475411ab146107e35780634a183ffc146108005780634a1a066b1461080857806351cff8d914610810578063575a86b214610836578063596b93e41461083e5761059c565b80633c5dae94146107955780633fc8cef31461079d5780634032b72b146107a557806345d3bdff146107cb578063463289ed146107d35780634641257d146107db5761059c565b806315ac03fd1161050757806324199bfe116104c05780632bfc9c231161049a5780632bfc9c231461074b5780632e1a7d4d14610753578063302ab80d1461077057806336569e771461078d5761059c565b806324199bfe1461073357806325c977571461073b5780632a99417d146107435761059c565b806315ac03fd1461067a578063160d0da51461068257806317d7de7c1461069e5780631ba894421461071b5780631f1fcd51146107235780631fe4a6861461072b5761059c565b80631158808611610559578063115880861461061f57806313bd4b951461062757806314a1fe021461062757806314ae9f2e1461062f57806314e6ac09146106555780631529a639146106725761059c565b806301664f66146105a157806305166eff146105c5578063057d66a2146105ed5780630ea8b3bf14610607578063109d0af81461060f578063112666b714610617575b600080fd5b6105a9610bd2565b604080516001600160a01b039092168252519081900360200190f35b6105eb600480360360208110156105db57600080fd5b50356001600160a01b0316610be1565b005b6105f5610c56565b60408051918252519081900360200190f35b6105f5610c75565b6105a9610cb5565b6105a9610ccd565b6105f5610ce5565b6105f5610cf4565b6105eb6004803603602081101561064557600080fd5b50356001600160a01b0316610cfb565b6105eb6004803603602081101561066b57600080fd5b5035610d7e565b6105f5610dce565b6105a9610ee5565b61068a610efd565b604080519115158252519081900360200190f35b6106a6610f06565b6040805160208082528351818301528351919283929083019185019080838360005b838110156106e05781810151838201526020016106c8565b50505050905090810190601f16801561070d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105f5610f33565b6105a9610f39565b6105a9610f48565b6105a9610f57565b6105a9610f66565b6105f5610f75565b6105f5610fb6565b6105eb6004803603602081101561076957600080fd5b5035611002565b6105eb6004803603602081101561078657600080fd5b503561139e565b6105a9611405565b6105f5611414565b6105a9611456565b6105eb600480360360208110156107bb57600080fd5b50356001600160a01b031661146e565b6105f56114f4565b6105f56114fa565b6105eb611591565b6105f5600480360360208110156107f957600080fd5b50356117ff565b6105a9611839565b6105f5611848565b6105f56004803603602081101561082657600080fd5b50356001600160a01b031661184e565b6105a961197f565b6105f56004803603602081101561085457600080fd5b503561198e565b6105eb6004803603602081101561087157600080fd5b50356119aa565b6105a9611a11565b6105f5611a20565b6105f5611a64565b6105f5611ae5565b6105f5611c98565b6105a9611cfb565b6105eb600480360360208110156108be57600080fd5b5035611d13565b6105eb600480360360208110156108db57600080fd5b5035611d7a565b6105eb600480360360208110156108f857600080fd5b5035611de1565b6105f5611e31565b6105f5611e52565b6105f5611e87565b6105eb6004803603602081101561092d57600080fd5b5035611f39565b6105f5611f89565b6105a9611fd9565b6105f5611fe8565b6105a96121a0565b6105f56121b8565b6105f56121be565b6105f56121c4565b6105eb6004803603602081101561098257600080fd5b50356001600160a01b03166121ca565b6105eb612237565b6105eb600480360360208110156109b057600080fd5b503515156124b2565b6105eb612512565b6105f561273c565b6105f5612765565b6105f5600480360360208110156109e757600080fd5b5035612838565b6105a9612861565b6105eb60048036036020811015610a0c57600080fd5b50356001600160a01b0316612870565b6105f56128df565b6105a9612a03565b6105eb60048036036020811015610a4257600080fd5b50356001600160a01b0316612a17565b6105a9612a86565b6105eb612a95565b6105f5612b3a565b6105f5612b40565b6105f5612c00565b6105f5612cd6565b6105a9612cdc565b6105eb60048036036020811015610aa057600080fd5b50356001600160a01b0316612ceb565b6105a9612d58565b6105f5612d67565b6105a9612d6d565b6105f5612d7c565b6105eb60048036036020811015610ae657600080fd5b50356001600160a01b0316612dc7565b6105f5612e36565b6105a9612e3c565b6105a9612e4b565b6105eb612e5d565b6105a9612fbd565b6105a9612fcc565b6105eb60048036036020811015610b3c57600080fd5b5035612fdb565b6105eb60048036036020811015610b5957600080fd5b5035613067565b6105f56130ce565b6105f56130d4565b6105eb60048036036020811015610b8657600080fd5b50356130da565b6105a9613166565b6105eb61317e565b6105f560048036036040811015610bb357600080fd5b50803590602001351515613216565b6105a96132d3565b6105a96132e2565b6015546001600160a01b031681565b6008546001600160a01b03163314610c2e576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600080610c61610dce565b9050610c6e816001613216565b9150505b90565b600080610c80611414565b90506000610cae6ec097ce7bc90715b34b9f1000000000670de0b6b3a764000084900363ffffffff6132f116565b9250505090565b73c00e94cb662c3520282e6f5717214004a7f2688881565b73d513d22422a3062bd342ae374b4b9c20e0a9a07481565b6000610cef610dce565b905090565b620186a081565b6008546001600160a01b0316331480610d1e5750600a546001600160a01b031633145b610d5d576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03166000908152601d60205260409020805460ff19169055565b600b546001600160a01b03163314610dc9576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600255565b6000806000600d60009054906101000a90046001600160a01b03166001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610e2e57600080fd5b505afa158015610e42573d6000803e3d6000fd5b505050506040513d6020811015610e5857600080fd5b5051601054601754604080516309092f9760e21b815260048101929092526001600160a01b038085166024840152815194955090921692632424be5c92604480840193919291829003018186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d6040811015610edc57600080fd5b50519250505090565b734ddc2d193948926d02f9b1fe9e1daa0718270ed581565b60035460ff1681565b60408051808201909152601381527253747261746567794d616b657257455448563160681b602082015290565b60145481565b6005546001600160a01b031681565b600a546001600160a01b031681565b6023546001600160a01b031681565b6026546001600160a01b031681565b600080610f80611a64565b90506000610f8c611f89565b9050610cae82610faa83670de0b6b3a764000063ffffffff61333a16565b9063ffffffff6132f116565b600080610fc1611414565b9050610c6e81610faa601f54610faa6ec097ce7bc90715b34b9f1000000000610ff660b6601e5461333a90919063ffffffff16565b9063ffffffff61333a16565b6009546001600160a01b0316331461104f576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561109a57600080fd5b505afa1580156110ae573d6000803e3d6000fd5b505050506040513d60208110156110c457600080fd5b50519050818110156110fd576110e86110e3838363ffffffff61339316565b6133d5565b91506110fa828263ffffffff6134cb16565b91505b600061111b620186a0610faa6002548661333a90919063ffffffff16565b9050600061113b620186a0610faa6001548761333a90919063ffffffff16565b60035490915060ff1615156001141561117e57600080611169611164858563ffffffff6134cb16565b613525565b915091506111778282613534565b5050611294565b60095460408051638d8f1e6760e01b81529051611209926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b1580156111c457600080fd5b505afa1580156111d8573d6000803e3d6000fd5b505050506040513d60208110156111ee57600080fd5b50516005546001600160a01b0316908463ffffffff61367016565b600954604080516361d027b360e01b81529051611294926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561124f57600080fd5b505afa158015611263573d6000803e3d6000fd5b505050506040513d602081101561127957600080fd5b50516005546001600160a01b0316908363ffffffff61367016565b60095460055460408051632988bb9f60e21b81526001600160a01b0392831660048201529051600093929092169163a622ee7c91602480820192602092909190829003018186803b1580156112e857600080fd5b505afa1580156112fc573d6000803e3d6000fd5b505050506040513d602081101561131257600080fd5b505190506001600160a01b03811661135a576040805162461bcd60e51b8152602060048201526006602482015265085d985d5b1d60d21b604482015290519081900360640190fd5b6113978161137e84611372898863ffffffff61339316565b9063ffffffff61339316565b6005546001600160a01b0316919063ffffffff61367016565b5050505050565b6008546001600160a01b03163314806113c15750600a546001600160a01b031633145b611400576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601e55565b6010546001600160a01b031681565b60008061141f6114fa565b90506000610cae611449601f54610faa670de0b6b3a7640000601e5461333a90919063ffffffff16565b839063ffffffff61339316565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6008546001600160a01b03163314806114915750600a546001600160a01b031633145b6114d0576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03166000908152601d60205260409020805460ff19166001179055565b601c5481565b60408051638e8f294b60e01b81526000805160206158eb833981519152600482015281516000928392733d9819210a31b4961b30ef54be2aed79b9c9cd3b92638e8f294b92602480840193919291829003018186803b15801561155c57600080fd5b505afa158015611570573d6000803e3d6000fd5b505050506040513d604081101561158657600080fd5b506020015191505090565b333214806115a957506008546001600160a01b031633145b806115be5750600a546001600160a01b031633145b6115c757600080fd5b6115cf6136c2565b604080516370a0823160e01b8152306004820152905160009173c00e94cb662c3520282e6f5717214004a7f26888916370a0823191602480820192602092909190829003018186803b15801561162457600080fd5b505afa158015611638573d6000803e3d6000fd5b505050506040513d602081101561164e57600080fd5b505190508015611684576005546116849073c00e94cb662c3520282e6f5717214004a7f26888906001600160a01b0316836137c0565b600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156116cf57600080fd5b505afa1580156116e3573d6000803e3d6000fd5b505050506040513d60208110156116f957600080fd5b5051600080549192509061171d90620186a090610faa90859063ffffffff61333a16565b60035490915060ff16151560011480156117375750600081115b1561175757600554611752906001600160a01b031682613534565b6117ec565b81156117ec57600954604080516361d027b360e01b815290516117ec926001600160a01b0316916361d027b3916004808301926020929190829003018186803b1580156117a357600080fd5b505afa1580156117b7573d6000803e3d6000fd5b505050506040513d60208110156117cd57600080fd5b505160005461137e90620186a090610faa90879063ffffffff61333a16565b81156117fa576117fa612e5d565b505050565b60008061180a6128df565b60145490915061183090610faa670de0b6b3a7640000610ff6878663ffffffff61333a16565b9150505b919050565b6007546001600160a01b031681565b60195481565b6009546000906001600160a01b0316331461189e576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6005546001600160a01b03838116911614156118ea576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561193057600080fd5b505afa158015611944573d6000803e3d6000fd5b505050506040513d602081101561195a57600080fd5b5051600954909150611834906001600160a01b0384811691168363ffffffff61367016565b6004546001600160a01b031681565b60008061199d83611372610dce565b9050611830816000613216565b6008546001600160a01b03163314806119cd5750600a546001600160a01b031633145b611a0c576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b602055565b6008546001600160a01b031681565b600080611a2b611a64565b90506000611a37611f89565b9050610cae611a4c838363ffffffff61339316565b610faa84670de0b6b3a764000063ffffffff61333a16565b60408051633af9e66960e01b815230600482015290516000916000805160206158eb83398151915291633af9e6699160248082019260209290919082900301818787803b158015611ab457600080fd5b505af1158015611ac8573d6000803e3d6000fd5b505050506040513d6020811015611ade57600080fd5b5051905090565b600d5460195460408051632726b07360e01b81526004810192909252516000928392839283926001600160a01b031691632726b073916024808301926020929190829003018186803b158015611b3a57600080fd5b505afa158015611b4e573d6000803e3d6000fd5b505050506040513d6020811015611b6457600080fd5b5051601054601754604080516309092f9760e21b815260048101929092526001600160a01b038085166024840152815194955090921692632424be5c92604480840193919291829003018186803b158015611bbe57600080fd5b505afa158015611bd2573d6000803e3d6000fd5b505050506040513d6040811015611be857600080fd5b506020015160105460175460408051636cb1c69b60e11b81526004810192909252519295506001600160a01b039091169163d9638d369160248082019260a092909190829003018186803b158015611c3f57600080fd5b505afa158015611c53573d6000803e3d6000fd5b505050506040513d60a0811015611c6957600080fd5b50602001519150611c906b033b2e3c9fd0803ce8000000610faa858563ffffffff61333a16565b935050505090565b604080516395dd919360e01b815230600482015290516000916000805160206158eb833981519152916395dd919391602480820192602092909190829003018186803b158015611ce757600080fd5b505afa158015611ac8573d6000803e3d6000fd5b733d9819210a31b4961b30ef54be2aed79b9c9cd3b81565b6008546001600160a01b0316331480611d365750600a546001600160a01b031633145b611d75576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601255565b6008546001600160a01b0316331480611d9d5750600a546001600160a01b031633145b611ddc576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601b55565b600b546001600160a01b03163314611e2c576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600055565b6000610cef611e3e610ce5565b611e46612d7c565b9063ffffffff6134cb16565b600080611e5d6114fa565b90506000610cae611449602154610faa670de0b6b3a764000060205461333a90919063ffffffff16565b604080516361bfb47160e11b81523060048201529051600091829182916000805160206158eb8339815191529163c37f68e291602480820192608092909190829003018186803b158015611eda57600080fd5b505afa158015611eee573d6000803e3d6000fd5b505050506040513d6080811015611f0457600080fd5b50602080820151606090920151604080519283019052808252919350909150600090611f309084613cb1565b94505050505090565b600b546001600160a01b03163314611f84576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600155565b604080516305eff7ef60e21b815230600482015290516000916000805160206158eb833981519152916317bfdfbc9160248082019260209290919082900301818787803b158015611ab457600080fd5b600f546001600160a01b031681565b6009546000906001600160a01b03163314612038576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b612040613d05565b600554604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d60208110156120b557600080fd5b505160095460055460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b15801561210d57600080fd5b505afa158015612121573d6000803e3d6000fd5b505050506040513d602081101561213757600080fd5b505190506001600160a01b03811661217f576040805162461bcd60e51b8152602060048201526006602482015265085d985d5b1d60d21b604482015290519081900360640190fd5b60055461219c906001600160a01b0316828463ffffffff61367016565b5090565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b601a5481565b60005481565b60255481565b600b546001600160a01b03163314612215576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000612241610dce565b90506000811161228a576040805162461bcd60e51b815260206004820152600f60248201526e085e995c9bd0dbdb1b185d195c985b608a1b604482015290519081900360640190fd5b6000612294611ae5565b9050600081116122d7576040805162461bcd60e51b8152602060048201526009602482015268085e995c9bd119589d60ba1b604482015290519081900360640190fd5b336000908152601d602052604090205460ff16806122f457503330145b806123095750600a546001600160a01b031633145b8061231e57506008546001600160a01b031633145b61235a576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b6000612366600061198e565b905080156117fa5761237781613d10565b601154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156123c257600080fd5b505afa1580156123d6573d6000803e3d6000fd5b505050506040513d60208110156123ec57600080fd5b505190508181101561243e576040805162461bcd60e51b8152602060048201526016602482015275216d69736d617463684166746572576974686472617760501b604482015290519081900360640190fd5b61244782613d1f565b6000612451612c00565b601a5490915061246890600163ffffffff61339316565b811015611397576040805162461bcd60e51b8152602060048201526013602482015272217374696c6c42656c6f774d696e526174696f60681b604482015290519081900360640190fd5b6008546001600160a01b031633146124ff576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003805460ff1916911515919091179055565b6008546001600160a01b0316331461255f576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601954156125a8576040805162461bcd60e51b81526020600482015260116024820152700858d91c105b1c9958591e53dc195b9959607a1b604482015290519081900360640190fd5b600d5460175460408051636090dec560e01b81526004810192909252306024830152516001600160a01b0390921691636090dec5916044808201926020929091908290030181600087803b1580156125ff57600080fd5b505af1158015612613573d6000803e3d6000fd5b505050506040513d602081101561262957600080fd5b50516019556013546015546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561268857600080fd5b505af115801561269c573d6000803e3d6000fd5b505050506040513d60208110156126b257600080fd5b5050601154600e546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561270e57600080fd5b505af1158015612722573d6000803e3d6000fd5b505050506040513d602081101561273857600080fd5b5050565b600080612747611a64565b90506000612753611f89565b9050610cae828263ffffffff61339316565b600080612770611a64565b9050600061277c611f89565b60408051638e8f294b60e01b81526000805160206158eb83398151915260048201528151929350600092733d9819210a31b4961b30ef54be2aed79b9c9cd3b92638e8f294b9260248082019391829003018186803b1580156127dd57600080fd5b505afa1580156127f1573d6000803e3d6000fd5b505050506040513d604081101561280757600080fd5b50602001519050611c90612710610faa61270f610ff686611372670de0b6b3a7640000858b8a63ffffffff61333a16565b600080612843610c75565b9050611830670de0b6b3a7640000610faa858463ffffffff61333a16565b6016546001600160a01b031681565b6008546001600160a01b031633146128bd576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6016546000906001600160a01b0316612934576040805162461bcd60e51b8152602060048201526012602482015271215f636f6c6c61746572616c4f7261636c6560701b604482015290519081900360640190fd5b6000806000806000601860009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561298a57600080fd5b505afa15801561299e573d6000803e3d6000fd5b505050506040513d60a08110156129b457600080fd5b5080516020820151604083015160608401516080909401519298509096509450909250905060008413156129f5576305f5e100840495505050505050610c72565b600095505050505050610c72565b60035461010090046001600160a01b031681565b6008546001600160a01b03163314612a64576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b031681565b336000908152601d602052604090205460ff1680612ab257503330145b80612ac75750600a546001600160a01b031633145b80612adc57506008546001600160a01b031633145b612b18576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b6000612b2261273c565b90506000612b2f82612838565b905061273881613f4f565b601b5481565b60408051631ea6374160e01b815273c00e94cb662c3520282e6f5717214004a7f268886004820152733d9819210a31b4961b30ef54be2aed79b9c9cd3b60248201523060448201529051600091829173d513d22422a3062bd342ae374b4b9c20e0a9a07491631ea6374191606480830192608092919082900301818787803b158015612bcb57600080fd5b505af1158015612bdf573d6000803e3d6000fd5b505050506040513d6080811015612bf557600080fd5b506060015191505090565b600080612c0b610dce565b905060008111612c54576040805162461bcd60e51b815260206004820152600f60248201526e085e995c9bd0dbdb1b185d195c985b608a1b604482015290519081900360640190fd5b6000612c5e611ae5565b905060008111612ca1576040805162461bcd60e51b8152602060048201526009602482015268085e995c9bd119589d60ba1b604482015290519081900360640190fd5b6000612cb86064610ff6612cb3610dce565b6117ff565b90506000612cc4611ae5565b9050611f30828263ffffffff6132f116565b60025481565b600c546001600160a01b031681565b600b546001600160a01b03163314612d36576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6022546001600160a01b031681565b60245481565b600e546001600160a01b031681565b600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611ce757600080fd5b6008546001600160a01b03163314612e14576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60015481565b6006546001600160a01b031681565b6000805160206158eb83398151915281565b600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612ea857600080fd5b505afa158015612ebc573d6000803e3d6000fd5b505050506040513d6020811015612ed257600080fd5b505190508015612fba576000612f00612ef9612eec610dce565b849063ffffffff6134cb16565b6001613216565b9050601254612f1d612f10611ae5565b839063ffffffff6134cb16565b1061273857612f2c82826140b9565b601154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612f7757600080fd5b505afa158015612f8b573d6000803e3d6000fd5b505050506040513d6020811015612fa157600080fd5b5051905081811015612fb1578091505b6117fa82614459565b50565b600b546001600160a01b031681565b6013546001600160a01b031681565b336000908152601d602052604090205460ff1680612ff857503330145b8061300d5750600a546001600160a01b031633145b8061302257506008546001600160a01b031633145b61305e576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b612fba81614468565b6008546001600160a01b031633148061308a5750600a546001600160a01b031633145b6130c9576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601a55565b60175481565b60125481565b336000908152601d602052604090205460ff16806130f757503330145b8061310c5750600a546001600160a01b031633145b8061312157506008546001600160a01b031633145b61315d576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b612fba81613f4f565b736b175474e89094c44da98b954eedeac495271d0f81565b336000908152601d602052604090205460ff168061319b57503330145b806131b05750600a546001600160a01b031633145b806131c557506008546001600160a01b031633145b613201576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b600061320b61273c565b9050612fba81614468565b6000806132576132486064610faa601c54610faa601b54601c5401610ff6612710601a5461333a90919063ffffffff16565b610faa612710610ff6886117ff565b90506000613263611ae5565b905060008480156132745750818310155b1561329057613289838363ffffffff61339316565b90506132b6565b8415801561329e5750828210155b156132b6576132b3828463ffffffff61339316565b90505b600081116132c55760006132c7565b805b93505050505b92915050565b6009546001600160a01b031681565b6011546001600160a01b031681565b600061333383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061470a565b9392505050565b600082613349575060006132cd565b8282028284828161335657fe5b04146133335760405162461bcd60e51b815260040180806020018281038252602181526020018061590b6021913960400191505060405180910390fd5b600061333383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506147ac565b6000806133e18361198e565b905080156133f2576133f281613d10565b601154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561343d57600080fd5b505afa158015613451573d6000803e3d6000fd5b505050506040513d602081101561346757600080fd5b50519050818110156134b9576040805162461bcd60e51b8152602060048201526016602482015275216d69736d617463684166746572576974686472617760501b604482015290519081900360640190fd5b6134c38483614806565b509192915050565b600082820183811015613333576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6022546001600160a01b031691565b60035460ff161515600114156127385760035461356190839061010090046001600160a01b0316836137c0565b600354604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156135b157600080fd5b505afa1580156135c5573d6000803e3d6000fd5b505050506040513d60208110156135db57600080fd5b50516004546003549192506136089161010090046001600160a01b0390811691168363ffffffff61367016565b6004805460408051635ad6dca560e11b8152928301849052516001600160a01b039091169163b5adb94a91602480830192600092919082900301818387803b15801561365357600080fd5b505af1158015613667573d6000803e3d6000fd5b50505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526117fa908490614b53565b604080516001808252818301909252606091602080830190803683370190505090506000805160206158eb8339815191528160008151811061370057fe5b6001600160a01b039092166020928302919091018201526040805162e1ed9760e51b8152306004820181815260248301938452855160448401528551733d9819210a31b4961b30ef54be2aed79b9c9cd3b95631c3db2e0959394889492606490910191858101910280838360005b8381101561378657818101518382015260200161376e565b505050509050019350505050600060405180830381600087803b1580156137ac57600080fd5b505af1158015611397573d6000803e3d6000fd5b6001600160a01b0382166137d357600080fd5b600c546137f4906001600160a01b038581169116600063ffffffff614c0416565b600c54613814906001600160a01b0385811691168363ffffffff614c0416565b6003546060906001600160a01b0384811661010090920416148015613840575060035460ff1615156001145b156139b0576001600160a01b03841673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814156138eb576040805160028082526060820183529091602083019080368337019050509050838160008151811061389857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505082816001815181106138c657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506139ab565b604080516003808252608082019092529060208201606080368337019050509050838160008151811061391a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061395c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061398a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b613b18565b6001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214806139f757506001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2145b15613a585760408051600280825260608201835290916020830190803683370190505090508381600081518110613a2a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061398a57fe5b6040805160038082526080820190925290602082016060803683370190505090508381600081518110613a8757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613ac957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110613af757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600c546001600160a01b03166338ed17398360008430613b3f42603c63ffffffff6134cb16565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613bb8578181015183820152602001613ba0565b505050509050019650505050505050600060405180830381600087803b158015613be157600080fd5b505af1158015613bf5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613c1e57600080fd5b8101908080516040519392919084640100000000821115613c3e57600080fd5b908301906020820185811115613c5357600080fd5b8251866020820283011164010000000082111715613c7057600080fd5b82525081516020918201928201910280838360005b83811015613c9d578181015183820152602001613c85565b505050509050016040525050505050505050565b6000806000613cbe6158d7565b613cc88686614d17565b90925090506000826003811115613cdb57fe5b14613cec5750915060009050613cfe565b6000613cf782614d7f565b9350935050505b9250929050565b612fba6110e3610ce5565b8015612fba57612fba81614d8e565b600060195411613d5f576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b806000613d6a611ae5565b90508082108015613d8c5750601254613d89828463ffffffff61339316565b10155b80613d975750818111155b613dd3576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b6000806000613de0614f9b565b600e5460408051633b4da69f60e01b81526001600160a01b038087166004830152602482018d905291519598509396509194501691633b4da69f9160448082019260009290919082900301818387803b158015613e3c57600080fd5b505af1158015613e50573d6000803e3d6000fd5b5050600d5460195460408051633612d9a360e11b81526001600160a01b038981166004830152915193821695506345e6bdcd94509192600092613eeb92899290831691636c25b346916024808301926020929190829003018186803b158015613eb857600080fd5b505afa158015613ecc573d6000803e3d6000fd5b505050506040513d6020811015613ee257600080fd5b5051898861511f565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015613f2f57600080fd5b505af1158015613f43573d6000803e3d6000fd5b50505050505050505050565b6000613f59610c75565b90506000613f6561273c565b9050808310158015613f925750613f8e670de0b6b3a7640000610faa838563ffffffff61333a16565b8311155b613fcf576040805162461bcd60e51b8152602060048201526009602482015268216c6576657261676560b81b604482015290519081900360640190fd5b600080613fda611a64565b90505b8481101561139757613fed612765565b915084614000828463ffffffff6134cb16565b111561401957614016858263ffffffff61339316565b91505b6000805160206158eb8339815191526001600160a01b031663c5ebeaec836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561406d57600080fd5b505af1158015614081573d6000803e3d6000fd5b505050506040513d602081101561409757600080fd5b506140a29050615256565b6140b2818363ffffffff6134cb16565b9050613fdd565b6000601954116140f9576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b601254614107612f10611ae5565b1015614145576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b6000806000614152614f9b565b60155460408051633b4da69f60e01b81526001600160a01b038087166004830152602482018c905291519598509396509194501691633b4da69f9160448082019260009290919082900301818387803b1580156141ae57600080fd5b505af11580156141c2573d6000803e3d6000fd5b5050600d546019546015546001600160a01b0392831694506345e6bdcd935090916141f7916141f291168a6152e2565b61535a565b600f546142119087906001600160a01b031689888c6153a0565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561425557600080fd5b505af1158015614269573d6000803e3d6000fd5b5050600d546019546001600160a01b03909116925063f9f30db691503061428f886154ef565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156142e557600080fd5b505af11580156142f9573d6000803e3d6000fd5b5050600e5460408051634538c4eb60e01b81523060048201526001600160a01b03928316602482015290519186169350634538c4eb9250604480820192602092909190829003018186803b15801561435057600080fd5b505afa158015614364573d6000803e3d6000fd5b505050506040513d602081101561437a57600080fd5b50516143e757600e54604080516328ec8bf160e21b81526001600160a01b03928316600482015290519184169163a3b22fc49160248082019260009290919082900301818387803b1580156143ce57600080fd5b505af11580156143e2573d6000803e3d6000fd5b505050505b600e546040805163ef693bed60e01b81523060048201526024810187905290516001600160a01b039092169163ef693bed9160448082019260009290919082900301818387803b15801561443a57600080fd5b505af115801561444e573d6000803e3d6000fd5b505050505050505050565b8015612fba57612fba81615507565b600061447261273c565b9050600061447e611a64565b90508183101580156144905750808311155b6144cf576040805162461bcd60e51b815260206004820152600b60248201526a2164656c6576657261676560a81b604482015290519081900360640190fd5b60006144d9612765565b90505b836144ed838363ffffffff61339316565b101561450657614503828563ffffffff61339316565b90505b6000805160206158eb8339815191526001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561455a57600080fd5b505af115801561456e573d6000803e3d6000fd5b505050506040513d602081101561458457600080fd5b5051156145c9576040805162461bcd60e51b815260206004820152600e60248201526d085c995919595b511b155b9d1a5b60921b604482015290519081900360640190fd5b6145fd736b175474e89094c44da98b954eedeac495271d0f6000805160206158eb833981519152600063ffffffff614c0416565b614630736b175474e89094c44da98b954eedeac495271d0f6000805160206158eb8339815191528363ffffffff614c0416565b6000805160206158eb8339815191526001600160a01b0316630e752702826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561468457600080fd5b505af1158015614698573d6000803e3d6000fd5b505050506040513d60208110156146ae57600080fd5b5051156146eb576040805162461bcd60e51b815260206004820152600660248201526521726570617960d01b604482015290519081900360640190fd5b6146fb828263ffffffff61339316565b91508382116144dc5750505050565b600081836147965760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561475b578181015183820152602001614743565b50505050905090810190601f1680156147885780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816147a257fe5b0495945050505050565b600081848411156147fe5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561475b578181015183820152602001614743565b505050900390565b600060195411614846576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b806000614851611ae5565b905080821080156148735750601254614870828463ffffffff61339316565b10155b8061487e5750818111155b6148ba576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b60008060006148c7614f9b565b91945092509050851561494257600e5460408051633b4da69f60e01b81526001600160a01b038681166004830152602482018a905291519190921691633b4da69f91604480830192600092919082900301818387803b15801561492957600080fd5b505af115801561493d573d6000803e3d6000fd5b505050505b60155460009061495b906001600160a01b0316896152e2565b600d546019549192506001600160a01b0316906345e6bdcd9061497d8461535a565b600003614a0d87886001600160a01b0316636c25b3468b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156149da57600080fd5b505afa1580156149ee573d6000803e3d6000fd5b505050506040513d6020811015614a0457600080fd5b50518a8961511f565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015614a5157600080fd5b505af1158015614a65573d6000803e3d6000fd5b5050600d54601954604080516313771f0760e31b8152600481019290925230602483015260448201869052516001600160a01b039092169350639bb8f838925060648082019260009290919082900301818387803b158015614ac657600080fd5b505af1158015614ada573d6000803e3d6000fd5b50506015546040805163ef693bed60e01b8152306004820152602481018d905290516001600160a01b03909216935063ef693bed925060448082019260009290919082900301818387803b158015614b3157600080fd5b505af1158015614b45573d6000803e3d6000fd5b505050505050505050505050565b6060614ba8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166156399092919063ffffffff16565b8051909150156117fa57808060200190516020811015614bc757600080fd5b50516117fa5760405162461bcd60e51b815260040180806020018281038252602a81526020018061592c602a913960400191505060405180910390fd5b801580614c8a575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614c5c57600080fd5b505afa158015614c70573d6000803e3d6000fd5b505050506040513d6020811015614c8657600080fd5b5051155b614cc55760405162461bcd60e51b81526004018080602001828103825260368152602001806159566036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526117fa908490614b53565b6000614d216158d7565b600080614d32866000015186615650565b90925090506000826003811115614d4557fe5b14614d6457506040805160208101909152600081529092509050613cfe565b60408051602081019091529081526000969095509350505050565b51670de0b6b3a7640000900490565b6000614d9861273c565b9050808211614da75781614da9565b805b91508180156117fa57806000805160206158eb8339815191526001600160a01b0316633b1d21a26040518163ffffffff1660e01b815260040160206040518083038186803b158015614dfa57600080fd5b505afa158015614e0e573d6000803e3d6000fd5b505050506040513d6020811015614e2457600080fd5b50511015614e6b576040805162461bcd60e51b815260206004820152600f60248201526e21636173682d6c697175696469747960881b604482015290519081900360640190fd5b6000614e75611f89565b90506000614e81611a64565b90506000614e8d611a20565b90506000614ead670de0b6b3a7640000610faa878563ffffffff61333a16565b905083811115614ecc57614ec7614ec261273c565b614468565b614edf565b614edf614ec2848363ffffffff61339316565b6000805160206158eb8339815191526001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015614f3357600080fd5b505af1158015614f47573d6000803e3d6000fd5b505050506040513d6020811015614f5d57600080fd5b505115613667576040805162461bcd60e51b81526020600482015260076024820152662172656465656d60c81b604482015290519081900360640190fd5b6000806000600d60009054906101000a90046001600160a01b03166001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015614ffb57600080fd5b505afa15801561500f573d6000803e3d6000fd5b505050506040513d602081101561502557600080fd5b5051600d54604080516336569e7760e01b815290516001600160a01b03909216916336569e7791600480820192602092909190829003018186803b15801561506c57600080fd5b505afa158015615080573d6000803e3d6000fd5b505050506040513d602081101561509657600080fd5b5051600d5460195460408051632c2cb9fd60e01b81526004810192909252516001600160a01b0390921691632c2cb9fd91602480820192602092909190829003018186803b1580156150e757600080fd5b505afa1580156150fb573d6000803e3d6000fd5b505050506040513d602081101561511157600080fd5b505191945092509050909192565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561516657600080fd5b505afa15801561517a573d6000803e3d6000fd5b505050506040513d60a081101561519057600080fd5b5060200151604080516309092f9760e21b8152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b1580156151e757600080fd5b505afa1580156151fb573d6000803e3d6000fd5b505050506040513d604081101561521157600080fd5b5060200151905061522b6141f2878463ffffffff6132f116565b9250808311156152465761523e8161535a565b60000361524b565b826000035b979650505050505050565b604080516370a0823160e01b81523060048201529051600091736b175474e89094c44da98b954eedeac495271d0f916370a0823191602480820192602092909190829003018186803b1580156152ab57600080fd5b505afa1580156152bf573d6000803e3d6000fd5b505050506040513d60208110156152d557600080fd5b50519050612fba81615507565b600061333382846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561532357600080fd5b505af1158015615337573d6000803e3d6000fd5b505050506040513d602081101561534d57600080fd5b5051601203600a0a61568f565b806000811215611834576040805162461bcd60e51b815260206004820152600c60248201526b696e742d6f766572666c6f7760a01b604482015290519081900360640190fd5b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156153e957600080fd5b505af11580156153fd573d6000803e3d6000fd5b505050506040513d602081101561541357600080fd5b505160408051633612d9a360e11b81526001600160a01b0388811660048301529151929350600092918a1691636c25b34691602480820192602092909190829003018186803b15801561546557600080fd5b505afa158015615479573d6000803e3d6000fd5b505050506040513d602081101561548f57600080fd5b5051905061549c846154ef565b8110156154e4576154bc6141f283610faa6154b6886154ef565b856156ea565b92506154c7846154ef565b6154d1848461568f565b106154dc57826154e1565b826001015b92505b505095945050505050565b60006132cd826b033b2e3c9fd0803ce800000061568f565b8015612fba57615541736b175474e89094c44da98b954eedeac495271d0f6000805160206158eb833981519152600063ffffffff614c0416565b615574736b175474e89094c44da98b954eedeac495271d0f6000805160206158eb8339815191528363ffffffff614c0416565b6000805160206158eb8339815191526001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156155c857600080fd5b505af11580156155dc573d6000803e3d6000fd5b505050506040513d60208110156155f257600080fd5b505115612fba576040805162461bcd60e51b815260206004820152601060248201526f0859195c1bdcda5d125b9d1bd0db5c1960821b604482015290519081900360640190fd5b60606156488484600085615731565b949350505050565b6000808361566357506000905080613cfe565b8383028385828161567057fe5b041461568457506002915060009050613cfe565b600092509050613cfe565b60008115806156aa575050808202828282816156a757fe5b04145b6132cd576040805162461bcd60e51b815260206004820152600c60248201526b6d756c2d6f766572666c6f7760a01b604482015290519081900360640190fd5b808203828111156132cd576040805162461bcd60e51b815260206004820152600c60248201526b7375622d6f766572666c6f7760a01b604482015290519081900360640190fd5b606061573c8561589e565b61578d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106157cc5780518252601f1990920191602091820191016157ad565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461582e576040519150601f19603f3d011682016040523d82523d6000602084013e615833565b606091505b509150915081156158475791506156489050565b8051156158575780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561475b578181015183820152602001614743565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615648575050151592915050565b604051806020016040528060008152509056fe0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220206a3c60d9092c1fff733e4e4aae60be270a982654b9d88c265b12e7c9a1bd7164736f6c6343000607003300000000000000000000000043229759e12efbe3e2a0fb0510b15e516d0464420000000000000000000000007cdacba026dddaa0bd77e63474425f630ddf4a0d0000000000000000000000004bf5059065541a2b176500928e91fbfd0b121d070000000000000000000000005dae9b27313670663b34ac8bffd18825bb9df736
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061059c5760003560e01c806377e741c7116102e5578063b131da401161018d578063d0e30db0116100f4578063f17336d7116100ad578063f53f135011610087578063f53f135014610b95578063f6ff935214610b9d578063f77c479114610bc2578063f8d8989814610bca5761059c565b8063f17336d714610b68578063f4aa3a8d14610b70578063f4b9fa7514610b8d5761059c565b8063d0e30db014610b0e578063d33219b414610b16578063d8dfeb4514610b1e578063eb514af914610b26578063ec029a4414610b43578063ef55105014610b605761059c565b8063c11645bc11610146578063c11645bc14610ac0578063c1a3d44c14610ac8578063c7b9d53014610ad0578063cc32d17614610af6578063ce7079ba14610afe578063cec2064014610b065761059c565b8063b131da4014610a72578063b635b8ae14610a7a578063b9e3748914610a82578063bdacb30314610a8a578063be0ce30f14610ab0578063bf0e4f1b14610ab85761059c565b80639ac9752c1161024c578063a36f063e11610205578063ab43be71116101df578063ab43be7114610a52578063ac41ceb314610a5a578063af4f170514610a62578063b01db4ec14610a6a5761059c565b8063a36f063e14610a1c578063a890dd9014610a24578063ab033ea914610a2c5761059c565b80639ac9752c146109b95780639c4b8163146109c15780639eb52f61146109c9578063a1e003e4146109d1578063a217d5ce146109ee578063a2d9f4dc146109f65761059c565b806386d8745b1161029e57806386d8745b14610954578063877887821461095c5780638e54edd91461096457806392eefe9b1461096c57806394d0737b146109925780639a9b567d1461099a5761059c565b806377e741c7146109175780637cc79113146106275780638081e1cf1461093457806384718d891461093c578063853828b614610944578063857a52b81461094c5761059c565b80633c5dae941161044857806359bca679116103af5780635fe3b5671161036857806370897b231161034257806370897b23146108e2578063722713f7146108ff5780637396a6261461090757806377da835a1461090f5761059c565b80635fe3b567146108a05780636234dc21146108a85780636765d6fb146108c55761059c565b806359bca6791461085b5780635aa6e675146108785780635bfb92ce146108805780635c208490146108885780635ccbbdf1146108905780635eefb092146108985761059c565b8063475411ab11610401578063475411ab146107e35780634a183ffc146108005780634a1a066b1461080857806351cff8d914610810578063575a86b214610836578063596b93e41461083e5761059c565b80633c5dae94146107955780633fc8cef31461079d5780634032b72b146107a557806345d3bdff146107cb578063463289ed146107d35780634641257d146107db5761059c565b806315ac03fd1161050757806324199bfe116104c05780632bfc9c231161049a5780632bfc9c231461074b5780632e1a7d4d14610753578063302ab80d1461077057806336569e771461078d5761059c565b806324199bfe1461073357806325c977571461073b5780632a99417d146107435761059c565b806315ac03fd1461067a578063160d0da51461068257806317d7de7c1461069e5780631ba894421461071b5780631f1fcd51146107235780631fe4a6861461072b5761059c565b80631158808611610559578063115880861461061f57806313bd4b951461062757806314a1fe021461062757806314ae9f2e1461062f57806314e6ac09146106555780631529a639146106725761059c565b806301664f66146105a157806305166eff146105c5578063057d66a2146105ed5780630ea8b3bf14610607578063109d0af81461060f578063112666b714610617575b600080fd5b6105a9610bd2565b604080516001600160a01b039092168252519081900360200190f35b6105eb600480360360208110156105db57600080fd5b50356001600160a01b0316610be1565b005b6105f5610c56565b60408051918252519081900360200190f35b6105f5610c75565b6105a9610cb5565b6105a9610ccd565b6105f5610ce5565b6105f5610cf4565b6105eb6004803603602081101561064557600080fd5b50356001600160a01b0316610cfb565b6105eb6004803603602081101561066b57600080fd5b5035610d7e565b6105f5610dce565b6105a9610ee5565b61068a610efd565b604080519115158252519081900360200190f35b6106a6610f06565b6040805160208082528351818301528351919283929083019185019080838360005b838110156106e05781810151838201526020016106c8565b50505050905090810190601f16801561070d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105f5610f33565b6105a9610f39565b6105a9610f48565b6105a9610f57565b6105a9610f66565b6105f5610f75565b6105f5610fb6565b6105eb6004803603602081101561076957600080fd5b5035611002565b6105eb6004803603602081101561078657600080fd5b503561139e565b6105a9611405565b6105f5611414565b6105a9611456565b6105eb600480360360208110156107bb57600080fd5b50356001600160a01b031661146e565b6105f56114f4565b6105f56114fa565b6105eb611591565b6105f5600480360360208110156107f957600080fd5b50356117ff565b6105a9611839565b6105f5611848565b6105f56004803603602081101561082657600080fd5b50356001600160a01b031661184e565b6105a961197f565b6105f56004803603602081101561085457600080fd5b503561198e565b6105eb6004803603602081101561087157600080fd5b50356119aa565b6105a9611a11565b6105f5611a20565b6105f5611a64565b6105f5611ae5565b6105f5611c98565b6105a9611cfb565b6105eb600480360360208110156108be57600080fd5b5035611d13565b6105eb600480360360208110156108db57600080fd5b5035611d7a565b6105eb600480360360208110156108f857600080fd5b5035611de1565b6105f5611e31565b6105f5611e52565b6105f5611e87565b6105eb6004803603602081101561092d57600080fd5b5035611f39565b6105f5611f89565b6105a9611fd9565b6105f5611fe8565b6105a96121a0565b6105f56121b8565b6105f56121be565b6105f56121c4565b6105eb6004803603602081101561098257600080fd5b50356001600160a01b03166121ca565b6105eb612237565b6105eb600480360360208110156109b057600080fd5b503515156124b2565b6105eb612512565b6105f561273c565b6105f5612765565b6105f5600480360360208110156109e757600080fd5b5035612838565b6105a9612861565b6105eb60048036036020811015610a0c57600080fd5b50356001600160a01b0316612870565b6105f56128df565b6105a9612a03565b6105eb60048036036020811015610a4257600080fd5b50356001600160a01b0316612a17565b6105a9612a86565b6105eb612a95565b6105f5612b3a565b6105f5612b40565b6105f5612c00565b6105f5612cd6565b6105a9612cdc565b6105eb60048036036020811015610aa057600080fd5b50356001600160a01b0316612ceb565b6105a9612d58565b6105f5612d67565b6105a9612d6d565b6105f5612d7c565b6105eb60048036036020811015610ae657600080fd5b50356001600160a01b0316612dc7565b6105f5612e36565b6105a9612e3c565b6105a9612e4b565b6105eb612e5d565b6105a9612fbd565b6105a9612fcc565b6105eb60048036036020811015610b3c57600080fd5b5035612fdb565b6105eb60048036036020811015610b5957600080fd5b5035613067565b6105f56130ce565b6105f56130d4565b6105eb60048036036020811015610b8657600080fd5b50356130da565b6105a9613166565b6105eb61317e565b6105f560048036036040811015610bb357600080fd5b50803590602001351515613216565b6105a96132d3565b6105a96132e2565b6015546001600160a01b031681565b6008546001600160a01b03163314610c2e576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600080610c61610dce565b9050610c6e816001613216565b9150505b90565b600080610c80611414565b90506000610cae6ec097ce7bc90715b34b9f1000000000670de0b6b3a764000084900363ffffffff6132f116565b9250505090565b73c00e94cb662c3520282e6f5717214004a7f2688881565b73d513d22422a3062bd342ae374b4b9c20e0a9a07481565b6000610cef610dce565b905090565b620186a081565b6008546001600160a01b0316331480610d1e5750600a546001600160a01b031633145b610d5d576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03166000908152601d60205260409020805460ff19169055565b600b546001600160a01b03163314610dc9576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600255565b6000806000600d60009054906101000a90046001600160a01b03166001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610e2e57600080fd5b505afa158015610e42573d6000803e3d6000fd5b505050506040513d6020811015610e5857600080fd5b5051601054601754604080516309092f9760e21b815260048101929092526001600160a01b038085166024840152815194955090921692632424be5c92604480840193919291829003018186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d6040811015610edc57600080fd5b50519250505090565b734ddc2d193948926d02f9b1fe9e1daa0718270ed581565b60035460ff1681565b60408051808201909152601381527253747261746567794d616b657257455448563160681b602082015290565b60145481565b6005546001600160a01b031681565b600a546001600160a01b031681565b6023546001600160a01b031681565b6026546001600160a01b031681565b600080610f80611a64565b90506000610f8c611f89565b9050610cae82610faa83670de0b6b3a764000063ffffffff61333a16565b9063ffffffff6132f116565b600080610fc1611414565b9050610c6e81610faa601f54610faa6ec097ce7bc90715b34b9f1000000000610ff660b6601e5461333a90919063ffffffff16565b9063ffffffff61333a16565b6009546001600160a01b0316331461104f576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561109a57600080fd5b505afa1580156110ae573d6000803e3d6000fd5b505050506040513d60208110156110c457600080fd5b50519050818110156110fd576110e86110e3838363ffffffff61339316565b6133d5565b91506110fa828263ffffffff6134cb16565b91505b600061111b620186a0610faa6002548661333a90919063ffffffff16565b9050600061113b620186a0610faa6001548761333a90919063ffffffff16565b60035490915060ff1615156001141561117e57600080611169611164858563ffffffff6134cb16565b613525565b915091506111778282613534565b5050611294565b60095460408051638d8f1e6760e01b81529051611209926001600160a01b031691638d8f1e67916004808301926020929190829003018186803b1580156111c457600080fd5b505afa1580156111d8573d6000803e3d6000fd5b505050506040513d60208110156111ee57600080fd5b50516005546001600160a01b0316908463ffffffff61367016565b600954604080516361d027b360e01b81529051611294926001600160a01b0316916361d027b3916004808301926020929190829003018186803b15801561124f57600080fd5b505afa158015611263573d6000803e3d6000fd5b505050506040513d602081101561127957600080fd5b50516005546001600160a01b0316908363ffffffff61367016565b60095460055460408051632988bb9f60e21b81526001600160a01b0392831660048201529051600093929092169163a622ee7c91602480820192602092909190829003018186803b1580156112e857600080fd5b505afa1580156112fc573d6000803e3d6000fd5b505050506040513d602081101561131257600080fd5b505190506001600160a01b03811661135a576040805162461bcd60e51b8152602060048201526006602482015265085d985d5b1d60d21b604482015290519081900360640190fd5b6113978161137e84611372898863ffffffff61339316565b9063ffffffff61339316565b6005546001600160a01b0316919063ffffffff61367016565b5050505050565b6008546001600160a01b03163314806113c15750600a546001600160a01b031633145b611400576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601e55565b6010546001600160a01b031681565b60008061141f6114fa565b90506000610cae611449601f54610faa670de0b6b3a7640000601e5461333a90919063ffffffff16565b839063ffffffff61339316565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6008546001600160a01b03163314806114915750600a546001600160a01b031633145b6114d0576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03166000908152601d60205260409020805460ff19166001179055565b601c5481565b60408051638e8f294b60e01b81526000805160206158eb833981519152600482015281516000928392733d9819210a31b4961b30ef54be2aed79b9c9cd3b92638e8f294b92602480840193919291829003018186803b15801561155c57600080fd5b505afa158015611570573d6000803e3d6000fd5b505050506040513d604081101561158657600080fd5b506020015191505090565b333214806115a957506008546001600160a01b031633145b806115be5750600a546001600160a01b031633145b6115c757600080fd5b6115cf6136c2565b604080516370a0823160e01b8152306004820152905160009173c00e94cb662c3520282e6f5717214004a7f26888916370a0823191602480820192602092909190829003018186803b15801561162457600080fd5b505afa158015611638573d6000803e3d6000fd5b505050506040513d602081101561164e57600080fd5b505190508015611684576005546116849073c00e94cb662c3520282e6f5717214004a7f26888906001600160a01b0316836137c0565b600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156116cf57600080fd5b505afa1580156116e3573d6000803e3d6000fd5b505050506040513d60208110156116f957600080fd5b5051600080549192509061171d90620186a090610faa90859063ffffffff61333a16565b60035490915060ff16151560011480156117375750600081115b1561175757600554611752906001600160a01b031682613534565b6117ec565b81156117ec57600954604080516361d027b360e01b815290516117ec926001600160a01b0316916361d027b3916004808301926020929190829003018186803b1580156117a357600080fd5b505afa1580156117b7573d6000803e3d6000fd5b505050506040513d60208110156117cd57600080fd5b505160005461137e90620186a090610faa90879063ffffffff61333a16565b81156117fa576117fa612e5d565b505050565b60008061180a6128df565b60145490915061183090610faa670de0b6b3a7640000610ff6878663ffffffff61333a16565b9150505b919050565b6007546001600160a01b031681565b60195481565b6009546000906001600160a01b0316331461189e576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6005546001600160a01b03838116911614156118ea576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561193057600080fd5b505afa158015611944573d6000803e3d6000fd5b505050506040513d602081101561195a57600080fd5b5051600954909150611834906001600160a01b0384811691168363ffffffff61367016565b6004546001600160a01b031681565b60008061199d83611372610dce565b9050611830816000613216565b6008546001600160a01b03163314806119cd5750600a546001600160a01b031633145b611a0c576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b602055565b6008546001600160a01b031681565b600080611a2b611a64565b90506000611a37611f89565b9050610cae611a4c838363ffffffff61339316565b610faa84670de0b6b3a764000063ffffffff61333a16565b60408051633af9e66960e01b815230600482015290516000916000805160206158eb83398151915291633af9e6699160248082019260209290919082900301818787803b158015611ab457600080fd5b505af1158015611ac8573d6000803e3d6000fd5b505050506040513d6020811015611ade57600080fd5b5051905090565b600d5460195460408051632726b07360e01b81526004810192909252516000928392839283926001600160a01b031691632726b073916024808301926020929190829003018186803b158015611b3a57600080fd5b505afa158015611b4e573d6000803e3d6000fd5b505050506040513d6020811015611b6457600080fd5b5051601054601754604080516309092f9760e21b815260048101929092526001600160a01b038085166024840152815194955090921692632424be5c92604480840193919291829003018186803b158015611bbe57600080fd5b505afa158015611bd2573d6000803e3d6000fd5b505050506040513d6040811015611be857600080fd5b506020015160105460175460408051636cb1c69b60e11b81526004810192909252519295506001600160a01b039091169163d9638d369160248082019260a092909190829003018186803b158015611c3f57600080fd5b505afa158015611c53573d6000803e3d6000fd5b505050506040513d60a0811015611c6957600080fd5b50602001519150611c906b033b2e3c9fd0803ce8000000610faa858563ffffffff61333a16565b935050505090565b604080516395dd919360e01b815230600482015290516000916000805160206158eb833981519152916395dd919391602480820192602092909190829003018186803b158015611ce757600080fd5b505afa158015611ac8573d6000803e3d6000fd5b733d9819210a31b4961b30ef54be2aed79b9c9cd3b81565b6008546001600160a01b0316331480611d365750600a546001600160a01b031633145b611d75576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601255565b6008546001600160a01b0316331480611d9d5750600a546001600160a01b031633145b611ddc576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601b55565b600b546001600160a01b03163314611e2c576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600055565b6000610cef611e3e610ce5565b611e46612d7c565b9063ffffffff6134cb16565b600080611e5d6114fa565b90506000610cae611449602154610faa670de0b6b3a764000060205461333a90919063ffffffff16565b604080516361bfb47160e11b81523060048201529051600091829182916000805160206158eb8339815191529163c37f68e291602480820192608092909190829003018186803b158015611eda57600080fd5b505afa158015611eee573d6000803e3d6000fd5b505050506040513d6080811015611f0457600080fd5b50602080820151606090920151604080519283019052808252919350909150600090611f309084613cb1565b94505050505090565b600b546001600160a01b03163314611f84576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600155565b604080516305eff7ef60e21b815230600482015290516000916000805160206158eb833981519152916317bfdfbc9160248082019260209290919082900301818787803b158015611ab457600080fd5b600f546001600160a01b031681565b6009546000906001600160a01b03163314612038576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b612040613d05565b600554604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d60208110156120b557600080fd5b505160095460055460408051632988bb9f60e21b81526001600160a01b0392831660048201529051939450600093919092169163a622ee7c916024808301926020929190829003018186803b15801561210d57600080fd5b505afa158015612121573d6000803e3d6000fd5b505050506040513d602081101561213757600080fd5b505190506001600160a01b03811661217f576040805162461bcd60e51b8152602060048201526006602482015265085d985d5b1d60d21b604482015290519081900360640190fd5b60055461219c906001600160a01b0316828463ffffffff61367016565b5090565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b601a5481565b60005481565b60255481565b600b546001600160a01b03163314612215576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000612241610dce565b90506000811161228a576040805162461bcd60e51b815260206004820152600f60248201526e085e995c9bd0dbdb1b185d195c985b608a1b604482015290519081900360640190fd5b6000612294611ae5565b9050600081116122d7576040805162461bcd60e51b8152602060048201526009602482015268085e995c9bd119589d60ba1b604482015290519081900360640190fd5b336000908152601d602052604090205460ff16806122f457503330145b806123095750600a546001600160a01b031633145b8061231e57506008546001600160a01b031633145b61235a576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b6000612366600061198e565b905080156117fa5761237781613d10565b601154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156123c257600080fd5b505afa1580156123d6573d6000803e3d6000fd5b505050506040513d60208110156123ec57600080fd5b505190508181101561243e576040805162461bcd60e51b8152602060048201526016602482015275216d69736d617463684166746572576974686472617760501b604482015290519081900360640190fd5b61244782613d1f565b6000612451612c00565b601a5490915061246890600163ffffffff61339316565b811015611397576040805162461bcd60e51b8152602060048201526013602482015272217374696c6c42656c6f774d696e526174696f60681b604482015290519081900360640190fd5b6008546001600160a01b031633146124ff576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6003805460ff1916911515919091179055565b6008546001600160a01b0316331461255f576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601954156125a8576040805162461bcd60e51b81526020600482015260116024820152700858d91c105b1c9958591e53dc195b9959607a1b604482015290519081900360640190fd5b600d5460175460408051636090dec560e01b81526004810192909252306024830152516001600160a01b0390921691636090dec5916044808201926020929091908290030181600087803b1580156125ff57600080fd5b505af1158015612613573d6000803e3d6000fd5b505050506040513d602081101561262957600080fd5b50516019556013546015546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561268857600080fd5b505af115801561269c573d6000803e3d6000fd5b505050506040513d60208110156126b257600080fd5b5050601154600e546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561270e57600080fd5b505af1158015612722573d6000803e3d6000fd5b505050506040513d602081101561273857600080fd5b5050565b600080612747611a64565b90506000612753611f89565b9050610cae828263ffffffff61339316565b600080612770611a64565b9050600061277c611f89565b60408051638e8f294b60e01b81526000805160206158eb83398151915260048201528151929350600092733d9819210a31b4961b30ef54be2aed79b9c9cd3b92638e8f294b9260248082019391829003018186803b1580156127dd57600080fd5b505afa1580156127f1573d6000803e3d6000fd5b505050506040513d604081101561280757600080fd5b50602001519050611c90612710610faa61270f610ff686611372670de0b6b3a7640000858b8a63ffffffff61333a16565b600080612843610c75565b9050611830670de0b6b3a7640000610faa858463ffffffff61333a16565b6016546001600160a01b031681565b6008546001600160a01b031633146128bd576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6016546000906001600160a01b0316612934576040805162461bcd60e51b8152602060048201526012602482015271215f636f6c6c61746572616c4f7261636c6560701b604482015290519081900360640190fd5b6000806000806000601860009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561298a57600080fd5b505afa15801561299e573d6000803e3d6000fd5b505050506040513d60a08110156129b457600080fd5b5080516020820151604083015160608401516080909401519298509096509450909250905060008413156129f5576305f5e100840495505050505050610c72565b600095505050505050610c72565b60035461010090046001600160a01b031681565b6008546001600160a01b03163314612a64576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b031681565b336000908152601d602052604090205460ff1680612ab257503330145b80612ac75750600a546001600160a01b031633145b80612adc57506008546001600160a01b031633145b612b18576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b6000612b2261273c565b90506000612b2f82612838565b905061273881613f4f565b601b5481565b60408051631ea6374160e01b815273c00e94cb662c3520282e6f5717214004a7f268886004820152733d9819210a31b4961b30ef54be2aed79b9c9cd3b60248201523060448201529051600091829173d513d22422a3062bd342ae374b4b9c20e0a9a07491631ea6374191606480830192608092919082900301818787803b158015612bcb57600080fd5b505af1158015612bdf573d6000803e3d6000fd5b505050506040513d6080811015612bf557600080fd5b506060015191505090565b600080612c0b610dce565b905060008111612c54576040805162461bcd60e51b815260206004820152600f60248201526e085e995c9bd0dbdb1b185d195c985b608a1b604482015290519081900360640190fd5b6000612c5e611ae5565b905060008111612ca1576040805162461bcd60e51b8152602060048201526009602482015268085e995c9bd119589d60ba1b604482015290519081900360640190fd5b6000612cb86064610ff6612cb3610dce565b6117ff565b90506000612cc4611ae5565b9050611f30828263ffffffff6132f116565b60025481565b600c546001600160a01b031681565b600b546001600160a01b03163314612d36576040805162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6022546001600160a01b031681565b60245481565b600e546001600160a01b031681565b600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611ce757600080fd5b6008546001600160a01b03163314612e14576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60015481565b6006546001600160a01b031681565b6000805160206158eb83398151915281565b600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612ea857600080fd5b505afa158015612ebc573d6000803e3d6000fd5b505050506040513d6020811015612ed257600080fd5b505190508015612fba576000612f00612ef9612eec610dce565b849063ffffffff6134cb16565b6001613216565b9050601254612f1d612f10611ae5565b839063ffffffff6134cb16565b1061273857612f2c82826140b9565b601154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612f7757600080fd5b505afa158015612f8b573d6000803e3d6000fd5b505050506040513d6020811015612fa157600080fd5b5051905081811015612fb1578091505b6117fa82614459565b50565b600b546001600160a01b031681565b6013546001600160a01b031681565b336000908152601d602052604090205460ff1680612ff857503330145b8061300d5750600a546001600160a01b031633145b8061302257506008546001600160a01b031633145b61305e576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b612fba81614468565b6008546001600160a01b031633148061308a5750600a546001600160a01b031633145b6130c9576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b601a55565b60175481565b60125481565b336000908152601d602052604090205460ff16806130f757503330145b8061310c5750600a546001600160a01b031633145b8061312157506008546001600160a01b031633145b61315d576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b612fba81613f4f565b736b175474e89094c44da98b954eedeac495271d0f81565b336000908152601d602052604090205460ff168061319b57503330145b806131b05750600a546001600160a01b031633145b806131c557506008546001600160a01b031633145b613201576040805162461bcd60e51b8152602060048201526008602482015267216b65657065727360c01b604482015290519081900360640190fd5b600061320b61273c565b9050612fba81614468565b6000806132576132486064610faa601c54610faa601b54601c5401610ff6612710601a5461333a90919063ffffffff16565b610faa612710610ff6886117ff565b90506000613263611ae5565b905060008480156132745750818310155b1561329057613289838363ffffffff61339316565b90506132b6565b8415801561329e5750828210155b156132b6576132b3828463ffffffff61339316565b90505b600081116132c55760006132c7565b805b93505050505b92915050565b6009546001600160a01b031681565b6011546001600160a01b031681565b600061333383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061470a565b9392505050565b600082613349575060006132cd565b8282028284828161335657fe5b04146133335760405162461bcd60e51b815260040180806020018281038252602181526020018061590b6021913960400191505060405180910390fd5b600061333383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506147ac565b6000806133e18361198e565b905080156133f2576133f281613d10565b601154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561343d57600080fd5b505afa158015613451573d6000803e3d6000fd5b505050506040513d602081101561346757600080fd5b50519050818110156134b9576040805162461bcd60e51b8152602060048201526016602482015275216d69736d617463684166746572576974686472617760501b604482015290519081900360640190fd5b6134c38483614806565b509192915050565b600082820183811015613333576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6022546001600160a01b031691565b60035460ff161515600114156127385760035461356190839061010090046001600160a01b0316836137c0565b600354604080516370a0823160e01b8152306004820152905160009261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156135b157600080fd5b505afa1580156135c5573d6000803e3d6000fd5b505050506040513d60208110156135db57600080fd5b50516004546003549192506136089161010090046001600160a01b0390811691168363ffffffff61367016565b6004805460408051635ad6dca560e11b8152928301849052516001600160a01b039091169163b5adb94a91602480830192600092919082900301818387803b15801561365357600080fd5b505af1158015613667573d6000803e3d6000fd5b50505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526117fa908490614b53565b604080516001808252818301909252606091602080830190803683370190505090506000805160206158eb8339815191528160008151811061370057fe5b6001600160a01b039092166020928302919091018201526040805162e1ed9760e51b8152306004820181815260248301938452855160448401528551733d9819210a31b4961b30ef54be2aed79b9c9cd3b95631c3db2e0959394889492606490910191858101910280838360005b8381101561378657818101518382015260200161376e565b505050509050019350505050600060405180830381600087803b1580156137ac57600080fd5b505af1158015611397573d6000803e3d6000fd5b6001600160a01b0382166137d357600080fd5b600c546137f4906001600160a01b038581169116600063ffffffff614c0416565b600c54613814906001600160a01b0385811691168363ffffffff614c0416565b6003546060906001600160a01b0384811661010090920416148015613840575060035460ff1615156001145b156139b0576001600160a01b03841673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814156138eb576040805160028082526060820183529091602083019080368337019050509050838160008151811061389857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505082816001815181106138c657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506139ab565b604080516003808252608082019092529060208201606080368337019050509050838160008151811061391a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061395c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061398a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b613b18565b6001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214806139f757506001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2145b15613a585760408051600280825260608201835290916020830190803683370190505090508381600081518110613a2a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061398a57fe5b6040805160038082526080820190925290602082016060803683370190505090508381600081518110613a8757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613ac957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110613af757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600c546001600160a01b03166338ed17398360008430613b3f42603c63ffffffff6134cb16565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613bb8578181015183820152602001613ba0565b505050509050019650505050505050600060405180830381600087803b158015613be157600080fd5b505af1158015613bf5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613c1e57600080fd5b8101908080516040519392919084640100000000821115613c3e57600080fd5b908301906020820185811115613c5357600080fd5b8251866020820283011164010000000082111715613c7057600080fd5b82525081516020918201928201910280838360005b83811015613c9d578181015183820152602001613c85565b505050509050016040525050505050505050565b6000806000613cbe6158d7565b613cc88686614d17565b90925090506000826003811115613cdb57fe5b14613cec5750915060009050613cfe565b6000613cf782614d7f565b9350935050505b9250929050565b612fba6110e3610ce5565b8015612fba57612fba81614d8e565b600060195411613d5f576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b806000613d6a611ae5565b90508082108015613d8c5750601254613d89828463ffffffff61339316565b10155b80613d975750818111155b613dd3576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b6000806000613de0614f9b565b600e5460408051633b4da69f60e01b81526001600160a01b038087166004830152602482018d905291519598509396509194501691633b4da69f9160448082019260009290919082900301818387803b158015613e3c57600080fd5b505af1158015613e50573d6000803e3d6000fd5b5050600d5460195460408051633612d9a360e11b81526001600160a01b038981166004830152915193821695506345e6bdcd94509192600092613eeb92899290831691636c25b346916024808301926020929190829003018186803b158015613eb857600080fd5b505afa158015613ecc573d6000803e3d6000fd5b505050506040513d6020811015613ee257600080fd5b5051898861511f565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015613f2f57600080fd5b505af1158015613f43573d6000803e3d6000fd5b50505050505050505050565b6000613f59610c75565b90506000613f6561273c565b9050808310158015613f925750613f8e670de0b6b3a7640000610faa838563ffffffff61333a16565b8311155b613fcf576040805162461bcd60e51b8152602060048201526009602482015268216c6576657261676560b81b604482015290519081900360640190fd5b600080613fda611a64565b90505b8481101561139757613fed612765565b915084614000828463ffffffff6134cb16565b111561401957614016858263ffffffff61339316565b91505b6000805160206158eb8339815191526001600160a01b031663c5ebeaec836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561406d57600080fd5b505af1158015614081573d6000803e3d6000fd5b505050506040513d602081101561409757600080fd5b506140a29050615256565b6140b2818363ffffffff6134cb16565b9050613fdd565b6000601954116140f9576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b601254614107612f10611ae5565b1015614145576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b6000806000614152614f9b565b60155460408051633b4da69f60e01b81526001600160a01b038087166004830152602482018c905291519598509396509194501691633b4da69f9160448082019260009290919082900301818387803b1580156141ae57600080fd5b505af11580156141c2573d6000803e3d6000fd5b5050600d546019546015546001600160a01b0392831694506345e6bdcd935090916141f7916141f291168a6152e2565b61535a565b600f546142119087906001600160a01b031689888c6153a0565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561425557600080fd5b505af1158015614269573d6000803e3d6000fd5b5050600d546019546001600160a01b03909116925063f9f30db691503061428f886154ef565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156142e557600080fd5b505af11580156142f9573d6000803e3d6000fd5b5050600e5460408051634538c4eb60e01b81523060048201526001600160a01b03928316602482015290519186169350634538c4eb9250604480820192602092909190829003018186803b15801561435057600080fd5b505afa158015614364573d6000803e3d6000fd5b505050506040513d602081101561437a57600080fd5b50516143e757600e54604080516328ec8bf160e21b81526001600160a01b03928316600482015290519184169163a3b22fc49160248082019260009290919082900301818387803b1580156143ce57600080fd5b505af11580156143e2573d6000803e3d6000fd5b505050505b600e546040805163ef693bed60e01b81523060048201526024810187905290516001600160a01b039092169163ef693bed9160448082019260009290919082900301818387803b15801561443a57600080fd5b505af115801561444e573d6000803e3d6000fd5b505050505050505050565b8015612fba57612fba81615507565b600061447261273c565b9050600061447e611a64565b90508183101580156144905750808311155b6144cf576040805162461bcd60e51b815260206004820152600b60248201526a2164656c6576657261676560a81b604482015290519081900360640190fd5b60006144d9612765565b90505b836144ed838363ffffffff61339316565b101561450657614503828563ffffffff61339316565b90505b6000805160206158eb8339815191526001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561455a57600080fd5b505af115801561456e573d6000803e3d6000fd5b505050506040513d602081101561458457600080fd5b5051156145c9576040805162461bcd60e51b815260206004820152600e60248201526d085c995919595b511b155b9d1a5b60921b604482015290519081900360640190fd5b6145fd736b175474e89094c44da98b954eedeac495271d0f6000805160206158eb833981519152600063ffffffff614c0416565b614630736b175474e89094c44da98b954eedeac495271d0f6000805160206158eb8339815191528363ffffffff614c0416565b6000805160206158eb8339815191526001600160a01b0316630e752702826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561468457600080fd5b505af1158015614698573d6000803e3d6000fd5b505050506040513d60208110156146ae57600080fd5b5051156146eb576040805162461bcd60e51b815260206004820152600660248201526521726570617960d01b604482015290519081900360640190fd5b6146fb828263ffffffff61339316565b91508382116144dc5750505050565b600081836147965760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561475b578181015183820152602001614743565b50505050905090810190601f1680156147885780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816147a257fe5b0495945050505050565b600081848411156147fe5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561475b578181015183820152602001614743565b505050900390565b600060195411614846576040805162461bcd60e51b81526020600482015260066024820152650216e6f4344560d41b604482015290519081900360640190fd5b806000614851611ae5565b905080821080156148735750601254614870828463ffffffff61339316565b10155b8061487e5750818111155b6148ba576040805162461bcd60e51b8152602060048201526008602482015267085b5a5b9119589d60c21b604482015290519081900360640190fd5b60008060006148c7614f9b565b91945092509050851561494257600e5460408051633b4da69f60e01b81526001600160a01b038681166004830152602482018a905291519190921691633b4da69f91604480830192600092919082900301818387803b15801561492957600080fd5b505af115801561493d573d6000803e3d6000fd5b505050505b60155460009061495b906001600160a01b0316896152e2565b600d546019549192506001600160a01b0316906345e6bdcd9061497d8461535a565b600003614a0d87886001600160a01b0316636c25b3468b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156149da57600080fd5b505afa1580156149ee573d6000803e3d6000fd5b505050506040513d6020811015614a0457600080fd5b50518a8961511f565b6040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b158015614a5157600080fd5b505af1158015614a65573d6000803e3d6000fd5b5050600d54601954604080516313771f0760e31b8152600481019290925230602483015260448201869052516001600160a01b039092169350639bb8f838925060648082019260009290919082900301818387803b158015614ac657600080fd5b505af1158015614ada573d6000803e3d6000fd5b50506015546040805163ef693bed60e01b8152306004820152602481018d905290516001600160a01b03909216935063ef693bed925060448082019260009290919082900301818387803b158015614b3157600080fd5b505af1158015614b45573d6000803e3d6000fd5b505050505050505050505050565b6060614ba8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166156399092919063ffffffff16565b8051909150156117fa57808060200190516020811015614bc757600080fd5b50516117fa5760405162461bcd60e51b815260040180806020018281038252602a81526020018061592c602a913960400191505060405180910390fd5b801580614c8a575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614c5c57600080fd5b505afa158015614c70573d6000803e3d6000fd5b505050506040513d6020811015614c8657600080fd5b5051155b614cc55760405162461bcd60e51b81526004018080602001828103825260368152602001806159566036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526117fa908490614b53565b6000614d216158d7565b600080614d32866000015186615650565b90925090506000826003811115614d4557fe5b14614d6457506040805160208101909152600081529092509050613cfe565b60408051602081019091529081526000969095509350505050565b51670de0b6b3a7640000900490565b6000614d9861273c565b9050808211614da75781614da9565b805b91508180156117fa57806000805160206158eb8339815191526001600160a01b0316633b1d21a26040518163ffffffff1660e01b815260040160206040518083038186803b158015614dfa57600080fd5b505afa158015614e0e573d6000803e3d6000fd5b505050506040513d6020811015614e2457600080fd5b50511015614e6b576040805162461bcd60e51b815260206004820152600f60248201526e21636173682d6c697175696469747960881b604482015290519081900360640190fd5b6000614e75611f89565b90506000614e81611a64565b90506000614e8d611a20565b90506000614ead670de0b6b3a7640000610faa878563ffffffff61333a16565b905083811115614ecc57614ec7614ec261273c565b614468565b614edf565b614edf614ec2848363ffffffff61339316565b6000805160206158eb8339815191526001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015614f3357600080fd5b505af1158015614f47573d6000803e3d6000fd5b505050506040513d6020811015614f5d57600080fd5b505115613667576040805162461bcd60e51b81526020600482015260076024820152662172656465656d60c81b604482015290519081900360640190fd5b6000806000600d60009054906101000a90046001600160a01b03166001600160a01b0316632726b0736019546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015614ffb57600080fd5b505afa15801561500f573d6000803e3d6000fd5b505050506040513d602081101561502557600080fd5b5051600d54604080516336569e7760e01b815290516001600160a01b03909216916336569e7791600480820192602092909190829003018186803b15801561506c57600080fd5b505afa158015615080573d6000803e3d6000fd5b505050506040513d602081101561509657600080fd5b5051600d5460195460408051632c2cb9fd60e01b81526004810192909252516001600160a01b0390921691632c2cb9fd91602480820192602092909190829003018186803b1580156150e757600080fd5b505afa1580156150fb573d6000803e3d6000fd5b505050506040513d602081101561511157600080fd5b505191945092509050909192565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561516657600080fd5b505afa15801561517a573d6000803e3d6000fd5b505050506040513d60a081101561519057600080fd5b5060200151604080516309092f9760e21b8152600481018690526001600160a01b0387811660248301528251939450600093908a1692632424be5c9260448082019391829003018186803b1580156151e757600080fd5b505afa1580156151fb573d6000803e3d6000fd5b505050506040513d604081101561521157600080fd5b5060200151905061522b6141f2878463ffffffff6132f116565b9250808311156152465761523e8161535a565b60000361524b565b826000035b979650505050505050565b604080516370a0823160e01b81523060048201529051600091736b175474e89094c44da98b954eedeac495271d0f916370a0823191602480820192602092909190829003018186803b1580156152ab57600080fd5b505afa1580156152bf573d6000803e3d6000fd5b505050506040513d60208110156152d557600080fd5b50519050612fba81615507565b600061333382846001600160a01b031663b3bcfa826040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561532357600080fd5b505af1158015615337573d6000803e3d6000fd5b505050506040513d602081101561534d57600080fd5b5051601203600a0a61568f565b806000811215611834576040805162461bcd60e51b815260206004820152600c60248201526b696e742d6f766572666c6f7760a01b604482015290519081900360640190fd5b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156153e957600080fd5b505af11580156153fd573d6000803e3d6000fd5b505050506040513d602081101561541357600080fd5b505160408051633612d9a360e11b81526001600160a01b0388811660048301529151929350600092918a1691636c25b34691602480820192602092909190829003018186803b15801561546557600080fd5b505afa158015615479573d6000803e3d6000fd5b505050506040513d602081101561548f57600080fd5b5051905061549c846154ef565b8110156154e4576154bc6141f283610faa6154b6886154ef565b856156ea565b92506154c7846154ef565b6154d1848461568f565b106154dc57826154e1565b826001015b92505b505095945050505050565b60006132cd826b033b2e3c9fd0803ce800000061568f565b8015612fba57615541736b175474e89094c44da98b954eedeac495271d0f6000805160206158eb833981519152600063ffffffff614c0416565b615574736b175474e89094c44da98b954eedeac495271d0f6000805160206158eb8339815191528363ffffffff614c0416565b6000805160206158eb8339815191526001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156155c857600080fd5b505af11580156155dc573d6000803e3d6000fd5b505050506040513d60208110156155f257600080fd5b505115612fba576040805162461bcd60e51b815260206004820152601060248201526f0859195c1bdcda5d125b9d1bd0db5c1960821b604482015290519081900360640190fd5b60606156488484600085615731565b949350505050565b6000808361566357506000905080613cfe565b8383028385828161567057fe5b041461568457506002915060009050613cfe565b600092509050613cfe565b60008115806156aa575050808202828282816156a757fe5b04145b6132cd576040805162461bcd60e51b815260206004820152600c60248201526b6d756c2d6f766572666c6f7760a01b604482015290519081900360640190fd5b808203828111156132cd576040805162461bcd60e51b815260206004820152600c60248201526b7375622d6f766572666c6f7760a01b604482015290519081900360640190fd5b606061573c8561589e565b61578d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106157cc5780518252601f1990920191602091820191016157ad565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461582e576040519150601f19603f3d011682016040523d82523d6000602084013e615833565b606091505b509150915081156158475791506156489050565b8051156158575780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561475b578181015183820152602001614743565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615648575050151592915050565b604051806020016040528060008152509056fe0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220206a3c60d9092c1fff733e4e4aae60be270a982654b9d88c265b12e7c9a1bd7164736f6c63430006070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000043229759e12efbe3e2a0fb0510b15e516d0464420000000000000000000000007cdacba026dddaa0bd77e63474425f630ddf4a0d0000000000000000000000004bf5059065541a2b176500928e91fbfd0b121d070000000000000000000000005dae9b27313670663b34ac8bffd18825bb9df736
-----Decoded View---------------
Arg [0] : _governance (address): 0x43229759E12eFbe3e2A0fB0510B15e516d046442
Arg [1] : _strategist (address): 0x7cDaCBa026DDdAa0bD77E63474425f630DDf4A0D
Arg [2] : _controller (address): 0x4bF5059065541A2B176500928e91FBfD0B121d07
Arg [3] : _timelock (address): 0x5DAe9B27313670663B34Ac8BfFD18825bB9Df736
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000043229759e12efbe3e2a0fb0510b15e516d046442
Arg [1] : 0000000000000000000000007cdacba026dddaa0bd77e63474425f630ddf4a0d
Arg [2] : 0000000000000000000000004bf5059065541a2b176500928e91fbfd0b121d07
Arg [3] : 0000000000000000000000005dae9b27313670663b34ac8bffd18825bb9df736
Deployed Bytecode Sourcemap
75660:3427:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;75660:3427:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;63840:22:0;;;:::i;:::-;;;;-1:-1:-1;;;;;63840:22:0;;;;;;;;;;;;;;43192:143;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43192:143:0;-1:-1:-1;;;;;43192:143:0;;:::i;:::-;;68369:176;;;:::i;:::-;;;;;;;;;;;;;;;;54548:274;;;:::i;51919:73::-;;;:::i;51760:::-;;;:::i;66922:111::-;;;:::i;39901:43::-;;;:::i;70131:119::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;70131:119:0;-1:-1:-1;;;;;70131:119:0;;:::i;42059:151::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42059:151:0;;:::i;66281:248::-;;;:::i;52079:75::-;;;:::i;39975:33::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;78971:113;;;:::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;78971:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63794:39;;;:::i;40184:19::-;;;:::i;40647:25::-;;;:::i;75846:72::-;;;:::i;76017:68::-;;;:::i;55934:195::-;;;:::i;55075:240::-;;;:::i;44203:1243::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44203:1243:0;;:::i;76567:174::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;76567:174:0;;:::i;63522:63::-;;;:::i;53673:319::-;;;:::i;40210:73::-;;;:::i;70008:115::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;70008:115:0;-1:-1:-1;;;;;70008:115:0;;:::i;64288:35::-;;;:::i;54315:169::-;;;:::i;77586:898::-;;;:::i;67041:233::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;67041:233:0;;:::i;40479:73::-;;;:::i;64032:24::-;;;:::i;43836:289::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43836:289:0;-1:-1:-1;;;;;43836:289:0;;:::i;40089:70::-;;;:::i;68553:233::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;68553:233:0;;:::i;76749:158::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;76749:158:0;;:::i;40583:25::-;;;:::i;56971:215::-;;;:::i;56340:122::-;;;:::i;66538:346::-;;;:::i;53202:131::-;;;:::i;51673:80::-;;;:::i;69631:112::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;69631:112:0;;:::i;69879:120::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;69879:120:0;;:::i;42381:167::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42381:167:0;;:::i;41834:113::-;;;:::i;54000:307::-;;;:::i;52914:280::-;;;:::i;42218:155::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42218:155:0;;:::i;56470:123::-;;;:::i;63452:63::-;;;:::i;45997:440::-;;;:::i;40314:80::-;;;:::i;64154:29::-;;;:::i;39577:37::-;;;:::i;75977:33::-;;;:::i;43033:151::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43033:151:0;-1:-1:-1;;;;;43033:151:0;;:::i;74059:531::-;;;:::i;43343:168::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43343:168:0;;;;:::i;71784:353::-;;;:::i;56137:195::-;;;:::i;56601:362::-;;;:::i;53469:196::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53469:196:0;;:::i;63869:31::-;;;:::i;43519:155::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43519:155:0;-1:-1:-1;;;;;43519:155:0;;:::i;69127:467::-;;;:::i;40015:67::-;;;:::i;42719:155::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42719:155:0;-1:-1:-1;;;;;42719:155:0;;:::i;63298:73::-;;;:::i;76961:221::-;;;:::i;64251:30::-;;;:::i;55726:200::-;;;:::i;67282:254::-;;;:::i;39864:30::-;;;:::i;40723:72::-;;;:::i;42882:143::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42882:143:0;-1:-1:-1;;;;;42882:143:0;;:::i;75764:75::-;;;:::i;75925:45::-;;;:::i;63378:67::-;;;:::i;41637:118::-;;;:::i;42556:155::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42556:155:0;-1:-1:-1;;;;;42556:155:0;;:::i;39772:32::-;;;:::i;40401:71::-;;;:::i;51999:73::-;;;:::i;74599:570::-;;;:::i;40679:23::-;;;:::i;63762:25::-;;;:::i;77468:109::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;77468:109:0;;:::i;69753:116::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;69753:116:0;;:::i;63907:28::-;;;:::i;63668:46::-;;;:::i;77353:106::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;77353:106:0;;:::i;51840:72::-;;;:::i;77190:154::-;;;:::i;67780:581::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;67780:581:0;;;;;;;;;:::i;40615:25::-;;;:::i;63592:69::-;;;:::i;63840:22::-;;;-1:-1:-1;;;;;63840:22:0;;:::o;43192:143::-;43272:10;;-1:-1:-1;;;;;43272:10:0;43258;:24;43250:48;;;;;-1:-1:-1;;;43250:48:0;;;;;;;;;;;;-1:-1:-1;;;43250:48:0;;;;;;;;;;;;;;;43309:7;:18;;-1:-1:-1;;;;;43309:18:0;;;;;-1:-1:-1;;;;;;43309:18:0;;;;;;;;;43192:143::o;68369:176::-;68416:7;68436:21;68460:22;:20;:22::i;:::-;68436:46;;68500:37;68517:13;68532:4;68500:16;:37::i;:::-;68493:44;;;68369:176;;:::o;54548:274::-;54595:7;54615:29;54647:26;:24;:26::i;:::-;54615:58;-1:-1:-1;54722:16:0;54741:47;54749:4;54759;:28;;;54741:47;:17;:47;:::i;:::-;54722:66;-1:-1:-1;;;54548:274:0;:::o;51919:73::-;51950:42;51919:73;:::o;51760:::-;51791:42;51760:73;:::o;66922:111::-;66977:7;67003:22;:20;:22::i;:::-;66996:29;;66922:111;:::o;39901:43::-;39938:6;39901:43;:::o;70131:119::-;65601:10;;-1:-1:-1;;;;;65601:10:0;65587;:24;;:52;;-1:-1:-1;65629:10:0;;-1:-1:-1;;;;;65629:10:0;65615;:24;65587:52;65579:76;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;70218:16:0::1;70237:5;70218:16:::0;;;:7:::1;:16;::::0;;;;:24;;-1:-1:-1;;70218:24:0::1;::::0;;70131:119::o;42059:151::-;42145:8;;-1:-1:-1;;;;;42145:8:0;42131:10;:22;42123:44;;;;;-1:-1:-1;;;42123:44:0;;;;;;;;;;;;-1:-1:-1;;;42123:44:0;;;;;;;;;;;;;;;42178:10;:24;42059:151::o;66281:248::-;66334:7;66354:11;66376:18;66409:13;;;;;;;;;-1:-1:-1;;;;;66409:13:0;-1:-1:-1;;;;;66397:31:0;;66429:5;;66397:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66397:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66397:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;66397:38:0;66464:3;;66474:13;;66456:44;;;-1:-1:-1;;;66456:44:0;;;;;;;;;-1:-1:-1;;;;;66456:44:0;;;;;;;;;66397:38;;-1:-1:-1;66464:3:0;;;;66456:17;;:44;;;;;;;;;;;;;66464:3;66456:44;;;2:2:-1;;;;27:1;24;17:12;2:2;66456:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66456:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;66456:44:0;;-1:-1:-1;;;66281:248:0;:::o;52079:75::-;52112:42;52079:75;:::o;39975:33::-;;;;;;:::o;78971:113::-;79048:28;;;;;;;;;;;;-1:-1:-1;;;79048:28:0;;;;78971:113;:::o;63794:39::-;;;;:::o;40184:19::-;;;-1:-1:-1;;;;;40184:19:0;;:::o;40647:25::-;;;-1:-1:-1;;;;;40647:25:0;;:::o;75846:72::-;;;-1:-1:-1;;;;;75846:72:0;;:::o;76017:68::-;;;-1:-1:-1;;;;;76017:68:0;;:::o;55934:195::-;55974:7;55994:16;56013:13;:11;:13::i;:::-;55994:32;;56037:16;56056:13;:11;:13::i;:::-;56037:32;-1:-1:-1;56089:32:0;56112:8;56089:18;56037:32;56102:4;56089:18;:12;:18;:::i;:::-;:22;:32;:22;:32;:::i;55075:240::-;55124:7;55144:21;55168:26;:24;:26::i;:::-;55144:50;;55212:95;55293:13;55213:74;55260:26;;55213:42;55250:4;55213:32;55241:3;55213:23;;:27;;:32;;;;:::i;:::-;:36;:42;:36;:42;:::i;44203:1243::-;44280:10;;-1:-1:-1;;;;;44280:10:0;44266;:24;44258:48;;;;;-1:-1:-1;;;44258:48:0;;;;;;;;;;;;-1:-1:-1;;;44258:48:0;;;;;;;;;;;;;;;44343:4;;44336:37;;;-1:-1:-1;;;44336:37:0;;44367:4;44336:37;;;;;;44317:16;;-1:-1:-1;;;;;44343:4:0;;44336:22;;:37;;;;;;;;;;;;;;44343:4;44336:37;;;2:2:-1;;;;27:1;24;17:12;2:2;44336:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44336:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44336:37:0;;-1:-1:-1;44388:18:0;;;44384:143;;;44433:36;44447:21;:7;44459:8;44447:21;:11;:21;:::i;:::-;44433:13;:36::i;:::-;44423:46;-1:-1:-1;44494:21:0;44423:46;44506:8;44494:21;:11;:21;:::i;:::-;44484:31;;44384:143;44543:15;44561:39;39938:6;44561:23;44573:10;;44561:7;:11;;:23;;;;:::i;:39::-;44543:57;;44611:20;44634:41;39849:6;44634:24;44646:11;;44634:7;:11;;:24;;;;:::i;:41::-;44692:14;;44611:64;;-1:-1:-1;44692:14:0;;:22;;:14;:22;44688:480;;;44794:25;;44847:48;44869:25;:7;44881:12;44869:25;:11;:25;:::i;:::-;44847:21;:48::i;:::-;44793:102;;;;44910:51;44927:17;44946:14;44910:16;:51::i;:::-;44688:480;;;;;45035:10;;45023:33;;;-1:-1:-1;;;45023:33:0;;;;44997:69;;-1:-1:-1;;;;;45035:10:0;;45023:31;;:33;;;;;;;;;;;;;;45035:10;45023:33;;;2:2:-1;;;;27:1;24;17:12;2:2;45023:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45023:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45023:33:0;45004:4;;-1:-1:-1;;;;;45004:4:0;;45058:7;44997:69;:25;:69;:::i;:::-;45119:10;;45107:34;;;-1:-1:-1;;;45107:34:0;;;;45081:75;;-1:-1:-1;;;;;45119:10:0;;45107:32;;:34;;;;;;;;;;;;;;45119:10;45107:34;;;2:2:-1;;;;27:1;24;17:12;2:2;45107:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45107:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45107:34:0;45088:4;;-1:-1:-1;;;;;45088:4:0;;45143:12;45081:75;:25;:75;:::i;:::-;45217:10;;45244:4;;45205:45;;;-1:-1:-1;;;45205:45:0;;-1:-1:-1;;;;;45244:4:0;;;45205:45;;;;;;45188:14;;45217:10;;;;;45205:30;;:45;;;;;;;;;;;;;;;45217:10;45205:45;;;2:2:-1;;;;27:1;24;17:12;2:2;45205:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45205:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45205:45:0;;-1:-1:-1;;;;;;45269:20:0;;45261:39;;;;;-1:-1:-1;;;45261:39:0;;;;;;;;;;;;-1:-1:-1;;;45261:39:0;;;;;;;;;;;;;;;45365:73;45391:6;45399:38;45424:12;45399:20;:7;45411;45399:20;:11;:20;:::i;:::-;:24;:38;:24;:38;:::i;:::-;45372:4;;-1:-1:-1;;;;;45372:4:0;;45365:73;;:25;:73;:::i;:::-;44203:1243;;;;;:::o;76567:174::-;65601:10;;-1:-1:-1;;;;;65601:10:0;65587;:24;;:52;;-1:-1:-1;65629:10:0;;-1:-1:-1;;;;;65629:10:0;65615;:24;65587:52;65579:76;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;;;;76683:23:::1;:50:::0;76567:174::o;63522:63::-;;;-1:-1:-1;;;;;63522:63:0;;:::o;53673:319::-;53730:7;53750:17;53770:20;:18;:20::i;:::-;53750:40;;53849:21;53873:80;53887:65;53925:26;;53887:33;53915:4;53887:23;;:27;;:33;;;;:::i;:65::-;53873:9;;:80;:13;:80;:::i;40210:73::-;40241:42;40210:73;:::o;70008:115::-;65601:10;;-1:-1:-1;;;;;65601:10:0;65587;:24;;:52;;-1:-1:-1;65629:10:0;;-1:-1:-1;;;;;65629:10:0;65615;:24;65587:52;65579:76;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;70092:16:0::1;;::::0;;;:7:::1;:16;::::0;;;;:23;;-1:-1:-1;;70092:23:0::1;70111:4;70092:23;::::0;;70008:115::o;64288:35::-;;;;:::o;54315:169::-;54410:39;;;-1:-1:-1;;;54410:39:0;;-1:-1:-1;;;;;;;;;;;54410:39:0;;;;;;54366:7;;;;51711:42;;54410:33;;:39;;;;;;;;;;;;;51711:42;54410:39;;;2:2:-1;;;;27:1;24;17:12;2:2;54410:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54410:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54410:39:0;;;;-1:-1:-1;;54315:169:0;:::o;77586:898::-;41456:10;41470:9;41456:23;;:68;;-1:-1:-1;41514:10:0;;-1:-1:-1;;;;;41514:10:0;41500;:24;41456:68;:113;;;-1:-1:-1;41559:10:0;;-1:-1:-1;;;;;41559:10:0;41545;:24;41456:113;41434:146;;12:1:-1;9;2:12;41434:146:0;77647:12:::1;:10;:12::i;:::-;77690:37;::::0;;-1:-1:-1;;;77690:37:0;;77721:4:::1;77690:37;::::0;::::1;::::0;;;77674:13:::1;::::0;51950:42:::1;::::0;77690:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;51950:42;77690:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;77690:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;77690:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;77690:37:0;;-1:-1:-1;77742:9:0;;77738:73:::1;;77787:4;::::0;77768:31:::1;::::0;51950:42:::1;::::0;-1:-1:-1;;;;;77787:4:0::1;77793:5:::0;77768:12:::1;:31::i;:::-;77846:4;::::0;77839:37:::1;::::0;;-1:-1:-1;;;77839:37:0;;77870:4:::1;77839:37;::::0;::::1;::::0;;;77823:13:::1;::::0;-1:-1:-1;;;;;77846:4:0::1;::::0;77839:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;77846:4;77839:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;77839:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;77839:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;77839:37:0;77887:22:::1;77922:14:::0;;77839:37;;-1:-1:-1;77887:22:0;77912:45:::1;::::0;39662:6:::1;::::0;77912:25:::1;::::0;77839:37;;77912:25:::1;:9;:25;:::i;:45::-;77974:14;::::0;77887:70;;-1:-1:-1;77974:14:0::1;;:22;;:14:::0;:22:::1;:44:::0;::::1;;;;78017:1;78000:14;:18;77974:44;77970:400;;;78052:4;::::0;78035:38:::1;::::0;-1:-1:-1;;;;;78052:4:0::1;78058:14:::0;78035:16:::1;:38::i;:::-;77970:400;;;78151:9:::0;;78147:212:::1;;78273:10;::::0;78261:34:::1;::::0;;-1:-1:-1;;;78261:34:0;;;;78235:108:::1;::::0;-1:-1:-1;;;;;78273:10:0::1;::::0;78261:32:::1;::::0;:34:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;78273:10;78261:34;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;78261:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;78261:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;78261:34:0;78307:14:::1;::::0;78297:45:::1;::::0;39662:6:::1;::::0;78297:25:::1;::::0;:5;;:25:::1;:9;:25;:::i;78235:108::-;78430:9:::0;;78426:51:::1;;78456:9;:7;:9::i;:::-;41591:1;;;77586:898::o:0;67041:233::-;67110:7;67129:23;67155:26;:24;:26::i;:::-;67248:17;;67129:52;;-1:-1:-1;67199:67:0;;:44;67238:4;67199:34;:13;67129:52;67199:34;:17;:34;:::i;:67::-;67192:74;;;67041:233;;;;:::o;40479:73::-;;;-1:-1:-1;;;;;40479:73:0;;:::o;64032:24::-;;;;:::o;43836:289::-;43937:10;;43887:15;;-1:-1:-1;;;;;43937:10:0;43923;:24;43915:48;;;;;-1:-1:-1;;;43915:48:0;;;;;;;;;;;;-1:-1:-1;;;43915:48:0;;;;;;;;;;;;;;;43982:4;;-1:-1:-1;;;;;43982:23:0;;;:4;;:23;;43974:40;;;;;-1:-1:-1;;;43974:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;43974:40:0;;;;;;;;;;;;;;;44035:31;;;-1:-1:-1;;;44035:31:0;;44060:4;44035:31;;;;;;-1:-1:-1;;;;;44035:16:0;;;;;:31;;;;;;;;;;;;;;:16;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;44035:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44035:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44035:31:0;44097:10;;44035:31;;-1:-1:-1;44077:40:0;;-1:-1:-1;;;;;44077:19:0;;;;44097:10;44035:31;44077:40;:19;:40;:::i;40089:70::-;;;-1:-1:-1;;;;;40089:70:0;;:::o;68553:233::-;68630:7;68650:21;68674:48;68701:20;68674:22;:20;:22::i;:48::-;68650:72;;68740:38;68757:13;68772:5;68740:16;:38::i;76749:158::-;65601:10;;-1:-1:-1;;;;;65601:10:0;65587;:24;;:52;;-1:-1:-1;65629:10:0;;-1:-1:-1;;;;;65629:10:0;65615;:24;65587:52;65579:76;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;;;;76857:19:::1;:42:::0;76749:158::o;40583:25::-;;;-1:-1:-1;;;;;40583:25:0;;:::o;56971:215::-;57017:7;57037:16;57056:13;:11;:13::i;:::-;57037:32;;57080:16;57099:13;:11;:13::i;:::-;57080:32;-1:-1:-1;57132:46:0;57155:22;:8;57080:32;57155:22;:12;:22;:::i;:::-;57132:18;:8;57145:4;57132:18;:12;:18;:::i;56340:122::-;56406:48;;;-1:-1:-1;;;56406:48:0;;56448:4;56406:48;;;;;;56379:7;;-1:-1:-1;;;;;;;;;;;52030:42:0;56406:33;;:48;;;;;;;;;;;;;;;56379:7;52030:42;56406:48;;;2:2:-1;;;;27:1;24;17:12;2:2;56406:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56406:48:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56406:48:0;;-1:-1:-1;56340:122:0;:::o;66538:346::-;66684:13;;66704:5;;66672:38;;;-1:-1:-1;;;66672:38:0;;;;;;;;;;66585:7;;;;;;;;-1:-1:-1;;;;;66684:13:0;;66672:31;;:38;;;;;;;;;;;;;;66684:13;66672:38;;;2:2:-1;;;;27:1;24;17:12;2:2;66672:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66672:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;66672:38:0;66739:3;;66749:13;;66731:44;;;-1:-1:-1;;;66731:44:0;;;;;;;;;-1:-1:-1;;;;;66731:44:0;;;;;;;;;66672:38;;-1:-1:-1;66739:3:0;;;;66731:17;;:44;;;;;;;;;;;;;66739:3;66731:44;;;2:2:-1;;;;27:1;24;17:12;2:2;66731:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66731:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;66731:44:0;;;66811:3;;66821:13;;66731:44;66803:32;;-1:-1:-1;;;66803:32:0;;;;;;;;;;66731:44;;-1:-1:-1;;;;;;66811:3:0;;;;66803:17;;:32;;;;;;;;;;;;;;;66811:3;66803:32;;;2:2:-1;;;;27:1;24;17:12;2:2;66803:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66803:32:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;66803:32:0;;;;-1:-1:-1;66853:23:0;66871:4;66853:13;:3;66803:32;66853:13;:7;:13;:::i;:23::-;66846:30;;;;;66538:346;:::o;53202:131::-;53277:48;;;-1:-1:-1;;;53277:48:0;;53319:4;53277:48;;;;;;53250:7;;-1:-1:-1;;;;;;;;;;;52030:42:0;53277:33;;:48;;;;;;;;;;;;;;;52030:42;53277:48;;;2:2:-1;;;;27:1;24;17:12;2:2;53277:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;51673:80:0;51711:42;51673:80;:::o;69631:112::-;65601:10;;-1:-1:-1;;;;;65601:10:0;65587;:24;;:52;;-1:-1:-1;65629:10:0;;-1:-1:-1;;;;;65629:10:0;65615;:24;65587:52;65579:76;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;;;;69717:7:::1;:18:::0;69631:112::o;69879:120::-;65601:10;;-1:-1:-1;;;;;65601:10:0;65587;:24;;:52;;-1:-1:-1;65629:10:0;;-1:-1:-1;;;;;65629:10:0;65615;:24;65587:52;65579:76;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;;;;69969:9:::1;:22:::0;69879:120::o;42381:167::-;42475:8;;-1:-1:-1;;;;;42475:8:0;42461:10;:22;42453:44;;;;;-1:-1:-1;;;42453:44:0;;;;;;;;;;;;-1:-1:-1;;;42453:44:0;;;;;;;;;;;;;;;42508:14;:32;42381:167::o;41834:113::-;41876:7;41903:36;41923:15;:13;:15::i;:::-;41903;:13;:15::i;:::-;:19;:36;:19;:36;:::i;54000:307::-;54053:7;54073:17;54093:20;:18;:20::i;:::-;54073:40;;54172:21;54196:72;54210:57;54244:22;;54210:29;54234:4;54210:19;;:23;;:29;;;;:::i;52914:280::-;53030:47;;;-1:-1:-1;;;53030:47:0;;53071:4;53030:47;;;;;;52962:7;;;;;;-1:-1:-1;;;;;;;;;;;52030:42:0;53030:32;;:47;;;;;;;;;;;;;;;52030:42;53030:47;;;2:2:-1;;;;27:1;24;17:12;2:2;53030:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53030:47:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;53030:47:0;;;;;;;;;;;53124:29;;;;;;;;;;53030:47;;-1:-1:-1;53030:47:0;;-1:-1:-1;53091:11:0;;53106:59;;53030:47;53106:17;:59::i;:::-;53088:77;-1:-1:-1;;;;;52914:280:0;:::o;42218:155::-;42306:8;;-1:-1:-1;;;;;42306:8:0;42292:10;:22;42284:44;;;;;-1:-1:-1;;;42284:44:0;;;;;;;;;;;;-1:-1:-1;;;42284:44:0;;;;;;;;;;;;;;;42339:11;:26;42218:155::o;56470:123::-;56536:49;;;-1:-1:-1;;;56536:49:0;;56579:4;56536:49;;;;;;56509:7;;-1:-1:-1;;;;;;;;;;;52030:42:0;56536:34;;:49;;;;;;;;;;;;;;;56509:7;52030:42;56536:49;;;2:2:-1;;;;27:1;24;17:12;63452:63:0;;;-1:-1:-1;;;;;63452:63:0;;:::o;45997:440::-;46088:10;;46038:15;;-1:-1:-1;;;;;46088:10:0;46074;:24;46066:48;;;;;-1:-1:-1;;;46066:48:0;;;;;;;;;;;;-1:-1:-1;;;46066:48:0;;;;;;;;;;;;;;;46125:14;:12;:14::i;:::-;46169:4;;46162:37;;;-1:-1:-1;;;46162:37:0;;46193:4;46162:37;;;;;;-1:-1:-1;;;;;46169:4:0;;;;46162:22;;:37;;;;;;;;;;;;;;;46169:4;46162:37;;;2:2:-1;;;;27:1;24;17:12;2:2;46162:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46162:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;46162:37:0;46241:10;;46268:4;;46229:45;;;-1:-1:-1;;;46229:45:0;;-1:-1:-1;;;;;46268:4:0;;;46229:45;;;;;;46162:37;;-1:-1:-1;46212:14:0;;46241:10;;;;;46229:30;;:45;;;;;46162:37;;46229:45;;;;;;;46241:10;46229:45;;;2:2:-1;;;;27:1;24;17:12;2:2;46229:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46229:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;46229:45:0;;-1:-1:-1;;;;;;46293:20:0;;46285:39;;;;;-1:-1:-1;;;46285:39:0;;;;;;;;;;;;-1:-1:-1;;;46285:39:0;;;;;;;;;;;;;;;46394:4;;46387:42;;-1:-1:-1;;;;;46394:4:0;46413:6;46421:7;46387:42;:25;:42;:::i;:::-;45997:440;;:::o;40314:80::-;40352:42;40314:80;:::o;64154:29::-;;;;:::o;39577:37::-;;;;:::o;75977:33::-;;;;:::o;43033:151::-;43119:8;;-1:-1:-1;;;;;43119:8:0;43105:10;:22;43097:44;;;;;-1:-1:-1;;;43097:44:0;;;;;;;;;;;;-1:-1:-1;;;43097:44:0;;;;;;;;;;;;;;;43152:10;:24;;-1:-1:-1;;;;;;43152:24:0;-1:-1:-1;;;;;43152:24:0;;;;;;;;;;43033:151::o;74059:531::-;65717:21;65741:22;:20;:22::i;:::-;65717:46;;65798:1;65782:13;:17;65774:45;;;;;-1:-1:-1;;;65774:45:0;;;;;;;;;;;;-1:-1:-1;;;65774:45:0;;;;;;;;;;;;;;;65834:15;65852:16;:14;:16::i;:::-;65834:34;;65897:1;65887:7;:11;65879:33;;;;;-1:-1:-1;;;65879:33:0;;;;;;;;;;;;-1:-1:-1;;;65879:33:0;;;;;;;;;;;;;;;65317:10:::1;65309:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;::::0;:67:::1;;-1:-1:-1::0;65349:10:0::1;65371:4;65349:27;65309:67;:112;;;-1:-1:-1::0;65411:10:0::1;::::0;-1:-1:-1;;;;;65411:10:0::1;65397;:24;65309:112;:157;;;-1:-1:-1::0;65456:10:0::1;::::0;-1:-1:-1;;;;;65456:10:0::1;65442;:24;65309:157;65287:215;;;::::0;;-1:-1:-1;;;65287:215:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;65287:215:0;;;;;;;;;;;;;::::1;;74130:24:::2;74157:19;74174:1;74157:16;:19::i;:::-;74130:46:::0;-1:-1:-1;74191:20:0;;74187:396:::2;;74227:30;74240:16;74227:12;:30::i;:::-;74293:9;::::0;74286:42:::2;::::0;;-1:-1:-1;;;74286:42:0;;74322:4:::2;74286:42;::::0;::::2;::::0;;;74272:11:::2;::::0;-1:-1:-1;;;;;74293:9:0::2;::::0;74286:27:::2;::::0;:42;;;;;::::2;::::0;;;;;;;;74293:9;74286:42;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;74286:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;74286:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;74286:42:0;;-1:-1:-1;74351:23:0;;::::2;;74343:58;;;::::0;;-1:-1:-1;;;74343:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;74343:58:0;;;;;;;;;;;;;::::2;;74421:26;74430:16;74421:8;:26::i;:::-;74462:17;74482:14;:12;:14::i;:::-;74532:8;::::0;74462:34;;-1:-1:-1;74532:15:0::2;::::0;74545:1:::2;74532:15;:12;:15;:::i;:::-;74519:9;:28;;74511:60;;;::::0;;-1:-1:-1;;;74511:60:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;74511:60:0;;;;;;;;;;;;;::::2;43343:168:::0;43434:10;;-1:-1:-1;;;;;43434:10:0;43420;:24;43412:48;;;;;-1:-1:-1;;;43412:48:0;;;;;;;;;;;;-1:-1:-1;;;43412:48:0;;;;;;;;;;;;;;;43471:14;:32;;-1:-1:-1;;43471:32:0;;;;;;;;;;43343:168::o;71784:353::-;71845:10;;-1:-1:-1;;;;;71845:10:0;71831;:24;71823:48;;;;;-1:-1:-1;;;71823:48:0;;;;;;;;;;;;-1:-1:-1;;;71823:48:0;;;;;;;;;;;;;;;71890:5;;:10;71882:40;;;;;-1:-1:-1;;;71882:40:0;;;;;;;;;;;;-1:-1:-1;;;71882:40:0;;;;;;;;;;;;;;;71957:13;;71977;;71945:61;;;-1:-1:-1;;;71945:61:0;;;;;;;;;72000:4;71945:61;;;;;-1:-1:-1;;;;;71957:13:0;;;;71945:31;;:61;;;;;;;;;;;;;;;71957:13;;71945:61;;;2:2:-1;;;;27:1;24;17:12;2:2;71945:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71945:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71945:61:0;71937:5;:69;72030:10;;72050:7;;72023:48;;;-1:-1:-1;;;72023:48:0;;-1:-1:-1;;;;;72050:7:0;;;72023:48;;;;-1:-1:-1;;72023:48:0;;;;;;72030:10;;;;;72023:26;;:48;;;;;71945:61;;72023:48;;;;;;;72030:10;;72023:48;;;2:2:-1;;;;27:1;24;17:12;2:2;72023:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72023:48:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;72089:9:0;;72108:7;;72082:47;;;-1:-1:-1;;;72082:47:0;;-1:-1:-1;;;;;72108:7:0;;;72082:47;;;;-1:-1:-1;;72082:47:0;;;;;;72089:9;;;;;72082:25;;:47;;;;;72023:48;;72082:47;;;;;;;72089:9;;72082:47;;;2:2:-1;;;;27:1;24;17:12;2:2;72082:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72082:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;71784:353:0:o;56137:195::-;56187:7;56207:16;56226:13;:11;:13::i;:::-;56207:32;;56250:16;56269:13;:11;:13::i;:::-;56250:32;-1:-1:-1;56302:22:0;:8;56250:32;56302:22;:12;:22;:::i;56601:362::-;56642:7;56662:16;56681:13;:11;:13::i;:::-;56662:32;;56705:16;56724:13;:11;:13::i;:::-;56774:39;;;-1:-1:-1;;;56774:39:0;;-1:-1:-1;;;;;;;;;;;56774:39:0;;;;;;56705:32;;-1:-1:-1;56753:17:0;;51711:42;;56774:33;;:39;;;;;;;;;;;51711:42;56774:39;;;2:2:-1;;;;27:1;24;17:12;2:2;56774:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56774:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56774:39:0;;;;-1:-1:-1;56887:68:0;56949:5;56887:57;56939:4;56887:47;56925:8;56887:33;56915:4;56887:57;:8;56774:39;56887:23;:12;:23;:::i;53469:196::-;53547:7;53567:16;53586;:14;:16::i;:::-;53567:35;-1:-1:-1;53620:37:0;53652:4;53620:27;:13;53567:35;53620:27;:17;:27;:::i;63869:31::-;;;-1:-1:-1;;;;;63869:31:0;;:::o;43519:155::-;43605:10;;-1:-1:-1;;;;;43605:10:0;43591;:24;43583:48;;;;;-1:-1:-1;;;43583:48:0;;;;;;;;;;;;-1:-1:-1;;;43583:48:0;;;;;;;;;;;;;;;43642:10;:24;;-1:-1:-1;;;;;;43642:24:0;-1:-1:-1;;;;;43642:24:0;;;;;;;;;;43519:155::o;69127:467::-;69211:16;;69184:7;;-1:-1:-1;;;;;69211:16:0;69203:61;;;;;-1:-1:-1;;;69203:61:0;;;;;;;;;;;;-1:-1:-1;;;69203:61:0;;;;;;;;;;;;;;;69291:14;69321:9;69345:14;69374;69403:22;69439:9;;;;;;;;;-1:-1:-1;;;;;69439:9:0;-1:-1:-1;;;;;69439:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;69439:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69439:27:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;69439:27:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69439:27:0;;-1:-1:-1;69439:27:0;-1:-1:-1;69439:27:0;;-1:-1:-1;69439:27:0;-1:-1:-1;69493:1:0;69485:9;;69481:106;;;69532:3;69525:5;69517:18;69510:25;;;;;;;;;69481:106;69574:1;69567:8;;;;;;;;;40015:67;;;;;;-1:-1:-1;;;;;40015:67:0;;:::o;42719:155::-;42805:10;;-1:-1:-1;;;;;42805:10:0;42791;:24;42783:48;;;;;-1:-1:-1;;;42783:48:0;;;;;;;;;;;;-1:-1:-1;;;42783:48:0;;;;;;;;;;;;;;;42842:10;:24;;-1:-1:-1;;;;;;42842:24:0;-1:-1:-1;;;;;42842:24:0;;;;;;;;;;42719:155::o;63298:73::-;;;-1:-1:-1;;;;;63298:73:0;;:::o;76961:221::-;65317:10;65309:19;;;;:7;:19;;;;;;;;;:67;;-1:-1:-1;65349:10:0;65371:4;65349:27;65309:67;:112;;;-1:-1:-1;65411:10:0;;-1:-1:-1;;;;;65411:10:0;65397;:24;65309:112;:157;;;-1:-1:-1;65456:10:0;;-1:-1:-1;;;;;65456:10:0;65442;:24;65309:157;65287:215;;;;;-1:-1:-1;;;65287:215:0;;;;;;;;;;;;-1:-1:-1;;;65287:215:0;;;;;;;;;;;;;;;77015:25:::1;77043:24;:22;:24::i;:::-;77015:52;;77078:19;77100:43;77125:17;77100:24;:43::i;:::-;77078:65;;77154:20;77162:11;77154:7;:20::i;64251:30::-:0;;;;:::o;55726:200::-;55814:79;;;-1:-1:-1;;;55814:79:0;;51950:42;55814:79;;;;51711:42;55814:79;;;;55887:4;55814:79;;;;;;55768:7;;;;51791:42;;55814:45;;:79;;;;;;;;;;;;;;55768:7;51791:42;55814:79;;;2:2:-1;;;;27:1;24;17:12;2:2;55814:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55814:79:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;55814:79:0;;;;-1:-1:-1;;55726:200:0;:::o;67282:254::-;67340:7;65717:21;65741:22;:20;:22::i;:::-;65717:46;;65798:1;65782:13;:17;65774:45;;;;;-1:-1:-1;;;65774:45:0;;;;;;;;;;;;-1:-1:-1;;;65774:45:0;;;;;;;;;;;;;;;65834:15;65852:16;:14;:16::i;:::-;65834:34;;65897:1;65887:7;:11;65879:33;;;;;-1:-1:-1;;;65879:33:0;;;;;;;;;;;;-1:-1:-1;;;65879:33:0;;;;;;;;;;;;;;;67365:21:::1;67389:48;67433:3;67389:39;67405:22;:20;:22::i;:::-;67389:15;:39::i;:48::-;67365:72;;67448:15;67466:16;:14;:16::i;:::-;67448:34:::0;-1:-1:-1;67502:26:0::1;:13:::0;67448:34;67502:26:::1;:17;:26;:::i;39864:30::-:0;;;;:::o;40723:72::-;;;-1:-1:-1;;;;;40723:72:0;;:::o;42882:143::-;42964:8;;-1:-1:-1;;;;;42964:8:0;42950:10;:22;42942:44;;;;;-1:-1:-1;;;42942:44:0;;;;;;;;;;;;-1:-1:-1;;;42942:44:0;;;;;;;;;;;;;;;42997:8;:20;;-1:-1:-1;;;;;;42997:20:0;-1:-1:-1;;;;;42997:20:0;;;;;;;;;;42882:143::o;75764:75::-;;;-1:-1:-1;;;;;75764:75:0;;:::o;75925:45::-;;;;:::o;63378:67::-;;;-1:-1:-1;;;;;63378:67:0;;:::o;41637:118::-;41717:4;;41710:37;;;-1:-1:-1;;;41710:37:0;;41741:4;41710:37;;;;;;41683:7;;-1:-1:-1;;;;;41717:4:0;;41710:22;;:37;;;;;;;;;;;;;;41717:4;41710:37;;;2:2:-1;;;;27:1;24;17:12;42556:155:0;42642:10;;-1:-1:-1;;;;;42642:10:0;42628;:24;42620:48;;;;;-1:-1:-1;;;42620:48:0;;;;;;;;;;;;-1:-1:-1;;;42620:48:0;;;;;;;;;;;;;;;42679:10;:24;;-1:-1:-1;;;;;;42679:24:0;-1:-1:-1;;;;;42679:24:0;;;;;;;;;;42556:155::o;39772:32::-;;;;:::o;40401:71::-;;;-1:-1:-1;;;;;40401:71:0;;:::o;51999:73::-;-1:-1:-1;;;;;;;;;;;51999:73:0;:::o;74599:570::-;74668:4;;74661:37;;;-1:-1:-1;;;74661:37:0;;74692:4;74661:37;;;;;;74645:13;;-1:-1:-1;;;;;74668:4:0;;74661:22;;:37;;;;;;;;;;;;;;74668:4;74661:37;;;2:2:-1;;;;27:1;24;17:12;2:2;74661:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74661:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;74661:37:0;;-1:-1:-1;74713:9:0;;74709:453;;74740:16;74759:57;74776:33;74786:22;:20;:22::i;:::-;74776:5;;:33;:9;:33;:::i;:::-;74811:4;74759:16;:57::i;:::-;74740:76;;74868:7;;74834:30;74847:16;:14;:16::i;:::-;74834:8;;:30;:12;:30;:::i;:::-;:41;74831:320;;74894:39;74917:5;74924:8;74894:22;:39::i;:::-;74972:9;;74965:42;;;-1:-1:-1;;;74965:42:0;;75001:4;74965:42;;;;;;74951:11;;-1:-1:-1;;;;;74972:9:0;;74965:27;;:42;;;;;;;;;;;;;;74972:9;74965:42;;;2:2:-1;;;;27:1;24;17:12;2:2;74965:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74965:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;74965:42:0;;-1:-1:-1;75028:14:0;;;75025:72;;;75075:3;75064:14;;75025:72;75114:21;75126:8;75114:11;:21::i;74709:453::-;74599:570;:::o;40679:23::-;;;-1:-1:-1;;;;;40679:23:0;;:::o;63762:25::-;;;-1:-1:-1;;;;;63762:25:0;;:::o;77468:109::-;65317:10;65309:19;;;;:7;:19;;;;;;;;;:67;;-1:-1:-1;65349:10:0;65371:4;65349:27;65309:67;:112;;;-1:-1:-1;65411:10:0;;-1:-1:-1;;;;;65411:10:0;65397;:24;65309:112;:157;;;-1:-1:-1;65456:10:0;;-1:-1:-1;;;;;65456:10:0;65442;:24;65309:157;65287:215;;;;;-1:-1:-1;;;65287:215:0;;;;;;;;;;;;-1:-1:-1;;;65287:215:0;;;;;;;;;;;;;;;77546:23:::1;77555:13;77546:8;:23::i;69753:116::-:0;65601:10;;-1:-1:-1;;;;;65601:10:0;65587;:24;;:52;;-1:-1:-1;65629:10:0;;-1:-1:-1;;;;;65629:10:0;65615;:24;65587:52;65579:76;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;-1:-1:-1;;;65579:76:0;;;;;;;;;;;;;;;69841:8:::1;:20:::0;69753:116::o;63907:28::-;;;;:::o;63668:46::-;;;;:::o;77353:106::-;65317:10;65309:19;;;;:7;:19;;;;;;;;;:67;;-1:-1:-1;65349:10:0;65371:4;65349:27;65309:67;:112;;;-1:-1:-1;65411:10:0;;-1:-1:-1;;;;;65411:10:0;65397;:24;65309:112;:157;;;-1:-1:-1;65456:10:0;;-1:-1:-1;;;;;65456:10:0;65442;:24;65309:157;65287:215;;;;;-1:-1:-1;;;65287:215:0;;;;;;;;;;;;-1:-1:-1;;;65287:215:0;;;;;;;;;;;;;;;77429:22:::1;77437:13;77429:7;:22::i;51840:72::-:0;51870:42;51840:72;:::o;77190:154::-;65317:10;65309:19;;;;:7;:19;;;;;;;;;:67;;-1:-1:-1;65349:10:0;65371:4;65349:27;65309:67;:112;;;-1:-1:-1;65411:10:0;;-1:-1:-1;;;;;65411:10:0;65397;:24;65309:112;:157;;;-1:-1:-1;65456:10:0;;-1:-1:-1;;;;;65456:10:0;65442;:24;65309:157;65287:215;;;;;-1:-1:-1;;;65287:215:0;;;;;;;;;;;;-1:-1:-1;;;65287:215:0;;;;;;;;;;;;;;;77246:25:::1;77274:24;:22;:24::i;:::-;77246:52;;77309:27;77318:17;77309:8;:27::i;67780:581::-:0;67863:7;67883:15;67901:123;67947:76;68019:3;67947:67;68001:12;;67947:49;67986:9;;67971:12;;:24;67947:19;67960:5;67947:8;;:12;;:19;;;;:::i;:76::-;67901:41;67936:5;67901:30;67917:13;67901:15;:30::i;:123::-;67883:141;;68039:15;68057:16;:14;:16::i;:::-;68039:34;-1:-1:-1;68088:12:0;68129:6;:28;;;;;68150:7;68139;:18;;68129:28;68125:181;;;68180:20;:7;68192;68180:20;:11;:20;:::i;:::-;68173:27;;68125:181;;;68223:6;68222:7;:29;;;;;68244:7;68233;:18;;68222:29;68218:88;;;68274:20;:7;68286;68274:20;:11;:20;:::i;:::-;68267:27;;68218:88;68341:1;68334:4;:8;68333:20;;68352:1;68333:20;;;68345:4;68333:20;68326:27;;;;;67780:581;;;;;:::o;40615:25::-;;;-1:-1:-1;;;;;40615:25:0;;:::o;63592:69::-;;;-1:-1:-1;;;;;63592:69:0;;:::o;3274:132::-;3332:7;3359:39;3363:1;3366;3359:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3352:46;3274:132;-1:-1:-1;;;3274:132:0:o;2327:471::-;2385:7;2630:6;2626:47;;-1:-1:-1;2660:1:0;2653:8;;2626:47;2697:5;;;2701:1;2697;:5;:1;2721:5;;;;;:10;2713:56;;;;-1:-1:-1;;;2713:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1437:136;1495:7;1522:43;1526:1;1529;1522:43;;;;;;;;;;;;;;;;;:3;:43::i;75177:470::-;75244:7;75264:24;75291:25;75308:7;75291:16;:25::i;:::-;75264:52;-1:-1:-1;75331:20:0;;75327:82;;75367:30;75380:16;75367:12;:30::i;:::-;75444:9;;75437:42;;;-1:-1:-1;;;75437:42:0;;75473:4;75437:42;;;;;;75423:11;;-1:-1:-1;;;;;75444:9:0;;75437:27;;:42;;;;;;;;;;;;;;75444:9;75437:42;;;2:2:-1;;;;27:1;24;17:12;2:2;75437:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;75437:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;75437:42:0;;-1:-1:-1;75498:23:0;;;;75490:58;;;;;-1:-1:-1;;;75490:58:0;;;;;;;;;;;;-1:-1:-1;;;75490:58:0;;;;;;;;;;;;;;;75563:51;75588:7;75597:16;75563:24;:51::i;:::-;-1:-1:-1;75632:7:0;;75177:470;-1:-1:-1;;75177:470:0:o;973:181::-;1031:7;1063:5;;;1087:6;;;;1079:46;;;;;-1:-1:-1;;;1079:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;78493:148;78606:15;;-1:-1:-1;;;;;78606:15:0;;78493:148::o;45496:425::-;45597:14;;;;:22;;:14;:22;45593:321;;;45668:7;;45636:56;;45649:17;;45668:7;;;-1:-1:-1;;;;;45668:7:0;45677:14;45636:12;:56::i;:::-;45734:7;;45727:40;;;-1:-1:-1;;;45727:40:0;;45761:4;45727:40;;;;;;-1:-1:-1;;45734:7:0;;;-1:-1:-1;;;;;45734:7:0;;45727:25;;:40;;;;;;;;;;;;;;45734:7;45727:40;;;2:2:-1;;;;27:1;24;17:12;2:2;45727:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45727:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45727:40:0;45811:10;;45789:7;;45727:40;;-1:-1:-1;45782:51:0;;45811:10;45789:7;;-1:-1:-1;;;;;45789:7:0;;;;45811:10;45727:40;45782:51;:28;:51;:::i;:::-;45860:10;;;45848:54;;;-1:-1:-1;;;45848:54:0;;;;;;;;;-1:-1:-1;;;;;45860:10:0;;;;45848:43;;:54;;;;;45860:10;;45848:54;;;;;;;45860:10;;45848:54;;;2:2:-1;;;;27:1;24;17:12;2:2;45848:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45848:54:0;;;;45593:321;45496:425;;:::o;26894:177::-;27004:58;;;-1:-1:-1;;;;;27004:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27004:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;26977:86:0;;26997:5;;26977:19;:86::i;61116:188::-;61185:16;;;61199:1;61185:16;;;;;;;;;61158:24;;61185:16;;;;;;109:14:-1;61185:16:0;88:42:-1;144:17;;-1:-1;61185:16:0;61158:43;;-1:-1:-1;;;;;;;;;;;61212:7:0;61220:1;61212:10;;;;;;;;-1:-1:-1;;;;;61212:17:0;;;:10;;;;;;;;;;:17;61240:59;;;-1:-1:-1;;;61240:59:0;;61284:4;61240:59;;;;;;;;;;;;;;;;;;;;51711:42;;61240:35;;61284:4;;61291:7;;61240:59;;;;;;;;;;;;;;-1:-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;61240:59:0;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;61240:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;46967:1285:0;-1:-1:-1;;;;;47096:17:0;;47088:26;;12:1:-1;9;2:12;47088:26:0;47183:12;;47157:42;;-1:-1:-1;;;;;47157:25:0;;;;47183:12;;47157:42;:25;:42;:::i;:::-;47236:12;;47210:48;;-1:-1:-1;;;;;47210:25:0;;;;47236:12;47250:7;47210:48;:25;:48;:::i;:::-;47316:7;;47271:21;;-1:-1:-1;;;;;47309:14:0;;;47316:7;;;;;47309:14;:40;;;;-1:-1:-1;47327:14:0;;;;:22;;:14;:22;47309:40;47305:751;;;-1:-1:-1;;;;;47370:20:0;;40352:42;47370:20;47366:323;;;47417:16;;;47431:1;47417:16;;;;;;;;;;;;;;;109:14:-1;47417:16:0;88:42:-1;144:17;;-1:-1;47417:16:0;47410:23;;47462:5;47452:4;47457:1;47452:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;47452:15:0;;;-1:-1:-1;;;;;47452:15:0;;;;;47496:3;47486:4;47491:1;47486:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;47486:13:0;;;-1:-1:-1;;;;;47486:13:0;;;;;47366:323;;;47551:16;;;47565:1;47551:16;;;;;;;;;;;;;17:15:-1;;109:14;47551:16:0;88:42:-1;144:17;;-1:-1;47551:16:0;47544:23;;47596:5;47586:4;47591:1;47586:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;47586:15:0;;;-1:-1:-1;;;;;47586:15:0;;;;;40352:42;47620:4;47625:1;47620:7;;;;;;;;;;;;;:21;-1:-1:-1;;;;;47620:21:0;;;-1:-1:-1;;;;;47620:21:0;;;;;47670:3;47660:4;47665:1;47660:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;47660:13:0;;;-1:-1:-1;;;;;47660:13:0;;;;;47366:323;47305:751;;;-1:-1:-1;;;;;47726:13:0;;40241:42;47726:13;;:28;;-1:-1:-1;;;;;;47743:11:0;;40241:42;47743:11;47726:28;47722:321;;;47782:16;;;47796:1;47782:16;;;;;;;;;;;;;;;109:14:-1;47782:16:0;88:42:-1;144:17;;-1:-1;47782:16:0;47775:23;;47827:5;47817:4;47822:1;47817:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;47817:15:0;;;-1:-1:-1;;;;;47817:15:0;;;;;47861:3;47851:4;47856:1;47851:7;;;;;;;47722:321;47912:16;;;47926:1;47912:16;;;;;;;;;;;;;17:15:-1;;109:14;47912:16:0;88:42:-1;144:17;;-1:-1;47912:16:0;47905:23;;47957:5;47947:4;47952:1;47947:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;47947:15:0;;;-1:-1:-1;;;;;47947:15:0;;;;;40241:42;47981:4;47986:1;47981:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;47981:14:0;;;-1:-1:-1;;;;;47981:14:0;;;;;48024:3;48014:4;48019:1;48014:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;48014:13:0;;;-1:-1:-1;;;;;48014:13:0;;;;;47722:321;48084:12;;-1:-1:-1;;;;;48084:12:0;48068:54;48137:7;48084:12;48175:4;48202;48222:11;:3;48230:2;48222:11;:7;:11;:::i;:::-;48068:176;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48068:176:0;-1:-1:-1;;;;;48068:176: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;48068:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48068:176:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48068:176:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;48068:176:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;48068:176:0;;;;;;;;;;;;;19:11:-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;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;48068:176:0;;421:4:-1;412:14;;;;48068:176:0;;;;;412:14:-1;48068:176: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;48068:176:0;;;;;;;;;;;;46967:1285;;;;:::o;32358:313::-;32435:9;32446:4;32464:13;32479:18;;:::i;:::-;32501:20;32511:1;32514:6;32501:9;:20::i;:::-;32463:58;;-1:-1:-1;32463:58:0;-1:-1:-1;32543:18:0;32536:3;:25;;;;;;;;;32532:73;;-1:-1:-1;32586:3:0;-1:-1:-1;32591:1:0;;-1:-1:-1;32578:15:0;;32532:73;32625:18;32645:17;32654:7;32645:8;:17::i;:::-;32617:46;;;;;;32358:313;;;;;;:::o;46445:82::-;46489:30;46503:15;:13;:15::i;78797:140::-;78869:11;;78865:65;;78899:19;78910:7;78899:10;:19::i;73065:319::-;66004:1;65996:5;;:9;65988:28;;;;;-1:-1:-1;;;65988:28:0;;;;;;;;;;;;-1:-1:-1;;;65988:28:0;;;;;;;;;;;;;;;73143:7:::1;66105:15;66123:16;:14;:16::i;:::-;66105:34;;66172:7;66162;:17;:54;;;;-1:-1:-1::0;66208:7:0::1;::::0;66184:20:::1;:7:::0;66196;66184:20:::1;:11;:20;:::i;:::-;:31;;66162:54;66161:78;;;;66232:7;66221;:18;;66161:78;66153:99;;;::::0;;-1:-1:-1;;;66153:99:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;66153:99:0;;;;;;;;;;;;;::::1;;73165:11:::2;73178::::0;73191::::2;73206:14;:12;:14::i;:::-;73245:7;::::0;73233:39:::2;::::0;;-1:-1:-1;;;73233:39:0;;-1:-1:-1;;;;;73233:39:0;;::::2;;::::0;::::2;::::0;;;;;;;;;73164:56;;-1:-1:-1;73164:56:0;;-1:-1:-1;73164:56:0;;-1:-1:-1;73245:7:0::2;::::0;73233:25:::2;::::0;:39;;;;;73245:7:::2;::::0;73233:39;;;;;;;;73245:7;;73233:39;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;73233:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;73295:13:0::2;::::0;73315:5:::2;::::0;73343:21:::2;::::0;;-1:-1:-1;;;73343:21:0;;-1:-1:-1;;;;;73343:21:0;;::::2;;::::0;::::2;::::0;;;73295:13;;::::2;::::0;-1:-1:-1;73283:31:0::2;::::0;-1:-1:-1;73315:5:0;;73295:13:::2;::::0;73325:50:::2;::::0;73338:3;;73343:16;;::::2;::::0;::::2;::::0;:21;;;;;::::2;::::0;;;;;;;;:16;:21;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;73343:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;73343:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;73343:21:0;73366:3;73371;73325:12:::2;:50::i;:::-;73283:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;73283:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;73283:93:0;;;;66263:1;;;66028::::1;;73065:319:::0;:::o;57431:919::-;57557:16;57576;:14;:16::i;:::-;57557:35;;57603:25;57631:24;:22;:24::i;:::-;57603:52;;57691:17;57674:13;:34;;:96;;;;-1:-1:-1;57729:41:0;57765:4;57729:31;:17;57751:8;57729:31;:21;:31;:::i;:41::-;57712:13;:58;;57674:96;57666:118;;;;;-1:-1:-1;;;57666:118:0;;;;;;;;;;;;-1:-1:-1;;;57666:118:0;;;;;;;;;;;;;;;57879:24;57914:16;57933:13;:11;:13::i;:::-;57914:32;;57957:386;57975:13;57964:8;:24;57957:386;;;58024:15;:13;:15::i;:::-;58005:34;-1:-1:-1;58093:13:0;58060:30;:8;58005:34;58060:30;:12;:30;:::i;:::-;:46;58056:133;;;58146:27;:13;58164:8;58146:27;:17;:27;:::i;:::-;58127:46;;58056:133;-1:-1:-1;;;;;;;;;;;;;;;;58205:20:0;;58226:16;58205:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58205:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58205:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58258:15:0;;-1:-1:-1;58258:13:0;:15::i;:::-;58301:30;:8;58314:16;58301:30;:12;:30;:::i;:::-;58290:41;;57957:386;;72363:692;66004:1;65996:5;;:9;65988:28;;;;;-1:-1:-1;;;65988:28:0;;;;;;;;;;;;-1:-1:-1;;;65988:28:0;;;;;;;;;;;;;;;72517:7:::1;;72484:29;72496:16;:14;:16::i;72484:29::-;:40;;72476:61;;;::::0;;-1:-1:-1;;;72476:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;72476:61:0;;;;;;;;;;;;;::::1;;72549:11;72562::::0;72575::::1;72590:14;:12;:14::i;:::-;72623:7;::::0;72611:46:::1;::::0;;-1:-1:-1;;;72611:46:0;;-1:-1:-1;;;;;72611:46:0;;::::1;;::::0;::::1;::::0;;;;;;;;;72548:56;;-1:-1:-1;72548:56:0;;-1:-1:-1;72548:56:0;;-1:-1:-1;72623:7:0::1;::::0;72611:25:::1;::::0;:46;;;;;72623:7:::1;::::0;72611:46;;;;;;;;72623:7;;72611:46;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;72611:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;72676:13:0::1;::::0;72696:5:::1;::::0;72721:7:::1;::::0;-1:-1:-1;;;;;72676:13:0;;::::1;::::0;-1:-1:-1;72664:31:0::1;::::0;-1:-1:-1;72696:5:0;;72703:43:::1;::::0;72709:36:::1;::::0;72721:7:::1;72730:14:::0;72709:11:::1;:36::i;:::-;72703:5;:43::i;:::-;72766:3;::::0;72748:41:::1;::::0;72761:3;;-1:-1:-1;;;;;72766:3:0::1;72771::::0;72776;72781:7;72748:12:::1;:41::i;:::-;72664:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;72664:126:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;72807:13:0::1;::::0;72827:5:::1;::::0;-1:-1:-1;;;;;72807:13:0;;::::1;::::0;-1:-1:-1;72795:31:0::1;::::0;-1:-1:-1;72842:4:0::1;72849:14;72855:7:::0;72849:5:::1;:14::i;:::-;72795:69;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;72795:69:0::1;-1:-1:-1::0;;;;;72795:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;72795:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;72919:7:0::1;::::0;72879:49:::1;::::0;;-1:-1:-1;;;72879:49:0;;72904:4:::1;72879:49;::::0;::::1;::::0;-1:-1:-1;;;;;72919:7:0;;::::1;72879:49:::0;;;;;;:16;;::::1;::::0;-1:-1:-1;72879:16:0::1;::::0;-1:-1:-1;72879:49:0;;;;;::::1;::::0;;;;;;;;;:16;:49;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;72879:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;72879:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;72879:49:0;72875:113:::1;;72968:7;::::0;72950:26:::1;::::0;;-1:-1:-1;;;72950:26:0;;-1:-1:-1;;;;;72968:7:0;;::::1;72950:26;::::0;::::1;::::0;;;:17;;::::1;::::0;::::1;::::0;:26;;;;;72968:7:::1;::::0;72950:26;;;;;;;;72968:7;72950:17;:26;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;72950:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;72950:26:0;;;;72875:113;73010:7;::::0;72998:49:::1;::::0;;-1:-1:-1;;;72998:49:0;;73032:4:::1;72998:49;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;73010:7:0;;::::1;::::0;72998:25:::1;::::0;:49;;;;;73010:7:::1;::::0;72998:49;;;;;;;;73010:7;;72998:49;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;72998:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;72998:49:0;;;;66028:1;;;72363:692:::0;;:::o;78650:138::-;78721:11;;78717:64;;78750:19;78761:7;78750:10;:19::i;58462:949::-;58523:25;58551:24;:22;:24::i;:::-;58523:52;;58586:16;58605:13;:11;:13::i;:::-;58586:32;;58654:17;58637:13;:34;;:63;;;;;58692:8;58675:13;:25;;58637:63;58629:87;;;;;-1:-1:-1;;;58629:87:0;;;;;;;;;;;;-1:-1:-1;;;58629:87:0;;;;;;;;;;;;;;;58816:23;58842:15;:13;:15::i;:::-;58816:41;;58868:536;58922:13;58890:29;:8;58903:15;58890:29;:12;:29;:::i;:::-;:45;58886:131;;;58974:27;:8;58987:13;58974:27;:12;:27;:::i;:::-;58956:45;;58886:131;-1:-1:-1;;;;;;;;;;;;;;;;59041:30:0;;59072:15;59041:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59041:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59041:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59041:47:0;:52;59033:79;;;;;-1:-1:-1;;;59033:79:0;;;;;;;;;;;;-1:-1:-1;;;59033:79:0;;;;;;;;;;;;;;;59127:32;51870:42;-1:-1:-1;;;;;;;;;;;59157:1:0;59127:32;:23;:32;:::i;:::-;59174:46;51870:42;-1:-1:-1;;;;;;;;;;;59204:15:0;59174:46;:23;:46;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;59243:25:0;;59269:15;59243:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59243:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59243:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59243:42:0;:47;59235:66;;;;;-1:-1:-1;;;59235:66:0;;;;;;;;;;;;-1:-1:-1;;;59235:66:0;;;;;;;;;;;;;;;59329:29;:8;59342:15;59329:29;:12;:29;:::i;:::-;59318:40;;59389:13;59378:8;:24;58868:536;;58462:949;;;;:::o;3902:278::-;3988:7;4023:12;4016:5;4008:28;;;;-1:-1:-1;;;4008:28: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;4008:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4047:9;4063:1;4059;:5;;;;;;;3902:278;-1:-1:-1;;;;;3902:278:0:o;1876:192::-;1962:7;1998:12;1990:6;;;;1982:29;;;;-1:-1:-1;;;1982:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1982:29:0;-1:-1:-1;;;2034:5:0;;;1876:192::o;73394:610::-;66004:1;65996:5;;:9;65988:28;;;;;-1:-1:-1;;;65988:28:0;;;;;;;;;;;;-1:-1:-1;;;65988:28:0;;;;;;;;;;;;;;;73509:7:::1;66105:15;66123:16;:14;:16::i;:::-;66105:34;;66172:7;66162;:17;:54;;;;-1:-1:-1::0;66208:7:0::1;::::0;66184:20:::1;:7:::0;66196;66184:20:::1;:11;:20;:::i;:::-;:31;;66162:54;66161:78;;;;66232:7;66221;:18;;66161:78;66153:99;;;::::0;;-1:-1:-1;;;66153:99:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;66153:99:0;;;;;;;;;;;;;::::1;;73531:11:::2;73544::::0;73557::::2;73572:14;:12;:14::i;:::-;73530:56:::0;;-1:-1:-1;73530:56:0;-1:-1:-1;73530:56:0;-1:-1:-1;73601:11:0;;73597:82:::2;;73640:7;::::0;73628:39:::2;::::0;;-1:-1:-1;;;73628:39:0;;-1:-1:-1;;;;;73628:39:0;;::::2;;::::0;::::2;::::0;;;;;;;;;73640:7;;;::::2;::::0;73628:25:::2;::::0;:39;;;;;73640:7:::2;::::0;73628:39;;;;;;;73640:7;;73628:39;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;73628:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;73628:39:0;;;;73597:82;73717:7;::::0;73689:13:::2;::::0;73705:36:::2;::::0;-1:-1:-1;;;;;73717:7:0::2;73726:14:::0;73705:11:::2;:36::i;:::-;73764:13;::::0;73784:5:::2;::::0;73689:52;;-1:-1:-1;;;;;;73764:13:0::2;::::0;73752:31:::2;::::0;73792:12:::2;73689:52:::0;73792:5:::2;:12::i;:::-;73791:13;;73807:50;73820:3;73833;-1:-1:-1::0;;;;;73825:16:0::2;;73842:3;73825:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;73825:21:0::2;-1:-1:-1::0;;;;;73825:21:0::2;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;73825:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;73825:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;73825:21:0;73848:3;73853;73807:12:::2;:50::i;:::-;73752:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;73752:106:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;73881:13:0::2;::::0;73901:5:::2;::::0;73869:60:::2;::::0;;-1:-1:-1;;;73869:60:0;;::::2;::::0;::::2;::::0;;;;73916:4:::2;73869:60:::0;;;;;;;;;;;-1:-1:-1;;;;;73881:13:0;;::::2;::::0;-1:-1:-1;73869:31:0::2;::::0;-1:-1:-1;73869:60:0;;;;;73881:13:::2;::::0;73869:60;;;;;;;;73881:13;;73869:60;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;73869:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;73952:7:0::2;::::0;73940:56:::2;::::0;;-1:-1:-1;;;73940:56:0;;73974:4:::2;73940:56;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;73952:7:0;;::::2;::::0;-1:-1:-1;73940:25:0::2;::::0;-1:-1:-1;73940:56:0;;;;;73952:7:::2;::::0;73940:56;;;;;;;;73952:7;;73940:56;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;73940:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;73940:56:0;;;;66263:1;;;;66028::::1;;73394:610:::0;;:::o;29199:761::-;29623:23;29649:69;29677:4;29649:69;;;;;;;;;;;;;;;;;29657:5;-1:-1:-1;;;;;29649:27:0;;;:69;;;;;:::i;:::-;29733:17;;29623:95;;-1:-1:-1;29733:21:0;29729:224;;29875:10;29864:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29864:30:0;29856:85;;;;-1:-1:-1;;;29856:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27553:622;27923:10;;;27922:62;;-1:-1:-1;27939:39:0;;;-1:-1:-1;;;27939:39:0;;27963:4;27939:39;;;;-1:-1:-1;;;;;27939:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;2:2:-1;;;;27:1;24;17:12;2:2;27939:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27939:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27939:39:0;:44;27922:62;27914:152;;;;-1:-1:-1;;;27914:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28104:62;;;-1:-1:-1;;;;;28104:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;28104:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;28077:90:0;;28097:5;;28077:19;:90::i;31892:353::-;31961:9;31972:10;;:::i;:::-;31996:14;32012:19;32035:27;32043:1;:10;;;32055:6;32035:7;:27::i;:::-;31995:67;;-1:-1:-1;31995:67:0;-1:-1:-1;32085:18:0;32077:4;:26;;;;;;;;;32073:92;;-1:-1:-1;32134:18:0;;;;;;;;;-1:-1:-1;32134:18:0;;32128:4;;-1:-1:-1;32134:18:0;-1:-1:-1;32120:33:0;;32073:92;32205:31;;;;;;;;;;;;-1:-1:-1;;32205:31:0;;-1:-1:-1;31892:353:0;-1:-1:-1;;;;31892:353:0:o;32830:213::-;33012:12;31565:4;33012:23;;;32830:213::o;59521:1192::-;59576:17;59596:24;:22;:24::i;:::-;59576:44;;59647:9;59639:5;:17;:36;;59670:5;59639:36;;;59658:9;59639:36;59631:44;-1:-1:-1;59631:44:0;59728:11;;59724:982;;59844:7;-1:-1:-1;;;;;;;;;;;;;;;;59817:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59817:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59817:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59817:23:0;:34;;59809:62;;;;;-1:-1:-1;;;59809:62:0;;;;;;;;;;;;-1:-1:-1;;;59809:62:0;;;;;;;;;;;;;;;59949:16;59968:13;:11;:13::i;:::-;59949:32;;59996:16;60015:13;:11;:13::i;:::-;59996:32;;60043:19;60065:20;:18;:20::i;:::-;60043:42;-1:-1:-1;60100:24:0;60127:34;60156:4;60127:24;:7;60043:42;60127:24;:11;:24;:::i;:34::-;60100:61;;60299:8;60280:16;:27;60276:303;;;60328:34;60337:24;:22;:24::i;:::-;60328:8;:34::i;:::-;60276:303;;;60523:40;60532:30;:8;60545:16;60532:30;:12;:30;:::i;60523:40::-;-1:-1:-1;;;;;;;;;;;;;;;;60638:30:0;;60669:7;60638:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;60638:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60638:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60638:39:0;:44;60630:64;;;;;-1:-1:-1;;;60630:64:0;;;;;;;;;;;;-1:-1:-1;;;60630:64:0;;;;;;;;;;;;;;72146:208;72188:7;72197;72206;72245:13;;;;;;;;;-1:-1:-1;;;;;72245:13:0;-1:-1:-1;;;;;72233:31:0;;72265:5;;72233:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;72233:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72233:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;72233:38:0;72285:13;;72273:32;;;-1:-1:-1;;;72273:32:0;;;;-1:-1:-1;;;;;72285:13:0;;;;72273:30;;:32;;;;;72233:38;;72273:32;;;;;;;;72285:13;72273:32;;;2:2:-1;;;;27:1;24;17:12;2:2;72273:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72273:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;72273:32:0;72319:13;;72339:5;;72307:38;;;-1:-1:-1;;;72307:38:0;;;;;;;;;;-1:-1:-1;;;;;72319:13:0;;;;72307:31;;:38;;;;;72273:32;;72307:38;;;;;;;;72319:13;72307:38;;;2:2:-1;;;;27:1;24;17:12;2:2;72307:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72307:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;72307:38:0;72225:121;;-1:-1:-1;72225:121:0;-1:-1:-1;72307:38:0;-1:-1:-1;72146:208:0;;;:::o;71449:326::-;71543:11;71570:12;71597:3;-1:-1:-1;;;;;71589:17:0;;71607:3;71589:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71589:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71589:22:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;71589:22:0;;;;71640:27;;-1:-1:-1;;;71640:27:0;;;;;;;;-1:-1:-1;;;;;71640:27:0;;;;;;;;;71589:22;;-1:-1:-1;71625:11:0;;71640:17;;;;;;:27;;;;;;;;;;;:17;:27;;;2:2:-1;;;;27:1;24;17:12;2:2;71640:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71640:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71640:27:0;;;;-1:-1:-1;71685:20:0;71691:13;:3;71699:4;71691:13;:7;:13;:::i;71685:20::-;71678:27;;71740:3;71731:4;71723:20;;:44;;71757:10;71763:3;71757:5;:10::i;:::-;71755:12;;71723:44;;;71748:4;71746:6;;71723:44;71716:51;71449:326;-1:-1:-1;;;;;;;71449:326:0:o;60719:128::-;60776:36;;;-1:-1:-1;;;60776:36:0;;60806:4;60776:36;;;;;;60761:12;;51870:42;;60776:21;;:36;;;;;;;;;;;;;;;51870:42;60776:36;;;2:2:-1;;;;27:1;24;17:12;2:2;60776:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60776:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60776:36:0;;-1:-1:-1;60823:16:0;60776:36;60823:10;:16::i;70881:156::-;70950:11;70980:49;70984:3;71013:7;-1:-1:-1;;;;;71001:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71001:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71001:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71001:26:0;70996:2;:31;70989:2;:39;70980:3;:49::i;70739:133::-;70820:1;70788:8;70841:6;;;70833:31;;;;;-1:-1:-1;;;70833:31:0;;;;;;;;;;;;-1:-1:-1;;;70833:31:0;;;;;;;;;;;;;;71046:397;71148:11;71172:12;71195:3;-1:-1:-1;;;;;71187:17:0;;71205:3;71187:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71187:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71187:22:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71187:22:0;71234:21;;;-1:-1:-1;;;71234:21:0;;-1:-1:-1;;;;;71234:21:0;;;;;;;;;71187:22;;-1:-1:-1;71220:11:0;;71234:16;;;;;;:21;;;;;71187:22;;71234:21;;;;;;;;:16;:21;;;2:2:-1;;;;27:1;24;17:12;2:2;71234:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71234:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71234:21:0;;-1:-1:-1;71276:10:0;71282:3;71276:5;:10::i;:::-;71270:3;:16;71266:170;;;71310:37;71316:30;71341:4;71316:20;71320:10;71326:3;71320:5;:10::i;:::-;71332:3;71316;:20::i;71310:37::-;71303:44;;71396:10;71402:3;71396:5;:10::i;:::-;71369:24;71381:4;71388;71369:3;:24::i;:::-;:37;:55;;71420:4;71369:55;;;71409:4;71416:1;71409:8;71369:55;71362:62;;71266:170;71046:397;;;;;;;;;:::o;70490:102::-;70541:11;70571:13;70575:3;70321:8;70571:3;:13::i;60853:257::-;60911:8;;60907:196;;60936:32;51870:42;-1:-1:-1;;;;;;;;;;;60966:1:0;60936:32;:23;:32;:::i;:::-;60983:35;51870:42;-1:-1:-1;;;;;;;;;;;61013:4:0;60983:35;:23;:35;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;61041:18:0;;61060:4;61041:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;61041:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61041:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;61041:24:0;:29;61033:58;;;;;-1:-1:-1;;;61033:58:0;;;;;;;;;;;;-1:-1:-1;;;61033:58:0;;;;;;;;;;;;;;13022:196;13125:12;13157:53;13180:6;13188:4;13194:1;13197:12;13157:22;:53::i;:::-;13150:60;13022:196;-1:-1:-1;;;;13022:196:0:o;30505:343::-;30561:9;;30593:6;30589:69;;-1:-1:-1;30624:18:0;;-1:-1:-1;30624:18:0;30616:30;;30589:69;30679:5;;;30683:1;30679;:5;:1;30701:5;;;;;:10;30697:144;;-1:-1:-1;30736:26:0;;-1:-1:-1;30764:1:0;;-1:-1:-1;30728:38:0;;30697:144;30807:18;;-1:-1:-1;30827:1:0;-1:-1:-1;30799:30:0;;70338:143;70396:9;70426:6;;;:30;;-1:-1:-1;;70441:5:0;;;70455:1;70450;70441:5;70450:1;70436:15;;;;;:20;70426:30;70418:55;;;;;-1:-1:-1;;;70418:55:0;;;;;;;;;;;;-1:-1:-1;;;70418:55:0;;;;;;;;;;;;;;70601:129;70694:5;;;70689:16;;;;70681:41;;;;;-1:-1:-1;;;70681:41:0;;;;;;;;;;;;-1:-1:-1;;;70681:41:0;;;;;;;;;;;;;;14399:979;14529:12;14562:18;14573:6;14562:10;:18::i;:::-;14554:60;;;;;-1:-1:-1;;;14554:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14688:12;14702:23;14729:6;-1:-1:-1;;;;;14729:11:0;14749:8;14760:4;14729:36;;;;;;;;;;;;;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;;;14729:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;14687:78:0;;;;14780:7;14776:595;;;14811:10;-1:-1:-1;14804:17:0;;-1:-1:-1;14804:17:0;14776:595;14925:17;;:21;14921:439;;15188:10;15182:17;15249:15;15236:10;15232:2;15228:19;15221:44;15136:148;15324:20;;-1:-1:-1;;;15324:20:0;;;;;;;;;;;;;;;;;15331:12;;15324:20;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9907:619:0;9967:4;10435:20;;10278:66;10475:23;;;;;;:42;;-1:-1:-1;;10502:15:0;;;10467:51;-1:-1:-1;;9907:619:0:o;75660:3427::-;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://206a3c60d9092c1fff733e4e4aae60be270a982654b9d88c265b12e7c9a1bd71
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.