Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xf50a9548386c737ecd51e175b4666782851141c67155b62fe93162e5a2caacd4 | 0x60806040 | 9760033 | 498 days 14 hrs ago | 0xf70f650c3720d11f970e618655d4d949ae2fc7f4 | IN | Create: PlatypusControllerV4 | 0 AVAX | 0.067031 |
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
PlatypusControllerV4
Compiler Version
v0.6.7+commit.b8d736ae
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-01-19 */ /** *Submitted for verification at snowtrace.io on 2021-11-14 */ /** *Submitted for verification at snowtrace.io on 2021-11-03 */ // File: contracts/interfaces/controller.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; interface IController { function globes(address) external view returns (address); function rewards() external view returns (address); function devfund() external view returns (address); function treasury() external view returns (address); function balanceOf(address) external view returns (uint256); function withdraw(address, uint256) external; function earn(address, uint256) external; } // File: contracts/lib/safe-math.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ 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; } } // File: contracts/lib/context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ 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/lib/erc20.sol // File: contracts/GSN/Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; // 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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @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"); } } } // File: contracts/interfaces/globe.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface IGlobe is IERC20 { function token() external view returns (address); function claimInsurance() external; // NOTE: Only yDelegatedVault implements this function getRatio() external view returns (uint256); function depositAll() external; function deposit(uint256) external; function withdrawAll() external; function withdraw(uint256) external; function earn() external; function decimals() external view returns (uint8); } // File: contracts/interfaces/globe-converter.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface IGlobeConverter { function convert( address _refundExcess, // address to send the excess amount when adding liquidity uint256 _amount, // UNI LP Amount bytes calldata _data ) external returns (uint256); } // File: contracts/interfaces/onesplit.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface OneSplitAudit { function getExpectedReturn( address fromToken, address toToken, uint256 amount, uint256 parts, uint256 featureFlags ) external view returns (uint256 returnAmount, uint256[] memory distribution); function swap( address fromToken, address toToken, uint256 amount, uint256 minReturn, uint256[] calldata distribution, uint256 featureFlags ) external payable; } // File: contracts/interfaces/strategy.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface IStrategy { function rewards() external view returns (address); function gauge() external view returns (address); function want() external view returns (address); function timelock() external view returns (address); function deposit() external; function withdrawForSwap(uint256) external returns (uint256); function withdraw(address) external; function withdraw(uint256) external; function skim() external; function withdrawAll() external returns (uint256); function balanceOf() external view returns (uint256); function harvest() external; function setTimelock(address) external; function setController(address _controller) external; function execute(address _target, bytes calldata _data) external payable returns (bytes memory response); function execute(bytes calldata _data) external payable returns (bytes memory response); } // File: contracts/interfaces/converter.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface Converter { function convert(address) external returns (uint256); } // File: contracts/controller-v4.sol // https://github.com/iearn-finance/globes/blob/master/contracts/controllers/StrategyControllerV1.sol pragma solidity ^0.6.7; pragma experimental ABIEncoderV2; contract PlatypusControllerV4 { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; address public constant burn = 0x000000000000000000000000000000000000dEaD; address public onesplit = 0xC586BeF4a0992C495Cf22e1aeEE4E446CECDee0E; address public governance; address public strategist; address public devfund; address public treasury; address public timelock; // Convenience fee 0.1% uint256 public convenienceFee = 100; uint256 public constant convenienceFeeMax = 100000; mapping(address => address) public globes; // takes lp address and returns associated globe mapping(address => address) public strategies; // takes lp and returns associated strategy mapping(address => mapping(address => address)) public converters; mapping(address => mapping(address => bool)) public approvedStrategies; mapping(address => bool) public approvedGlobeConverters; uint256 public split = 500; uint256 public constant max = 10000; constructor( address _governance, address _strategist, address _timelock, address _devfund, address _treasury ) public { governance = _governance; strategist = _strategist; timelock = _timelock; devfund = _devfund; treasury = _treasury; } function setDevFund(address _devfund) public { require(msg.sender == governance, "!governance"); devfund = _devfund; } function setTreasury(address _treasury) public { require(msg.sender == governance, "!governance"); treasury = _treasury; } function setStrategist(address _strategist) public { require(msg.sender == governance, "!governance"); strategist = _strategist; } function setSplit(uint256 _split) public { require(msg.sender == governance, "!governance"); require(_split <= max, "numerator cannot be greater than denominator"); split = _split; } function setOneSplit(address _onesplit) public { require(msg.sender == governance, "!governance"); onesplit = _onesplit; } function setGovernance(address _governance) public { require(msg.sender == governance, "!governance"); governance = _governance; } function setTimelock(address _timelock) public { require(msg.sender == timelock, "!timelock"); timelock = _timelock; } function setGlobe(address _token, address _globe) public { require( msg.sender == strategist || msg.sender == governance, "!strategist" ); require(globes[_token] == address(0), "globe"); globes[_token] = _globe; } function approveGlobeConverter(address _converter) public { require(msg.sender == governance, "!governance"); approvedGlobeConverters[_converter] = true; } function revokeGlobeConverter(address _converter) public { require(msg.sender == governance, "!governance"); approvedGlobeConverters[_converter] = false; } function approveStrategy(address _token, address _strategy) public { require(msg.sender == timelock, "!timelock"); approvedStrategies[_token][_strategy] = true; } function revokeStrategy(address _token, address _strategy) public { require(msg.sender == governance, "!governance"); require(strategies[_token] != _strategy, "cannot revoke active strategy"); approvedStrategies[_token][_strategy] = false; } function setConvenienceFee(uint256 _convenienceFee) external { require(msg.sender == timelock, "!timelock"); convenienceFee = _convenienceFee; } function setStrategy(address _token, address _strategy) public { require( msg.sender == strategist || msg.sender == governance, "!strategist" ); require(approvedStrategies[_token][_strategy] == true, "!approved"); address _current = strategies[_token]; if (_current != address(0)) { IStrategy(_current).withdrawAll(); } strategies[_token] = _strategy; } function earn(address _token, uint256 _amount) public { address _strategy = strategies[_token]; address _want = IStrategy(_strategy).want(); if (_want != _token) { address converter = converters[_token][_want]; IERC20(_token).safeTransfer(converter, _amount); _amount = Converter(converter).convert(_strategy); IERC20(_want).safeTransfer(_strategy, _amount); } else { IERC20(_token).safeTransfer(_strategy, _amount); } IStrategy(_strategy).deposit(); } function balanceOf(address _token) external view returns (uint256) { return IStrategy(strategies[_token]).balanceOf(); } function withdrawAll(address _token) public { require( msg.sender == strategist || msg.sender == governance, "!strategist" ); IStrategy(strategies[_token]).withdrawAll(); } function inCaseTokensGetStuck(address _token, uint256 _amount) public { require( msg.sender == strategist || msg.sender == governance, "!governance" ); IERC20(_token).safeTransfer(msg.sender, _amount); } function inCaseStrategyTokenGetStuck(address _strategy, address _token) public { require( msg.sender == strategist || msg.sender == governance, "!governance" ); IStrategy(_strategy).withdraw(_token); } function getExpectedReturn( address _strategy, address _token, uint256 parts ) public view returns (uint256 expected) { uint256 _balance = IERC20(_token).balanceOf(_strategy); address _want = IStrategy(_strategy).want(); (expected, ) = OneSplitAudit(onesplit).getExpectedReturn( _token, _want, _balance, parts, 0 ); } // Only allows to withdraw non-core strategy tokens ~ this is over and above normal yield function yearn( address _strategy, address _token, uint256 parts ) public { require( msg.sender == strategist || msg.sender == governance, "!governance" ); // This contract should never have value in it, but just incase since this is a public call uint256 _before = IERC20(_token).balanceOf(address(this)); IStrategy(_strategy).withdraw(_token); uint256 _after = IERC20(_token).balanceOf(address(this)); if (_after > _before) { uint256 _amount = _after.sub(_before); address _want = IStrategy(_strategy).want(); uint256[] memory _distribution; uint256 _expected; _before = IERC20(_want).balanceOf(address(this)); IERC20(_token).safeApprove(onesplit, 0); IERC20(_token).safeApprove(onesplit, _amount); (_expected, _distribution) = OneSplitAudit(onesplit) .getExpectedReturn(_token, _want, _amount, parts, 0); OneSplitAudit(onesplit).swap( _token, _want, _amount, _expected, _distribution, 0 ); _after = IERC20(_want).balanceOf(address(this)); if (_after > _before) { _amount = _after.sub(_before); uint256 _treasury = _amount.mul(split).div(max); earn(_want, _amount.sub(_treasury)); IERC20(_want).safeTransfer(treasury, _treasury); } } } function withdraw(address _token, uint256 _amount) public { require(msg.sender == globes[_token], "!globe"); IStrategy(strategies[_token]).withdraw(_amount); } // Function to swap between globes function swapExactGlobeForGlobe( address _fromGlobe, // From which Globe address _toGlobe, // To which Globe uint256 _fromGlobeAmount, // How much globe tokens to swap uint256 _toGlobeMinAmount, // How much globe tokens you'd like at a minimum address payable[] calldata _targets, bytes[] calldata _data ) external returns (uint256) { require(_targets.length == _data.length, "!length"); // Only return last response for (uint256 i = 0; i < _targets.length; i++) { require(_targets[i] != address(0), "!converter"); require(approvedGlobeConverters[_targets[i]], "!converter"); } address _fromGlobeToken = IGlobe(_fromGlobe).token(); address _toGlobeToken = IGlobe(_toGlobe).token(); // Get pTokens from msg.sender IERC20(_fromGlobe).safeTransferFrom( msg.sender, address(this), _fromGlobeAmount ); // Calculate how much underlying // is the amount of pTokens worth uint256 _fromGlobeUnderlyingAmount = _fromGlobeAmount .mul(IGlobe(_fromGlobe).getRatio()) .div(10**uint256(IGlobe(_fromGlobe).decimals())); // Call 'withdrawForSwap' on Globe's current strategy if Globe // doesn't have enough initial capital. // This has moves the funds from the strategy to the Globe's // 'earnable' amount. Enabling 'free' withdrawals uint256 _fromGlobeAvailUnderlying = IERC20(_fromGlobeToken).balanceOf( _fromGlobe ); if (_fromGlobeAvailUnderlying < _fromGlobeUnderlyingAmount) { IStrategy(strategies[_fromGlobeToken]).withdrawForSwap( _fromGlobeUnderlyingAmount.sub(_fromGlobeAvailUnderlying) ); } // Withdraw from Globe // Note: this is free since its still within the "earnable" amount // as we transferred the access IERC20(_fromGlobe).safeApprove(_fromGlobe, 0); IERC20(_fromGlobe).safeApprove(_fromGlobe, _fromGlobeAmount); IGlobe(_fromGlobe).withdraw(_fromGlobeAmount); // Calculate fee uint256 _fromUnderlyingBalance = IERC20(_fromGlobeToken).balanceOf( address(this) ); uint256 _convenienceFee = _fromUnderlyingBalance.mul(convenienceFee).div( convenienceFeeMax ); if (_convenienceFee > 1) { IERC20(_fromGlobeToken).safeTransfer(devfund, _convenienceFee.div(2)); IERC20(_fromGlobeToken).safeTransfer(treasury, _convenienceFee.div(2)); } // Executes sequence of logic for (uint256 i = 0; i < _targets.length; i++) { _execute(_targets[i], _data[i]); } // Deposit into new Globe uint256 _toBal = IERC20(_toGlobeToken).balanceOf(address(this)); IERC20(_toGlobeToken).safeApprove(_toGlobe, 0); IERC20(_toGlobeToken).safeApprove(_toGlobe, _toBal); IGlobe(_toGlobe).deposit(_toBal); // Send Globe Tokens to user uint256 _toGlobeBal = IGlobe(_toGlobe).balanceOf(address(this)); if (_toGlobeBal < _toGlobeMinAmount) { revert("!min-globe-amount"); } IGlobe(_toGlobe).transfer(msg.sender, _toGlobeBal); return _toGlobeBal; } function _execute(address _target, bytes memory _data) internal returns (bytes memory response) { require(_target != address(0), "!target"); // call contract in current context assembly { let succeeded := delegatecall( sub(gas(), 5000), _target, add(_data, 0x20), mload(_data), 0, 0 ) let size := returndatasize() response := mload(0x40) mstore( 0x40, add(response, and(add(add(size, 0x20), 0x1f), not(0x1f))) ) mstore(response, size) returndatacopy(add(response, 0x20), 0, size) switch iszero(succeeded) case 1 { // throw if delegatecall failed revert(add(response, 0x20), size) } } } }
[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_timelock","type":"address"},{"internalType":"address","name":"_devfund","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_converter","type":"address"}],"name":"approveGlobeConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_strategy","type":"address"}],"name":"approveStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedGlobeConverters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"approvedStrategies","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convenienceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convenienceFeeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"converters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devfund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"earn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"parts","type":"uint256"}],"name":"getExpectedReturn","outputs":[{"internalType":"uint256","name":"expected","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"globes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"inCaseStrategyTokenGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onesplit","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_converter","type":"address"}],"name":"revokeGlobeConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_strategy","type":"address"}],"name":"revokeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_convenienceFee","type":"uint256"}],"name":"setConvenienceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devfund","type":"address"}],"name":"setDevFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_globe","type":"address"}],"name":"setGlobe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_onesplit","type":"address"}],"name":"setOneSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_split","type":"uint256"}],"name":"setSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_strategy","type":"address"}],"name":"setStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"split","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fromGlobe","type":"address"},{"internalType":"address","name":"_toGlobe","type":"address"},{"internalType":"uint256","name":"_fromGlobeAmount","type":"uint256"},{"internalType":"uint256","name":"_toGlobeMinAmount","type":"uint256"},{"internalType":"address payable[]","name":"_targets","type":"address[]"},{"internalType":"bytes[]","name":"_data","type":"bytes[]"}],"name":"swapExactGlobeForGlobe","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"parts","type":"uint256"}],"name":"yearn","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b03191673c586bef4a0992c495cf22e1aeee4e446cecdee0e17905560646006556101f4600c553480156200004257600080fd5b5060405162002da138038062002da18339810160408190526200006591620000c8565b600180546001600160a01b03199081166001600160a01b0397881617909155600280548216958716959095179094556005805485169386169390931790925560038054841691851691909117905560048054909216921691909117905562000160565b600080600080600060a08688031215620000e0578081fd5b8551620000ed8162000147565b6020870151909550620001008162000147565b6040870151909450620001138162000147565b6060870151909350620001268162000147565b6080870151909250620001398162000147565b809150509295509295909350565b6001600160a01b03811681146200015d57600080fd5b50565b612c3180620001706000396000f3fe608060405234801561001057600080fd5b506004361061023c5760003560e01c80638d8f1e671161013b578063c7b9d530116100b8578063f712adbb1161007c578063f712adbb146104a1578063f7654176146104a9578063f89c44a7146104b1578063fa09e630146104c4578063fbe8b5ce146104d75761023c565b8063c7b9d5301461044d578063d33219b414610460578063e4f2494d14610468578063f0f442601461047b578063f3fef3a31461048e5761023c565b8063ae4db919116100ff578063ae4db919146103ee578063b02bf4b914610401578063bdacb30314610414578063c494448e14610427578063c6d758cb1461043a5761023c565b80638d8f1e67146103a55780638da1df4d146103ad5780639bcdff1f146103c0578063a1578b6a146103c8578063ab033ea9146103db5761023c565b80635aa6e675116101c95780636dcd64e51161018d5780636dcd64e5146103395780636f8bec301461034c57806370a082311461036c57806372cb5d971461037f57806383c9a30b146103925761023c565b80635aa6e675146102ee57806361d027b3146102f6578063674e694f146102fe5780636ac5db19146103115780636d1b4bde146103265761023c565b80631fe4a686116102105780631fe4a6861461028f57806330ed9dff146102ad57806339ebf823146102c057806344df8e70146102d3578063590bbb60146102db5761023c565b8062b267531461024157806304209f4814610256578063197baa6d146102695780631dfd45af1461027c575b600080fd5b61025461024f366004612420565b6104df565b005b610254610264366004612490565b610533565b610254610277366004612458565b610a2b565b61025461028a3660046125c0565b610acc565b610297610afb565b6040516102a491906126d1565b60405180910390f35b6102546102bb366004612458565b610b0a565b6102976102ce366004612420565b610baf565b610297610bca565b6102546102e9366004612458565b610bd0565b610297610c68565b610297610c77565b61025461030c3660046125c0565b610c86565b610319610cd7565b6040516102a49190612b20565b610297610334366004612420565b610cdd565b610319610347366004612490565b610cf8565b61035f61035a366004612420565b610e83565b6040516102a491906127e7565b61031961037a366004612420565b610e98565b61025461038d366004612458565b610f28565b6103196103a03660046124d0565b611076565b6102976118f8565b6102546103bb366004612420565b611907565b610319611953565b61035f6103d6366004612458565b61195a565b6102546103e9366004612420565b61197a565b6102546103fc366004612420565b6119c6565b61025461040f366004612575565b611a12565b610254610422366004612420565b611c05565b610254610435366004612458565b611c51565b610254610448366004612575565b611caf565b61025461045b366004612420565b611d0c565b610297611d58565b610297610476366004612458565b611d67565b610254610489366004612420565b611d8d565b61025461049c366004612575565b611dd9565b610297611e51565b610319611e60565b6102546104bf366004612420565b611e66565b6102546104d2366004612420565b611eb4565b610319611f7c565b6001546001600160a01b031633146105125760405162461bcd60e51b815260040161050990612881565b60405180910390fd5b6001600160a01b03166000908152600b60205260409020805460ff19169055565b6002546001600160a01b031633148061055657506001546001600160a01b031633145b6105725760405162461bcd60e51b815260040161050990612881565b6040516370a0823160e01b81526000906001600160a01b038416906370a08231906105a19030906004016126d1565b60206040518083038186803b1580156105b957600080fd5b505afa1580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f191906125d8565b6040516351cff8d960e01b81529091506001600160a01b038516906351cff8d9906106209086906004016126d1565b600060405180830381600087803b15801561063a57600080fd5b505af115801561064e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03861691506370a08231906106819030906004016126d1565b60206040518083038186803b15801561069957600080fd5b505afa1580156106ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d191906125d8565b905081811115610a245760006106ed828463ffffffff611f8216565b90506000866001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b15801561072a57600080fd5b505afa15801561073e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610762919061243c565b905060606000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161079491906126d1565b60206040518083038186803b1580156107ac57600080fd5b505afa1580156107c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e491906125d8565b60008054919750610809916001600160a01b038b81169291169063ffffffff611fcb16565b600054610829906001600160a01b038a811691168663ffffffff611fcb16565b6000805460405163085e2c5b60e01b81526001600160a01b039091169163085e2c5b91610861918c9188918a918e91906004016127b6565b60006040518083038186803b15801561087957600080fd5b505afa15801561088d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108b591908101906125f0565b60008054604051637153a8af60e11b81529295509293506001600160a01b039092169163e2a7515e916108f4918c9188918a9188918a9160040161273c565b600060405180830381600087803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b50506040516370a0823160e01b81526001600160a01b03861692506370a0823191506109529030906004016126d1565b60206040518083038186803b15801561096a57600080fd5b505afa15801561097e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a291906125d8565b945085851115610a1f576109bc858763ffffffff611f8216565b935060006109e76127106109db600c54886120ca90919063ffffffff16565b9063ffffffff61210416565b90506109fd8461040f878463ffffffff611f8216565b600454610a1d906001600160a01b0386811691168363ffffffff61214616565b505b505050505b5050505050565b6002546001600160a01b0316331480610a4e57506001546001600160a01b031633145b610a6a5760405162461bcd60e51b815260040161050990612881565b6040516351cff8d960e01b81526001600160a01b038316906351cff8d990610a969084906004016126d1565b600060405180830381600087803b158015610ab057600080fd5b505af1158015610ac4573d6000803e3d6000fd5b505050505050565b6005546001600160a01b03163314610af65760405162461bcd60e51b815260040161050990612aa7565b600655565b6002546001600160a01b031681565b6002546001600160a01b0316331480610b2d57506001546001600160a01b031633145b610b495760405162461bcd60e51b81526004016105099061285c565b6001600160a01b038281166000908152600760205260409020541615610b815760405162461bcd60e51b81526004016105099061295a565b6001600160a01b03918216600090815260076020526040902080546001600160a01b03191691909216179055565b6008602052600090815260409020546001600160a01b031681565b61dead81565b6001546001600160a01b03163314610bfa5760405162461bcd60e51b815260040161050990612881565b6001600160a01b0382811660009081526008602052604090205481169082161415610c375760405162461bcd60e51b815260040161050990612825565b6001600160a01b039182166000908152600a602090815260408083209390941682529190915220805460ff19169055565b6001546001600160a01b031681565b6004546001600160a01b031681565b6001546001600160a01b03163314610cb05760405162461bcd60e51b815260040161050990612881565b612710811115610cd25760405162461bcd60e51b8152600401610509906128c7565b600c55565b61271081565b6007602052600090815260409020546001600160a01b031681565b600080836001600160a01b03166370a08231866040518263ffffffff1660e01b8152600401610d2791906126d1565b60206040518083038186803b158015610d3f57600080fd5b505afa158015610d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7791906125d8565b90506000856001600160a01b0316631f1fcd516040518163ffffffff1660e01b815260040160206040518083038186803b158015610db457600080fd5b505afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec919061243c565b6000805460405163085e2c5b60e01b81529293506001600160a01b03169163085e2c5b91610e24918991869188918b916004016127b6565b60006040518083038186803b158015610e3c57600080fd5b505afa158015610e50573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e7891908101906125f0565b509695505050505050565b600b6020526000908152604090205460ff1681565b6001600160a01b03808216600090815260086020908152604080832054815163722713f760e01b815291519394169263722713f792600480840193919291829003018186803b158015610eea57600080fd5b505afa158015610efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2291906125d8565b92915050565b6002546001600160a01b0316331480610f4b57506001546001600160a01b031633145b610f675760405162461bcd60e51b81526004016105099061285c565b6001600160a01b038083166000908152600a602090815260408083209385168352929052205460ff161515600114610fb15760405162461bcd60e51b815260040161050990612937565b6001600160a01b0380831660009081526008602052604090205416801561104757806001600160a01b031663853828b66040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561100d57600080fd5b505af1158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906125d8565b505b506001600160a01b03918216600090815260086020526040902080546001600160a01b03191691909216179055565b60008382146110975760405162461bcd60e51b815260040161050990612a86565b60005b848110156111525760008686838181106110b057fe5b90506020020160208101906110c59190612420565b6001600160a01b031614156110ec5760405162461bcd60e51b815260040161050990612913565b600b60008787848181106110fc57fe5b90506020020160208101906111119190612420565b6001600160a01b0316815260208101919091526040016000205460ff1661114a5760405162461bcd60e51b815260040161050990612913565b60010161109a565b506000896001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561118e57600080fd5b505afa1580156111a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c6919061243c565b90506000896001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561120357600080fd5b505afa158015611217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123b919061243c565b90506112586001600160a01b038c1633308c63ffffffff61216516565b60006113558c6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561129657600080fd5b505afa1580156112aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190612694565b60ff16600a0a6109db8e6001600160a01b031663ec1ebd7a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561131057600080fd5b505afa158015611324573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134891906125d8565b8d9063ffffffff6120ca16565b90506000836001600160a01b03166370a082318e6040518263ffffffff1660e01b815260040161138591906126d1565b60206040518083038186803b15801561139d57600080fd5b505afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d591906125d8565b90508181101561147f576001600160a01b038085166000908152600860205260409020541663c6223e2661140f848463ffffffff611f8216565b6040518263ffffffff1660e01b815260040161142b9190612b20565b602060405180830381600087803b15801561144557600080fd5b505af1158015611459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147d91906125d8565b505b61149a6001600160a01b038e168e600063ffffffff611fcb16565b6114b46001600160a01b038e168e8d63ffffffff611fcb16565b604051632e1a7d4d60e01b81526001600160a01b038e1690632e1a7d4d906114e0908e90600401612b20565b600060405180830381600087803b1580156114fa57600080fd5b505af115801561150e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03871691506370a08231906115419030906004016126d1565b60206040518083038186803b15801561155957600080fd5b505afa15801561156d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159191906125d8565b905060006115b1620186a06109db600654856120ca90919063ffffffff16565b90506001811115611615576003546115f4906001600160a01b03166115dd83600263ffffffff61210416565b6001600160a01b038916919063ffffffff61214616565b600454611615906001600160a01b03166115dd83600263ffffffff61210416565b60005b8a8110156116a55761169c8c8c8381811061162f57fe5b90506020020160208101906116449190612420565b8b8b8481811061165057fe5b90506020028101906116629190612b29565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061218c92505050565b50600101611618565b506040516370a0823160e01b81526000906001600160a01b038716906370a08231906116d59030906004016126d1565b60206040518083038186803b1580156116ed57600080fd5b505afa158015611701573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172591906125d8565b90506117468f6000886001600160a01b0316611fcb9092919063ffffffff16565b6117648f82886001600160a01b0316611fcb9092919063ffffffff16565b8e6001600160a01b031663b6b55f25826040518263ffffffff1660e01b81526004016117909190612b20565b600060405180830381600087803b1580156117aa57600080fd5b505af11580156117be573d6000803e3d6000fd5b5050505060008f6001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016117f091906126d1565b60206040518083038186803b15801561180857600080fd5b505afa15801561181c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184091906125d8565b90508d8110156118625760405162461bcd60e51b8152600401610509906129da565b8f6001600160a01b031663a9059cbb33836040518363ffffffff1660e01b81526004016118909291906126e5565b602060405180830381600087803b1580156118aa57600080fd5b505af11580156118be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e291906125a0565b5097505050505050505098975050505050505050565b6003546001600160a01b031681565b6001546001600160a01b031633146119315760405162461bcd60e51b815260040161050990612881565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b620186a081565b600a60209081526000928352604080842090915290825290205460ff1681565b6001546001600160a01b031633146119a45760405162461bcd60e51b815260040161050990612881565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146119f05760405162461bcd60e51b815260040161050990612881565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083166000908152600860209081526040808320548151631f1fcd5160e01b815291519416938492631f1fcd519260048082019391829003018186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9b919061243c565b9050836001600160a01b0316816001600160a01b031614611b92576001600160a01b038085166000818152600960209081526040808320868616845290915290205490911690611af290828663ffffffff61214616565b60405163def2489b60e01b81526001600160a01b0382169063def2489b90611b1e9086906004016126d1565b602060405180830381600087803b158015611b3857600080fd5b505af1158015611b4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7091906125d8565b9350611b8c6001600160a01b038316848663ffffffff61214616565b50611bac565b611bac6001600160a01b038516838563ffffffff61214616565b816001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611be757600080fd5b505af1158015611bfb573d6000803e3d6000fd5b5050505050505050565b6005546001600160a01b03163314611c2f5760405162461bcd60e51b815260040161050990612aa7565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611c7b5760405162461bcd60e51b815260040161050990612aa7565b6001600160a01b039182166000908152600a602090815260408083209390941682529190915220805460ff19166001179055565b6002546001600160a01b0316331480611cd257506001546001600160a01b031633145b611cee5760405162461bcd60e51b815260040161050990612881565b611d086001600160a01b038316338363ffffffff61214616565b5050565b6001546001600160a01b03163314611d365760405162461bcd60e51b815260040161050990612881565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b60096020908152600092835260408084209091529082529020546001600160a01b031681565b6001546001600160a01b03163314611db75760405162461bcd60e51b815260040161050990612881565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03828116600090815260076020526040902054163314611e125760405162461bcd60e51b8152600401610509906129ba565b6001600160a01b0380831660009081526008602052604090819020549051632e1a7d4d60e01b8152911690632e1a7d4d90610a96908490600401612b20565b6000546001600160a01b031681565b600c5481565b6001546001600160a01b03163314611e905760405162461bcd60e51b815260040161050990612881565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6002546001600160a01b0316331480611ed757506001546001600160a01b031633145b611ef35760405162461bcd60e51b81526004016105099061285c565b6001600160a01b03808216600090815260086020908152604080832054815163429c145b60e11b8152915194169363853828b693600480840194938390030190829087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0891906125d8565b60065481565b6000611fc483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612204565b9392505050565b8015806120535750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061200190309086906004016126fe565b60206040518083038186803b15801561201957600080fd5b505afa15801561202d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205191906125d8565b155b61206f5760405162461bcd60e51b815260040161050990612aca565b6120c58363095ea7b360e01b848460405160240161208e9291906126e5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612230565b505050565b6000826120d957506000610f22565b828202828482816120e657fe5b0414611fc45760405162461bcd60e51b815260040161050990612979565b6000611fc483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122bf565b6120c58363a9059cbb60e01b848460405160240161208e9291906126e5565b612186846323b872dd60e01b85858560405160240161208e93929190612718565b50505050565b60606001600160a01b0383166121b45760405162461bcd60e51b8152600401610509906128a6565b600080835160208501866113885a03f43d6040519250601f19601f6020830101168301604052808352806000602085013e8115600181146121f4576121fb565b8160208501fd5b50505092915050565b600081848411156122285760405162461bcd60e51b815260040161050991906127f2565b505050900390565b6060612285826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122f69092919063ffffffff16565b8051909150156120c557808060200190518101906122a391906125a0565b6120c55760405162461bcd60e51b815260040161050990612a3c565b600081836122e05760405162461bcd60e51b815260040161050991906127f2565b5060008385816122ec57fe5b0495945050505050565b6060612305848460008561230d565b949350505050565b6060612318856123d1565b6123345760405162461bcd60e51b815260040161050990612a05565b60006060866001600160a01b0316858760405161235191906126b5565b60006040518083038185875af1925050503d806000811461238e576040519150601f19603f3d011682016040523d82523d6000602084013e612393565b606091505b509150915081156123a75791506123059050565b8051156123b75780518082602001fd5b8360405162461bcd60e51b815260040161050991906127f2565b3b151590565b60008083601f8401126123e8578182fd5b50813567ffffffffffffffff8111156123ff578182fd5b602083019150836020808302850101111561241957600080fd5b9250929050565b600060208284031215612431578081fd5b8135611fc481612be3565b60006020828403121561244d578081fd5b8151611fc481612be3565b6000806040838503121561246a578081fd5b823561247581612be3565b9150602083013561248581612be3565b809150509250929050565b6000806000606084860312156124a4578081fd5b83356124af81612be3565b925060208401356124bf81612be3565b929592945050506040919091013590565b60008060008060008060008060c0898b0312156124eb578384fd5b88356124f681612be3565b9750602089013561250681612be3565b96506040890135955060608901359450608089013567ffffffffffffffff80821115612530578586fd5b61253c8c838d016123d7565b909650945060a08b0135915080821115612554578384fd5b506125618b828c016123d7565b999c989b5096995094979396929594505050565b60008060408385031215612587578182fd5b823561259281612be3565b946020939093013593505050565b6000602082840312156125b1578081fd5b81518015158114611fc4578182fd5b6000602082840312156125d1578081fd5b5035919050565b6000602082840312156125e9578081fd5b5051919050565b60008060408385031215612602578182fd5b8251915060208084015167ffffffffffffffff811115612620578283fd5b80850186601f820112612631578384fd5b8051915061264661264183612b97565b612b70565b82815283810190828501858502840186018a1015612662578687fd5b8693505b84841015612684578051835260019390930192918501918501612666565b5080955050505050509250929050565b6000602082840312156126a5578081fd5b815160ff81168114611fc4578182fd5b600082516126c7818460208701612bb7565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0387811682528616602080830191909152604082018690526060820185905260c06080830181905284519083018190526000918581019160e085019190845b8181101561279e57845184529382019392820192600101612782565b50505060a09390930193909352509695505050505050565b6001600160a01b03958616815293909416602084015260408301919091526060820152608081019190915260a00190565b901515815260200190565b6000602082528251806020840152612811816040850160208701612bb7565b601f01601f19169190910160400192915050565b6020808252601d908201527f63616e6e6f74207265766f6b6520616374697665207374726174656779000000604082015260600190565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b6020808252600b908201526a21676f7665726e616e636560a81b604082015260600190565b602080825260079082015266085d185c99d95d60ca1b604082015260600190565b6020808252602c908201527f6e756d657261746f722063616e6e6f742062652067726561746572207468616e60408201526b103232b737b6b4b730ba37b960a11b606082015260800190565b6020808252600a908201526910b1b7b73b32b93a32b960b11b604082015260600190565b60208082526009908201526808585c1c1c9bdd995960ba1b604082015260600190565b602080825260059082015264676c6f626560d81b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526006908201526521676c6f626560d01b604082015260600190565b602080825260119082015270085b5a5b8b59db1bd8994b585b5bdd5b9d607a1b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b602080825260079082015266042d8cadccee8d60cb1b604082015260600190565b6020808252600990820152682174696d656c6f636b60b81b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b6000808335601e19843603018112612b3f578283fd5b8084018035925067ffffffffffffffff831115612b5a578384fd5b6020019250503681900382131561241957600080fd5b60405181810167ffffffffffffffff81118282101715612b8f57600080fd5b604052919050565b600067ffffffffffffffff821115612bad578081fd5b5060209081020190565b60005b83811015612bd2578181015183820152602001612bba565b838111156121865750506000910152565b6001600160a01b0381168114612bf857600080fd5b5056fea26469706673582212205f77ac200c35c7eb584ab64c0381be094779968ca657d269feb2d62054eb1fbf64736f6c63430006070033000000000000000000000000294ab3200ef36200db84c4128b7f1b4eec71e38a0000000000000000000000003d88b8022142ea2693ba43ba349f89256392d59b0000000000000000000000003d88b8022142ea2693ba43ba349f89256392d59b0000000000000000000000000aa5cb6f365259524f7ece8e09cce9a7b394077a000000000000000000000000028933a66dd0ccc239a3d5c2243b2d96672f11f5
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000294ab3200ef36200db84c4128b7f1b4eec71e38a0000000000000000000000003d88b8022142ea2693ba43ba349f89256392d59b0000000000000000000000003d88b8022142ea2693ba43ba349f89256392d59b0000000000000000000000000aa5cb6f365259524f7ece8e09cce9a7b394077a000000000000000000000000028933a66dd0ccc239a3d5c2243b2d96672f11f5
-----Decoded View---------------
Arg [0] : _governance (address): 0x294ab3200ef36200db84c4128b7f1b4eec71e38a
Arg [1] : _strategist (address): 0x3d88b8022142ea2693ba43ba349f89256392d59b
Arg [2] : _timelock (address): 0x3d88b8022142ea2693ba43ba349f89256392d59b
Arg [3] : _devfund (address): 0x0aa5cb6f365259524f7ece8e09cce9a7b394077a
Arg [4] : _treasury (address): 0x028933a66dd0ccc239a3d5c2243b2d96672f11f5
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000294ab3200ef36200db84c4128b7f1b4eec71e38a
Arg [1] : 0000000000000000000000003d88b8022142ea2693ba43ba349f89256392d59b
Arg [2] : 0000000000000000000000003d88b8022142ea2693ba43ba349f89256392d59b
Arg [3] : 0000000000000000000000000aa5cb6f365259524f7ece8e09cce9a7b394077a
Arg [4] : 000000000000000000000000028933a66dd0ccc239a3d5c2243b2d96672f11f5
Deployed ByteCode Sourcemap
33724:12719:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33724:12719:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;36754:178:0;;;;;;;;;:::i;:::-;;40131:1628;;;;;;;;;:::i;39292:273::-;;;;;;;;;:::i;37414:167::-;;;;;;;;;:::i;34050:25::-;;;:::i;:::-;;;;;;;;;;;;;;;;36280:280;;;;;;;;;:::i;34400:45::-;;;;;;;;;:::i;33861:73::-;;;:::i;37133:273::-;;;;;;;;;:::i;34018:25::-;;;:::i;34111:23::-;;;:::i;35595:214::-;;;;;;;;;:::i;34742:35::-;;;:::i;:::-;;;;;;;;34303:41;;;;;;;;;:::i;39573:455::-;;;;;;;;;:::i;34645:55::-;;;;;;;;;:::i;:::-;;;;;;;;38643:134;;;;;;;;;:::i;37589:462::-;;;;;;;;;:::i;41997:3451::-;;;;;;;;;:::i;34082:22::-;;;:::i;35817:145::-;;;;;;;;;:::i;34244:50::-;;;:::i;34568:70::-;;;;;;;;;:::i;35970:153::-;;;;;;;;;:::i;35132:141::-;;;;;;;;;:::i;38059:576::-;;;;;;;;;:::i;36131:141::-;;;;;;;;;:::i;36940:185::-;;;;;;;;;:::i;39023:261::-;;;;;;;;;:::i;35434:153::-;;;;;;;;;:::i;34141:23::-;;;:::i;34496:65::-;;;;;;;;;:::i;35281:145::-;;;;;;;;;:::i;41767:182::-;;;;;;;;;:::i;33941:68::-;;;:::i;34709:26::-;;;:::i;36568:178::-;;;;;;;;;:::i;38785:230::-;;;;;;;;;:::i;34202:35::-;;;:::i;36754:178::-;36844:10;;-1:-1:-1;;;;;36844:10:0;36830;:24;36822:48;;;;-1:-1:-1;;;36822:48:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36881:35:0;36919:5;36881:35;;;:23;:35;;;;;:43;;-1:-1:-1;;36881:43:0;;;36754:178::o;40131:1628::-;40284:10;;-1:-1:-1;;;;;40284:10:0;40270;:24;;:52;;-1:-1:-1;40312:10:0;;-1:-1:-1;;;;;40312:10:0;40298;:24;40270:52;40248:113;;;;-1:-1:-1;;;40248:113:0;;;;;;;;;40491:39;;-1:-1:-1;;;40491:39:0;;40473:15;;-1:-1:-1;;;;;40491:24:0;;;;;:39;;40524:4;;40491:39;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40491:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40491:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40491:39:0;;;;;;;;;40541:37;;-1:-1:-1;;;40541:37:0;;40473:57;;-1:-1:-1;;;;;;40541:29:0;;;;;:37;;40571:6;;40541:37;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40541:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;40606:39:0;;-1:-1:-1;;;40606:39:0;;40589:14;;-1:-1:-1;;;;;;40606:24:0;;;-1:-1:-1;40606:24:0;;:39;;40639:4;;40606:39;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40606:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40606:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40606:39:0;;;;;;;;;40589:56;;40669:7;40660:6;:16;40656:1096;;;40693:15;40711:19;:6;40722:7;40711:19;:10;:19;:::i;:::-;40693:37;;40745:13;40771:9;-1:-1:-1;;;;;40761:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40761:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40761:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40761:27:0;;;;;;;;;40745:43;;40803:30;40848:17;40897:5;-1:-1:-1;;;;;40890:23:0;;40922:4;40890:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40890:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40890:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40890:38:0;;;;;;;;;40970:8;;;40880:48;;-1:-1:-1;40943:39:0;;-1:-1:-1;;;;;40943:26:0;;;;40970:8;;;40943:39;:26;:39;:::i;:::-;41024:8;;40997:45;;-1:-1:-1;;;;;40997:26:0;;;;41024:8;41034:7;40997:45;:26;:45;:::i;:::-;41100:8;;;41086:93;;-1:-1:-1;;;41086:93:0;;-1:-1:-1;;;;;41100:8:0;;;;41086:59;;:93;;41146:6;;41154:5;;41161:7;;41170:5;;41100:8;41086:93;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41086:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41086:93:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;41086:93:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;41086:93:0;;;;;;;;;41208:8;;;41194:198;;-1:-1:-1;;;41194:198:0;;41057:122;;-1:-1:-1;41057:122:0;;-1:-1:-1;;;;;;41208:8:0;;;;41194:28;;:198;;41241:6;;41266:5;;41290:7;;41057:122;;;;41194:198;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41194:198:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;41416:38:0;;-1:-1:-1;;;41416:38:0;;-1:-1:-1;;;;;41416:23:0;;;-1:-1:-1;41416:23:0;;-1:-1:-1;41416:38:0;;41448:4;;41416:38;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41416:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41416:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41416:38:0;;;;;;;;;41407:47;;41482:7;41473:6;:16;41469:272;;;41520:19;:6;41531:7;41520:19;:10;:19;:::i;:::-;41510:29;;41558:17;41578:27;34772:5;41578:18;41590:5;;41578:7;:11;;:18;;;;:::i;:::-;:22;:27;:22;:27;:::i;:::-;41558:47;-1:-1:-1;41624:35:0;41629:5;41636:22;:7;41558:47;41636:22;:11;:22;:::i;41624:35::-;41705:8;;41678:47;;-1:-1:-1;;;;;41678:26:0;;;;41705:8;41715:9;41678:47;:26;:47;:::i;:::-;41469:272;;40656:1096;;;;;40131:1628;;;;;:::o;39292:273::-;39432:10;;-1:-1:-1;;;;;39432:10:0;39418;:24;;:52;;-1:-1:-1;39460:10:0;;-1:-1:-1;;;;;39460:10:0;39446;:24;39418:52;39396:113;;;;-1:-1:-1;;;39396:113:0;;;;;;;;;39520:37;;-1:-1:-1;;;39520:37:0;;-1:-1:-1;;;;;39520:29:0;;;;;:37;;39550:6;;39520:37;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39520:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39520:37:0;;;;39292:273;;:::o;37414:167::-;37508:8;;-1:-1:-1;;;;;37508:8:0;37494:10;:22;37486:44;;;;-1:-1:-1;;;37486:44:0;;;;;;;;;37541:14;:32;37414:167::o;34050:25::-;;;-1:-1:-1;;;;;34050:25:0;;:::o;36280:280::-;36384:10;;-1:-1:-1;;;;;36384:10:0;36370;:24;;:52;;-1:-1:-1;36412:10:0;;-1:-1:-1;;;;;36412:10:0;36398;:24;36370:52;36348:113;;;;-1:-1:-1;;;36348:113:0;;;;;;;;;-1:-1:-1;;;;;36480:14:0;;;36506:1;36480:14;;;:6;:14;;;;;;;:28;36472:46;;;;-1:-1:-1;;;36472:46:0;;;;;;;;;-1:-1:-1;;;;;36529:14:0;;;;;;;:6;:14;;;;;:23;;-1:-1:-1;;;;;;36529:23:0;;;;;;;;36280:280::o;34400:45::-;;;;;;;;;;;;-1:-1:-1;;;;;34400:45:0;;:::o;33861:73::-;33892:42;33861:73;:::o;37133:273::-;37232:10;;-1:-1:-1;;;;;37232:10:0;37218;:24;37210:48;;;;-1:-1:-1;;;37210:48:0;;;;;;;;;-1:-1:-1;;;;;37277:18:0;;;;;;;:10;:18;;;;;;;;:31;;;;;37269:73;;;;-1:-1:-1;;;37269:73:0;;;;;;;;;-1:-1:-1;;;;;37353:26:0;;;37393:5;37353:26;;;:18;:26;;;;;;;;:37;;;;;;;;;;;:45;;-1:-1:-1;;37353:45:0;;;37133:273::o;34018:25::-;;;-1:-1:-1;;;;;34018:25:0;;:::o;34111:23::-;;;-1:-1:-1;;;;;34111:23:0;;:::o;35595:214::-;35669:10;;-1:-1:-1;;;;;35669:10:0;35655;:24;35647:48;;;;-1:-1:-1;;;35647:48:0;;;;;;;;;34772:5;35714:6;:13;;35706:70;;;;-1:-1:-1;;;35706:70:0;;;;;;;;;35787:5;:14;35595:214::o;34742:35::-;34772:5;34742:35;:::o;34303:41::-;;;;;;;;;;;;-1:-1:-1;;;;;34303:41:0;;:::o;39573:455::-;39705:16;39734;39760:6;-1:-1:-1;;;;;39753:24:0;;39778:9;39753:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39753:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39753:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39753:35:0;;;;;;;;;39734:54;;39799:13;39825:9;-1:-1:-1;;;;;39815:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39815:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39815:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39815:27:0;;;;;;;;;39882:8;;;39868:152;;-1:-1:-1;;;39868:152:0;;39799:43;;-1:-1:-1;;;;;;39882:8:0;;39868:41;;:152;;39924:6;;39799:43;;39965:8;;39988:5;;39868:152;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39868:152:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39868:152:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;39868:152:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;39868:152:0;;;;;;;;;-1:-1:-1;39853:167:0;39573:455;-1:-1:-1;;;;;;39573:455:0:o;34645:55::-;;;;;;;;;;;;;;;:::o;38643:134::-;-1:-1:-1;;;;;38738:18:0;;;38701:7;38738:18;;;:10;:18;;;;;;;;;38728:41;;-1:-1:-1;;;38728:41:0;;;;38701:7;;38738:18;;38728:39;;:41;;;;;38738:18;;38728:41;;;;;;38738:18;38728:41;;;2:2:-1;;;;27:1;24;17:12;2:2;38728:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38728:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38728:41:0;;;;;;;;;38721:48;38643:134;-1:-1:-1;;38643:134:0:o;37589:462::-;37699:10;;-1:-1:-1;;;;;37699:10:0;37685;:24;;:52;;-1:-1:-1;37727:10:0;;-1:-1:-1;;;;;37727:10:0;37713;:24;37685:52;37663:113;;;;-1:-1:-1;;;37663:113:0;;;;;;;;;-1:-1:-1;;;;;37795:26:0;;;;;;;:18;:26;;;;;;;;:37;;;;;;;;;;;;:45;;:37;:45;37787:67;;;;-1:-1:-1;;;37787:67:0;;;;;;;;;-1:-1:-1;;;;;37886:18:0;;;37867:16;37886:18;;;:10;:18;;;;;;;37919:22;;37915:88;;37968:8;-1:-1:-1;;;;;37958:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37958:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37958:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37958:33:0;;;;;;;;;;37915:88;-1:-1:-1;;;;;;38013:18:0;;;;;;;:10;:18;;;;;:30;;-1:-1:-1;;;;;;38013:30:0;;;;;;;;37589:462::o;41997:3451::-;42380:7;42408:31;;;42400:51;;;;-1:-1:-1;;;42400:51:0;;;;;;;;;42507:9;42502:195;42522:19;;;42502:195;;;42594:1;42571:8;;42580:1;42571:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42571:25:0;;;42563:48;;;;-1:-1:-1;;;42563:48:0;;;;;;;;;42634:23;:36;42658:8;;42667:1;42658:11;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42634:36:0;;;;;;;;;;;;-1:-1:-1;42634:36:0;;;;42626:59;;;;-1:-1:-1;;;42626:59:0;;;;;;;;;42543:3;;42502:195;;;;42709:23;42742:10;-1:-1:-1;;;;;42735:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42735:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42735:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42735:26:0;;;;;;;;;42709:52;;42772:21;42803:8;-1:-1:-1;;;;;42796:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42796:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42796:24:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42796:24:0;;;;;;;;;42772:48;-1:-1:-1;42873:130:0;-1:-1:-1;;;;;42873:35:0;;42923:10;42956:4;42976:16;42873:130;:35;:130;:::i;:::-;43101:34;43138:127;43241:10;-1:-1:-1;;;;;43234:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43234:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43234:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43234:29:0;;;;;;;;;43226:38;;43222:2;:42;43138:65;43180:10;-1:-1:-1;;;;;43173:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43173:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43173:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43173:29:0;;;;;;;;;43138:16;;:65;:34;:65;:::i;:127::-;43101:164;;43528:33;43571:15;-1:-1:-1;;;;;43564:33:0;;43612:10;43564:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43564:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43564:69:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43564:69:0;;;;;;;;;43528:105;;43676:26;43648:25;:54;43644:232;;;-1:-1:-1;;;;;43729:27:0;;;;;;;:10;:27;;;;;;;43719:54;43792:57;:26;43823:25;43792:57;:30;:57;:::i;:::-;43719:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43719:145:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43719:145:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43719:145:0;;;;;;;;;;43644:232;44043:45;-1:-1:-1;;;;;44043:30:0;;44074:10;44086:1;44043:45;:30;:45;:::i;:::-;44099:60;-1:-1:-1;;;;;44099:30:0;;44130:10;44142:16;44099:60;:30;:60;:::i;:::-;44170:45;;-1:-1:-1;;;44170:45:0;;-1:-1:-1;;;;;44170:27:0;;;;;:45;;44198:16;;44170:45;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44170:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;44287:72:0;;-1:-1:-1;;;44287:72:0;;44254:30;;-1:-1:-1;;;;;;44287:33:0;;;-1:-1:-1;44287:33:0;;:72;;44343:4;;44287:72;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44287:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44287:72:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44287:72:0;;;;;;;;;44254:105;;44370:23;44396:89;34288:6;44396:42;44423:14;;44396:22;:26;;:42;;;;:::i;:89::-;44370:115;;44520:1;44502:15;:19;44498:206;;;44575:7;;44538:69;;-1:-1:-1;;;;;44575:7:0;44584:22;:15;44604:1;44584:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;44538:36:0;;;:69;;:36;:69;:::i;:::-;44659:8;;44622:70;;-1:-1:-1;;;;;44659:8:0;44669:22;:15;44689:1;44669:22;:19;:22;:::i;44622:70::-;44760:9;44755:104;44775:19;;;44755:104;;;44816:31;44825:8;;44834:1;44825:11;;;;;;;;;;;;;;;;;;;;;;44838:5;;44844:1;44838:8;;;;;;;;;;;;;;;;;;;;44816:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44816:8:0;;-1:-1:-1;;;44816:31:0:i;:::-;-1:-1:-1;44796:3:0;;44755:104;;;-1:-1:-1;44923:46:0;;-1:-1:-1;;;44923:46:0;;44906:14;;-1:-1:-1;;;;;44923:31:0;;;;;:46;;44963:4;;44923:46;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44923:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44923:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44923:46:0;;;;;;;;;44906:63;;44980:46;45014:8;45024:1;44987:13;-1:-1:-1;;;;;44980:33:0;;;:46;;;;;:::i;:::-;45037:51;45071:8;45081:6;45044:13;-1:-1:-1;;;;;45037:33:0;;;:51;;;;;:::i;:::-;45106:8;-1:-1:-1;;;;;45099:24:0;;45124:6;45099:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45099:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45099:32:0;;;;45182:19;45211:8;-1:-1:-1;;;;;45204:26:0;;45239:4;45204:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45204:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45204:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45204:41:0;;;;;;;;;45182:63;;45274:17;45260:11;:31;45256:91;;;45308:27;;-1:-1:-1;;;45308:27:0;;;;;;;;45256:91;45366:8;-1:-1:-1;;;;;45359:25:0;;45385:10;45397:11;45359:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45359:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45359:50:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45359:50:0;;;;;;;;;-1:-1:-1;45429:11:0;-1:-1:-1;;;;;;;;41997:3451:0;;;;;;;;;;:::o;34082:22::-;;;-1:-1:-1;;;;;34082:22:0;;:::o;35817:145::-;35897:10;;-1:-1:-1;;;;;35897:10:0;35883;:24;35875:48;;;;-1:-1:-1;;;35875:48:0;;;;;;;;;35934:8;:20;;-1:-1:-1;;;;;;35934:20:0;-1:-1:-1;;;;;35934:20:0;;;;;;;;;;35817:145::o;34244:50::-;34288:6;34244:50;:::o;34568:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35970:153::-;36054:10;;-1:-1:-1;;;;;36054:10:0;36040;:24;36032:48;;;;-1:-1:-1;;;36032:48:0;;;;;;;;;36091:10;:24;;-1:-1:-1;;;;;;36091:24:0;-1:-1:-1;;;;;36091:24:0;;;;;;;;;;35970:153::o;35132:141::-;35210:10;;-1:-1:-1;;;;;35210:10:0;35196;:24;35188:48;;;;-1:-1:-1;;;35188:48:0;;;;;;;;;35247:7;:18;;-1:-1:-1;;;;;;35247:18:0;-1:-1:-1;;;;;35247:18:0;;;;;;;;;;35132:141::o;38059:576::-;-1:-1:-1;;;;;38144:18:0;;;38124:17;38144:18;;;:10;:18;;;;;;;;;38189:27;;-1:-1:-1;;;38189:27:0;;;;38144:18;;;;;38189:25;;:27;;;;;;;;;;;38144:18;38189:27;;;2:2:-1;;;;27:1;24;17:12;2:2;38189:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38189:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38189:27:0;;;;;;;;;38173:43;;38240:6;-1:-1:-1;;;;;38231:15:0;:5;-1:-1:-1;;;;;38231:15:0;;38227:360;;-1:-1:-1;;;;;38283:18:0;;;38263:17;38283:18;;;:10;:18;;;;;;;;:25;;;;;;;;;;;;;;;38323:47;;38283:25;38362:7;38323:47;:27;:47;:::i;:::-;38395:39;;-1:-1:-1;;;38395:39:0;;-1:-1:-1;;;;;38395:28:0;;;;;:39;;38424:9;;38395:39;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38395:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38395:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38395:39:0;;;;;;;;;38385:49;-1:-1:-1;38449:46:0;-1:-1:-1;;;;;38449:26:0;;38476:9;38385:49;38449:46;:26;:46;:::i;:::-;38227:360;;;;38528:47;-1:-1:-1;;;;;38528:27:0;;38556:9;38567:7;38528:47;:27;:47;:::i;:::-;38607:9;-1:-1:-1;;;;;38597:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38597:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38597:30:0;;;;38059:576;;;;:::o;36131:141::-;36211:8;;-1:-1:-1;;;;;36211:8:0;36197:10;:22;36189:44;;;;-1:-1:-1;;;36189:44:0;;;;;;;;;36244:8;:20;;-1:-1:-1;;;;;;36244:20:0;-1:-1:-1;;;;;36244:20:0;;;;;;;;;;36131:141::o;36940:185::-;37040:8;;-1:-1:-1;;;;;37040:8:0;37026:10;:22;37018:44;;;;-1:-1:-1;;;37018:44:0;;;;;;;;;-1:-1:-1;;;;;37073:26:0;;;;;;;:18;:26;;;;;;;;:37;;;;;;;;;;;:44;;-1:-1:-1;;37073:44:0;37113:4;37073:44;;;36940:185::o;39023:261::-;39140:10;;-1:-1:-1;;;;;39140:10:0;39126;:24;;:52;;-1:-1:-1;39168:10:0;;-1:-1:-1;;;;;39168:10:0;39154;:24;39126:52;39104:113;;;;-1:-1:-1;;;39104:113:0;;;;;;;;;39228:48;-1:-1:-1;;;;;39228:27:0;;39256:10;39268:7;39228:48;:27;:48;:::i;:::-;39023:261;;:::o;35434:153::-;35518:10;;-1:-1:-1;;;;;35518:10:0;35504;:24;35496:48;;;;-1:-1:-1;;;35496:48:0;;;;;;;;;35555:10;:24;;-1:-1:-1;;;;;;35555:24:0;-1:-1:-1;;;;;35555:24:0;;;;;;;;;;35434:153::o;34141:23::-;;;-1:-1:-1;;;;;34141:23:0;;:::o;34496:65::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34496:65:0;;:::o;35281:145::-;35361:10;;-1:-1:-1;;;;;35361:10:0;35347;:24;35339:48;;;;-1:-1:-1;;;35339:48:0;;;;;;;;;35398:8;:20;;-1:-1:-1;;;;;;35398:20:0;-1:-1:-1;;;;;35398:20:0;;;;;;;;;;35281:145::o;41767:182::-;-1:-1:-1;;;;;41858:14:0;;;;;;;:6;:14;;;;;;;41844:10;:28;41836:47;;;;-1:-1:-1;;;41836:47:0;;;;;;;;;-1:-1:-1;;;;;41904:18:0;;;;;;;:10;:18;;;;;;;;41894:47;;-1:-1:-1;;;41894:47:0;;41904:18;;;41894:38;;:47;;41933:7;;41894:47;;;;33941:68;;;-1:-1:-1;;;;;33941:68:0;;:::o;34709:26::-;;;;:::o;36568:178::-;36659:10;;-1:-1:-1;;;;;36659:10:0;36645;:24;36637:48;;;;-1:-1:-1;;;36637:48:0;;;;;;;;;-1:-1:-1;;;;;36696:35:0;;;;;:23;:35;;;;;:42;;-1:-1:-1;;36696:42:0;36734:4;36696:42;;;36568:178::o;38785:230::-;38876:10;;-1:-1:-1;;;;;38876:10:0;38862;:24;;:52;;-1:-1:-1;38904:10:0;;-1:-1:-1;;;;;38904:10:0;38890;:24;38862:52;38840:113;;;;-1:-1:-1;;;38840:113:0;;;;;;;;;-1:-1:-1;;;;;38974:18:0;;;;;;;:10;:18;;;;;;;;;38964:43;;-1:-1:-1;;;38964:43:0;;;;38974:18;;;38964:41;;:43;;;;;38974:18;38964:43;;;;;;;38974:18;38964:43;;;2:2:-1;;;;27:1;24;17:12;2:2;38964:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38964:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38964:43:0;;;;;;;;34202:35;;;;:::o;2099:136::-;2157:7;2184:43;2188:1;2191;2184:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2177:50;2099:136;-1:-1:-1;;;2099:136:0:o;28166:622::-;28536:10;;;28535:62;;-1:-1:-1;28552:39:0;;-1:-1:-1;;;28552:39:0;;-1:-1:-1;;;;;28552:15:0;;;;;:39;;28576:4;;28583:7;;28552:39;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28552:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28552:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;28552:39:0;;;;;;;;;:44;28535:62;28527:152;;;;-1:-1:-1;;;28527:152:0;;;;;;;;;28690:90;28710:5;28740:22;;;28764:7;28773:5;28717:62;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;28717:62:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;28717:62:0;;;179:29:-1;;;;160:49;;;28690:19:0;:90::i;:::-;28166:622;;;:::o;2989:471::-;3047:7;3292:6;3288:47;;-1:-1:-1;3322:1:0;3315:8;;3288:47;3359:5;;;3363:1;3359;:5;:1;3383:5;;;;;:10;3375:56;;;;-1:-1:-1;;;3375:56:0;;;;;;;;3936:132;3994:7;4021:39;4025:1;4028;4021:39;;;;;;;;;;;;;;;;;:3;:39::i;27507:177::-;27590:86;27610:5;27640:23;;;27665:2;27669:5;27617:58;;;;;;;;;;27692:205;27793:96;27813:5;27843:27;;;27872:4;27878:2;27882:5;27820:68;;;;;;;;;;;27793:96;27692:205;;;;:::o;45456:984::-;45547:21;-1:-1:-1;;;;;45594:21:0;;45586:41;;;;-1:-1:-1;;;45586:41:0;;;;;;;;;45904:1;45884;45859:5;45853:12;45829:4;45822:5;45818:16;45792:7;45768:4;45761:5;45757:16;45726:194;45946:16;45996:4;45990:11;45978:23;;46113:4;46109:9;46102:4;46095;46089;46085:15;46081:26;46077:42;46067:8;46063:57;46040:4;46015:120;46166:4;46156:8;46149:22;46224:4;46221:1;46214:4;46204:8;46200:19;46185:44;46259:9;46252:17;46292:1;46287:135;;;;46245:177;;46287:135;46398:4;46391;46381:8;46377:19;46370:33;46245:177;;;;45694:739;;;;:::o;2538:192::-;2624:7;2660:12;2652:6;;;;2644:29;;;;-1:-1:-1;;;2644:29:0;;;;;;;;;;-1:-1:-1;;;2696:5:0;;;2538:192::o;29812:761::-;30236:23;30262:69;30290:4;30262:69;;;;;;;;;;;;;;;;;30270:5;-1:-1:-1;;;;;30262:27:0;;;:69;;;;;:::i;:::-;30346:17;;30236:95;;-1:-1:-1;30346:21:0;30342:224;;30488:10;30477:30;;;;;;;;;;;;;;30469:85;;;;-1:-1:-1;;;30469:85:0;;;;;;;;4564:278;4650:7;4685:12;4678:5;4670:28;;;;-1:-1:-1;;;4670:28:0;;;;;;;;;;;4709:9;4725:1;4721;:5;;;;;;;4564:278;-1:-1:-1;;;;;4564:278:0:o;13633:196::-;13736:12;13768:53;13791:6;13799:4;13805:1;13808:12;13768:22;:53::i;:::-;13761:60;13633:196;-1:-1:-1;;;;13633:196:0:o;15010:979::-;15140:12;15173:18;15184:6;15173:10;:18::i;:::-;15165:60;;;;-1:-1:-1;;;15165:60:0;;;;;;;;;15299:12;15313:23;15340:6;-1:-1:-1;;;;;15340:11:0;15360:8;15371:4;15340:36;;;;;;;;;;;;;;;;;;;;;;;;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;;15298:78:0;;;;15391:7;15387:595;;;15422:10;-1:-1:-1;15415:17:0;;-1:-1:-1;15415:17:0;15387:595;15536:17;;:21;15532:439;;15799:10;15793:17;15860:15;15847:10;15843:2;15839:19;15832:44;15747:148;15942:12;15935:20;;-1:-1:-1;;;15935:20:0;;;;;;;;;10715:422;11082:20;11121:8;;;10715:422::o;462:360:-1:-;;;600:3;593:4;585:6;581:17;577:27;567:2;;-1:-1;;608:12;567:2;-1:-1;638:20;;678:18;667:30;;664:2;;;-1:-1;;700:12;664:2;744:4;736:6;732:17;720:29;;795:3;744:4;;779:6;775:17;736:6;761:32;;758:41;755:2;;;812:1;;802:12;755:2;560:262;;;;;;2515:241;;2619:2;2607:9;2598:7;2594:23;2590:32;2587:2;;;-1:-1;;2625:12;2587:2;85:6;72:20;97:33;124:5;97:33;;2763:263;;2878:2;2866:9;2857:7;2853:23;2849:32;2846:2;;;-1:-1;;2884:12;2846:2;226:6;220:13;238:33;265:5;238:33;;3297:366;;;3418:2;3406:9;3397:7;3393:23;3389:32;3386:2;;;-1:-1;;3424:12;3386:2;85:6;72:20;97:33;124:5;97:33;;;3476:63;-1:-1;3576:2;3615:22;;72:20;97:33;72:20;97:33;;;3584:63;;;;3380:283;;;;;;3670:491;;;;3808:2;3796:9;3787:7;3783:23;3779:32;3776:2;;;-1:-1;;3814:12;3776:2;85:6;72:20;97:33;124:5;97:33;;;3866:63;-1:-1;3966:2;4005:22;;72:20;97:33;72:20;97:33;;;3770:391;;3974:63;;-1:-1;;;4074:2;4113:22;;;;2167:20;;3770:391;4168:1219;;;;;;;;;4446:3;4434:9;4425:7;4421:23;4417:33;4414:2;;;-1:-1;;4453:12;4414:2;85:6;72:20;97:33;124:5;97:33;;;4505:63;-1:-1;4605:2;4644:22;;72:20;97:33;72:20;97:33;;;4613:63;-1:-1;4713:2;4752:22;;2167:20;;-1:-1;4821:2;4860:22;;2167:20;;-1:-1;4957:3;4942:19;;4929:33;4982:18;4971:30;;;4968:2;;;-1:-1;;5004:12;4968:2;5042:88;5122:7;5113:6;5102:9;5098:22;5042:88;;;5032:98;;-1:-1;5032:98;-1:-1;5195:3;5180:19;;5167:33;;-1:-1;5209:30;;;5206:2;;;-1:-1;;5242:12;5206:2;;5280:91;5363:7;5354:6;5343:9;5339:22;5280:91;;;4408:979;;;;-1:-1;4408:979;;-1:-1;4408:979;;;;;;5270:101;-1:-1;;;4408:979;5394:366;;;5515:2;5503:9;5494:7;5490:23;5486:32;5483:2;;;-1:-1;;5521:12;5483:2;85:6;72:20;97:33;124:5;97:33;;;5573:63;5673:2;5712:22;;;;2167:20;;-1:-1;;;5477:283;5767:257;;5879:2;5867:9;5858:7;5854:23;5850:32;5847:2;;;-1:-1;;5885:12;5847:2;2046:6;2040:13;30163:5;28613:13;28606:21;30141:5;30138:32;30128:2;;-1:-1;;30174:12;6031:241;;6135:2;6123:9;6114:7;6110:23;6106:32;6103:2;;;-1:-1;;6141:12;6103:2;-1:-1;2167:20;;6097:175;-1:-1;6097:175;6279:263;;6394:2;6382:9;6373:7;6369:23;6365:32;6362:2;;;-1:-1;;6400:12;6362:2;-1:-1;2315:13;;6356:186;-1:-1;6356:186;6549:528;;;6706:2;6694:9;6685:7;6681:23;6677:32;6674:2;;;-1:-1;;6712:12;6674:2;2321:6;2315:13;6764:74;;6896:2;;6885:9;6881:18;6875:25;6920:18;6912:6;6909:30;6906:2;;;-1:-1;;6942:12;6906:2;7044:6;7033:9;7029:22;1363:3;1356:4;1348:6;1344:17;1340:27;1330:2;;-1:-1;;1371:12;1330:2;1411:6;1405:13;1391:27;;1433:80;1448:64;1505:6;1448:64;;;1433:80;;;1541:21;;;1598:14;;;;1573:17;;;1687;;;1678:27;;;;1675:36;-1:-1;1672:2;;;-1:-1;;1714:12;1672:2;-1:-1;1740:10;;1734:217;1759:6;1756:1;1753:13;1734:217;;;2315:13;;1827:61;;1781:1;1774:9;;;;;1902:14;;;;1930;;1734:217;;;1738:14;6962:99;;;;;;;;6668:409;;;;;;7084:259;;7197:2;7185:9;7176:7;7172:23;7168:32;7165:2;;;-1:-1;;7203:12;7165:2;2460:6;2454:13;28917:4;30407:5;28906:16;30384:5;30381:33;30371:2;;-1:-1;;30418:12;15146:262;;8801:5;27418:12;8912:52;8957:6;8952:3;8945:4;8938:5;8934:16;8912:52;;;8976:16;;;;;15271:137;-1:-1;;15271:137;15415:213;-1:-1;;;;;28701:54;;;;7752:37;;15533:2;15518:18;;15504:124;15635:340;-1:-1;;;;;28701:54;;;;7611:58;;15961:2;15946:18;;14977:37;15789:2;15774:18;;15760:215;15982:324;-1:-1;;;;;28701:54;;;7752:37;;28701:54;;16292:2;16277:18;;7752:37;16128:2;16113:18;;16099:207;16313:435;-1:-1;;;;;28701:54;;;7752:37;;28701:54;;;;16651:2;16636:18;;7752:37;16734:2;16719:18;;14977:37;;;;16487:2;16472:18;;16458:290;16755:935;-1:-1;;;;;28701:54;;;7752:37;;28701:54;;17236:2;17221:18;;;7752:37;;;;17319:2;17304:18;;14977:37;;;17402:2;17387:18;;14977:37;;;17071:3;17439;17424:19;;17417:49;;;27418:12;;17056:19;;;27950;;;16755:935;;27272:14;;;;27990;;;;17236:2;16755:935;8240:260;8265:6;8262:1;8259:13;8240:260;;;8326:13;;14977:37;;27805:14;;;;7504;;;;8287:1;8280:9;8240:260;;;-1:-1;;;17675:3;17660:19;;;;9083:58;;;;-1:-1;17472:116;17042:648;-1:-1;;;;;;17042:648;17697:675;-1:-1;;;;;28701:54;;;7752:37;;28701:54;;;;18100:2;18085:18;;7752:37;18183:2;18168:18;;14977:37;;;;18266:2;18251:18;;14977:37;18357:3;18342:19;;9083:58;;;;17935:3;17920:19;;17906:466;18710:201;28613:13;;28606:21;8595:34;;18822:2;18807:18;;18793:118;18918:301;;19056:2;19077:17;19070:47;9298:5;27418:12;27962:6;19056:2;19045:9;19041:18;27950:19;9392:52;9437:6;27990:14;19045:9;27990:14;19056:2;9418:5;9414:16;9392:52;;;29797:7;29781:14;-1:-1;;29777:28;9456:39;;;;27990:14;9456:39;;19027:192;-1:-1;;19027:192;19226:407;19417:2;19431:47;;;9732:2;19402:18;;;27950:19;9768:31;27990:14;;;9748:52;9819:12;;;19388:245;19640:407;19831:2;19845:47;;;10070:2;19816:18;;;27950:19;-1:-1;;;27990:14;;;10086:34;10139:12;;;19802:245;20054:407;20245:2;20259:47;;;10390:2;20230:18;;;27950:19;-1:-1;;;27990:14;;;10406:34;10459:12;;;20216:245;20468:407;20659:2;20673:47;;;10710:1;20644:18;;;27950:19;-1:-1;;;27990:14;;;10725:30;10774:12;;;20630:245;20882:407;21073:2;21087:47;;;11025:2;21058:18;;;27950:19;11061:34;27990:14;;;11041:55;-1:-1;;;11116:12;;;11109:36;11164:12;;;21044:245;21296:407;21487:2;21501:47;;;11415:2;21472:18;;;27950:19;-1:-1;;;27990:14;;;11431:33;11483:12;;;21458:245;21710:407;21901:2;21915:47;;;11734:1;21886:18;;;27950:19;-1:-1;;;27990:14;;;11749:32;11800:12;;;21872:245;22124:407;22315:2;22329:47;;;12051:1;22300:18;;;27950:19;-1:-1;;;27990:14;;;12066:28;12113:12;;;22286:245;22538:407;22729:2;22743:47;;;12364:2;22714:18;;;27950:19;12400:34;27990:14;;;12380:55;-1:-1;;;12455:12;;;12448:25;12492:12;;;22700:245;22952:407;23143:2;23157:47;;;12743:1;23128:18;;;27950:19;-1:-1;;;27990:14;;;12758:29;12806:12;;;23114:245;23366:407;23557:2;23571:47;;;13057:2;23542:18;;;27950:19;-1:-1;;;27990:14;;;13073:40;13132:12;;;23528:245;23780:407;23971:2;23985:47;;;13383:2;23956:18;;;27950:19;13419:31;27990:14;;;13399:52;13470:12;;;23942:245;24194:407;24385:2;24399:47;;;13721:2;24370:18;;;27950:19;13757:34;27990:14;;;13737:55;-1:-1;;;13812:12;;;13805:34;13858:12;;;24356:245;24608:407;24799:2;24813:47;;;14109:1;24784:18;;;27950:19;-1:-1;;;27990:14;;;14124:30;14173:12;;;24770:245;25022:407;25213:2;25227:47;;;14424:1;25198:18;;;27950:19;-1:-1;;;27990:14;;;14439:32;14490:12;;;25184:245;25436:407;25627:2;25641:47;;;14741:2;25612:18;;;27950:19;14777:34;27990:14;;;14757:55;-1:-1;;;14832:12;;;14825:46;14890:12;;;25598:245;25850:213;14977:37;;;25968:2;25953:18;;25939:124;26070:506;;;26205:11;26192:25;26256:48;;26280:8;26264:14;26260:29;26256:48;26236:18;26232:73;26222:2;;-1:-1;;26309:12;26222:2;26350:18;26340:8;26336:33;26403:4;26390:18;26380:28;;26428:18;26420:6;26417:30;26414:2;;;-1:-1;;26450:12;26414:2;26295:4;26478:13;;-1:-1;;26264:14;26510:38;;;26500:49;;26497:2;;;26562:1;;26552:12;26583:256;26645:2;26639:9;26671:17;;;26746:18;26731:34;;26767:22;;;26728:62;26725:2;;;26803:1;;26793:12;26725:2;26645;26812:22;26623:216;;-1:-1;26623:216;26846:304;;27005:18;26997:6;26994:30;26991:2;;;-1:-1;;27027:12;26991:2;-1:-1;27072:4;27060:17;;;27125:15;;26928:222;29437:268;29502:1;29509:101;29523:6;29520:1;29517:13;29509:101;;;29590:11;;;29584:18;29571:11;;;29564:39;29545:2;29538:10;29509:101;;;29625:6;29622:1;29619:13;29616:2;;;-1:-1;;29502:1;29672:16;;29665:27;29486:219;29818:117;-1:-1;;;;;28701:54;;29877:35;;29867:2;;29926:1;;29916:12;29867:2;29861:74;
Swarm Source
ipfs://5f77ac200c35c7eb584ab64c0381be094779968ca657d269feb2d62054eb1fbf
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.