Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
10880745 | 1512 days ago | 9 wei | ||||
10880745 | 1512 days ago | 9 wei | ||||
9756911 | 1686 days ago | 65.26832801 ETH | ||||
9756911 | 1686 days ago | 52.27158403 ETH | ||||
9756911 | 1686 days ago | 12.99674398 ETH | ||||
9698669 | 1695 days ago | 1.78760983 ETH | ||||
9698669 | 1695 days ago | 1.78760983 ETH | ||||
9683669 | 1697 days ago | 4.72165707 ETH | ||||
9683669 | 1697 days ago | 4.72165707 ETH | ||||
9683669 | 1697 days ago | 44.5478454 ETH | ||||
9683669 | 1697 days ago | 44.5478454 ETH | ||||
9670413 | 1699 days ago | 0.09047197 ETH | ||||
9670413 | 1699 days ago | 0.09047197 ETH | ||||
9670413 | 1699 days ago | 0.75816155 ETH | ||||
9670413 | 1699 days ago | 0.75816155 ETH | ||||
9664694 | 1700 days ago | 770 ETH | ||||
9664694 | 1700 days ago | 770 ETH | ||||
9641050 | 1704 days ago | 0.61779444 ETH | ||||
9641050 | 1704 days ago | 0.61779444 ETH | ||||
9636102 | 1705 days ago | 1 ETH | ||||
9636102 | 1705 days ago | 1 ETH | ||||
9636094 | 1705 days ago | 1 ETH | ||||
9636094 | 1705 days ago | 1 ETH | ||||
9625619 | 1706 days ago | 16.4 ETH | ||||
9625619 | 1706 days ago | 16.4 ETH |
Loading...
Loading
Contract Name:
OneSplit
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-02-26 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/IOneSplit.sol pragma solidity ^0.5.0; contract IOneSplitView { // disableFlags = FLAG_UNISWAP + FLAG_KYBER + ... uint256 public constant FLAG_UNISWAP = 0x01; uint256 public constant FLAG_KYBER = 0x02; uint256 public constant FLAG_KYBER_UNISWAP_RESERVE = 0x100000000; // Turned off by default uint256 public constant FLAG_KYBER_OASIS_RESERVE = 0x200000000; // Turned off by default uint256 public constant FLAG_KYBER_BANCOR_RESERVE = 0x400000000; // Turned off by default uint256 public constant FLAG_BANCOR = 0x04; uint256 public constant FLAG_OASIS = 0x08; uint256 public constant FLAG_COMPOUND = 0x10; uint256 public constant FLAG_FULCRUM = 0x20; uint256 public constant FLAG_CHAI = 0x40; uint256 public constant FLAG_AAVE = 0x80; uint256 public constant FLAG_SMART_TOKEN = 0x100; uint256 public constant FLAG_MULTI_PATH_ETH = 0x200; // Turned off by default uint256 public constant FLAG_BDAI = 0x400; uint256 public constant FLAG_IEARN = 0x800; function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ); } contract IOneSplit is IOneSplitView { function swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public payable; function goodSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public payable; } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/interface/IUniswapExchange.sol pragma solidity ^0.5.0; interface IUniswapExchange { function getEthToTokenInputPrice(uint256 ethSold) external view returns (uint256 tokensBought); function getTokenToEthInputPrice(uint256 tokensSold) external view returns (uint256 ethBought); function ethToTokenSwapInput(uint256 minTokens, uint256 deadline) external payable returns (uint256 tokensBought); function tokenToEthSwapInput(uint256 tokensSold, uint256 minEth, uint256 deadline) external returns (uint256 ethBought); function tokenToTokenSwapInput( uint256 tokensSold, uint256 minTokensBought, uint256 minEthBought, uint256 deadline, address tokenAddr ) external returns (uint256 tokensBought); } // File: contracts/interface/IUniswapFactory.sol pragma solidity ^0.5.0; interface IUniswapFactory { function getExchange(IERC20 token) external view returns (IUniswapExchange exchange); } // File: contracts/interface/IKyberNetworkContract.sol pragma solidity ^0.5.0; interface IKyberNetworkContract { function searchBestRate(IERC20 src, IERC20 dest, uint256 srcAmount, bool usePermissionless) external view returns (address reserve, uint256 rate); } // File: contracts/interface/IKyberNetworkProxy.sol pragma solidity ^0.5.0; interface IKyberNetworkProxy { function getExpectedRate(IERC20 src, IERC20 dest, uint256 srcQty) external view returns (uint256 expectedRate, uint256 slippageRate); function tradeWithHint( IERC20 src, uint256 srcAmount, IERC20 dest, address destAddress, uint256 maxDestAmount, uint256 minConversionRate, address walletId, bytes calldata hint ) external payable returns (uint256); function kyberNetworkContract() external view returns (IKyberNetworkContract); // TODO: Limit usage by tx.gasPrice // function maxGasPrice() external view returns (uint256); // TODO: Limit usage by user cap // function getUserCapInWei(address user) external view returns (uint256); // function getUserCapInTokenWei(address user, IERC20 token) external view returns (uint256); } // File: contracts/interface/IKyberUniswapReserve.sol pragma solidity ^0.5.0; interface IKyberUniswapReserve { function uniswapFactory() external view returns (address); } // File: contracts/interface/IKyberOasisReserve.sol pragma solidity ^0.5.0; interface IKyberOasisReserve { function otc() external view returns (address); } // File: contracts/interface/IKyberBancorReserve.sol pragma solidity ^0.5.0; contract IKyberBancorReserve { function bancorEth() public view returns (address); } // File: contracts/interface/IBancorNetwork.sol pragma solidity ^0.5.0; interface IBancorNetwork { function getReturnByPath(address[] calldata path, uint256 amount) external view returns (uint256 returnAmount, uint256 conversionFee); function claimAndConvert(address[] calldata path, uint256 amount, uint256 minReturn) external returns (uint256); function convert(address[] calldata path, uint256 amount, uint256 minReturn) external payable returns (uint256); } // File: contracts/interface/IBancorContractRegistry.sol pragma solidity ^0.5.0; contract IBancorContractRegistry { function addressOf(bytes32 contractName) external view returns (address); } // File: contracts/interface/IBancorNetworkPathFinder.sol pragma solidity ^0.5.0; interface IBancorNetworkPathFinder { function generatePath(IERC20 sourceToken, IERC20 targetToken) external view returns (address[] memory); } // File: contracts/interface/IBancorEtherToken.sol pragma solidity ^0.5.0; contract IBancorEtherToken is IERC20 { function deposit() external payable; function withdraw(uint256 amount) external; } // File: contracts/interface/IOasisExchange.sol pragma solidity ^0.5.0; interface IOasisExchange { function getBuyAmount(IERC20 buyGem, IERC20 payGem, uint256 payAmt) external view returns (uint256 fillAmt); function sellAllAmount(IERC20 payGem, uint256 payAmt, IERC20 buyGem, uint256 minFillAmount) external returns (uint256 fillAmt); } // File: contracts/interface/IWETH.sol pragma solidity ^0.5.0; contract IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 amount) external; } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/UniversalERC20.sol pragma solidity ^0.5.0; library UniversalERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private constant ZERO_ADDRESS = IERC20(0x0000000000000000000000000000000000000000); IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); function universalTransfer(IERC20 token, address to, uint256 amount) internal returns(bool) { if (amount == 0) { return true; } if (isETH(token)) { address(uint160(to)).transfer(amount); } else { token.safeTransfer(to, amount); return true; } } function universalTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { if (amount == 0) { return; } if (isETH(token)) { require(from == msg.sender && msg.value >= amount, "msg.value is zero"); if (to != address(this)) { address(uint160(to)).transfer(amount); } if (msg.value > amount) { msg.sender.transfer(msg.value.sub(amount)); } } else { token.safeTransferFrom(from, to, amount); } } function universalApprove(IERC20 token, address to, uint256 amount) internal { if (!isETH(token)) { if (amount > 0 && token.allowance(address(this), to) > 0) { token.safeApprove(to, 0); } token.safeApprove(to, amount); } } function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) { if (isETH(token)) { return who.balance; } else { return token.balanceOf(who); } } function universalDecimals(IERC20 token) internal view returns (uint256) { if (isETH(token)) { return 18; } (bool success, bytes memory data) = address(token).staticcall.gas(5000)( abi.encodeWithSignature("decimals()") ); if (!success) { (success, data) = address(token).staticcall.gas(5000)( abi.encodeWithSignature("DECIMALS()") ); } return success ? abi.decode(data, (uint256)) : 18; } function isETH(IERC20 token) internal pure returns(bool) { return (address(token) == address(ZERO_ADDRESS) || address(token) == address(ETH_ADDRESS)); } } // File: contracts/OneSplitBase.sol pragma solidity ^0.5.0; library DisableFlags { function enabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) { return (disableFlags & flag) == 0; } function disabledReserve(uint256 disableFlags, uint256 flag) internal pure returns(bool) { // For flag disabled by default (Kyber reserves) return enabled(disableFlags, flag); } function disabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) { return (disableFlags & flag) != 0; } } contract OneSplitBaseBase { using SafeMath for uint256; using DisableFlags for uint256; using UniversalERC20 for IERC20; using UniversalERC20 for IWETH; using UniversalERC20 for IBancorEtherToken; IERC20 constant public ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); IERC20 public dai = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); IWETH public wethToken = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); IBancorEtherToken public bancorEtherToken = IBancorEtherToken(0xc0829421C1d260BD3cB3E0F06cfE2D52db2cE315); IKyberNetworkProxy public kyberNetworkProxy = IKyberNetworkProxy(0x818E6FECD516Ecc3849DAf6845e3EC868087B755); IUniswapFactory public uniswapFactory = IUniswapFactory(0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95); IBancorContractRegistry public bancorContractRegistry = IBancorContractRegistry(0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4); IBancorNetworkPathFinder bancorNetworkPathFinder = IBancorNetworkPathFinder(0x6F0cD8C4f6F06eAB664C7E3031909452b4B72861); IOasisExchange public oasisExchange = IOasisExchange(0x794e6e91555438aFc3ccF1c5076A74F42133d08D); } contract OneSplitBaseView is IOneSplitView, OneSplitBaseBase { function log(uint256) external view { } function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ) { distribution = new uint256[](4); if (fromToken == toToken) { return (amount, distribution); } function(IERC20,IERC20,uint256,uint256) view returns(uint256)[4] memory reserves = [ disableFlags.disabled(FLAG_UNISWAP) ? _calculateNoReturn : calculateUniswapReturn, disableFlags.disabled(FLAG_KYBER) ? _calculateNoReturn : calculateKyberReturn, disableFlags.disabled(FLAG_BANCOR) ? _calculateNoReturn : calculateBancorReturn, disableFlags.disabled(FLAG_OASIS) ? _calculateNoReturn : calculateOasisReturn ]; uint256[4] memory rates; uint256[4] memory fullRates; for (uint i = 0; i < rates.length; i++) { rates[i] = reserves[i](fromToken, toToken, amount.div(parts), disableFlags); this.log(rates[i]); fullRates[i] = rates[i]; } for (uint j = 0; j < parts; j++) { // Find best part uint256 bestIndex = 0; for (uint i = 1; i < rates.length; i++) { if (rates[i] > rates[bestIndex]) { bestIndex = i; } } // Add best part returnAmount = returnAmount.add(rates[bestIndex]); distribution[bestIndex]++; // Avoid CompilerError: Stack too deep uint256 srcAmount = amount; // Recalc part if needed if (j + 1 < parts) { uint256 newRate = reserves[bestIndex]( fromToken, toToken, srcAmount.mul(distribution[bestIndex] + 1).div(parts), disableFlags ); if (newRate > fullRates[bestIndex]) { rates[bestIndex] = newRate.sub(fullRates[bestIndex]); } else { rates[bestIndex] = 0; } this.log(rates[bestIndex]); fullRates[bestIndex] = newRate; } } } // View Helpers function calculateUniswapReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 /*disableFlags*/ ) public view returns(uint256) { uint256 returnAmount = amount; if (!fromToken.isETH()) { IUniswapExchange fromExchange = uniswapFactory.getExchange(fromToken); if (fromExchange != IUniswapExchange(0)) { (bool success, bytes memory data) = address(fromExchange).staticcall.gas(200000)( abi.encodeWithSelector( fromExchange.getTokenToEthInputPrice.selector, returnAmount ) ); if (success) { returnAmount = abi.decode(data, (uint256)); } else { returnAmount = 0; } } else { returnAmount = 0; } } if (!toToken.isETH()) { IUniswapExchange toExchange = uniswapFactory.getExchange(toToken); if (toExchange != IUniswapExchange(0)) { (bool success, bytes memory data) = address(toExchange).staticcall.gas(200000)( abi.encodeWithSelector( toExchange.getEthToTokenInputPrice.selector, returnAmount ) ); if (success) { returnAmount = abi.decode(data, (uint256)); } else { returnAmount = 0; } } else { returnAmount = 0; } } return returnAmount; } function calculateKyberReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 disableFlags ) public view returns(uint256) { (bool success, bytes memory data) = address(kyberNetworkProxy).staticcall.gas(2300)(abi.encodeWithSelector( kyberNetworkProxy.kyberNetworkContract.selector )); if (!success) { return 0; } IKyberNetworkContract kyberNetworkContract = IKyberNetworkContract(abi.decode(data, (address))); if (fromToken.isETH() || toToken.isETH()) { return _calculateKyberReturnWithEth(kyberNetworkContract, fromToken, toToken, amount, disableFlags); } uint256 value = _calculateKyberReturnWithEth(kyberNetworkContract, fromToken, ETH_ADDRESS, amount, disableFlags); if (value == 0) { return 0; } return _calculateKyberReturnWithEth(kyberNetworkContract, ETH_ADDRESS, toToken, value, disableFlags); } function _calculateKyberReturnWithEth( IKyberNetworkContract kyberNetworkContract, IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 disableFlags ) public view returns(uint256) { require(fromToken.isETH() || toToken.isETH(), "One of the tokens should be ETH"); (bool success, bytes memory data) = address(kyberNetworkContract).staticcall.gas(1500000)(abi.encodeWithSelector( kyberNetworkContract.searchBestRate.selector, fromToken.isETH() ? ETH_ADDRESS : fromToken, toToken.isETH() ? ETH_ADDRESS : toToken, amount, true )); if (!success) { return 0; } (address reserve, uint256 rate) = abi.decode(data, (address,uint256)); if ((reserve == 0x31E085Afd48a1d6e51Cc193153d625e8f0514C7F && disableFlags.disabledReserve(FLAG_KYBER_UNISWAP_RESERVE)) || (reserve == 0x1E158c0e93c30d24e918Ef83d1e0bE23595C3c0f && disableFlags.disabledReserve(FLAG_KYBER_OASIS_RESERVE)) || (reserve == 0x053AA84FCC676113a57e0EbB0bD1913839874bE4 && disableFlags.disabledReserve(FLAG_KYBER_BANCOR_RESERVE))) { return 0; } if (disableFlags.disabledReserve(FLAG_KYBER_UNISWAP_RESERVE)) { (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberUniswapReserve(reserve).uniswapFactory.selector )); if (success) { return 0; } } if (disableFlags.disabledReserve(FLAG_KYBER_OASIS_RESERVE)) { (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberOasisReserve(reserve).otc.selector )); if (success) { return 0; } } if (disableFlags.disabledReserve(FLAG_KYBER_BANCOR_RESERVE)) { (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberBancorReserve(reserve).bancorEth.selector )); if (success) { return 0; } } return rate.mul(amount) .mul(10 ** IERC20(toToken).universalDecimals()) .div(10 ** IERC20(fromToken).universalDecimals()) .div(1e18); } function calculateBancorReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 /*disableFlags*/ ) public view returns(uint256) { IBancorNetwork bancorNetwork = IBancorNetwork(bancorContractRegistry.addressOf("BancorNetwork")); address[] memory path = bancorNetworkPathFinder.generatePath( fromToken.isETH() ? bancorEtherToken : fromToken, toToken.isETH() ? bancorEtherToken : toToken ); (bool success, bytes memory data) = address(bancorNetwork).staticcall.gas(500000)( abi.encodeWithSelector( bancorNetwork.getReturnByPath.selector, path, amount ) ); if (!success) { return 0; } (uint256 returnAmount,) = abi.decode(data, (uint256,uint256)); return returnAmount; } function calculateOasisReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 /*disableFlags*/ ) public view returns(uint256) { (bool success, bytes memory data) = address(oasisExchange).staticcall.gas(500000)( abi.encodeWithSelector( oasisExchange.getBuyAmount.selector, toToken.isETH() ? wethToken : toToken, fromToken.isETH() ? wethToken : fromToken, amount ) ); if (!success) { return 0; } return abi.decode(data, (uint256)); } function _calculateNoReturn( IERC20 /*fromToken*/, IERC20 /*toToken*/, uint256 /*amount*/, uint256 /*disableFlags*/ ) internal view returns(uint256) { this; } } contract OneSplitBase is IOneSplit, OneSplitBaseBase { function() external payable { // solium-disable-next-line security/no-tx-origin require(msg.sender != tx.origin); } function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 /*disableFlags*/ // 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken ) internal { if (fromToken == toToken) { return; } function(IERC20,IERC20,uint256) returns(uint256)[4] memory reserves = [ _swapOnUniswap, _swapOnKyber, _swapOnBancor, _swapOnOasis ]; uint256 parts = 0; uint256 lastNonZeroIndex = 0; for (uint i = 0; i < reserves.length; i++) { if (distribution[i] > 0) { parts = parts.add(distribution[i]); lastNonZeroIndex = i; } } require(parts > 0, "OneSplit: distribution should contain non-zeros"); uint256 remainingAmount = amount; for (uint i = 0; i < reserves.length; i++) { if (distribution[i] == 0) { continue; } uint256 swapAmount = amount.mul(distribution[i]).div(parts); if (i == lastNonZeroIndex) { swapAmount = remainingAmount; } remainingAmount -= swapAmount; reserves[i](fromToken, toToken, swapAmount); } } // Swap helpers function _swapOnUniswap( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { uint256 returnAmount = amount; if (!fromToken.isETH()) { IUniswapExchange fromExchange = uniswapFactory.getExchange(fromToken); if (fromExchange != IUniswapExchange(0)) { _infiniteApproveIfNeeded(fromToken, address(fromExchange)); returnAmount = fromExchange.tokenToEthSwapInput(returnAmount, 1, now); } } if (!toToken.isETH()) { IUniswapExchange toExchange = uniswapFactory.getExchange(toToken); if (toExchange != IUniswapExchange(0)) { returnAmount = toExchange.ethToTokenSwapInput.value(returnAmount)(1, now); } } return returnAmount; } function _swapOnKyber( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { _infiniteApproveIfNeeded(fromToken, address(kyberNetworkProxy)); return kyberNetworkProxy.tradeWithHint.value(fromToken.isETH() ? amount : 0)( fromToken.isETH() ? ETH_ADDRESS : fromToken, amount, toToken.isETH() ? ETH_ADDRESS : toToken, address(this), 1 << 255, 0, 0x4D37f28D2db99e8d35A6C725a5f1749A085850a3, "" ); } function _swapOnBancor( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { if (fromToken.isETH()) { bancorEtherToken.deposit.value(amount)(); } IBancorNetwork bancorNetwork = IBancorNetwork(bancorContractRegistry.addressOf("BancorNetwork")); address[] memory path = bancorNetworkPathFinder.generatePath( fromToken.isETH() ? bancorEtherToken : fromToken, toToken.isETH() ? bancorEtherToken : toToken ); _infiniteApproveIfNeeded(fromToken.isETH() ? bancorEtherToken : fromToken, address(bancorNetwork)); uint256 returnAmount = bancorNetwork.claimAndConvert(path, amount, 1); if (toToken.isETH()) { bancorEtherToken.withdraw(bancorEtherToken.balanceOf(address(this))); } return returnAmount; } function _swapOnOasis( IERC20 fromToken, IERC20 toToken, uint256 amount ) internal returns(uint256) { if (fromToken.isETH()) { wethToken.deposit.value(amount)(); } _infiniteApproveIfNeeded(fromToken.isETH() ? wethToken : fromToken, address(oasisExchange)); uint256 returnAmount = oasisExchange.sellAllAmount( fromToken.isETH() ? wethToken : fromToken, amount, toToken.isETH() ? wethToken : toToken, 1 ); if (toToken.isETH()) { wethToken.withdraw(wethToken.balanceOf(address(this))); } return returnAmount; } // Helpers function _infiniteApproveIfNeeded(IERC20 token, address to) internal { if (!token.isETH()) { if ((token.allowance(address(this), to) >> 255) == 0) { token.universalApprove(to, uint256(- 1)); } } } } // File: contracts/OneSplitMultiPath.sol pragma solidity ^0.5.0; contract OneSplitMultiPathView is OneSplitBaseView { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns ( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (!fromToken.isETH() && !toToken.isETH() && !disableFlags.disabledReserve(FLAG_MULTI_PATH_ETH)) { (returnAmount, distribution) = super.getExpectedReturn( fromToken, ETH_ADDRESS, amount, parts, disableFlags | FLAG_BANCOR ); uint256[] memory dist; (returnAmount, dist) = super.getExpectedReturn( ETH_ADDRESS, toToken, returnAmount, parts, disableFlags | FLAG_BANCOR ); for (uint i = 0; i < distribution.length; i++) { distribution[i] = distribution[i].add(dist[i] << 8); } return (returnAmount, distribution); } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitMultiPath is OneSplitBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { if (!fromToken.isETH() && !toToken.isETH() && !disableFlags.disabledReserve(FLAG_MULTI_PATH_ETH)) { uint256[] memory dist = new uint256[](distribution.length); for (uint i = 0; i < distribution.length; i++) { dist[i] = distribution[i] & 0xFF; } super._swap( fromToken, ETH_ADDRESS, amount, dist, disableFlags ); for (uint i = 0; i < distribution.length; i++) { dist[i] = (distribution[i] >> 8) & 0xFF; } super._swap( ETH_ADDRESS, toToken, address(this).balance, dist, disableFlags ); return; } super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: contracts/interface/ICompound.sol pragma solidity ^0.5.0; contract ICompound { function markets(address cToken) external view returns (bool isListed, uint256 collateralFactorMantissa); } contract ICompoundToken is IERC20 { function underlying() external view returns (address); function exchangeRateStored() external view returns (uint256); function mint(uint256 mintAmount) external returns (uint256); function redeem(uint256 redeemTokens) external returns (uint256); } contract ICompoundEther is IERC20 { function mint() external payable; function redeem(uint256 redeemTokens) external returns (uint256); } // File: contracts/OneSplitCompound.sol pragma solidity ^0.5.0; contract OneSplitCompoundBase { ICompound public compound = ICompound(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); ICompoundEther public cETH = ICompoundEther(0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5); function _isCompoundToken(IERC20 token) internal view returns(bool) { if (token == cETH) { return true; } (bool success, bytes memory data) = address(compound).staticcall.gas(5000)(abi.encodeWithSelector( compound.markets.selector, token )); if (!success) { return false; } (bool isListed,) = abi.decode(data, (bool,uint256)); return isListed; } function _compoundUnderlyingAsset(IERC20 asset) internal view returns(IERC20) { if (asset == cETH) { return IERC20(address(0)); } (bool success, bytes memory data) = address(asset).staticcall.gas(5000)(abi.encodeWithSelector( ICompoundToken(address(asset)).underlying.selector )); if (!success) { return IERC20(-1); } return abi.decode(data, (IERC20)); } } contract OneSplitCompoundView is OneSplitBaseView, OneSplitCompoundBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { return _compoundGetExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function _compoundGetExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) private view returns( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (disableFlags.enabled(FLAG_COMPOUND)) { if (_isCompoundToken(fromToken)) { IERC20 underlying = _compoundUnderlyingAsset(fromToken); if (underlying != IERC20(-1)) { uint256 compoundRate = ICompoundToken(address(fromToken)).exchangeRateStored(); return _compoundGetExpectedReturn( underlying, toToken, amount.mul(compoundRate).div(1e18), parts, disableFlags ); } } if (_isCompoundToken(toToken)) { IERC20 underlying = _compoundUnderlyingAsset(toToken); if (underlying != IERC20(-1)) { uint256 compoundRate = ICompoundToken(address(toToken)).exchangeRateStored(); (returnAmount, distribution) = super.getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); returnAmount = returnAmount.mul(1e18).div(compoundRate); return (returnAmount, distribution); } } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitCompound is OneSplitBase, OneSplitCompoundBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { _compundSwap( fromToken, toToken, amount, distribution, disableFlags ); } function _compundSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) private { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_COMPOUND)) { if (_isCompoundToken(fromToken)) { IERC20 underlying = _compoundUnderlyingAsset(fromToken); ICompoundToken(address(fromToken)).redeem(amount); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); return _compundSwap( underlying, toToken, underlyingAmount, distribution, disableFlags ); } if (_isCompoundToken(toToken)) { IERC20 underlying = _compoundUnderlyingAsset(toToken); super._swap( fromToken, underlying, amount, distribution, disableFlags ); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); if (underlying.isETH()) { cETH.mint.value(underlyingAmount)(); } else { _infiniteApproveIfNeeded(underlying, address(toToken)); ICompoundToken(address(toToken)).mint(underlyingAmount); } return; } } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } } // File: contracts/interface/IFulcrum.sol pragma solidity ^0.5.0; contract IFulcrumToken is IERC20 { function tokenPrice() external view returns (uint256); function loanTokenAddress() external view returns (address); function mintWithEther(address receiver) external payable returns (uint256 mintAmount); function mint(address receiver, uint256 depositAmount) external returns (uint256 mintAmount); function burnToEther(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); } // File: contracts/OneSplitFulcrum.sol pragma solidity ^0.5.0; contract OneSplitFulcrumBase { using UniversalERC20 for IERC20; function _isFulcrumToken(IERC20 token) public view returns(IERC20) { if (token.isETH()) { return IERC20(-1); } (bool success, bytes memory data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( ERC20Detailed(address(token)).name.selector )); if (!success) { return IERC20(-1); } bool foundBZX = false; for (uint i = 0; i < data.length - 7; i++) { if (data[i + 0] == "F" && data[i + 1] == "u" && data[i + 2] == "l" && data[i + 3] == "c" && data[i + 4] == "r" && data[i + 5] == "u" && data[i + 6] == "m") { foundBZX = true; break; } } if (!foundBZX) { return IERC20(-1); } (success, data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( IFulcrumToken(address(token)).loanTokenAddress.selector )); if (!success) { return IERC20(-1); } return abi.decode(data, (IERC20)); } } contract OneSplitFulcrumView is OneSplitBaseView, OneSplitFulcrumBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { return _fulcrumGetExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function _fulcrumGetExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (disableFlags.enabled(FLAG_FULCRUM)) { IERC20 underlying = _isFulcrumToken(fromToken); if (underlying != IERC20(-1)) { uint256 fulcrumRate = IFulcrumToken(address(fromToken)).tokenPrice(); return _fulcrumGetExpectedReturn( underlying, toToken, amount.mul(fulcrumRate).div(1e18), parts, disableFlags ); } underlying = _isFulcrumToken(toToken); if (underlying != IERC20(-1)) { uint256 fulcrumRate = IFulcrumToken(address(toToken)).tokenPrice(); (returnAmount, distribution) = super.getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); returnAmount = returnAmount.mul(1e18).div(fulcrumRate); return (returnAmount, distribution); } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitFulcrum is OneSplitBase, OneSplitFulcrumBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { _fulcrumSwap( fromToken, toToken, amount, distribution, disableFlags ); } function _fulcrumSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) private { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_FULCRUM)) { IERC20 underlying = _isFulcrumToken(fromToken); if (underlying != IERC20(-1)) { if (underlying.isETH()) { IFulcrumToken(address(fromToken)).burnToEther(address(this), amount); } else { IFulcrumToken(address(fromToken)).burn(address(this), amount); } uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); return super._swap( underlying, toToken, underlyingAmount, distribution, disableFlags ); } underlying = _isFulcrumToken(toToken); if (underlying != IERC20(-1)) { super._swap( fromToken, underlying, amount, distribution, disableFlags ); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); if (underlying.isETH()) { IFulcrumToken(address(toToken)).mintWithEther.value(underlyingAmount)(address(this)); } else { _infiniteApproveIfNeeded(underlying, address(toToken)); IFulcrumToken(address(toToken)).mint(address(this), underlyingAmount); } return; } } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: contracts/interface/IChai.sol pragma solidity ^0.5.0; interface IPot { function dsr() external view returns (uint256); function chi() external view returns (uint256); function rho() external view returns (uint256); function drip() external returns (uint256); function join(uint256) external; function exit(uint256) external; } contract IChai is IERC20 { function POT() public view returns (IPot); function join(address dst, uint256 wad) external; function exit(address src, uint256 wad) external; } library ChaiHelper { IPot private constant POT = IPot(0x197E90f9FAD81970bA7976f33CbD77088E5D7cf7); uint256 private constant RAY = 10**27; function _mul(uint256 x, uint256 y) private pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x); } function _rmul(uint256 x, uint256 y) private pure returns (uint256 z) { // always rounds down z = _mul(x, y) / RAY; } function _rdiv(uint256 x, uint256 y) private pure returns (uint256 z) { // always rounds down z = _mul(x, RAY) / y; } function rpow(uint256 x, uint256 n, uint256 base) private pure returns (uint256 z) { // solium-disable-next-line security/no-inline-assembly assembly { switch x case 0 { switch n case 0 { z := base } default { z := 0 } } default { switch mod(n, 2) case 0 { z := base } default { z := x } let half := div(base, 2) // for rounding. for { n := div(n, 2) } n { n := div(n, 2) } { let xx := mul(x, x) if iszero(eq(div(xx, x), x)) { revert(0, 0) } let xxRound := add(xx, half) if lt(xxRound, xx) { revert(0, 0) } x := div(xxRound, base) if mod(n, 2) { let zx := mul(z, x) if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0, 0) } let zxRound := add(zx, half) if lt(zxRound, zx) { revert(0, 0) } z := div(zxRound, base) } } } } } function potDrip() private view returns (uint256) { return _rmul(rpow(POT.dsr(), now - POT.rho(), RAY), POT.chi()); } function daiToChai( IChai, /*chai*/ uint256 amount ) internal view returns (uint256) { uint256 chi = (now > POT.rho()) ? potDrip() : POT.chi(); return _rdiv(amount, chi); } function chaiToDai( IChai, /*chai*/ uint256 amount ) internal view returns (uint256) { uint256 chi = (now > POT.rho()) ? potDrip() : POT.chi(); return _rmul(chi, amount); } } // File: contracts/OneSplitChai.sol pragma solidity ^0.5.0; contract OneSplitChaiBase { using ChaiHelper for IChai; IChai public chai = IChai(0x06AF07097C9Eeb7fD685c692751D5C66dB49c215); } contract OneSplitChaiView is OneSplitBaseView, OneSplitChaiBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (disableFlags.enabled(FLAG_CHAI)) { if (fromToken == IERC20(chai)) { return super.getExpectedReturn( dai, toToken, chai.chaiToDai(amount), parts, disableFlags ); } if (toToken == IERC20(chai)) { (returnAmount, distribution) = super.getExpectedReturn( fromToken, dai, amount, parts, disableFlags ); return (chai.daiToChai(returnAmount), distribution); } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitChai is OneSplitBase, OneSplitChaiBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_CHAI)) { if (fromToken == IERC20(chai)) { chai.exit(address(this), amount); return super._swap( dai, toToken, dai.balanceOf(address(this)), distribution, disableFlags ); } if (toToken == IERC20(chai)) { super._swap( fromToken, dai, amount, distribution, disableFlags ); _infiniteApproveIfNeeded(dai, address(chai)); chai.join(address(this), dai.balanceOf(address(this))); return; } } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: contracts/interface/IBdai.sol pragma solidity ^0.5.0; contract IBdai is IERC20 { function join(uint256) external; function exit(uint256) external; } // File: contracts/OneSplitBdai.sol pragma solidity ^0.5.0; contract OneSplitBdaiBase { IBdai public bdai = IBdai(0x6a4FFAafa8DD400676Df8076AD6c724867b0e2e8); IERC20 public btu = IERC20(0xb683D83a532e2Cb7DFa5275eED3698436371cc9f); } contract OneSplitBdaiView is OneSplitBaseView, OneSplitBdaiBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns (uint256 returnAmount, uint256[] memory distribution) { if (fromToken == toToken) { return (amount, new uint256[](4)); } if (disableFlags.enabled(FLAG_BDAI)) { if (fromToken == IERC20(bdai)) { return super.getExpectedReturn( dai, toToken, amount, parts, disableFlags ); } if (toToken == IERC20(bdai)) { return super.getExpectedReturn( fromToken, dai, amount, parts, disableFlags ); } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitBdai is OneSplitBase, OneSplitBdaiBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_BDAI)) { if (fromToken == IERC20(bdai)) { bdai.exit(amount); uint256 btuBalance = btu.balanceOf(address(this)); if (btuBalance > 0) { (,uint256[] memory btuDistribution) = getExpectedReturn( btu, toToken, btuBalance, 1, disableFlags ); _swap( btu, toToken, btuBalance, btuDistribution, disableFlags ); } return super._swap( dai, toToken, amount, distribution, disableFlags ); } if (toToken == IERC20(bdai)) { super._swap(fromToken, dai, amount, distribution, disableFlags); _infiniteApproveIfNeeded(dai, address(bdai)); bdai.join(dai.balanceOf(address(this))); return; } } return super._swap(fromToken, toToken, amount, distribution, disableFlags); } } // File: contracts/interface/IIearn.sol pragma solidity ^0.5.0; contract IIearn is IERC20 { function token() external view returns(IERC20); function calcPoolValueInToken() external view returns(uint256); function deposit(uint256 _amount) external; function withdraw(uint256 _shares) external; } // File: contracts/OneSplitIearn.sol pragma solidity ^0.5.0; contract OneSplitIearnBase { function _yTokens() internal pure returns(IIearn[6] memory) { return [ IIearn(0x16de59092dAE5CcF4A1E6439D611fd0653f0Bd01), IIearn(0x04Aa51bbcB46541455cCF1B8bef2ebc5d3787EC9), IIearn(0x73a052500105205d34Daf004eAb301916DA8190f), IIearn(0x83f798e925BcD4017Eb265844FDDAbb448f1707D), IIearn(0xd6aD7a6750A7593E092a9B218d66C0A814a3436e), IIearn(0xF61718057901F84C4eEC4339EF8f0D86D2B45600) ]; } } contract OneSplitIearnView is OneSplitBaseView, OneSplitIearnBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns (uint256 returnAmount, uint256[] memory distribution) { return _iearnGetExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function _iearnGetExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) private view returns (uint256 returnAmount, uint256[] memory distribution) { if (fromToken == toToken) { return (amount, new uint256[](4)); } IIearn[6] memory yTokens = _yTokens(); if (disableFlags.enabled(FLAG_IEARN)) { for (uint i = 0; i < yTokens.length; i++) { if (fromToken == IERC20(yTokens[i])) { return _iearnGetExpectedReturn( yTokens[i].token(), toToken, amount .mul(yTokens[i].calcPoolValueInToken()) .div(yTokens[i].totalSupply()), parts, disableFlags ); } } for (uint i = 0; i < yTokens.length; i++) { if (toToken == IERC20(yTokens[i])) { (uint256 ret, uint256[] memory dist) = super.getExpectedReturn( fromToken, yTokens[i].token(), amount, parts, disableFlags ); return ( ret .mul(yTokens[i].totalSupply()) .div(yTokens[i].calcPoolValueInToken()), dist ); } } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitIearn is OneSplitBase, OneSplitIearnBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { _iearnSwap( fromToken, toToken, amount, distribution, disableFlags ); } function _iearnSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) private { if (fromToken == toToken) { return; } IIearn[6] memory yTokens = _yTokens(); if (disableFlags.enabled(FLAG_IEARN)) { for (uint i = 0; i < yTokens.length; i++) { if (fromToken == IERC20(yTokens[i])) { IERC20 underlying = yTokens[i].token(); yTokens[i].withdraw(amount); _iearnSwap(underlying, toToken, underlying.balanceOf(address(this)), distribution, disableFlags); return; } } for (uint i = 0; i < yTokens.length; i++) { if (toToken == IERC20(yTokens[i])) { IERC20 underlying = yTokens[i].token(); super._swap(fromToken, underlying, amount, distribution, disableFlags); _infiniteApproveIfNeeded(underlying, address(yTokens[i])); yTokens[i].deposit(underlying.balanceOf(address(this))); return; } } } return super._swap(fromToken, toToken, amount, distribution, disableFlags); } } // File: contracts/interface/IAaveToken.sol pragma solidity ^0.5.0; interface IAaveToken { function underlyingAssetAddress() external view returns (IERC20); function redeem(uint256 amount) external; } interface IAaveLendingPool { function core() external view returns (address); function deposit(IERC20 token, uint256 amount, uint16 refCode) external payable; } // File: contracts/OneSplitAave.sol pragma solidity ^0.5.0; contract OneSplitAaveBase { using UniversalERC20 for IERC20; IAaveLendingPool public aave = IAaveLendingPool(0x398eC7346DcD622eDc5ae82352F02bE94C62d119); function _isAaveToken(IERC20 token) public view returns(IERC20) { if (token.isETH()) { return IERC20(-1); } (bool success, bytes memory data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( ERC20Detailed(address(token)).name.selector )); if (!success) { return IERC20(-1); } bool foundAave = false; for (uint i = 0; i < data.length - 4; i++) { if (data[i + 0] == "A" && data[i + 1] == "a" && data[i + 2] == "v" && data[i + 3] == "e") { foundAave = true; break; } } if (!foundAave) { return IERC20(-1); } (success, data) = address(token).staticcall.gas(5000)(abi.encodeWithSelector( IAaveToken(address(token)).underlyingAssetAddress.selector )); if (!success) { return IERC20(-1); } return abi.decode(data, (IERC20)); } } contract OneSplitAaveView is OneSplitBaseView, OneSplitAaveBase { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns( uint256 returnAmount, uint256[] memory distribution ) { return _aaveGetExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function _aaveGetExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) private view returns( uint256 returnAmount, uint256[] memory distribution ) { if (fromToken == toToken) { return (amount, distribution); } if (disableFlags.enabled(FLAG_AAVE)) { IERC20 underlying = _isAaveToken(fromToken); if (underlying != IERC20(-1)) { return _aaveGetExpectedReturn( underlying, toToken, amount, parts, disableFlags ); } underlying = _isAaveToken(toToken); if (underlying != IERC20(-1)) { return super.getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); } } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplitAave is OneSplitBase, OneSplitAaveBase { function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) internal { _aaveSwap( fromToken, toToken, amount, distribution, disableFlags ); } function _aaveSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, uint256 disableFlags ) private { if (fromToken == toToken) { return; } if (disableFlags.enabled(FLAG_AAVE)) { IERC20 underlying = _isAaveToken(fromToken); if (underlying != IERC20(-1)) { IAaveToken(address(fromToken)).redeem(amount); return _aaveSwap( underlying, toToken, amount, distribution, disableFlags ); } underlying = _isAaveToken(toToken); if (underlying != IERC20(-1)) { super._swap( fromToken, underlying, amount, distribution, disableFlags ); uint256 underlyingAmount = underlying.universalBalanceOf(address(this)); _infiniteApproveIfNeeded(underlying, aave.core()); aave.deposit.value(underlying.isETH() ? underlyingAmount : 0)( underlying.isETH() ? ETH_ADDRESS : underlying, underlyingAmount, 1101 ); return; } } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } } // File: contracts/OneSplit.sol pragma solidity ^0.5.0; //import "./OneSplitSmartToken.sol"; contract OneSplitView is IOneSplitView, OneSplitBaseView, OneSplitMultiPathView, OneSplitChaiView, OneSplitBdaiView, OneSplitAaveView, OneSplitFulcrumView, OneSplitCompoundView, OneSplitIearnView //OneSplitSmartTokenView { function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ) { if (fromToken == toToken) { return (amount, new uint256[](4)); } return super.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } } contract OneSplit is IOneSplit, OneSplitBase, OneSplitMultiPath, OneSplitChai, OneSplitBdai, OneSplitAave, OneSplitFulcrum, OneSplitCompound, OneSplitIearn //OneSplitSmartToken { IOneSplitView public oneSplitView; constructor(IOneSplitView _oneSplitView) public { oneSplitView = _oneSplitView; } function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ) { return oneSplitView.getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); } function swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public payable { fromToken.universalTransferFrom(msg.sender, address(this), amount); _swap(fromToken, toToken, amount, distribution, disableFlags); uint256 returnAmount = toToken.universalBalanceOf(address(this)); require(returnAmount >= minReturn, "OneSplit: actual return amount is less than minReturn"); toToken.universalTransfer(msg.sender, returnAmount); fromToken.universalTransfer(msg.sender, fromToken.universalBalanceOf(address(this))); } function _swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) internal { if (fromToken == toToken) { return; } return super._swap( fromToken, toToken, amount, distribution, disableFlags ); } function goodSwap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum, 64 - Chai, 128 - Aave, 256 - SmartToken, 1024 - bDAI ) public payable { (, uint256[] memory distribution) = getExpectedReturn( fromToken, toToken, amount, parts, disableFlags ); swap( fromToken, toToken, amount, minReturn, distribution, disableFlags ); } // DEPERECATED: function getAllRatesForDEX( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags ) public view returns(uint256[] memory results) { results = new uint256[](parts); for (uint i = 0; i < parts; i++) { (results[i],) = getExpectedReturn( fromToken, toToken, amount.mul(i + 1).div(parts), 1, disableFlags ); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IOneSplitView","name":"_oneSplitView","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_AAVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_BANCOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_BDAI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_CHAI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_COMPOUND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_FULCRUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_IEARN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER_BANCOR_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER_OASIS_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_KYBER_UNISWAP_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_MULTI_PATH_ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_OASIS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_SMART_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FLAG_UNISWAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"_isAaveToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"_isFulcrumToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aave","outputs":[{"internalType":"contract IAaveLendingPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bancorContractRegistry","outputs":[{"internalType":"contract IBancorContractRegistry","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bancorEtherToken","outputs":[{"internalType":"contract IBancorEtherToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bdai","outputs":[{"internalType":"contract IBdai","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"btu","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cETH","outputs":[{"internalType":"contract ICompoundEther","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"chai","outputs":[{"internalType":"contract IChai","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"compound","outputs":[{"internalType":"contract ICompound","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dai","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"getAllRatesForDEX","outputs":[{"internalType":"uint256[]","name":"results","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"getExpectedReturn","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256[]","name":"distribution","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"uint256","name":"parts","type":"uint256"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"goodSwap","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"kyberNetworkProxy","outputs":[{"internalType":"contract IKyberNetworkProxy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oasisExchange","outputs":[{"internalType":"contract IOasisExchange","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oneSplitView","outputs":[{"internalType":"contract IOneSplitView","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"uint256[]","name":"distribution","type":"uint256[]"},{"internalType":"uint256","name":"disableFlags","type":"uint256"}],"name":"swap","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wethToken","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b0319908116736b175474e89094c44da98b954eedeac495271d0f1790915560018054821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc217905560028054821673c0829421c1d260bd3cb3e0f06cfe2d52db2ce31517905560038054821673818e6fecd516ecc3849daf6845e3ec868087b75517905560048054821673c0a47dfe034b400b47bdad5fecda2621de6c4d951790556005805482167352ae12abe5d8bd778bd5397f99ca900624cfadd4179055600680548216736f0cd8c4f6f06eab664c7e3031909452b4b7286117905560078054821673794e6e91555438afc3ccf1c5076a74f42133d08d1790556008805482167306af07097c9eeb7fd685c692751d5c66db49c215179055600980548216736a4ffaafa8dd400676df8076ad6c724867b0e2e8179055600a8054821673b683d83a532e2cb7dfa5275eed3698436371cc9f179055600b8054821673398ec7346dcd622edc5ae82352f02be94c62d119179055600c80548216733d9819210a31b4961b30ef54be2aed79b9c9cd3b179055600d8054909116734ddc2d193948926d02f9b1fe9e1daa0718270ed51790553480156101c057600080fd5b506040516140bf3803806140bf833981810160405260208110156101e357600080fd5b5051600e80546001600160a01b0319166001600160a01b03909216919091179055613eac806102136000396000f3fe60806040526004361061020f5760003560e01c8063851954fa11610118578063d77366a4116100a0578063f484966b1161006f578063f484966b1461068e578063f4b9fa751461072d578063f64a9a4914610742578063f69e204614610757578063fbe4ed951461076c5761020f565b8063d77366a414610587578063df9116631461059c578063e2a7515e146105b1578063eb16df2a146106795761020f565b8063a734f06e116100e7578063a734f06e1461051e578063a9d3589f14610533578063b69d045614610548578063c11f4f111461055d578063ceb54115146105725761020f565b8063851954fa146104ca5780638bdb2afa146104df5780638c6c11f2146104f4578063a1b4d011146105095761020f565b80635cfcee281161019b57806372b6f1bf1161016a57806372b6f1bf1461044357806373eb69d414610476578063819faf7b1461048b57806383366577146104a057806383a0118f146104b55761020f565b80635cfcee28146103bc5780636b5a4ca2146103d15780636b9589aa146103e6578063702bf8fa1461042e5761020f565b80633c1a62dc116101e25780633c1a62dc146103355780634037f9671461034a5780634b57b0be1461037d5780634c914a4e1461039257806358886253146103a75761020f565b8063085e2c5b1461021e57806311c0c0f7146102c857806312dea160146102ef5780631388b42014610320575b3332141561021c57600080fd5b005b34801561022a57600080fd5b5061026d600480360360a081101561024157600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135610781565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156102b357818101518382015260200161029b565b50505050905001935050505060405180910390f35b3480156102d457600080fd5b506102dd6108c9565b60408051918252519081900360200190f35b3480156102fb57600080fd5b506103046108cf565b604080516001600160a01b039092168252519081900360200190f35b34801561032c57600080fd5b506103046108de565b34801561034157600080fd5b506102dd6108ed565b34801561035657600080fd5b506103046004803603602081101561036d57600080fd5b50356001600160a01b03166108f2565b34801561038957600080fd5b50610304610c6a565b34801561039e57600080fd5b506102dd610c79565b3480156103b357600080fd5b506102dd610c7e565b3480156103c857600080fd5b506102dd610c84565b3480156103dd57600080fd5b50610304610c89565b61021c600480360360c08110156103fc57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a00135610c98565b34801561043a57600080fd5b506102dd610cc1565b34801561044f57600080fd5b506103046004803603602081101561046657600080fd5b50356001600160a01b0316610cc9565b34801561048257600080fd5b506102dd610f19565b34801561049757600080fd5b50610304610f1f565b3480156104ac57600080fd5b506102dd610f2e565b3480156104c157600080fd5b506102dd610f33565b3480156104d657600080fd5b50610304610f39565b3480156104eb57600080fd5b50610304610f48565b34801561050057600080fd5b506102dd610f57565b34801561051557600080fd5b50610304610f5c565b34801561052a57600080fd5b50610304610f6b565b34801561053f57600080fd5b506102dd610f83565b34801561055457600080fd5b50610304610f8c565b34801561056957600080fd5b50610304610f9b565b34801561057e57600080fd5b506102dd610faa565b34801561059357600080fd5b50610304610faf565b3480156105a857600080fd5b506102dd610fbe565b61021c600480360360c08110156105c757600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561060657600080fd5b82018360208201111561061857600080fd5b803590602001918460208302840111600160201b8311171561063957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610fc7915050565b34801561068557600080fd5b506102dd6110a4565b34801561069a57600080fd5b506106dd600480360360a08110156106b157600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356110a9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610719578181015183820152602001610701565b505050509050019250505060405180910390f35b34801561073957600080fd5b5061030461113d565b34801561074e57600080fd5b506102dd61114c565b34801561076357600080fd5b50610304611151565b34801561077857600080fd5b50610304611160565b600e546040805163085e2c5b60e01b81526001600160a01b03888116600483015287811660248301526044820187905260648201869052608482018590529151600093606093169163085e2c5b9160a48083019287929190829003018186803b1580156107ed57600080fd5b505afa158015610801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561082a57600080fd5b815160208301805160405192949293830192919084600160201b82111561085057600080fd5b90830190602082018581111561086557600080fd5b82518660208202830111600160201b8211171561088157600080fd5b82525081516020918201928201910280838360005b838110156108ae578181015183820152602001610896565b50505050905001604052505050915091509550959350505050565b61010081565b6005546001600160a01b031681565b6007546001600160a01b031681565b602081565b6000610906826001600160a01b031661116f565b156109145750600019610c65565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b6020831061097f5780518252601f199092019160209182019101610960565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146109e0576040519150601f19603f3d011682016040523d82523d6000602084013e6109e5565b606091505b5091509150816109fb5760001992505050610c65565b6000805b6007835103811015610b5457828160000181518110610a1a57fe5b6020910101516001600160f81b031916602360f91b148015610a5d5750828160010181518110610a4657fe5b6020910101516001600160f81b031916607560f81b145b8015610a8a5750828160020181518110610a7357fe5b6020910101516001600160f81b031916601b60fa1b145b8015610ab75750828160030181518110610aa057fe5b6020910101516001600160f81b031916606360f81b145b8015610ae45750828160040181518110610acd57fe5b6020910101516001600160f81b031916603960f91b145b8015610b115750828160050181518110610afa57fe5b6020910101516001600160f81b031916607560f81b145b8015610b3e5750828160060181518110610b2757fe5b6020910101516001600160f81b031916606d60f81b145b15610b4c5760019150610b54565b6001016109ff565b5080610b67576000199350505050610c65565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b60208310610bca5780518252601f199092019160209182019101610bab565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114610c2b576040519150601f19603f3d011682016040523d82523d6000602084013e610c30565b606091505b50909350915082610c48576000199350505050610c65565b818060200190516020811015610c5d57600080fd5b505193505050505b919050565b6001546001600160a01b031681565b604081565b61020081565b601081565b600a546001600160a01b031681565b6060610ca78787878686610781565b915050610cb8878787878587610fc7565b50505050505050565b600160201b81565b6000610cdd826001600160a01b031661116f565b15610ceb5750600019610c65565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610d565780518252601f199092019160209182019101610d37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114610db7576040519150601f19603f3d011682016040523d82523d6000602084013e610dbc565b606091505b509150915081610dd25760001992505050610c65565b6000805b6004835103811015610ea457828160000181518110610df157fe5b6020910101516001600160f81b031916604160f81b148015610e345750828160010181518110610e1d57fe5b6020910101516001600160f81b031916606160f81b145b8015610e615750828160020181518110610e4a57fe5b6020910101516001600160f81b031916603b60f91b145b8015610e8e5750828160030181518110610e7757fe5b6020910101516001600160f81b031916606560f81b145b15610e9c5760019150610ea4565b600101610dd6565b5080610eb7576000199350505050610c65565b60408051600481526024810182526020810180516001600160e01b0316632274683f60e21b178152915181516001600160a01b0389169361138893929182919080838360208310610bca5780518252601f199092019160209182019101610bab565b61080081565b600b546001600160a01b031681565b608081565b61040081565b6002546001600160a01b031681565b6004546001600160a01b031681565b600881565b600d546001600160a01b031681565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b64040000000081565b6008546001600160a01b031681565b6009546001600160a01b031681565b600281565b6003546001600160a01b031681565b64020000000081565b610fe26001600160a01b03871633308763ffffffff6111a916565b610fef86868685856112d2565b600061100a6001600160a01b0387163063ffffffff61130516565b90508381101561104b5760405162461bcd60e51b8152600401808060200182810382526035815260200180613d936035913960400191505060405180910390fd5b6110656001600160a01b038716338363ffffffff6113af16565b5061109a336110836001600160a01b038a163063ffffffff61130516565b6001600160a01b038a16919063ffffffff6113af16565b5050505050505050565b600181565b6060826040519080825280602002602001820160405280156110d5578160200160208202803883390190505b50905060005b8381101561113357611113878761110b876110ff8a6001880163ffffffff61142d16565b9063ffffffff61148616565b600187610781565b5082828151811061112057fe5b60209081029190910101526001016110db565b5095945050505050565b6000546001600160a01b031681565b600481565b600c546001600160a01b031681565b600e546001600160a01b031681565b60006001600160a01b03821615806111a357506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b92915050565b806111b3576112cc565b6111bc8461116f565b156112b1576001600160a01b038316331480156111d95750803410155b61121e576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014611266576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611264573d6000803e3d6000fd5b505b803411156112ac57336108fc611282348463ffffffff6114c816565b6040518115909202916000818181858888f193505050501580156112aa573d6000803e3d6000fd5b505b6112cc565b6112cc6001600160a01b03851684848463ffffffff61150a16565b50505050565b836001600160a01b0316856001600160a01b031614156112f1576112fe565b6112fe8585858585611564565b5050505050565b60006113108361116f565b1561132657506001600160a01b038116316111a3565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b50519392505050565b6000816113be57506001611426565b6113c78461116f565b15611408576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611402573d6000803e3d6000fd5b50611426565b6114226001600160a01b038516848463ffffffff61157116565b5060015b9392505050565b60008261143c575060006111a3565b8282028284828161144957fe5b04146114265760405162461bcd60e51b8152600401808060200182810382526021815260200180613df76021913960400191505060405180910390fd5b600061142683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506115c8565b600061142683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061166a565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526112cc9085906116c4565b6112fe858585858561187c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115c39084906116c4565b505050565b600081836116545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611619578181015183820152602001611601565b50505050905090810190601f1680156116465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161166057fe5b0495945050505050565b600081848411156116bc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611619578181015183820152602001611601565b505050900390565b6116d6826001600160a01b0316611c74565b611727576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106117655780518252601f199092019160209182019101611746565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146117c7576040519150601f19603f3d011682016040523d82523d6000602084013e6117cc565b606091505b509150915081611823576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112cc5780806020019051602081101561183f57600080fd5b50516112cc5760405162461bcd60e51b815260040180806020018281038252602a815260200180613e18602a913960400191505060405180910390fd5b836001600160a01b0316856001600160a01b0316141561189b576112fe565b6118a3613d4a565b6118ab611cb0565b90506118bf8261080063ffffffff611d6116565b15611c5f5760005b6006811015611a7f578181600681106118dc57fe5b60200201516001600160a01b0316876001600160a01b03161415611a7757600082826006811061190857fe5b60200201516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561194557600080fd5b505afa158015611959573d6000803e3d6000fd5b505050506040513d602081101561196f57600080fd5b5051905082826006811061197f57fe5b60200201516001600160a01b0316632e1a7d4d876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119c957600080fd5b505af11580156119dd573d6000803e3d6000fd5b50505050611a6f8188836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611a3c57600080fd5b505afa158015611a50573d6000803e3d6000fd5b505050506040513d6020811015611a6657600080fd5b5051888861187c565b5050506112fe565b6001016118c7565b5060005b6006811015611c5d57818160068110611a9857fe5b60200201516001600160a01b0316866001600160a01b03161415611c55576000828260068110611ac457fe5b60200201516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0157600080fd5b505afa158015611b15573d6000803e3d6000fd5b505050506040513d6020811015611b2b57600080fd5b50519050611b3c8882888888611d66565b611b5681848460068110611b4c57fe5b6020020151611d73565b828260068110611b6257fe5b60200201516001600160a01b031663b6b55f25826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611bcb57600080fd5b505afa158015611bdf573d6000803e3d6000fd5b505050506040513d6020811015611bf557600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015611c3557600080fd5b505af1158015611c49573d6000803e3d6000fd5b505050505050506112fe565b600101611a83565b505b611c6c8686868686611d66565b505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611ca857508115155b949350505050565b611cb8613d4a565b506040805160c0810182527316de59092dae5ccf4a1e6439d611fd0653f0bd0181527304aa51bbcb46541455ccf1b8bef2ebc5d3787ec960208201527373a052500105205d34daf004eab301916da8190f918101919091527383f798e925bcd4017eb265844fddabb448f1707d606082015273d6ad7a6750a7593e092a9b218d66c0a814a3436e608082015273f61718057901f84c4eec4339ef8f0d86d2b4560060a082015290565b161590565b6112fe8585858585611e2c565b611d85826001600160a01b031661116f565b611e285760408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915160ff9285169163dd62ed3e916044808301926020929190829003018186803b158015611dda57600080fd5b505afa158015611dee573d6000803e3d6000fd5b505050506040513d6020811015611e0457600080fd5b5051901c611e2857611e286001600160a01b0383168260001963ffffffff61207a16565b5050565b836001600160a01b0316856001600160a01b03161415611e4b576112fe565b611e5c81601063ffffffff611d6116565b1561206d57611e6a8561214b565b15611f20576000611e7a8661227e565b9050856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611ec257600080fd5b505af1158015611ed6573d6000803e3d6000fd5b505050506040513d6020811015611eec57600080fd5b5060009050611f0a6001600160a01b0383163063ffffffff61130516565b9050611f198287838787611e2c565b50506112fe565b611f298461214b565b1561206d576000611f398561227e565b9050611f4886828686866123a5565b6000611f636001600160a01b0383163063ffffffff61130516565b9050611f77826001600160a01b031661116f565b15611fea57600d60009054906101000a90046001600160a01b03166001600160a01b0316631249c58b826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611fcc57600080fd5b505af1158015611fe0573d6000803e3d6000fd5b5050505050611f19565b611ff48287611d73565b856001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561203a57600080fd5b505af115801561204e573d6000803e3d6000fd5b505050506040513d602081101561206457600080fd5b505050506112fe565b6112fe85858585856123a5565b6120838361116f565b6115c357600081118015612111575060408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b1580156120e357600080fd5b505afa1580156120f7573d6000803e3d6000fd5b505050506040513d602081101561210d57600080fd5b5051115b15612131576121316001600160a01b03841683600063ffffffff6123b216565b6115c36001600160a01b038416838363ffffffff6123b216565b600d546000906001600160a01b038381169116141561216c57506001610c65565b600c54604080516001600160a01b0385811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638e8f294b60e01b17815292518251600095606095931693611388939092918291908083835b602083106121ec5780518252601f1990920191602091820191016121cd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461224d576040519150601f19603f3d011682016040523d82523d6000602084013e612252565b606091505b50915091508161226757600092505050610c65565b6000818060200190516040811015610c5d57600080fd5b600d546000906001600160a01b038381169116141561229f57506000610c65565b60408051600481526024810182526020810180516001600160e01b0316636f307dc360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b6020831061230a5780518252601f1990920191602091820191016122eb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461236b576040519150601f19603f3d011682016040523d82523d6000602084013e612370565b606091505b5091509150816123865760001992505050610c65565b80806020019051602081101561239b57600080fd5b5051949350505050565b6112fe85858585856124c5565b801580612438575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561240a57600080fd5b505afa15801561241e573d6000803e3d6000fd5b505050506040513d602081101561243457600080fd5b5051155b6124735760405162461bcd60e51b8152600401808060200182810382526036815260200180613e426036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526115c39084906116c4565b836001600160a01b0316856001600160a01b031614156124e4576112fe565b6124f581602063ffffffff611d6116565b15612789576000612505866108f2565b90506001600160a01b038082161461265557612529816001600160a01b031661116f565b156125af576040805163081a6b2560e41b81523060048201526024810186905290516001600160a01b038816916381a6b2509160448083019260209291908290030181600087803b15801561257d57600080fd5b505af1158015612591573d6000803e3d6000fd5b505050506040513d60208110156125a757600080fd5b5061262b9050565b60408051632770a7eb60e21b81523060048201526024810186905290516001600160a01b03881691639dc29fac9160448083019260209291908290030181600087803b1580156125fe57600080fd5b505af1158015612612573d6000803e3d6000fd5b505050506040513d602081101561262857600080fd5b50505b60006126466001600160a01b0383163063ffffffff61130516565b9050611f198287838787612792565b61265e856108f2565b90506001600160a01b03808216146127875761267d8682868686612792565b60006126986001600160a01b0383163063ffffffff61130516565b90506126ac826001600160a01b031661116f565b1561272e5760408051638f6ede1f60e01b815230600482015290516001600160a01b03881691638f6ede1f91849160248082019260209290919082900301818588803b1580156126fb57600080fd5b505af115801561270f573d6000803e3d6000fd5b50505050506040513d602081101561272657600080fd5b50611f199050565b6127388287611d73565b604080516340c10f1960e01b81523060048201526024810183905290516001600160a01b038816916340c10f199160448083019260209291908290030181600087803b15801561203a57600080fd5b505b6112fe85858585855b6112fe85858585855b836001600160a01b0316856001600160a01b031614156127ba576112fe565b6127cb81608063ffffffff611d6116565b156129dc5760006127db86610cc9565b90506001600160a01b038082161461285e57856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561283357600080fd5b505af1158015612847573d6000803e3d6000fd5b50505050612858818686868661279b565b506112fe565b61286785610cc9565b90506001600160a01b03808216146129da5761288686828686866129e5565b60006128a16001600160a01b0383163063ffffffff61130516565b905061292682600b60009054906101000a90046001600160a01b03166001600160a01b031663f2f4eb266040518163ffffffff1660e01b815260040160206040518083038186803b1580156128f557600080fd5b505afa158015612909573d6000803e3d6000fd5b505050506040513d602081101561291f57600080fd5b5051611d73565b600b546001600160a01b039081169063d2d0e0669061294690851661116f565b612951576000612953565b825b612965856001600160a01b031661116f565b61296f5784612985565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b604080516001600160e01b031960e086901b1681526001600160a01b0390921660048301526024820186905261044d604483015251606480830192600092919082900301818588803b158015611c3557600080fd5b505b6112fe85858585855b836001600160a01b0316856001600160a01b03161415612a04576112fe565b612a168161040063ffffffff611d6116565b15612c8b576009546001600160a01b0386811691161415612b6c5760095460408051637f8661a160e01b81526004810186905290516001600160a01b0390921691637f8661a19160248082019260009290919082900301818387803b158015612a7e57600080fd5b505af1158015612a92573d6000803e3d6000fd5b5050600a54604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d6020811015612b0d57600080fd5b505190508015612b5357600a54606090612b34906001600160a01b03168784600187610781565b600a54909250612b5191506001600160a01b0316878484876112d2565b505b600054612858906001600160a01b031686868686612c94565b6009546001600160a01b0385811691161415612c8b57600054612b9c9086906001600160a01b0316858585612c94565b600054600954612bb8916001600160a01b039081169116611d73565b600954600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363049878f39316916370a08231916024808301926020929190829003018186803b158015612c0d57600080fd5b505afa158015612c21573d6000803e3d6000fd5b505050506040513d6020811015612c3757600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015612c7757600080fd5b505af1158015612064573d6000803e3d6000fd5b6112fe85858585855b836001600160a01b0316856001600160a01b03161415612cb3576112fe565b612cc481604063ffffffff611d6116565b15612ef1576008546001600160a01b0386811691161415612dd4576008546040805163ef693bed60e01b81523060048201526024810186905290516001600160a01b039092169163ef693bed9160448082019260009290919082900301818387803b158015612d3257600080fd5b505af1158015612d46573d6000803e3d6000fd5b5050600054604080516370a0823160e01b81523060048201529051612dcf94506001600160a01b039092169250879183916370a08231916024808301926020929190829003018186803b158015612d9c57600080fd5b505afa158015612db0573d6000803e3d6000fd5b505050506040513d6020811015612dc657600080fd5b50518585612efa565b6112fe565b6008546001600160a01b0385811691161415612ef157600054612e049086906001600160a01b0316858585612efa565b600054600854612e20916001600160a01b039081169116611d73565b600854600054604080516370a0823160e01b8152306004820181905291516001600160a01b0394851694633b4da69f9416916370a08231916024808301926020929190829003018186803b158015612e7757600080fd5b505afa158015612e8b573d6000803e3d6000fd5b505050506040513d6020811015612ea157600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b158015612c7757600080fd5b6112fe85858585855b612f0c856001600160a01b031661116f565b158015612f285750612f26846001600160a01b031661116f565b155b8015612f435750612f418161020063ffffffff61305116565b155b156130445760608251604051908082528060200260200182016040528015612f75578160200160208202803883390190505b50905060005b8351811015612fba57838181518110612f9057fe5b602002602001015160ff16828281518110612fa757fe5b6020908102919091010152600101612f7b565b50612fdc8673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee86848661305d565b60005b8351811015613022576008848281518110612ff657fe5b6020026020010151901c60ff1682828151811061300f57fe5b6020908102919091010152600101612fdf565b5061285873eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8647848661305d565b6112fe858585858561305d565b60006114268383611d61565b836001600160a01b0316856001600160a01b0316141561307c576112fe565b613084613d68565b50604080516080810182526131ee815261345660208201526135c591810191909152613a4b6060820152600080805b600481101561310c5760008682815181106130ca57fe5b60200260200101511115613104576130fe8682815181106130e757fe5b602002602001015184613cf090919063ffffffff16565b92508091505b6001016130b3565b506000821161314c5760405162461bcd60e51b815260040180806020018281038252602f815260200180613dc8602f913960400191505060405180910390fd5b8560005b60048110156131e25786818151811061316557fe5b60200260200101516000141561317a576131da565b60006131a6856110ff8a858151811061318f57fe5b60200260200101518c61142d90919063ffffffff16565b9050838214156131b35750815b80830392506131d78b8b838986600481106131ca57fe5b602002015163ffffffff16565b50505b600101613150565b50505050505050505050565b6000816132036001600160a01b03861661116f565b6133285760048054604080516303795fb160e11b81526001600160a01b03898116948201949094529051600093909216916306f2bf6291602480820192602092909190829003018186803b15801561325a57600080fd5b505afa15801561326e573d6000803e3d6000fd5b505050506040513d602081101561328457600080fd5b505190506001600160a01b03811615613326576132a18682611d73565b604080516395e3c50b60e01b8152600481018490526001602482015242604482015290516001600160a01b038316916395e3c50b9160648083019260209291908290030181600087803b1580156132f757600080fd5b505af115801561330b573d6000803e3d6000fd5b505050506040513d602081101561332157600080fd5b505191505b505b61333a846001600160a01b031661116f565b611ca85760048054604080516303795fb160e11b81526001600160a01b03888116948201949094529051600093909216916306f2bf6291602480820192602092909190829003018186803b15801561339157600080fd5b505afa1580156133a5573d6000803e3d6000fd5b505050506040513d60208110156133bb57600080fd5b505190506001600160a01b0381161561344d57806001600160a01b031663f39b5b9b836001426040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b15801561341d57600080fd5b505af1158015613431573d6000803e3d6000fd5b50505050506040513d602081101561344857600080fd5b505191505b50949350505050565b6003546000906134709085906001600160a01b0316611d73565b6003546001600160a01b03908116906329589f619061349090871661116f565b61349b57600061349d565b835b6134af876001600160a01b031661116f565b6134b957866134cf565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b856134e2886001600160a01b031661116f565b6134ec5787613502565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b604080516001600160e01b031960e088901b1681526001600160a01b039485166004820152602481019390935292166044820152306064820152600160ff1b6084820152600060a48201819052734d37f28d2db99e8d35a6c725a5f1749a085850a360c483015261010060e4830152610104820152905161014480830192602092919082900301818588803b15801561359a57600080fd5b505af11580156135ae573d6000803e3d6000fd5b50505050506040513d602081101561239b57600080fd5b60006135d9846001600160a01b031661116f565b1561364857600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561362e57600080fd5b505af1158015613642573d6000803e3d6000fd5b50505050505b60055460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156136a357600080fd5b505afa1580156136b7573d6000803e3d6000fd5b505050506040513d60208110156136cd57600080fd5b50516006549091506060906001600160a01b03908116906375e1cc82906136f590891661116f565b6136ff578761370c565b6002546001600160a01b03165b61371e886001600160a01b031661116f565b6137285787613735565b6002546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156137d157600080fd5b8101908080516040519392919084600160201b8211156137f057600080fd5b90830190602082018581111561380557600080fd5b82518660208202830111600160201b8211171561382157600080fd5b82525081516020918201928201910280838360005b8381101561384e578181015183820152602001613836565b50505050905001604052505050905061388f613872876001600160a01b031661116f565b61387c5786613889565b6002546001600160a01b03165b83611d73565b6000826001600160a01b031663c7ba24bc838760016040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156138ff5781810151838201526020016138e7565b50505050905001945050505050602060405180830381600087803b15801561392657600080fd5b505af115801561393a573d6000803e3d6000fd5b505050506040513d602081101561395057600080fd5b505190506139666001600160a01b03871661116f565b15613a4157600254604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b1580156139be57600080fd5b505afa1580156139d2573d6000803e3d6000fd5b505050506040513d60208110156139e857600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015613a2857600080fd5b505af1158015613a3c573d6000803e3d6000fd5b505050505b9695505050505050565b6000613a5f846001600160a01b031661116f565b15613ace57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015613ab457600080fd5b505af1158015613ac8573d6000803e3d6000fd5b50505050505b613b0b613ae3856001600160a01b031661116f565b613aed5784613afa565b6001546001600160a01b03165b6007546001600160a01b0316611d73565b6007546000906001600160a01b0390811690630621b4f690613b2e90881661116f565b613b385786613b45565b6001546001600160a01b03165b85613b58886001600160a01b031661116f565b613b625787613b6f565b6001546001600160a01b03165b604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015260248101939093529216604482015260016064820152905160848083019260209291908290030181600087803b158015613bcd57600080fd5b505af1158015613be1573d6000803e3d6000fd5b505050506040513d6020811015613bf757600080fd5b50519050613c0d6001600160a01b03851661116f565b15611ca857600154604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b158015613c6557600080fd5b505afa158015613c79573d6000803e3d6000fd5b505050506040513d6020811015613c8f57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015613ccf57600080fd5b505af1158015613ce3573d6000803e3d6000fd5b5050505090509392505050565b600082820183811015611426576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040518060c001604052806006906020820280388339509192915050565b60405180608001604052806004905b613d90815260200190600190039081613d775790505090565bfefe4f6e6553706c69743a2061637475616c2072657475726e20616d6f756e74206973206c657373207468616e206d696e52657475726e4f6e6553706c69743a20646973747269627574696f6e2073686f756c6420636f6e7461696e206e6f6e2d7a65726f73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582053bcc086e3773303a8ea498e3210523914b00172e5fb53e592f61670806639ae64736f6c6343000510003200000000000000000000000024b499e1cedea2a1fdada946ebc49b353b5c2053
Deployed Bytecode
0x60806040526004361061020f5760003560e01c8063851954fa11610118578063d77366a4116100a0578063f484966b1161006f578063f484966b1461068e578063f4b9fa751461072d578063f64a9a4914610742578063f69e204614610757578063fbe4ed951461076c5761020f565b8063d77366a414610587578063df9116631461059c578063e2a7515e146105b1578063eb16df2a146106795761020f565b8063a734f06e116100e7578063a734f06e1461051e578063a9d3589f14610533578063b69d045614610548578063c11f4f111461055d578063ceb54115146105725761020f565b8063851954fa146104ca5780638bdb2afa146104df5780638c6c11f2146104f4578063a1b4d011146105095761020f565b80635cfcee281161019b57806372b6f1bf1161016a57806372b6f1bf1461044357806373eb69d414610476578063819faf7b1461048b57806383366577146104a057806383a0118f146104b55761020f565b80635cfcee28146103bc5780636b5a4ca2146103d15780636b9589aa146103e6578063702bf8fa1461042e5761020f565b80633c1a62dc116101e25780633c1a62dc146103355780634037f9671461034a5780634b57b0be1461037d5780634c914a4e1461039257806358886253146103a75761020f565b8063085e2c5b1461021e57806311c0c0f7146102c857806312dea160146102ef5780631388b42014610320575b3332141561021c57600080fd5b005b34801561022a57600080fd5b5061026d600480360360a081101561024157600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135610781565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156102b357818101518382015260200161029b565b50505050905001935050505060405180910390f35b3480156102d457600080fd5b506102dd6108c9565b60408051918252519081900360200190f35b3480156102fb57600080fd5b506103046108cf565b604080516001600160a01b039092168252519081900360200190f35b34801561032c57600080fd5b506103046108de565b34801561034157600080fd5b506102dd6108ed565b34801561035657600080fd5b506103046004803603602081101561036d57600080fd5b50356001600160a01b03166108f2565b34801561038957600080fd5b50610304610c6a565b34801561039e57600080fd5b506102dd610c79565b3480156103b357600080fd5b506102dd610c7e565b3480156103c857600080fd5b506102dd610c84565b3480156103dd57600080fd5b50610304610c89565b61021c600480360360c08110156103fc57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a00135610c98565b34801561043a57600080fd5b506102dd610cc1565b34801561044f57600080fd5b506103046004803603602081101561046657600080fd5b50356001600160a01b0316610cc9565b34801561048257600080fd5b506102dd610f19565b34801561049757600080fd5b50610304610f1f565b3480156104ac57600080fd5b506102dd610f2e565b3480156104c157600080fd5b506102dd610f33565b3480156104d657600080fd5b50610304610f39565b3480156104eb57600080fd5b50610304610f48565b34801561050057600080fd5b506102dd610f57565b34801561051557600080fd5b50610304610f5c565b34801561052a57600080fd5b50610304610f6b565b34801561053f57600080fd5b506102dd610f83565b34801561055457600080fd5b50610304610f8c565b34801561056957600080fd5b50610304610f9b565b34801561057e57600080fd5b506102dd610faa565b34801561059357600080fd5b50610304610faf565b3480156105a857600080fd5b506102dd610fbe565b61021c600480360360c08110156105c757600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561060657600080fd5b82018360208201111561061857600080fd5b803590602001918460208302840111600160201b8311171561063957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610fc7915050565b34801561068557600080fd5b506102dd6110a4565b34801561069a57600080fd5b506106dd600480360360a08110156106b157600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356110a9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610719578181015183820152602001610701565b505050509050019250505060405180910390f35b34801561073957600080fd5b5061030461113d565b34801561074e57600080fd5b506102dd61114c565b34801561076357600080fd5b50610304611151565b34801561077857600080fd5b50610304611160565b600e546040805163085e2c5b60e01b81526001600160a01b03888116600483015287811660248301526044820187905260648201869052608482018590529151600093606093169163085e2c5b9160a48083019287929190829003018186803b1580156107ed57600080fd5b505afa158015610801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561082a57600080fd5b815160208301805160405192949293830192919084600160201b82111561085057600080fd5b90830190602082018581111561086557600080fd5b82518660208202830111600160201b8211171561088157600080fd5b82525081516020918201928201910280838360005b838110156108ae578181015183820152602001610896565b50505050905001604052505050915091509550959350505050565b61010081565b6005546001600160a01b031681565b6007546001600160a01b031681565b602081565b6000610906826001600160a01b031661116f565b156109145750600019610c65565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b6020831061097f5780518252601f199092019160209182019101610960565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146109e0576040519150601f19603f3d011682016040523d82523d6000602084013e6109e5565b606091505b5091509150816109fb5760001992505050610c65565b6000805b6007835103811015610b5457828160000181518110610a1a57fe5b6020910101516001600160f81b031916602360f91b148015610a5d5750828160010181518110610a4657fe5b6020910101516001600160f81b031916607560f81b145b8015610a8a5750828160020181518110610a7357fe5b6020910101516001600160f81b031916601b60fa1b145b8015610ab75750828160030181518110610aa057fe5b6020910101516001600160f81b031916606360f81b145b8015610ae45750828160040181518110610acd57fe5b6020910101516001600160f81b031916603960f91b145b8015610b115750828160050181518110610afa57fe5b6020910101516001600160f81b031916607560f81b145b8015610b3e5750828160060181518110610b2757fe5b6020910101516001600160f81b031916606d60f81b145b15610b4c5760019150610b54565b6001016109ff565b5080610b67576000199350505050610c65565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b60208310610bca5780518252601f199092019160209182019101610bab565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114610c2b576040519150601f19603f3d011682016040523d82523d6000602084013e610c30565b606091505b50909350915082610c48576000199350505050610c65565b818060200190516020811015610c5d57600080fd5b505193505050505b919050565b6001546001600160a01b031681565b604081565b61020081565b601081565b600a546001600160a01b031681565b6060610ca78787878686610781565b915050610cb8878787878587610fc7565b50505050505050565b600160201b81565b6000610cdd826001600160a01b031661116f565b15610ceb5750600019610c65565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610d565780518252601f199092019160209182019101610d37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114610db7576040519150601f19603f3d011682016040523d82523d6000602084013e610dbc565b606091505b509150915081610dd25760001992505050610c65565b6000805b6004835103811015610ea457828160000181518110610df157fe5b6020910101516001600160f81b031916604160f81b148015610e345750828160010181518110610e1d57fe5b6020910101516001600160f81b031916606160f81b145b8015610e615750828160020181518110610e4a57fe5b6020910101516001600160f81b031916603b60f91b145b8015610e8e5750828160030181518110610e7757fe5b6020910101516001600160f81b031916606560f81b145b15610e9c5760019150610ea4565b600101610dd6565b5080610eb7576000199350505050610c65565b60408051600481526024810182526020810180516001600160e01b0316632274683f60e21b178152915181516001600160a01b0389169361138893929182919080838360208310610bca5780518252601f199092019160209182019101610bab565b61080081565b600b546001600160a01b031681565b608081565b61040081565b6002546001600160a01b031681565b6004546001600160a01b031681565b600881565b600d546001600160a01b031681565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b64040000000081565b6008546001600160a01b031681565b6009546001600160a01b031681565b600281565b6003546001600160a01b031681565b64020000000081565b610fe26001600160a01b03871633308763ffffffff6111a916565b610fef86868685856112d2565b600061100a6001600160a01b0387163063ffffffff61130516565b90508381101561104b5760405162461bcd60e51b8152600401808060200182810382526035815260200180613d936035913960400191505060405180910390fd5b6110656001600160a01b038716338363ffffffff6113af16565b5061109a336110836001600160a01b038a163063ffffffff61130516565b6001600160a01b038a16919063ffffffff6113af16565b5050505050505050565b600181565b6060826040519080825280602002602001820160405280156110d5578160200160208202803883390190505b50905060005b8381101561113357611113878761110b876110ff8a6001880163ffffffff61142d16565b9063ffffffff61148616565b600187610781565b5082828151811061112057fe5b60209081029190910101526001016110db565b5095945050505050565b6000546001600160a01b031681565b600481565b600c546001600160a01b031681565b600e546001600160a01b031681565b60006001600160a01b03821615806111a357506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b92915050565b806111b3576112cc565b6111bc8461116f565b156112b1576001600160a01b038316331480156111d95750803410155b61121e576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014611266576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611264573d6000803e3d6000fd5b505b803411156112ac57336108fc611282348463ffffffff6114c816565b6040518115909202916000818181858888f193505050501580156112aa573d6000803e3d6000fd5b505b6112cc565b6112cc6001600160a01b03851684848463ffffffff61150a16565b50505050565b836001600160a01b0316856001600160a01b031614156112f1576112fe565b6112fe8585858585611564565b5050505050565b60006113108361116f565b1561132657506001600160a01b038116316111a3565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561137c57600080fd5b505afa158015611390573d6000803e3d6000fd5b505050506040513d60208110156113a657600080fd5b50519392505050565b6000816113be57506001611426565b6113c78461116f565b15611408576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611402573d6000803e3d6000fd5b50611426565b6114226001600160a01b038516848463ffffffff61157116565b5060015b9392505050565b60008261143c575060006111a3565b8282028284828161144957fe5b04146114265760405162461bcd60e51b8152600401808060200182810382526021815260200180613df76021913960400191505060405180910390fd5b600061142683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506115c8565b600061142683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061166a565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526112cc9085906116c4565b6112fe858585858561187c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115c39084906116c4565b505050565b600081836116545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611619578181015183820152602001611601565b50505050905090810190601f1680156116465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161166057fe5b0495945050505050565b600081848411156116bc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611619578181015183820152602001611601565b505050900390565b6116d6826001600160a01b0316611c74565b611727576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106117655780518252601f199092019160209182019101611746565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146117c7576040519150601f19603f3d011682016040523d82523d6000602084013e6117cc565b606091505b509150915081611823576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156112cc5780806020019051602081101561183f57600080fd5b50516112cc5760405162461bcd60e51b815260040180806020018281038252602a815260200180613e18602a913960400191505060405180910390fd5b836001600160a01b0316856001600160a01b0316141561189b576112fe565b6118a3613d4a565b6118ab611cb0565b90506118bf8261080063ffffffff611d6116565b15611c5f5760005b6006811015611a7f578181600681106118dc57fe5b60200201516001600160a01b0316876001600160a01b03161415611a7757600082826006811061190857fe5b60200201516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561194557600080fd5b505afa158015611959573d6000803e3d6000fd5b505050506040513d602081101561196f57600080fd5b5051905082826006811061197f57fe5b60200201516001600160a01b0316632e1a7d4d876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119c957600080fd5b505af11580156119dd573d6000803e3d6000fd5b50505050611a6f8188836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611a3c57600080fd5b505afa158015611a50573d6000803e3d6000fd5b505050506040513d6020811015611a6657600080fd5b5051888861187c565b5050506112fe565b6001016118c7565b5060005b6006811015611c5d57818160068110611a9857fe5b60200201516001600160a01b0316866001600160a01b03161415611c55576000828260068110611ac457fe5b60200201516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0157600080fd5b505afa158015611b15573d6000803e3d6000fd5b505050506040513d6020811015611b2b57600080fd5b50519050611b3c8882888888611d66565b611b5681848460068110611b4c57fe5b6020020151611d73565b828260068110611b6257fe5b60200201516001600160a01b031663b6b55f25826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611bcb57600080fd5b505afa158015611bdf573d6000803e3d6000fd5b505050506040513d6020811015611bf557600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015611c3557600080fd5b505af1158015611c49573d6000803e3d6000fd5b505050505050506112fe565b600101611a83565b505b611c6c8686868686611d66565b505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611ca857508115155b949350505050565b611cb8613d4a565b506040805160c0810182527316de59092dae5ccf4a1e6439d611fd0653f0bd0181527304aa51bbcb46541455ccf1b8bef2ebc5d3787ec960208201527373a052500105205d34daf004eab301916da8190f918101919091527383f798e925bcd4017eb265844fddabb448f1707d606082015273d6ad7a6750a7593e092a9b218d66c0a814a3436e608082015273f61718057901f84c4eec4339ef8f0d86d2b4560060a082015290565b161590565b6112fe8585858585611e2c565b611d85826001600160a01b031661116f565b611e285760408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915160ff9285169163dd62ed3e916044808301926020929190829003018186803b158015611dda57600080fd5b505afa158015611dee573d6000803e3d6000fd5b505050506040513d6020811015611e0457600080fd5b5051901c611e2857611e286001600160a01b0383168260001963ffffffff61207a16565b5050565b836001600160a01b0316856001600160a01b03161415611e4b576112fe565b611e5c81601063ffffffff611d6116565b1561206d57611e6a8561214b565b15611f20576000611e7a8661227e565b9050856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611ec257600080fd5b505af1158015611ed6573d6000803e3d6000fd5b505050506040513d6020811015611eec57600080fd5b5060009050611f0a6001600160a01b0383163063ffffffff61130516565b9050611f198287838787611e2c565b50506112fe565b611f298461214b565b1561206d576000611f398561227e565b9050611f4886828686866123a5565b6000611f636001600160a01b0383163063ffffffff61130516565b9050611f77826001600160a01b031661116f565b15611fea57600d60009054906101000a90046001600160a01b03166001600160a01b0316631249c58b826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611fcc57600080fd5b505af1158015611fe0573d6000803e3d6000fd5b5050505050611f19565b611ff48287611d73565b856001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561203a57600080fd5b505af115801561204e573d6000803e3d6000fd5b505050506040513d602081101561206457600080fd5b505050506112fe565b6112fe85858585856123a5565b6120838361116f565b6115c357600081118015612111575060408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b1580156120e357600080fd5b505afa1580156120f7573d6000803e3d6000fd5b505050506040513d602081101561210d57600080fd5b5051115b15612131576121316001600160a01b03841683600063ffffffff6123b216565b6115c36001600160a01b038416838363ffffffff6123b216565b600d546000906001600160a01b038381169116141561216c57506001610c65565b600c54604080516001600160a01b0385811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638e8f294b60e01b17815292518251600095606095931693611388939092918291908083835b602083106121ec5780518252601f1990920191602091820191016121cd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461224d576040519150601f19603f3d011682016040523d82523d6000602084013e612252565b606091505b50915091508161226757600092505050610c65565b6000818060200190516040811015610c5d57600080fd5b600d546000906001600160a01b038381169116141561229f57506000610c65565b60408051600481526024810182526020810180516001600160e01b0316636f307dc360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b6020831061230a5780518252601f1990920191602091820191016122eb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461236b576040519150601f19603f3d011682016040523d82523d6000602084013e612370565b606091505b5091509150816123865760001992505050610c65565b80806020019051602081101561239b57600080fd5b5051949350505050565b6112fe85858585856124c5565b801580612438575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561240a57600080fd5b505afa15801561241e573d6000803e3d6000fd5b505050506040513d602081101561243457600080fd5b5051155b6124735760405162461bcd60e51b8152600401808060200182810382526036815260200180613e426036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526115c39084906116c4565b836001600160a01b0316856001600160a01b031614156124e4576112fe565b6124f581602063ffffffff611d6116565b15612789576000612505866108f2565b90506001600160a01b038082161461265557612529816001600160a01b031661116f565b156125af576040805163081a6b2560e41b81523060048201526024810186905290516001600160a01b038816916381a6b2509160448083019260209291908290030181600087803b15801561257d57600080fd5b505af1158015612591573d6000803e3d6000fd5b505050506040513d60208110156125a757600080fd5b5061262b9050565b60408051632770a7eb60e21b81523060048201526024810186905290516001600160a01b03881691639dc29fac9160448083019260209291908290030181600087803b1580156125fe57600080fd5b505af1158015612612573d6000803e3d6000fd5b505050506040513d602081101561262857600080fd5b50505b60006126466001600160a01b0383163063ffffffff61130516565b9050611f198287838787612792565b61265e856108f2565b90506001600160a01b03808216146127875761267d8682868686612792565b60006126986001600160a01b0383163063ffffffff61130516565b90506126ac826001600160a01b031661116f565b1561272e5760408051638f6ede1f60e01b815230600482015290516001600160a01b03881691638f6ede1f91849160248082019260209290919082900301818588803b1580156126fb57600080fd5b505af115801561270f573d6000803e3d6000fd5b50505050506040513d602081101561272657600080fd5b50611f199050565b6127388287611d73565b604080516340c10f1960e01b81523060048201526024810183905290516001600160a01b038816916340c10f199160448083019260209291908290030181600087803b15801561203a57600080fd5b505b6112fe85858585855b6112fe85858585855b836001600160a01b0316856001600160a01b031614156127ba576112fe565b6127cb81608063ffffffff611d6116565b156129dc5760006127db86610cc9565b90506001600160a01b038082161461285e57856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561283357600080fd5b505af1158015612847573d6000803e3d6000fd5b50505050612858818686868661279b565b506112fe565b61286785610cc9565b90506001600160a01b03808216146129da5761288686828686866129e5565b60006128a16001600160a01b0383163063ffffffff61130516565b905061292682600b60009054906101000a90046001600160a01b03166001600160a01b031663f2f4eb266040518163ffffffff1660e01b815260040160206040518083038186803b1580156128f557600080fd5b505afa158015612909573d6000803e3d6000fd5b505050506040513d602081101561291f57600080fd5b5051611d73565b600b546001600160a01b039081169063d2d0e0669061294690851661116f565b612951576000612953565b825b612965856001600160a01b031661116f565b61296f5784612985565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b604080516001600160e01b031960e086901b1681526001600160a01b0390921660048301526024820186905261044d604483015251606480830192600092919082900301818588803b158015611c3557600080fd5b505b6112fe85858585855b836001600160a01b0316856001600160a01b03161415612a04576112fe565b612a168161040063ffffffff611d6116565b15612c8b576009546001600160a01b0386811691161415612b6c5760095460408051637f8661a160e01b81526004810186905290516001600160a01b0390921691637f8661a19160248082019260009290919082900301818387803b158015612a7e57600080fd5b505af1158015612a92573d6000803e3d6000fd5b5050600a54604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d6020811015612b0d57600080fd5b505190508015612b5357600a54606090612b34906001600160a01b03168784600187610781565b600a54909250612b5191506001600160a01b0316878484876112d2565b505b600054612858906001600160a01b031686868686612c94565b6009546001600160a01b0385811691161415612c8b57600054612b9c9086906001600160a01b0316858585612c94565b600054600954612bb8916001600160a01b039081169116611d73565b600954600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363049878f39316916370a08231916024808301926020929190829003018186803b158015612c0d57600080fd5b505afa158015612c21573d6000803e3d6000fd5b505050506040513d6020811015612c3757600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015612c7757600080fd5b505af1158015612064573d6000803e3d6000fd5b6112fe85858585855b836001600160a01b0316856001600160a01b03161415612cb3576112fe565b612cc481604063ffffffff611d6116565b15612ef1576008546001600160a01b0386811691161415612dd4576008546040805163ef693bed60e01b81523060048201526024810186905290516001600160a01b039092169163ef693bed9160448082019260009290919082900301818387803b158015612d3257600080fd5b505af1158015612d46573d6000803e3d6000fd5b5050600054604080516370a0823160e01b81523060048201529051612dcf94506001600160a01b039092169250879183916370a08231916024808301926020929190829003018186803b158015612d9c57600080fd5b505afa158015612db0573d6000803e3d6000fd5b505050506040513d6020811015612dc657600080fd5b50518585612efa565b6112fe565b6008546001600160a01b0385811691161415612ef157600054612e049086906001600160a01b0316858585612efa565b600054600854612e20916001600160a01b039081169116611d73565b600854600054604080516370a0823160e01b8152306004820181905291516001600160a01b0394851694633b4da69f9416916370a08231916024808301926020929190829003018186803b158015612e7757600080fd5b505afa158015612e8b573d6000803e3d6000fd5b505050506040513d6020811015612ea157600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b158015612c7757600080fd5b6112fe85858585855b612f0c856001600160a01b031661116f565b158015612f285750612f26846001600160a01b031661116f565b155b8015612f435750612f418161020063ffffffff61305116565b155b156130445760608251604051908082528060200260200182016040528015612f75578160200160208202803883390190505b50905060005b8351811015612fba57838181518110612f9057fe5b602002602001015160ff16828281518110612fa757fe5b6020908102919091010152600101612f7b565b50612fdc8673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee86848661305d565b60005b8351811015613022576008848281518110612ff657fe5b6020026020010151901c60ff1682828151811061300f57fe5b6020908102919091010152600101612fdf565b5061285873eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8647848661305d565b6112fe858585858561305d565b60006114268383611d61565b836001600160a01b0316856001600160a01b0316141561307c576112fe565b613084613d68565b50604080516080810182526131ee815261345660208201526135c591810191909152613a4b6060820152600080805b600481101561310c5760008682815181106130ca57fe5b60200260200101511115613104576130fe8682815181106130e757fe5b602002602001015184613cf090919063ffffffff16565b92508091505b6001016130b3565b506000821161314c5760405162461bcd60e51b815260040180806020018281038252602f815260200180613dc8602f913960400191505060405180910390fd5b8560005b60048110156131e25786818151811061316557fe5b60200260200101516000141561317a576131da565b60006131a6856110ff8a858151811061318f57fe5b60200260200101518c61142d90919063ffffffff16565b9050838214156131b35750815b80830392506131d78b8b838986600481106131ca57fe5b602002015163ffffffff16565b50505b600101613150565b50505050505050505050565b6000816132036001600160a01b03861661116f565b6133285760048054604080516303795fb160e11b81526001600160a01b03898116948201949094529051600093909216916306f2bf6291602480820192602092909190829003018186803b15801561325a57600080fd5b505afa15801561326e573d6000803e3d6000fd5b505050506040513d602081101561328457600080fd5b505190506001600160a01b03811615613326576132a18682611d73565b604080516395e3c50b60e01b8152600481018490526001602482015242604482015290516001600160a01b038316916395e3c50b9160648083019260209291908290030181600087803b1580156132f757600080fd5b505af115801561330b573d6000803e3d6000fd5b505050506040513d602081101561332157600080fd5b505191505b505b61333a846001600160a01b031661116f565b611ca85760048054604080516303795fb160e11b81526001600160a01b03888116948201949094529051600093909216916306f2bf6291602480820192602092909190829003018186803b15801561339157600080fd5b505afa1580156133a5573d6000803e3d6000fd5b505050506040513d60208110156133bb57600080fd5b505190506001600160a01b0381161561344d57806001600160a01b031663f39b5b9b836001426040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b15801561341d57600080fd5b505af1158015613431573d6000803e3d6000fd5b50505050506040513d602081101561344857600080fd5b505191505b50949350505050565b6003546000906134709085906001600160a01b0316611d73565b6003546001600160a01b03908116906329589f619061349090871661116f565b61349b57600061349d565b835b6134af876001600160a01b031661116f565b6134b957866134cf565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b856134e2886001600160a01b031661116f565b6134ec5787613502565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b604080516001600160e01b031960e088901b1681526001600160a01b039485166004820152602481019390935292166044820152306064820152600160ff1b6084820152600060a48201819052734d37f28d2db99e8d35a6c725a5f1749a085850a360c483015261010060e4830152610104820152905161014480830192602092919082900301818588803b15801561359a57600080fd5b505af11580156135ae573d6000803e3d6000fd5b50505050506040513d602081101561239b57600080fd5b60006135d9846001600160a01b031661116f565b1561364857600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561362e57600080fd5b505af1158015613642573d6000803e3d6000fd5b50505050505b60055460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b1580156136a357600080fd5b505afa1580156136b7573d6000803e3d6000fd5b505050506040513d60208110156136cd57600080fd5b50516006549091506060906001600160a01b03908116906375e1cc82906136f590891661116f565b6136ff578761370c565b6002546001600160a01b03165b61371e886001600160a01b031661116f565b6137285787613735565b6002546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156137d157600080fd5b8101908080516040519392919084600160201b8211156137f057600080fd5b90830190602082018581111561380557600080fd5b82518660208202830111600160201b8211171561382157600080fd5b82525081516020918201928201910280838360005b8381101561384e578181015183820152602001613836565b50505050905001604052505050905061388f613872876001600160a01b031661116f565b61387c5786613889565b6002546001600160a01b03165b83611d73565b6000826001600160a01b031663c7ba24bc838760016040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156138ff5781810151838201526020016138e7565b50505050905001945050505050602060405180830381600087803b15801561392657600080fd5b505af115801561393a573d6000803e3d6000fd5b505050506040513d602081101561395057600080fd5b505190506139666001600160a01b03871661116f565b15613a4157600254604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b1580156139be57600080fd5b505afa1580156139d2573d6000803e3d6000fd5b505050506040513d60208110156139e857600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015613a2857600080fd5b505af1158015613a3c573d6000803e3d6000fd5b505050505b9695505050505050565b6000613a5f846001600160a01b031661116f565b15613ace57600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015613ab457600080fd5b505af1158015613ac8573d6000803e3d6000fd5b50505050505b613b0b613ae3856001600160a01b031661116f565b613aed5784613afa565b6001546001600160a01b03165b6007546001600160a01b0316611d73565b6007546000906001600160a01b0390811690630621b4f690613b2e90881661116f565b613b385786613b45565b6001546001600160a01b03165b85613b58886001600160a01b031661116f565b613b625787613b6f565b6001546001600160a01b03165b604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015260248101939093529216604482015260016064820152905160848083019260209291908290030181600087803b158015613bcd57600080fd5b505af1158015613be1573d6000803e3d6000fd5b505050506040513d6020811015613bf757600080fd5b50519050613c0d6001600160a01b03851661116f565b15611ca857600154604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b158015613c6557600080fd5b505afa158015613c79573d6000803e3d6000fd5b505050506040513d6020811015613c8f57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015613ccf57600080fd5b505af1158015613ce3573d6000803e3d6000fd5b5050505090509392505050565b600082820183811015611426576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040518060c001604052806006906020820280388339509192915050565b60405180608001604052806004905b613d90815260200190600190039081613d775790505090565bfefe4f6e6553706c69743a2061637475616c2072657475726e20616d6f756e74206973206c657373207468616e206d696e52657475726e4f6e6553706c69743a20646973747269627574696f6e2073686f756c6420636f6e7461696e206e6f6e2d7a65726f73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582053bcc086e3773303a8ea498e3210523914b00172e5fb53e592f61670806639ae64736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000024b499e1cedea2a1fdada946ebc49b353b5c2053
-----Decoded View---------------
Arg [0] : _oneSplitView (address): 0x24b499E1CedEA2a1fDadA946EBc49B353b5C2053
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000024b499e1cedea2a1fdada946ebc49b353b5c2053
Deployed Bytecode Sourcemap
81330:3691:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36566:10;36580:9;36566:23;;36558:32;;;;;;81330:3691;81710:656;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81710:656:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;81710:656:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;81710:656:0;;;;;;;;;;;;;;;;;;3707:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3707:48:0;;;:::i;:::-;;;;;;;;;;;;;;;;26355:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26355:123:0;;;:::i;:::-;;;;-1:-1:-1;;;;;26355:123:0;;;;;;;;;;;;;;26611:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26611:96:0;;;:::i;3563:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3563:43:0;;;:::i;53433:1205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53433:1205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53433:1205:0;-1:-1:-1;;;;;53433:1205:0;;:::i;25939:74::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25939:74:0;;;:::i;3613:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3613:40:0;;;:::i;3762:51::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3762:51:0;;;:::i;3512:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3512:44:0;;;:::i;66332:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66332:70:0;;;:::i;83756:700::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;83756:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3130:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3130:64:0;;;:::i;75143:1091::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;75143:1091:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;75143:1091:0;-1:-1:-1;;;;;75143:1091:0;;:::i;3893:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3893:42:0;;;:::i;75043:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;75043:91:0;;;:::i;3660:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3660:40:0;;;:::i;3845:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3845:41:0;;;:::i;26020:105::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26020:105:0;;;:::i;26249:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26249:99:0;;;:::i;3464:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3464:41:0;;;:::i;45139:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45139:87:0;;;:::i;25766:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25766:87:0;;;:::i;3320:63::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3320:63:0;;;:::i;63174:69::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63174:69:0;;;:::i;66256:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66256:69:0;;;:::i;3082:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3082:41:0;;;:::i;26134:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26134:108:0;;;:::i;3226:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3226:62:0;;;:::i;82374:827::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;82374:827:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;82374:827:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;82374:827:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;82374:827:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;82374:827:0;;-1:-1:-1;;82374:827:0;;;-1:-1:-1;82374:827:0;;-1:-1:-1;;82374:827:0:i;3032:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3032:43:0;;;:::i;84487:531::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84487:531:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;84487:531:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;84487:531:0;;;;;;;;;;;;;;;;;25862:70;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25862:70:0;;;:::i;3415:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3415:42:0;;;:::i;45051:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45051:81:0;;;:::i;81565:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81565:33:0;;;:::i;81710:656::-;82203:12;;:155;;;-1:-1:-1;;;82203:155:0;;-1:-1:-1;;;;;82203:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82069:20;;82104:29;;82203:12;;:30;;:155;;;;;82069:20;;82203:155;;;;;;;:12;:155;;;5:2:-1;;;;30:1;27;20:12;5:2;82203:155:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;82203:155:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;82203:155:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;;;5:11;;2:2;;;29:1;26;19:12;2:2;82203:155:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;82203:155:0;;421:4:-1;412:14;;;;82203:155:0;;;;;412:14:-1;82203:155:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;82203:155:0;;;;;;;;;;;82196:162;;;;81710:656;;;;;;;;:::o;3707:48::-;3750:5;3707:48;:::o;26355:123::-;;;-1:-1:-1;;;;;26355:123:0;;:::o;26611:96::-;;;-1:-1:-1;;;;;26611:96:0;;:::o;3563:43::-;3602:4;3563:43;:::o;53433:1205::-;53492:6;53515:13;:5;-1:-1:-1;;;;;53515:11:0;;:13::i;:::-;53511:63;;;-1:-1:-1;;;53545:17:0;;53511:63;53658:91;;;22:32:-1;6:49;;53658:91:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;53622:128:0;;;;53587:12;;53601:17;;-1:-1:-1;;;;;53622:25:0;;;53652:4;;53658:91;;53622:128;;;;25:18:-1;53622:128:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;53622:128:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;53586:164:0;;;;53766:7;53761:58;;-1:-1:-1;;53790:17:0;;;;;;53761:58;53831:13;;53863:414;53898:1;53884:4;:11;:15;53880:1;:19;53863:414;;;53925:4;53930:1;53934;53930:5;53925:11;;;;;;;;;;;;;-1:-1:-1;;;;;;53925:11:0;-1:-1:-1;;;53925:18:0;:57;;;;;53964:4;53969:1;53973;53969:5;53964:11;;;;;;;;;;;;;-1:-1:-1;;;;;;53964:11:0;-1:-1:-1;;;53964:18:0;53925:57;:96;;;;;54003:4;54008:1;54012;54008:5;54003:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54003:11:0;-1:-1:-1;;;54003:18:0;53925:96;:135;;;;;54042:4;54047:1;54051;54047:5;54042:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54042:11:0;-1:-1:-1;;;54042:18:0;53925:135;:174;;;;;54081:4;54086:1;54090;54086:5;54081:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54081:11:0;-1:-1:-1;;;54081:18:0;53925:174;:213;;;;;54120:4;54125:1;54129;54125:5;54120:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54120:11:0;-1:-1:-1;;;54120:18:0;53925:213;:252;;;;;54159:4;54164:1;54168;54164:5;54159:11;;;;;;;;;;;;;-1:-1:-1;;;;;;54159:11:0;-1:-1:-1;;;54159:18:0;53925:252;53921:345;;;54222:4;54211:15;;54245:5;;53921:345;53901:3;;53863:414;;;;54292:8;54287:59;;-1:-1:-1;;54317:17:0;;;;;;;54287:59;54412:103;;;22:32:-1;6:49;;54412:103:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;54376:140:0;;;;-1:-1:-1;;;;;54376:25:0;;;54406:4;;54412:103;54376:140;;;25:18:-1;54376:140:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;54376:140:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;54358:158:0;;-1:-1:-1;54358:158:0;-1:-1:-1;54358:158:0;54527:58;;-1:-1:-1;;54556:17:0;;;;;;;54527:58;54615:4;54604:26;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54604:26:0;;-1:-1:-1;;;;53433:1205:0;;;;:::o;25939:74::-;;;-1:-1:-1;;;;;25939:74:0;;:::o;3613:40::-;3649:4;3613:40;:::o;3762:51::-;3808:5;3762:51;:::o;3512:44::-;3552:4;3512:44;:::o;66332:70::-;;;-1:-1:-1;;;;;66332:70:0;;:::o;83756:700::-;84102:29;84135:142;84167:9;84191:7;84213:6;84234:5;84254:12;84135:17;:142::i;:::-;84099:178;;;84288:160;84307:9;84331:7;84353:6;84374:9;84398:12;84425;84288:4;:160::i;:::-;83756:700;;;;;;;:::o;3130:64::-;-1:-1:-1;;;3130:64:0;:::o;75143:1091::-;75199:6;75222:13;:5;-1:-1:-1;;;;;75222:11:0;;:13::i;:::-;75218:63;;;-1:-1:-1;;;75252:17:0;;75218:63;75365:91;;;22:32:-1;6:49;;75365:91:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;75329:128:0;;;;75294:12;;75308:17;;-1:-1:-1;;;;;75329:25:0;;;75359:4;;75365:91;;75329:128;;;;25:18:-1;75329:128:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;75329:128:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;75293:164:0;;;;75473:7;75468:58;;-1:-1:-1;;75497:17:0;;;;;;75468:58;75538:14;;75571:298;75606:1;75592:4;:11;:15;75588:1;:19;75571:298;;;75633:4;75638:1;75642;75638:5;75633:11;;;;;;;;;;;;;-1:-1:-1;;;;;;75633:11:0;-1:-1:-1;;;75633:18:0;:57;;;;;75672:4;75677:1;75681;75677:5;75672:11;;;;;;;;;;;;;-1:-1:-1;;;;;;75672:11:0;-1:-1:-1;;;75672:18:0;75633:57;:96;;;;;75711:4;75716:1;75720;75716:5;75711:11;;;;;;;;;;;;;-1:-1:-1;;;;;;75711:11:0;-1:-1:-1;;;75711:18:0;75633:96;:135;;;;;75750:4;75755:1;75759;75755:5;75750:11;;;;;;;;;;;;;-1:-1:-1;;;;;;75750:11:0;-1:-1:-1;;;75750:18:0;75633:135;75629:229;;;75814:4;75802:16;;75837:5;;75629:229;75609:3;;75571:298;;;;75884:9;75879:60;;-1:-1:-1;;75910:17:0;;;;;;;75879:60;76005:106;;;22:32:-1;6:49;;76005:106:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;75969:143:0;;;;-1:-1:-1;;;;;75969:25:0;;;75999:4;;76005:106;75969:143;;;25:18:-1;75969:143:0;;25:18:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;3893:42:0;3930:5;3893:42;:::o;75043:91::-;;;-1:-1:-1;;;;;75043:91:0;;:::o;3660:40::-;3696:4;3660:40;:::o;3845:41::-;3881:5;3845:41;:::o;26020:105::-;;;-1:-1:-1;;;;;26020:105:0;;:::o;26249:99::-;;;-1:-1:-1;;;;;26249:99:0;;:::o;3464:41::-;3501:4;3464:41;:::o;45139:87::-;;;-1:-1:-1;;;;;45139:87:0;;:::o;25766:::-;25810:42;25766:87;:::o;3320:63::-;3372:11;3320:63;:::o;63174:69::-;;;-1:-1:-1;;;;;63174:69:0;;:::o;66256:::-;;;-1:-1:-1;;;;;66256:69:0;;:::o;3082:41::-;3119:4;3082:41;:::o;26134:108::-;;;-1:-1:-1;;;;;26134:108:0;;:::o;3226:62::-;3277:11;3226:62;:::o;82374:827::-;82717:66;-1:-1:-1;;;;;82717:31:0;;82749:10;82769:4;82776:6;82717:66;:31;:66;:::i;:::-;82796:61;82802:9;82813:7;82822:6;82830:12;82844;82796:5;:61::i;:::-;82870:20;82893:41;-1:-1:-1;;;;;82893:26:0;;82928:4;82893:41;:26;:41;:::i;:::-;82870:64;;82969:9;82953:12;:25;;82945:91;;;;-1:-1:-1;;;82945:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83047:51;-1:-1:-1;;;;;83047:25:0;;83073:10;83085:12;83047:51;:25;:51;:::i;:::-;-1:-1:-1;83109:84:0;83137:10;83149:43;-1:-1:-1;;;;;83149:28:0;;83186:4;83149:43;:28;:43;:::i;:::-;-1:-1:-1;;;;;83109:27:0;;;:84;;:27;:84;:::i;:::-;;82374:827;;;;;;;:::o;3032:43::-;3071:4;3032:43;:::o;84487:531::-;84673:24;84734:5;84720:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;84720:20:0;-1:-1:-1;84710:30:0;-1:-1:-1;84756:6:0;84751:260;84772:5;84768:1;:9;84751:260;;;84815:184;84851:9;84879:7;84905:28;84927:5;84905:17;:6;84920:1;84916:5;;84905:17;:10;:17;:::i;:::-;:21;:28;:21;:28;:::i;:::-;84952:1;84972:12;84815:17;:184::i;:::-;84799:200;84800:7;84808:1;84800:10;;;;;;;;;;;;;;;;;84799:200;84779:3;;84751:260;;;;84487:531;;;;;;;:::o;25862:70::-;;;-1:-1:-1;;;;;25862:70:0;;:::o;3415:42::-;3453:4;3415:42;:::o;45051:81::-;;;-1:-1:-1;;;;;45051:81:0;;:::o;81565:33::-;;;-1:-1:-1;;;;;81565:33:0;;:::o;24744:166::-;24795:4;-1:-1:-1;;;;;24820:39:0;;;;:81;;-1:-1:-1;;;;;;24863:38:0;;22653:42;24863:38;24820:81;24812:90;24744:166;-1:-1:-1;;24744:166:0:o;23061:591::-;23172:11;23168:50;;23200:7;;23168:50;23234:12;23240:5;23234;:12::i;:::-;23230:415;;;-1:-1:-1;;;;;23271:18:0;;23279:10;23271:18;:41;;;;;23306:6;23293:9;:19;;23271:41;23263:71;;;;;-1:-1:-1;;;23263:71:0;;;;;;;;;;;;-1:-1:-1;;;23263:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23353:19:0;;23367:4;23353:19;23349:97;;23393:37;;-1:-1:-1;;;;;23393:29:0;;;:37;;;;;23423:6;;23393:37;;;;23423:6;23393:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23393:37:0;23349:97;23476:6;23464:9;:18;23460:101;;;23503:10;:42;23523:21;:9;23537:6;23523:21;:13;:21;:::i;:::-;23503:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23503:42:0;23460:101;23230:415;;;23593:40;-1:-1:-1;;;;;23593:22:0;;23616:4;23622:2;23626:6;23593:40;:22;:40;:::i;:::-;23061:591;;;;:::o;83209:539::-;83536:7;-1:-1:-1;;;;;83523:20:0;:9;-1:-1:-1;;;;;83523:20:0;;83519:59;;;83560:7;;83519:59;83597:143;83623:9;83647:7;83669:6;83690:12;83717;83597:11;:143::i;:::-;83209:539;;;;;:::o;23969:228::-;24047:7;24071:12;24077:5;24071;:12::i;:::-;24067:123;;;-1:-1:-1;;;;;;24107:11:0;;;24100:18;;24067:123;24158:5;-1:-1:-1;;;;;24158:15:0;;24174:3;24158:20;;;;;;;;;;;;;-1:-1:-1;;;;;24158:20:0;-1:-1:-1;;;;;24158:20:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24158:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24158:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24158:20:0;;23969:228;-1:-1:-1;;;23969:228:0:o;22705:348::-;22791:4;22812:11;22808:55;;-1:-1:-1;22847:4:0;22840:11;;22808:55;22879:12;22885:5;22879;:12::i;:::-;22875:171;;;22908:37;;-1:-1:-1;;;;;22908:29:0;;;:37;;;;;22938:6;;22908:37;;;;22938:6;22908:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22908:37:0;22875:171;;;22978:30;-1:-1:-1;;;;;22978:18:0;;22997:2;23001:6;22978:30;:18;:30;:::i;:::-;-1:-1:-1;23030:4:0;22875:171;22705:348;;;;;:::o;7430:471::-;7488:7;7733:6;7729:47;;-1:-1:-1;7763:1:0;7756:8;;7729:47;7800:5;;;7804:1;7800;:5;:1;7824:5;;;;;:10;7816:56;;;;-1:-1:-1;;;7816:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8369:132;8427:7;8454:39;8458:1;8461;8454:39;;;;;;;;;;;;;;;;;:3;:39::i;6514:136::-;6572:7;6599:43;6603:1;6606;6599:43;;;;;;;;;;;;;;;;;:3;:43::i;19360:204::-;19487:68;;;-1:-1:-1;;;;;19487:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19487:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;19461:95:0;;19480:5;;19461:18;:95::i;72782:340::-;72972:142;72997:9;73021:7;73043:6;73064:12;73091;72972:10;:142::i;19176:176::-;19285:58;;;-1:-1:-1;;;;;19285:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19285:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;19259:85:0;;19278:5;;19259:18;:85::i;:::-;19176:176;;;:::o;9031:345::-;9117:7;9219:12;9212:5;9204:28;;;;-1:-1:-1;;;9204:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9204:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9243:9;9259:1;9255;:5;;;;;;;9031:345;-1:-1:-1;;;;;9031:345:0:o;6987:192::-;7073:7;7109:12;7101:6;;;;7093:29;;;;-1:-1:-1;;;7093:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7093:29:0;-1:-1:-1;;;7145:5:0;;;6987:192::o;21215:1114::-;21819:27;21827:5;-1:-1:-1;;;;;21819:25:0;;:27::i;:::-;21811:71;;;;;-1:-1:-1;;;21811:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21956:12;21970:23;22005:5;-1:-1:-1;;;;;21997:19:0;22017:4;21997:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;21997:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;21955:67:0;;;;22041:7;22033:52;;;;;-1:-1:-1;;;22033:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22102:17;;:21;22098:224;;22244:10;22233:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22233:30:0;22225:85;;;;-1:-1:-1;;;22225:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73130:1353;73341:7;-1:-1:-1;;;;;73328:20:0;:9;-1:-1:-1;;;;;73328:20:0;;73324:59;;;73365:7;;73324:59;73395:24;;:::i;:::-;73422:10;:8;:10::i;:::-;73395:37;-1:-1:-1;73449:32:0;:12;3930:5;73449:32;:20;:32;:::i;:::-;73445:944;;;73503:6;73498:392;73519:14;73515:1;:18;73498:392;;;73583:7;73591:1;73583:10;;;;;;;;;;;-1:-1:-1;;;;;73563:31:0;:9;-1:-1:-1;;;;;73563:31:0;;73559:316;;;73619:17;73639:7;73647:1;73639:10;;;;;;;;;;;-1:-1:-1;;;;;73639:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73639:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73639:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73639:18:0;;-1:-1:-1;73680:7:0;73688:1;73680:10;;;;;;;;;;;-1:-1:-1;;;;;73680:19:0;;73700:6;73680:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73680:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73680:27:0;;;;73730:96;73741:10;73753:7;73762:10;-1:-1:-1;;;;;73762:20:0;;73791:4;73762:35;;;;;;;;;;;;;-1:-1:-1;;;;;73762:35:0;-1:-1:-1;;;;;73762:35:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73762:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;73762:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;73762:35:0;73799:12;73813;73730:10;:96::i;:::-;73849:7;;;;;73559:316;73535:3;;73498:392;;;-1:-1:-1;73911:6:0;73906:472;73927:14;73923:1;:18;73906:472;;;73989:7;73997:1;73989:10;;;;;;;;;;;-1:-1:-1;;;;;73971:29:0;:7;-1:-1:-1;;;;;73971:29:0;;73967:396;;;74025:17;74045:7;74053:1;74045:10;;;;;;;;;;;-1:-1:-1;;;;;74045:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74045:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74045:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;74045:18:0;;-1:-1:-1;74086:70:0;74098:9;74045:18;74121:6;74129:12;74143;74086:11;:70::i;:::-;74179:57;74204:10;74224:7;74232:1;74224:10;;;;;;;;;;;74179:24;:57::i;:::-;74259:7;74267:1;74259:10;;;;;;;;;;;-1:-1:-1;;;;;74259:18:0;;74278:10;-1:-1:-1;;;;;74278:20:0;;74307:4;74278:35;;;;;;;;;;;;;-1:-1:-1;;;;;74278:35:0;-1:-1:-1;;;;;74278:35:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74278:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74278:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;74278:35:0;74259:55;;;-1:-1:-1;;;;;;74259:55:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74259:55:0;;;;;;;-1:-1:-1;74259:55:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;74259:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74259:55:0;;;;74337:7;;;;;73967:396;73943:3;;73906:472;;;;73445:944;74408:67;74420:9;74431:7;74440:6;74448:12;74462;74408:11;:67::i;:::-;74401:74;73130:1353;;;;;:::o;16205:619::-;16265:4;16733:20;;16576:66;16773:23;;;;;;:42;;-1:-1:-1;16800:15:0;;;16773:42;16765:51;16205:619;-1:-1:-1;;;;16205:619:0:o;69802:487::-;69844:16;;:::i;:::-;-1:-1:-1;69873:408:0;;;;;;;;69902:42;69873:408;;69967:42;69873:408;;;;70032:42;69873:408;;;;;;;70097:42;69873:408;;;;70162:42;69873:408;;;;70227:42;69873:408;;;;69802:487;:::o;25043:133::-;25143:19;25142:26;;25043:133::o;48811:342::-;49001:144;49028:9;49052:7;49074:6;49095:12;49122;49001;:144::i;41159:262::-;41244:13;:5;-1:-1:-1;;;;;41244:11:0;;:13::i;:::-;41239:175;;41279:34;;;-1:-1:-1;;;41279:34:0;;41303:4;41279:34;;;;-1:-1:-1;;;;;41279:34:0;;;;;;;;;41317:3;;41279:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;41279:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41279:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41279:34:0;:41;;41274:129;;41347:40;-1:-1:-1;;;;;41347:22:0;;41370:2;-1:-1:-1;;41347:40:0;:22;:40;:::i;:::-;41159:262;;:::o;49161:1788::-;49374:7;-1:-1:-1;;;;;49361:20:0;:9;-1:-1:-1;;;;;49361:20:0;;49357:59;;;49398:7;;49357:59;49432:35;:12;3552:4;49432:35;:20;:35;:::i;:::-;49428:1351;;;49488:27;49505:9;49488:16;:27::i;:::-;49484:514;;;49536:17;49556:35;49581:9;49556:24;:35::i;:::-;49536:55;;49635:9;-1:-1:-1;;;;;49612:41:0;;49654:6;49612:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49612:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49612:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49680:24:0;;-1:-1:-1;49707:44:0;-1:-1:-1;;;;;49707:29:0;;49745:4;49707:44;:29;:44;:::i;:::-;49680:71;;49779:203;49814:10;49847:7;49877:16;49916:12;49951;49779;:203::i;:::-;49772:210;;;;49484:514;50018:25;50035:7;50018:16;:25::i;:::-;50014:754;;;50064:17;50084:33;50109:7;50084:24;:33::i;:::-;50064:53;;50138:194;50172:9;50204:10;50237:6;50266:12;50301;50138:11;:194::i;:::-;50353:24;50380:44;-1:-1:-1;;;;;50380:29:0;;50418:4;50380:44;:29;:44;:::i;:::-;50353:71;;50449:18;:10;-1:-1:-1;;;;;50449:16:0;;:18::i;:::-;50445:283;;;50492:4;;;;;;;;;-1:-1:-1;;;;;50492:4:0;-1:-1:-1;;;;;50492:9:0;;50508:16;50492:35;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50492:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50492:35:0;;;;;50445:283;;;50576:54;50601:10;50621:7;50576:24;:54::i;:::-;50676:7;-1:-1:-1;;;;;50653:37:0;;50691:16;50653:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50653:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50653:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;50746:7:0;;;;50014:754;50798:143;50824:9;50848:7;50870:6;50891:12;50918;50798:11;:143::i;23660:301::-;23753:12;23759:5;23753;:12::i;:::-;23748:206;;23795:1;23786:6;:10;:52;;;;-1:-1:-1;23800:34:0;;;-1:-1:-1;;;23800:34:0;;23824:4;23800:34;;;;-1:-1:-1;;;;;23800:34:0;;;;;;;;;23837:1;;23800:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;23800:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23800:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23800:34:0;:38;23786:52;23782:117;;;23859:24;-1:-1:-1;;;;;23859:17:0;;23877:2;23881:1;23859:24;:17;:24;:::i;:::-;23913:29;-1:-1:-1;;;;;23913:17:0;;23931:2;23935:6;23913:29;:17;:29;:::i;45235:478::-;45327:4;;45297;;-1:-1:-1;;;;;45318:13:0;;;45327:4;;45318:13;45314:57;;;-1:-1:-1;45355:4:0;45348:11;;45314:57;45427:8;;45458:93;;;-1:-1:-1;;;;;45458:93:0;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45458:93:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;45419:133:0;;;;45384:12;;45398:17;;45427:8;;;45452:4;;45458:93;;45419:133;;;25:18:-1;45419:133:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;45419:133:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;45383:169:0;;;;45568:7;45563:53;;45599:5;45592:12;;;;;;45563:53;45629:13;45658:4;45647:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;45721:465:0;45823:4;;45791:6;;-1:-1:-1;;;;;45814:13:0;;;45823:4;;45814:13;45810:71;;;-1:-1:-1;45866:1:0;45844:25;;45810:71;45965:98;;;22:32:-1;6:49;;45965:98:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;45929:135:0;;;;45894:12;;45908:17;;-1:-1:-1;;;;;45929:25:0;;;45959:4;;45965:98;;45929:135;;;;25:18:-1;45929:135:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;45929:135:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;45893:171:0;;;;46080:7;46075:58;;-1:-1:-1;;46104:17:0;;;;;;46075:58;46163:4;46152:26;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46152:26:0;;45721:465;-1:-1:-1;;;;45721:465:0:o;56987:342::-;57177:144;57204:9;57228:7;57250:6;57271:12;57298;57177;:144::i;19572:621::-;19942:10;;;19941:62;;-1:-1:-1;19958:39:0;;;-1:-1:-1;;;19958:39:0;;19982:4;19958:39;;;;-1:-1:-1;;;;;19958:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;19958:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19958:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19958:39:0;:44;19941:62;19933:152;;;;-1:-1:-1;;;19933:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20122:62;;;-1:-1:-1;;;;;20122:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20122:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20096:89:0;;20115:5;;20096:18;:89::i;57337:2005::-;57550:7;-1:-1:-1;;;;;57537:20:0;:9;-1:-1:-1;;;;;57537:20:0;;57533:59;;;57574:7;;57533:59;57608:34;:12;3602:4;57608:34;:20;:34;:::i;:::-;57604:1568;;;57659:17;57679:26;57695:9;57679:15;:26::i;:::-;57659:46;-1:-1:-1;;;;;;57724:24:0;;;;57720:631;;57773:18;:10;-1:-1:-1;;;;;57773:16:0;;:18::i;:::-;57769:245;;;57816:68;;;-1:-1:-1;;;57816:68:0;;57870:4;57816:68;;;;;;;;;;;;-1:-1:-1;;;;;57816:45:0;;;;;:68;;;;;;;;;;;;;;-1:-1:-1;57816:45:0;:68;;;5:2:-1;;;;30:1;27;20:12;5:2;57816:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57816:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57769:245:0;;-1:-1:-1;57769:245:0;;57933:61;;;-1:-1:-1;;;57933:61:0;;57980:4;57933:61;;;;;;;;;;;;-1:-1:-1;;;;;57933:38:0;;;;;:61;;;;;;;;;;;;;;-1:-1:-1;57933:38:0;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;57933:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57933:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;57769:245:0;58034:24;58061:44;-1:-1:-1;;;;;58061:29:0;;58099:4;58061:44;:29;:44;:::i;:::-;58034:71;;58133:202;58167:10;58200:7;58230:16;58269:12;58304;58133:11;:202::i;57720:631::-;58380:24;58396:7;58380:15;:24::i;:::-;58367:37;-1:-1:-1;;;;;;58423:24:0;;;;58419:742;;58468:194;58502:9;58534:10;58567:6;58596:12;58631;58468:11;:194::i;:::-;58683:24;58710:44;-1:-1:-1;;;;;58710:29:0;;58748:4;58710:44;:29;:44;:::i;:::-;58683:71;;58779:18;:10;-1:-1:-1;;;;;58779:16:0;;:18::i;:::-;58775:346;;;58822:84;;;-1:-1:-1;;;58822:84:0;;58900:4;58822:84;;;;;;-1:-1:-1;;;;;58822:45:0;;;;;58874:16;;58822:84;;;;;;;;;;;;;;;58874:16;58822:45;:84;;;5:2:-1;;;;30:1;27;20:12;5:2;58822:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58822:84:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58775:346:0;;-1:-1:-1;58775:346:0;;58955:54;58980:10;59000:7;58955:24;:54::i;:::-;59032:69;;;-1:-1:-1;;;59032:69:0;;59077:4;59032:69;;;;;;;;;;;;-1:-1:-1;;;;;59032:36:0;;;;;:69;;;;;;;;;;;;;;-1:-1:-1;59032:36:0;:69;;;5:2:-1;;;;30:1;27;20:12;58419:742:0;57604:1568;;59191:143;59217:9;59241:7;59263:6;59284:12;59311;78194:339;78384:141;78408:9;78432:7;78454:6;78475:12;78502;78541:1627;78751:7;-1:-1:-1;;;;;78738:20:0;:9;-1:-1:-1;;;;;78738:20:0;;78734:59;;;78775:7;;78734:59;78809:31;:12;3696:4;78809:31;:20;:31;:::i;:::-;78805:1193;;;78857:17;78877:23;78890:9;78877:12;:23::i;:::-;78857:43;-1:-1:-1;;;;;;78919:24:0;;;;78915:328;;78983:9;-1:-1:-1;;;;;78964:37:0;;79002:6;78964:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78964:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78964:45:0;;;;79037:190;79069:10;79102:7;79132:6;79161:12;79196;79037:9;:190::i;:::-;79030:197;;;78915:328;79272:21;79285:7;79272:12;:21::i;:::-;79259:34;-1:-1:-1;;;;;;79312:24:0;;;;79308:679;;79357:194;79391:9;79423:10;79456:6;79485:12;79520;79357:11;:194::i;:::-;79572:24;79599:44;-1:-1:-1;;;;;79599:29:0;;79637:4;79599:44;:29;:44;:::i;:::-;79572:71;;79664:49;79689:10;79701:4;;;;;;;;;-1:-1:-1;;;;;79701:4:0;-1:-1:-1;;;;;79701:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79701:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79701:11:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79701:11:0;79664:24;:49::i;:::-;79732:4;;-1:-1:-1;;;;;79732:4:0;;;;:12;;79751:18;;:16;;;:18::i;:::-;:41;;79791:1;79751:41;;;79772:16;79751:41;79816:18;:10;-1:-1:-1;;;;;79816:16:0;;:18::i;:::-;:45;;79851:10;79816:45;;;25810:42;79816:45;79732:214;;;-1:-1:-1;;;;;;79732:214:0;;;;;;;-1:-1:-1;;;;;79732:214:0;;;;;;;;;;;;;79923:4;79732:214;;;;;;;;;;-1:-1:-1;;79732:214:0;;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;79308:679:0;78805:1193;;80017:143;80043:9;80067:7;80089:6;80110:12;80137;67716:1637;67923:7;-1:-1:-1;;;;;67910:20:0;:9;-1:-1:-1;;;;;67910:20:0;;67906:59;;;67947:7;;67906:59;67981:31;:12;3881:5;67981:31;:20;:31;:::i;:::-;67977:1282;;;68053:4;;-1:-1:-1;;;;;68033:25:0;;;68053:4;;68033:25;68029:928;;;68079:4;;:17;;;-1:-1:-1;;;68079:17:0;;;;;;;;;;-1:-1:-1;;;;;68079:4:0;;;;:9;;:17;;;;;:4;;:17;;;;;;;;:4;;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;68079:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;68138:3:0;;:28;;;-1:-1:-1;;;68138:28:0;;68160:4;68138:28;;;;;;68117:18;;-1:-1:-1;;;;;;68138:3:0;;;;-1:-1:-1;68138:13:0;;:28;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;68138:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68138:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;68138:28:0;;-1:-1:-1;68189:14:0;;68185:544;;68310:3;;68230:32;;68266:208;;-1:-1:-1;;;;;68310:3:0;68340:7;68374:10;68310:3;68439:12;68266:17;:208::i;:::-;68531:3;;68228:246;;-1:-1:-1;68499:210:0;;-1:-1:-1;;;;;;68531:3:0;68561:7;68595:10;68228:246;68674:12;68499:5;:210::i;:::-;68185:544;;68790:3;;68756:185;;-1:-1:-1;;;;;68790:3:0;68816:7;68846:6;68875:12;68910;68756:11;:185::i;68029:928::-;68995:4;;-1:-1:-1;;;;;68977:23:0;;;68995:4;;68977:23;68973:275;;;69044:3;;69021:63;;69033:9;;-1:-1:-1;;;;;69044:3:0;69049:6;69057:12;69071;69021:11;:63::i;:::-;69130:3;;69143:4;;69105:44;;-1:-1:-1;;;;;69130:3:0;;;;69143:4;69105:24;:44::i;:::-;69168:4;;;69178:3;:28;;;-1:-1:-1;;;69178:28:0;;69200:4;69178:28;;;;;;-1:-1:-1;;;;;69168:4:0;;;;:9;;69178:3;;:13;;:28;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;69178:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69178:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;69178:28:0;69168:39;;;-1:-1:-1;;;;;;69168:39:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69168:39:0;;;;;;;-1:-1:-1;69168:39:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;69168:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;68973:275:0;69278:67;69290:9;69301:7;69310:6;69318:12;69332;64703:1257;64910:7;-1:-1:-1;;;;;64897:20:0;:9;-1:-1:-1;;;;;64897:20:0;;64893:59;;;64934:7;;64893:59;64968:31;:12;3649:4;64968:31;:20;:31;:::i;:::-;64964:826;;;65040:4;;-1:-1:-1;;;;;65020:25:0;;;65040:4;;65020:25;65016:333;;;65066:4;;:32;;;-1:-1:-1;;;65066:32:0;;65084:4;65066:32;;;;;;;;;;;;-1:-1:-1;;;;;65066:4:0;;;;:9;;:32;;;;;:4;;:32;;;;;;;;:4;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;65066:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;65160:3:0;;65216:28;;;-1:-1:-1;;;65216:28:0;;65238:4;65216:28;;;;;;65126:207;;-1:-1:-1;;;;;;65160:3:0;;;;-1:-1:-1;65186:7:0;;65160:3;;65216:13;;:28;;;;;;;;;;;;;;65160:3;65216:28;;;5:2:-1;;;;30:1;27;20:12;5:2;65216:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65216:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65216:28:0;65267:12;65302;65126:11;:207::i;:::-;65119:214;;65016:333;65387:4;;-1:-1:-1;;;;;65369:23:0;;;65387:4;;65369:23;65365:414;;;65479:3;;65413:187;;65447:9;;-1:-1:-1;;;;;65479:3:0;65505:6;65534:12;65569;65413:11;:187::i;:::-;65646:3;;65659:4;;65621:44;;-1:-1:-1;;;;;65646:3:0;;;;65659:4;65621:24;:44::i;:::-;65684:4;;;65709:3;:28;;;-1:-1:-1;;;65709:28:0;;65702:4;65709:28;;;;;;;;-1:-1:-1;;;;;65684:4:0;;;;:9;;65709:3;;:13;;:28;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;65709:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65709:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65709:28:0;65684:54;;;-1:-1:-1;;;;;;65684:54:0;;;;;;;-1:-1:-1;;;;;65684:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65684:54:0;;;;;;;-1:-1:-1;65684:54:0;;;;5:2:-1;;;;30:1;27;20:12;65365:414:0;65809:143;65835:9;65859:7;65881:6;65902:12;65929;43026:1191;43221:17;:9;-1:-1:-1;;;;;43221:15:0;;:17::i;:::-;43220:18;:38;;;;;43243:15;:7;-1:-1:-1;;;;;43243:13:0;;:15::i;:::-;43242:16;43220:38;:92;;;;-1:-1:-1;43263:49:0;:12;3808:5;43263:49;:28;:49;:::i;:::-;43262:50;43220:92;43216:838;;;43329:21;43367:12;:19;43353:34;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;43353:34:0;-1:-1:-1;43329:58:0;-1:-1:-1;43407:6:0;43402:114;43423:12;:19;43419:1;:23;43402:114;;;43478:12;43491:1;43478:15;;;;;;;;;;;;;;43496:4;43478:22;43468:4;43473:1;43468:7;;;;;;;;;;;;;;;;;:32;43444:3;;43402:114;;;;43530:163;43560:9;25810:42;43618:6;43643:4;43666:12;43530:11;:163::i;:::-;43715:6;43710:121;43731:12;:19;43727:1;:23;43710:121;;;43806:1;43787:12;43800:1;43787:15;;;;;;;;;;;;;;:20;;43811:4;43786:29;43776:4;43781:1;43776:7;;;;;;;;;;;;;;;;;:39;43752:3;;43710:121;;;;43845:176;25810:42;43905:7;43931:21;43971:4;43994:12;43845:11;:176::i;43216:838::-;44066:143;44092:9;44116:7;44138:6;44159:12;44186;44066:11;:143::i;25184:200::-;25267:4;25349:27;25357:12;25371:4;25349:7;:27::i;36606:1410::-;36924:7;-1:-1:-1;;;;;36911:20:0;:9;-1:-1:-1;;;;;36911:20:0;;36907:59;;;36948:7;;36907:59;36978:67;;:::i;:::-;-1:-1:-1;36978:192:0;;;;;;;;37063:14;36978:192;;37092:12;36978:192;;;;37119:13;36978:192;;;;;;;37147:12;36978:192;;;;-1:-1:-1;;;37250:202:0;37271:15;37267:1;:19;37250:202;;;37330:1;37312:12;37325:1;37312:15;;;;;;;;;;;;;;:19;37308:133;;;37360:26;37370:12;37383:1;37370:15;;;;;;;;;;;;;;37360:5;:9;;:26;;;;:::i;:::-;37352:34;;37424:1;37405:20;;37308:133;37288:3;;37250:202;;;;37480:1;37472:5;:9;37464:69;;;;-1:-1:-1;;;37464:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37572:6;37546:23;37589:420;37610:15;37606:1;:19;37589:420;;;37651:12;37664:1;37651:15;;;;;;;;;;;;;;37670:1;37651:20;37647:69;;;37692:8;;37647:69;37732:18;37753:38;37785:5;37753:27;37764:12;37777:1;37764:15;;;;;;;;;;;;;;37753:6;:10;;:27;;;;:::i;:38::-;37732:59;;37815:16;37810:1;:21;37806:90;;;-1:-1:-1;37865:15:0;37806:90;37929:10;37910:29;;;;37954:43;37966:9;37977:7;37986:10;37954:8;37963:1;37954:11;;;;;;;;;;;:43;;:::i;:::-;;37589:420;;37627:3;;37589:420;;;;36606:1410;;;;;;;;;:::o;38047:871::-;38172:7;38217:6;38241:17;-1:-1:-1;;;;;38241:15:0;;;:17::i;:::-;38236:356;;38307:14;;;:37;;;-1:-1:-1;;;38307:37:0;;-1:-1:-1;;;;;38307:37:0;;;;;;;;;;;;38275:29;;38307:14;;;;:26;;:37;;;;;;;;;;;;;;;:14;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;38307:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38307:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38307:37:0;;-1:-1:-1;;;;;;38363:35:0;;;38359:222;;38419:58;38444:9;38463:12;38419:24;:58::i;:::-;38511:54;;;-1:-1:-1;;;38511:54:0;;;;;;;;38558:1;38511:54;;;;38561:3;38511:54;;;;;;-1:-1:-1;;;;;38511:32:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;38511:32:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;38511:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38511:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38511:54:0;;-1:-1:-1;38359:222:0;38236:356;;38609:15;:7;-1:-1:-1;;;;;38609:13:0;;:15::i;:::-;38604:275;;38671:14;;;:35;;;-1:-1:-1;;;38671:35:0;;-1:-1:-1;;;;;38671:35:0;;;;;;;;;;;;38641:27;;38671:14;;;;:26;;:35;;;;;;;;;;;;;;;:14;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;38671:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38671:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38671:35:0;;-1:-1:-1;;;;;;38725:33:0;;;38721:147;;38794:10;-1:-1:-1;;;;;38794:30:0;;38831:12;38845:1;38848:3;38794:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38794:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38794:58:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38794:58:0;;-1:-1:-1;38721:147:0;38604:275;38898:12;38047:871;-1:-1:-1;;;;38047:871:0:o;38926:586::-;39113:17;;39049:7;;39069:63;;39094:9;;-1:-1:-1;;;;;39113:17:0;39069:24;:63::i;:::-;39150:17;;-1:-1:-1;;;;;39150:17:0;;;;:31;;39188:17;;:15;;;:17::i;:::-;:30;;39217:1;39188:30;;;39208:6;39188:30;39234:17;:9;-1:-1:-1;;;;;39234:15:0;;:17::i;:::-;:43;;39268:9;39234:43;;;25810:42;39234:43;39292:6;39313:15;:7;-1:-1:-1;;;;;39313:13:0;;:15::i;:::-;:39;;39345:7;39313:39;;;25810:42;39313:39;39150:354;;;-1:-1:-1;;;;;;39150:354:0;;;;;;;-1:-1:-1;;;;;39150:354:0;;;;;;;;;;;;;;;;;;;;39375:4;39150:354;;;;-1:-1:-1;;;39150:354:0;;;;39418:1;39150:354;;;;;;39434:42;39150:354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;39150:354:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39150:354:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;39520:905:0;39644:7;39668:17;:9;-1:-1:-1;;;;;39668:15:0;;:17::i;:::-;39664:90;;;39702:16;;;;;;;;;-1:-1:-1;;;;;39702:16:0;-1:-1:-1;;;;;39702:24:0;;39733:6;39702:40;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39702:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39702:40:0;;;;;39664:90;39812:22;;:49;;;-1:-1:-1;;;39812:49:0;;-1:-1:-1;;;39812:49:0;;;;;;39766:28;;-1:-1:-1;;;;;39812:22:0;;:32;;:49;;;;;;;;;;;;;;:22;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;39812:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39812:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39812:49:0;39897:23;;39812:49;;-1:-1:-1;39873:21:0;;-1:-1:-1;;;;;39897:23:0;;;;:36;;39948:17;;:15;;;:17::i;:::-;:48;;39987:9;39948:48;;;39968:16;;-1:-1:-1;;;;;39968:16:0;39948:48;40011:15;:7;-1:-1:-1;;;;;40011:13:0;;:15::i;:::-;:44;;40048:7;40011:44;;;40029:16;;-1:-1:-1;;;;;40029:16:0;40011:44;39897:169;;;;;;;;;;;;;-1:-1:-1;;;;;39897:169:0;-1:-1:-1;;;;;39897:169:0;;;;;;-1:-1:-1;;;;;39897:169:0;-1:-1:-1;;;;;39897:169:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39897:169:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39897:169:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;39897:169:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;39897:169:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;39897:169:0;;421:4:-1;412:14;;;;39897:169:0;;;;;412:14:-1;39897:169:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39897:169:0;;;;;;;;;;;39873:193;;40079:98;40104:17;:9;-1:-1:-1;;;;;40104:15:0;;:17::i;:::-;:48;;40143:9;40104:48;;;40124:16;;-1:-1:-1;;;;;40124:16:0;40104:48;40162:13;40079:24;:98::i;:::-;40188:20;40211:13;-1:-1:-1;;;;;40211:29:0;;40241:4;40247:6;40255:1;40211:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40211:46:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40211:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40211:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40211:46:0;;-1:-1:-1;40274:15:0;-1:-1:-1;;;;;40274:13:0;;;:15::i;:::-;40270:116;;;40306:16;;40332:41;;;-1:-1:-1;;;40332:41:0;;40367:4;40332:41;;;;;;-1:-1:-1;;;;;40306:16:0;;;;:25;;:16;;40332:26;;:41;;;;;;;;;;;;;;;40306:16;40332:41;;;5:2:-1;;;;30:1;27;20:12;5:2;40332:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40332:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40332:41:0;40306:68;;;-1:-1:-1;;;;;;40306:68:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40306:68:0;;;;;;;-1:-1:-1;40306:68:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;40306:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40306:68:0;;;;40270:116;40405:12;39520:905;-1:-1:-1;;;;;;39520:905:0:o;40433:700::-;40556:7;40580:17;:9;-1:-1:-1;;;;;40580:15:0;;:17::i;:::-;40576:83;;;40614:9;;;;;;;;;-1:-1:-1;;;;;40614:9:0;-1:-1:-1;;;;;40614:17:0;;40638:6;40614:33;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40614:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40614:33:0;;;;;40576:83;40671:91;40696:17;:9;-1:-1:-1;;;;;40696:15:0;;:17::i;:::-;:41;;40728:9;40696:41;;;40716:9;;-1:-1:-1;;;;;40716:9:0;40696:41;40747:13;;-1:-1:-1;;;;;40747:13:0;40671:24;:91::i;:::-;40796:13;;40773:20;;-1:-1:-1;;;;;40796:13:0;;;;:27;;40838:17;;:15;;;:17::i;:::-;:41;;40870:9;40838:41;;;40858:9;;-1:-1:-1;;;;;40858:9:0;40838:41;40894:6;40915:15;:7;-1:-1:-1;;;;;40915:13:0;;:15::i;:::-;:37;;40945:7;40915:37;;;40933:9;;-1:-1:-1;;;;;40933:9:0;40915:37;40796:183;;;-1:-1:-1;;;;;;40796:183:0;;;;;;;-1:-1:-1;;;;;40796:183:0;;;;;;;;;;;;;;;;;;;;40967:1;40796:183;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40796:183:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;40796:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40796:183:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40796:183:0;;-1:-1:-1;40996:15:0;-1:-1:-1;;;;;40996:13:0;;;:15::i;:::-;40992:102;;;41028:9;;41047:34;;;-1:-1:-1;;;41047:34:0;;41075:4;41047:34;;;;;;-1:-1:-1;;;;;41028:9:0;;;;:18;;:9;;41047:19;;:34;;;;;;;;;;;;;;;41028:9;41047:34;;;5:2:-1;;;;30:1;27;20:12;5:2;41047:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41047:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41047:34:0;41028:54;;;-1:-1:-1;;;;;;41028:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41028:54:0;;;;;;;-1:-1:-1;41028:54:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;41028:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41028:54:0;;;;41113:12;-1:-1:-1;40433:700:0;;;;;:::o;6058:181::-;6116:7;6148:5;;;6172:6;;;;6164:46;;;;;-1:-1:-1;;;6164:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;81330:3691;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;81330:3691:0;;;-1:-1:-1;;81330:3691:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;
Swarm Source
bzzr://53bcc086e3773303a8ea498e3210523914b00172e5fb53e592f61670806639ae
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $4.47 | 1 | $4.47 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.