More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap | 11350076 | 1603 days ago | IN | 0 ETH | 0.00189732 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 11350076 | 1603 days ago | 0.09583608 ETH | ||||
- | 11191472 | 1628 days ago | 0.00009453 ETH | ||||
- | 11191472 | 1628 days ago | 0.00009453 ETH | ||||
- | 11174004 | 1630 days ago | 0.38722947 ETH | ||||
- | 11174004 | 1630 days ago | 0.38722947 ETH | ||||
- | 11129924 | 1637 days ago | 0.00356283 ETH | ||||
- | 11007066 | 1656 days ago | 0.65518418 ETH | ||||
- | 10981315 | 1660 days ago | 0.61948498 ETH | ||||
- | 10981315 | 1660 days ago | 0.61948498 ETH | ||||
- | 10978515 | 1661 days ago | 0.61681643 ETH | ||||
- | 10978515 | 1661 days ago | 0.61681643 ETH | ||||
- | 10975653 | 1661 days ago | 0.00598553 ETH | ||||
- | 10975653 | 1661 days ago | 0.00598553 ETH | ||||
- | 10964980 | 1663 days ago | 0.55897443 ETH | ||||
- | 10964980 | 1663 days ago | 0.55897443 ETH | ||||
- | 10964814 | 1663 days ago | 0.03081372 ETH | ||||
- | 10964814 | 1663 days ago | 0.03081372 ETH | ||||
- | 10964677 | 1663 days ago | 0.58868868 ETH | ||||
- | 10964677 | 1663 days ago | 0.58868868 ETH | ||||
- | 10964336 | 1663 days ago | 0.58465622 ETH | ||||
- | 10964336 | 1663 days ago | 0.58465622 ETH | ||||
- | 10964296 | 1663 days ago | 0.58245209 ETH | ||||
- | 10964296 | 1663 days ago | 0.58245209 ETH | ||||
- | 10964280 | 1663 days ago | 0.58701645 ETH | ||||
- | 10964280 | 1663 days ago | 0.58701645 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-01-11 */ // 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: @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: @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/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, uint payAmt, IERC20 buyGem, uint256 minFillAmount) external returns(uint256 fillAmt); } // 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/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/interface/IWETH.sol pragma solidity ^0.5.0; contract IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 amount) external; } // 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, uint wad) external; function exit(address src, uint wad) external; } library ChaiHelper { IPot private constant POT = IPot(0x197E90f9FAD81970bA7976f33CbD77088E5D7cf7); uint256 private constant RAY = 10 ** 27; function _mul(uint x, uint y) private pure returns (uint z) { require(y == 0 || (z = x * y) / y == x); } function _rmul(uint x, uint y) private pure returns (uint z) { // always rounds down z = _mul(x, y) / RAY; } function _rdiv(uint x, uint y) private pure returns (uint z) { // always rounds down z = _mul(x, RAY) / y; } function rpow(uint x, uint n, uint base) private pure returns (uint 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) { uint chi = (now > POT.rho()) ? potDrip() : POT.chi(); return _rdiv(amount, chi); } function chaiToDai(IChai /*chai*/, uint256 amount) internal view returns(uint256) { uint chi = (now > POT.rho()) ? potDrip() : POT.chi(); return _rmul(chi, amount); } } // 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: @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. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing 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. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // 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 != 0x0 && codehash != accountHash); } /** * @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 (token == ZERO_ADDRESS || token == ETH_ADDRESS) { 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 (token == ZERO_ADDRESS || token == ETH_ADDRESS) { 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 (token != ZERO_ADDRESS && token != ETH_ADDRESS) { token.safeApprove(to, amount); } } function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) { if (token == ZERO_ADDRESS || token == ETH_ADDRESS) { return who.balance; } else { return token.balanceOf(who); } } function universalDecimals(IERC20 token) internal view returns (uint256) { if (token == ZERO_ADDRESS || token == ETH_ADDRESS) { 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/OneSplit.sol pragma solidity ^0.5.0; library DisableFlags { function enabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) { return (disableFlags & flag) == 0; } function disabled(uint256 disableFlags, uint256 flag) internal pure returns(bool) { return (disableFlags & flag) != 0; } } contract OneSplit { using SafeMath for uint256; using DisableFlags for uint256; using ChaiHelper for IChai; using UniversalERC20 for IERC20; using UniversalERC20 for IWETH; using UniversalERC20 for IBancorEtherToken; // // disableFlags = FLAG_UNISWAP + FLAG_KYBER + ... // uint256 constant public FLAG_UNISWAP = 0x01; uint256 constant public FLAG_KYBER = 0x02; uint256 constant public FLAG_BANCOR = 0x04; uint256 constant public FLAG_OASIS = 0x08; uint256 constant public FLAG_COMPOUND = 0x10; uint256 constant public FLAG_FULCRUM = 0x20; uint256 constant public FLAG_CHAI = 0x40; uint256 constant public FLAG_AAVE = 0x80; IERC20 constant public ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); IWETH wethToken = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); IBancorEtherToken bancorEtherToken = IBancorEtherToken(0xc0829421C1d260BD3cB3E0F06cfE2D52db2cE315); ICompound public compound = ICompound(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); ICompoundEther public cETH = ICompoundEther(0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5); IERC20 public dai = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); IChai public chai = IChai(0x06AF07097C9Eeb7fD685c692751D5C66dB49c215); IAaveLendingPool public aave = IAaveLendingPool(0x398eC7346DcD622eDc5ae82352F02bE94C62d119); IKyberNetworkProxy public kyberNetworkProxy = IKyberNetworkProxy(0x818E6FECD516Ecc3849DAf6845e3EC868087B755); IUniswapFactory public uniswapFactory = IUniswapFactory(0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95); IBancorContractRegistry public bancorContractRegistry = IBancorContractRegistry(0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4); IBancorNetworkPathFinder bancorNetworkPathFinder = IBancorNetworkPathFinder(0x6F0cD8C4f6F06eAB664C7E3031909452b4B72861); IOasisExchange public oasisExchange = IOasisExchange(0x39755357759cE0d7f32dC8dC45414CCa409AE24e); function() external payable { // solium-disable-next-line security/no-tx-origin require(msg.sender != tx.origin); } function log(uint256) external view { } 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 ); } } function getExpectedReturn( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 parts, uint256 disableFlags // 1 - Uniswap, 2 - Kyber, 4 - Bancor, 8 - Oasis, 16 - Compound, 32 - Fulcrum ) public view returns( uint256 returnAmount, uint256[] memory distribution // [Uniswap, Kyber, Bancor, Oasis] ) { distribution = new uint256[](4); if (fromToken == toToken) { returnAmount = amount; return (returnAmount, distribution); } if (disableFlags.enabled(FLAG_COMPOUND)) { if (_isCompoundToken(fromToken)) { IERC20 underlying = _compoundUnderlyingAsset(fromToken); if (underlying != IERC20(-1)) { uint256 compoundRate = ICompoundToken(address(fromToken)).exchangeRateStored(); return getExpectedReturn( 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) = getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); returnAmount = returnAmount.mul(1e18).div(compoundRate); return (returnAmount, distribution); } } } if (disableFlags.enabled(FLAG_FULCRUM)) { IERC20 underlying = _isFulcrumToken(fromToken); if (underlying != IERC20(-1)) { uint256 fulcrumRate = IFulcrumToken(address(fromToken)).tokenPrice(); return getExpectedReturn( underlying, toToken, amount.mul(fulcrumRate).div(1e18), parts, disableFlags ); } underlying = _isFulcrumToken(toToken); if (underlying != IERC20(-1)) { uint256 fulcrumRate = IFulcrumToken(address(toToken)).tokenPrice(); (returnAmount, distribution) = getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); returnAmount = returnAmount.mul(1e18).div(fulcrumRate); return (returnAmount, distribution); } } if (disableFlags.enabled(FLAG_CHAI)) { if (fromToken == IERC20(chai)) { return getExpectedReturn( dai, toToken, chai.chaiToDai(amount), parts, disableFlags ); } if (toToken == IERC20(chai)) { (returnAmount, distribution) = getExpectedReturn( fromToken, dai, amount, parts, disableFlags ); return (chai.daiToChai(returnAmount), distribution); } } if (disableFlags.enabled(FLAG_AAVE)) { IERC20 underlying = _isAaveToken(fromToken); if (underlying != IERC20(-1)) { return getExpectedReturn( underlying, toToken, amount, parts, disableFlags ); } underlying = _isAaveToken(toToken); if (underlying != IERC20(-1)) { return getExpectedReturn( fromToken, underlying, amount, parts, disableFlags ); } } function(IERC20,IERC20,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)); 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) ); rates[bestIndex] = newRate.sub(fullRates[bestIndex]); this.log(rates[bestIndex]); fullRates[bestIndex] = newRate; } } } function swap( IERC20 fromToken, IERC20 toToken, uint256 amount, uint256 minReturn, uint256[] memory distribution, // [Uniswap, Kyber, Bancor, Oasis] uint256 disableFlags // 16 - Compound, 32 - Fulcrum ) 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 ) internal { 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 _swap( underlying, toToken, underlyingAmount, distribution, disableFlags ); } if (_isCompoundToken(toToken)) { IERC20 underlying = _compoundUnderlyingAsset(toToken); _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; } } 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 _swap( underlying, toToken, underlyingAmount, distribution, disableFlags ); } underlying = _isFulcrumToken(toToken); if (underlying != IERC20(-1)) { _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; } } if (disableFlags.enabled(FLAG_CHAI)) { if (fromToken == IERC20(chai)) { chai.exit(address(this), amount); return _swap( dai, toToken, dai.balanceOf(address(this)), distribution, disableFlags ); } if (toToken == IERC20(chai)) { _swap( fromToken, dai, amount, distribution, disableFlags ); _infiniteApproveIfNeeded(dai, address(chai)); chai.join(address(this), dai.balanceOf(address(this))); return; } } if (disableFlags.enabled(FLAG_AAVE)) { IERC20 underlying = _isAaveToken(fromToken); if (underlying != IERC20(-1)) { IAaveToken(address(fromToken)).redeem(amount); return _swap( underlying, toToken, amount, distribution, disableFlags ); } underlying = _isAaveToken(toToken); if (underlying != IERC20(-1)) { _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; } } 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); } } 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 ) public payable { (, uint256[] memory distribution) = getExpectedReturn(fromToken, toToken, amount, parts, disableFlags); swap( fromToken, toToken, amount, minReturn, distribution, disableFlags ); } // View Helpers function calculateUniswapReturn( IERC20 fromToken, IERC20 toToken, uint256 amount ) 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; } } } 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; } } } return returnAmount; } function calculateKyberReturn( IERC20 fromToken, IERC20 toToken, uint256 amount ) 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); } uint256 value = _calculateKyberReturnWithEth(kyberNetworkContract, fromToken, ETH_ADDRESS, amount); if (value == 0) { return 0; } return _calculateKyberReturnWithEth(kyberNetworkContract, ETH_ADDRESS, toToken, value); } function _calculateKyberReturnWithEth( IKyberNetworkContract kyberNetworkContract, IERC20 fromToken, IERC20 toToken, uint256 amount ) public view returns(uint256) { (bool success, bytes memory data) = address(kyberNetworkContract).staticcall.gas(200000)(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 == 0x54A4a1167B004b004520c605E3f01906f683413d || // Uniswap reserve == 0xCf1394C5e2e879969fdB1f464cE1487147863dCb || // Oasis reserve == 0x053AA84FCC676113a57e0EbB0bD1913839874bE4) // Bancor { return 0; } // Check for Uniswap reserve (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberUniswapReserve(reserve).uniswapFactory.selector )); if (success) { return 0; } // Check for Oasis reserve (success,) = reserve.staticcall.gas(2300)(abi.encodeWithSelector( IKyberOasisReserve(reserve).otc.selector )); if (success) { return 0; } // Check for 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 ) 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(200000)( 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 ) 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*/ ) internal view returns(uint256) { this; } // 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)); } } } 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)); } 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)); } 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 Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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_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_KYBER","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_UNISWAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IKyberNetworkContract","name":"kyberNetworkContract","type":"address"},{"internalType":"contract IERC20","name":"fromToken","type":"address"},{"internalType":"contract IERC20","name":"toToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"_calculateKyberReturnWithEth","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":"cETH","outputs":[{"internalType":"contract ICompoundEther","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"}],"name":"calculateBancorReturn","outputs":[{"internalType":"uint256","name":"","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"}],"name":"calculateKyberReturn","outputs":[{"internalType":"uint256","name":"","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"}],"name":"calculateOasisReturn","outputs":[{"internalType":"uint256","name":"","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"}],"name":"calculateUniswapReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"log","outputs":[],"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":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"}]
Contract Creation Code
6080604052600080546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560018054821673c0829421c1d260bd3cb3e0f06cfe2d52db2ce315179055600280548216733d9819210a31b4961b30ef54be2aed79b9c9cd3b179055600380548216734ddc2d193948926d02f9b1fe9e1daa0718270ed5179055600480548216736b175474e89094c44da98b954eedeac495271d0f1790556005805482167306af07097c9eeb7fd685c692751d5c66db49c21517905560068054821673398ec7346dcd622edc5ae82352f02be94c62d11917905560078054821673818e6fecd516ecc3849daf6845e3ec868087b75517905560088054821673c0a47dfe034b400b47bdad5fecda2621de6c4d951790556009805482167352ae12abe5d8bd778bd5397f99ca900624cfadd4179055600a80548216736f0cd8c4f6f06eab664c7e3031909452b4b72861179055600b80549091167339755357759ce0d7f32dc8dc45414cca409ae24e17905534801561018457600080fd5b506150c4806101946000396000f3fe6080604052600436106101cd5760003560e01c80638bdb2afa116100f7578063d77366a411610095578063f4b9fa7511610064578063f4b9fa751461075b578063f64a9a4914610770578063f69e204614610785578063f82c50f11461079a576101cd565b8063d77366a4146105c8578063e2a7515e146105dd578063eb16df2a146106a7578063f484966b146106bc576101cd565b8063a1b4d011116100d1578063a1b4d01114610574578063a734f06e14610589578063b69d04561461059e578063ceb54115146105b3576101cd565b80638bdb2afa146105015780638c6c11f214610516578063955039451461052b576101cd565b80635cfcee281161016f57806372b6f1bf1161013e57806372b6f1bf14610461578063819faf7b1461049457806383366577146104a95780638a273858146104be576101cd565b80635cfcee281461037e57806364456efa146103935780636b9589aa146103d65780636f3a10531461041e576101cd565b80633c1a62dc116101ab5780633c1a62dc146102cc5780634037f967146102f35780634c914a4e146103265780635372d5481461033b576101cd565b8063085e2c5b146101dc57806312dea160146102865780631388b420146102b7575b333214156101da57600080fd5b005b3480156101e857600080fd5b5061022b600480360360a08110156101ff57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356107c4565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610271578181015183820152602001610259565b50505050905001935050505060405180910390f35b34801561029257600080fd5b5061029b610f1d565b604080516001600160a01b039092168252519081900360200190f35b3480156102c357600080fd5b5061029b610f2c565b3480156102d857600080fd5b506102e1610f3b565b60408051918252519081900360200190f35b3480156102ff57600080fd5b5061029b6004803603602081101561031657600080fd5b50356001600160a01b0316610f40565b34801561033257600080fd5b506102e16112b8565b34801561034757600080fd5b506102e16004803603606081101561035e57600080fd5b506001600160a01b038135811691602081013590911690604001356112bd565b34801561038a57600080fd5b506102e161145e565b34801561039f57600080fd5b506102e1600480360360608110156103b657600080fd5b506001600160a01b03813581169160208101359091169060400135611463565b6101da600480360360c08110156103ec57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a001356117de565b34801561042a57600080fd5b506102e16004803603606081101561044157600080fd5b506001600160a01b03813581169160208101359091169060400135611807565b34801561046d57600080fd5b5061029b6004803603602081101561048457600080fd5b50356001600160a01b0316611ba5565b3480156104a057600080fd5b5061029b611df5565b3480156104b557600080fd5b506102e1611e04565b3480156104ca57600080fd5b506102e1600480360360608110156104e157600080fd5b506001600160a01b03813581169160208101359091169060400135611e09565b34801561050d57600080fd5b5061029b611f9a565b34801561052257600080fd5b506102e1611fa9565b34801561053757600080fd5b506102e16004803603608081101561054e57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611fae565b34801561058057600080fd5b5061029b6124d6565b34801561059557600080fd5b5061029b6124e5565b3480156105aa57600080fd5b5061029b6124f7565b3480156105bf57600080fd5b506102e1612506565b3480156105d457600080fd5b5061029b61250b565b6101da600480360360c08110156105f357600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561063357600080fd5b82018360208201111561064557600080fd5b8035906020019184602083028401116401000000008311171561066757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061251a915050565b3480156106b357600080fd5b506102e16125f7565b3480156106c857600080fd5b5061070b600480360360a08110156106df57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356125fc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074757818101518382015260200161072f565b505050509050019250505060405180910390f35b34801561076757600080fd5b5061029b612684565b34801561077c57600080fd5b506102e1612693565b34801561079157600080fd5b5061029b612698565b3480156107a657600080fd5b506101da600480360360208110156107bd57600080fd5b50356126a7565b60408051600480825260a082019092526000916060919060208201608080388339019050509050856001600160a01b0316876001600160a01b0316141561080d57849150610f13565b61081e83601063ffffffff6126aa16565b156109c65761082c876126b5565b156108f857600061083c886127e8565b90506001600160a01b03808216146108f6576000886001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561088957600080fd5b505afa15801561089d573d6000803e3d6000fd5b505050506040513d60208110156108b357600080fd5b505190506108eb82896108e4670de0b6b3a76400006108d88c8763ffffffff61290f16565b9063ffffffff61296816565b89896107c4565b935093505050610f13565b505b610901866126b5565b156109c6576000610911876127e8565b90506001600160a01b03808216146109c4576000876001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561095e57600080fd5b505afa158015610972573d6000803e3d6000fd5b505050506040513d602081101561098857600080fd5b5051905061099989838989896107c4565b90945092506109ba816108d886670de0b6b3a764000063ffffffff61290f16565b9350610f13915050565b505b6109d783602063ffffffff6126aa16565b15610a8c5760006109e788610f40565b90506001600160a01b0380821614610a34576000886001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561088957600080fd5b610a3d87610f40565b90506001600160a01b0380821614610a8a576000876001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561095e57600080fd5b505b610a9d83604063ffffffff6126aa16565b15610b49576005546001600160a01b0388811691161415610af157600454600554610ae8916001600160a01b03908116918991610ae191168963ffffffff6129aa16565b87876107c4565b91509150610f13565b6005546001600160a01b0387811691161415610b4957600454610b219088906001600160a01b03168787876107c4565b6005549193509150610b42906001600160a01b03168363ffffffff612abe16565b9150610f13565b610b5a83608063ffffffff6126aa16565b15610bbd576000610b6a88611ba5565b90506001600160a01b0380821614610b9357610b8981888888886107c4565b9250925050610f13565b610b9c87611ba5565b90506001600160a01b0380821614610bbb57610b8988828888886107c4565b505b610bc5614f42565b604080516080810190915280610be286600163ffffffff612bd216565b610bee57611463610bf2565b612bd85b67ffffffffffffffff168152602001610c1286600263ffffffff612bd216565b610c1e576112bd610c22565b612bd85b67ffffffffffffffff168152602001610c4286600463ffffffff612bd216565b610c4e57611807610c52565b612bd85b67ffffffffffffffff168152602001610c7286600863ffffffff612bd216565b610c7e57611e09610c82565b612bd85b67ffffffffffffffff1690529050610c98614f6a565b610ca0614f6a565b60005b6004811015610d7857610cda8b8b610cc18c8c63ffffffff61296816565b878560048110610ccd57fe5b602002015163ffffffff16565b838260048110610ce657fe5b60200201523063f82c50f1848360048110610cfd57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b50505050828160048110610d5a57fe5b6020020151828260048110610d6b57fe5b6020020152600101610ca3565b5060005b87811015610f0e57600060015b6004811015610dc657848260048110610d9e57fe5b6020020151858260048110610daf57fe5b60200201511115610dbe578091505b600101610d89565b50610de8848260048110610dd657fe5b6020020151889063ffffffff612be116565b9650858181518110610df657fe5b6020026020010180518091906001018152505060008a905089836001011015610f04576000610e598e8e610e4d8e6108d88d8981518110610e3357fe5b60200260200101516001018861290f90919063ffffffff16565b8a8760048110610ccd57fe5b9050610e7c858460048110610e6a57fe5b6020020151829063ffffffff612c3b16565b868460048110610e8857fe5b60200201523063f82c50f1878560048110610e9f57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610ed857600080fd5b505afa158015610eec573d6000803e3d6000fd5b5050505080858460048110610efd57fe5b6020020152505b5050600101610d7c565b505050505b9550959350505050565b6009546001600160a01b031681565b600b546001600160a01b031681565b602081565b6000610f54826001600160a01b0316612c7d565b15610f6257506000196112b3565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610fcd5780518252601f199092019160209182019101610fae565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461102e576040519150601f19603f3d011682016040523d82523d6000602084013e611033565b606091505b50915091508161104957600019925050506112b3565b6000805b60078351038110156111a25782816000018151811061106857fe5b6020910101516001600160f81b031916602360f91b1480156110ab575082816001018151811061109457fe5b6020910101516001600160f81b031916607560f81b145b80156110d857508281600201815181106110c157fe5b6020910101516001600160f81b031916601b60fa1b145b801561110557508281600301815181106110ee57fe5b6020910101516001600160f81b031916606360f81b145b8015611132575082816004018151811061111b57fe5b6020910101516001600160f81b031916603960f91b145b801561115f575082816005018151811061114857fe5b6020910101516001600160f81b031916607560f81b145b801561118c575082816006018151811061117557fe5b6020910101516001600160f81b031916606d60f81b145b1561119a57600191506111a2565b60010161104d565b50806111b55760001993505050506112b3565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b602083106112185780518252601f1990920191602091820191016111f9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611279576040519150601f19603f3d011682016040523d82523d6000602084013e61127e565b606091505b509093509150826112965760001993505050506112b3565b8180602001905160208110156112ab57600080fd5b505193505050505b919050565b604081565b60075460408051600481526024810182526020810180516001600160e01b0316634f61ff8b60e01b1781529151815160009485946060946001600160a01b03909216936108fc93909182918083835b6020831061132b5780518252601f19909201916020918201910161130c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461138c576040519150601f19603f3d011682016040523d82523d6000602084013e611391565b606091505b5091509150816113a657600092505050611457565b60008180602001905160208110156113bd57600080fd5b505190506113d36001600160a01b038816612c7d565b806113eb57506113eb866001600160a01b0316612c7d565b15611406576113fc81888888611fae565b9350505050611457565b6000611422828960008051602061501083398151915289611fae565b905080611436576000945050505050611457565b611450826000805160206150108339815191528984611fae565b9450505050505b9392505050565b601081565b6000816114786001600160a01b038616612c7d565b61161e57600854604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b1580156114cd57600080fd5b505afa1580156114e1573d6000803e3d6000fd5b505050506040513d60208110156114f757600080fd5b505190506001600160a01b0381161561161c5760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b03166395b68fe760e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106115855780518252601f199092019160209182019101611566565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146115e6576040519150601f19603f3d011682016040523d82523d6000602084013e6115eb565b606091505b509150915081156116145780806020019051602081101561160b57600080fd5b50519350611619565b600093505b50505b505b611630846001600160a01b0316612c7d565b6117d657600854604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561168557600080fd5b505afa158015611699573d6000803e3d6000fd5b505050506040513d60208110156116af57600080fd5b505190506001600160a01b038116156117d45760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663cd7724c360e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b6020831061173d5780518252601f19909201916020918201910161171e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461179e576040519150601f19603f3d011682016040523d82523d6000602084013e6117a3565b606091505b509150915081156117cc578080602001905160208110156117c357600080fd5b505193506117d1565b600093505b50505b505b949350505050565b60606117ed87878786866107c4565b9150506117fe87878787858761251a565b50505050505050565b60095460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b6004820152905160009283926001600160a01b039091169163bb34534c91602480820192602092909190829003018186803b15801561186757600080fd5b505afa15801561187b573d6000803e3d6000fd5b505050506040513d602081101561189157600080fd5b5051600a549091506060906001600160a01b03908116906375e1cc82906118b9908916612c7d565b6118c357876118d0565b6001546001600160a01b03165b6118e2886001600160a01b0316612c7d565b6118ec57876118f9565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561195857600080fd5b505afa15801561196c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561199557600080fd5b81019080805160405193929190846401000000008211156119b557600080fd5b9083019060208201858111156119ca57600080fd5b82518660208202830111640100000000821117156119e757600080fd5b82525081516020918201928201910280838360005b83811015611a145781810151838201526020016119fc565b50505050905001604052505050905060006060836001600160a01b031662030d40856001600160a01b0316630c8496cc905060e01b85896040516024018080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015611a94578181015183820152602001611a7c565b505050509050019350505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b60208310611b025780518252601f199092019160209182019101611ae3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611b63576040519150601f19603f3d011682016040523d82523d6000602084013e611b68565b606091505b509150915081611b7f576000945050505050611457565b6000818060200190516040811015611b9657600080fd5b50519998505050505050505050565b6000611bb9826001600160a01b0316612c7d565b15611bc757506000196112b3565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310611c325780518252601f199092019160209182019101611c13565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611c93576040519150601f19603f3d011682016040523d82523d6000602084013e611c98565b606091505b509150915081611cae57600019925050506112b3565b6000805b6004835103811015611d8057828160000181518110611ccd57fe5b6020910101516001600160f81b031916604160f81b148015611d105750828160010181518110611cf957fe5b6020910101516001600160f81b031916606160f81b145b8015611d3d5750828160020181518110611d2657fe5b6020910101516001600160f81b031916603b60f91b145b8015611d6a5750828160030181518110611d5357fe5b6020910101516001600160f81b031916606560f81b145b15611d785760019150611d80565b600101611cb2565b5080611d935760001993505050506112b3565b60408051600481526024810182526020810180516001600160e01b0316632274683f60e21b178152915181516001600160a01b03891693611388939291829190808383602083106112185780518252601f1990920191602091820191016111f9565b6006546001600160a01b031681565b608081565b600b5460009081906060906001600160a01b03908116906207a12090630a2513a960e11b90611e39908916612c7d565b611e435787611e50565b6000546001600160a01b03165b611e628a6001600160a01b0316612c7d565b611e6c5789611e79565b6000546001600160a01b03165b604080516001600160a01b03938416602482015291909216604482015260648082018a905282518083039091018152608490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611efe5780518252601f199092019160209182019101611edf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611f5f576040519150601f19603f3d011682016040523d82523d6000602084013e611f64565b606091505b509150915081611f7957600092505050611457565b808060200190516020811015611f8e57600080fd5b50519695505050505050565b6008546001600160a01b031681565b600881565b60008060606001600160a01b038088169062030d4090630611aecb60e11b90611fd8908a16612c7d565b611fe25788611ff2565b6000805160206150108339815191525b612004896001600160a01b0316612c7d565b61200e578861201e565b6000805160206150108339815191525b604080516001600160a01b0393841660248201529190921660448201526064810189905260016084808301919091528251808303909101815260a490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b602083106120ad5780518252601f19909201916020918201910161208e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461210e576040519150601f19603f3d011682016040523d82523d6000602084013e612113565b606091505b509150915081612128576000925050506117d6565b60008082806020019051604081101561214057600080fd5b50805160209091015190925090507354a4a1167b004b004520c605e3f01906f683413d6001600160a01b0383161480612195575073cf1394c5e2e879969fdb1f464ce1487147863dcb6001600160a01b038316145b806121bc575073053aa84fcc676113a57e0ebb0bd1913839874be46001600160a01b038316145b156121ce5760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b03166345ed957d60e11b178152915181516001600160a01b038616936108fc9392918291908083835b602083106122315780518252601f199092019160209182019101612212565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612292576040519150601f19603f3d011682016040523d82523d6000602084013e612297565b606091505b509094505083156122af5760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b0316630dad878f60e21b178152915181516001600160a01b038616936108fc9392918291908083835b602083106123125780518252601f1990920191602091820191016122f3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612373576040519150601f19603f3d011682016040523d82523d6000602084013e612378565b606091505b509094505083156123905760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b0316634d21dff760e01b178152915181516001600160a01b038616936108fc9392918291908083835b602083106123f35780518252601f1990920191602091820191016123d4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612454576040519150601f19603f3d011682016040523d82523d6000602084013e612459565b606091505b509094505083156124715760009450505050506117d6565b6124c9670de0b6b3a76400006108d86124928b6001600160a01b0316612cb0565b600a0a6108d86124aa8c6001600160a01b0316612cb0565b600a0a6124bd878d63ffffffff61290f16565b9063ffffffff61290f16565b9998505050505050505050565b6003546001600160a01b031681565b60008051602061501083398151915281565b6005546001600160a01b031681565b600281565b6007546001600160a01b031681565b6125356001600160a01b03871633308763ffffffff612ea516565b6125428686868585612ff1565b600061255d6001600160a01b0387163063ffffffff613a9316565b90508381101561259e5760405162461bcd60e51b8152600401808060200182810382526035815260200180614f8b6035913960400191505060405180910390fd5b6125b86001600160a01b038716338363ffffffff613b6016565b506125ed336125d66001600160a01b038a163063ffffffff613a9316565b6001600160a01b038a16919063ffffffff613b6016565b5050505050505050565b600181565b606082604051908082528060200260200182016040528015612628578160200160208202803883390190505b50905060005b8381101561267a5761265a8787612652876108d88a6001880163ffffffff61290f16565b6001876107c4565b5082828151811061266757fe5b602090810291909101015260010161262e565b5095945050505050565b6004546001600160a01b031681565b600481565b6002546001600160a01b031681565b50565b818116155b92915050565b6003546000906001600160a01b03838116911614156126d6575060016112b3565b600254604080516001600160a01b0385811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638e8f294b60e01b17815292518251600095606095931693611388939092918291908083835b602083106127565780518252601f199092019160209182019101612737565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146127b7576040519150601f19603f3d011682016040523d82523d6000602084013e6127bc565b606091505b5091509150816127d1576000925050506112b3565b60008180602001905160408110156112ab57600080fd5b6003546000906001600160a01b0383811691161415612809575060006112b3565b60408051600481526024810182526020810180516001600160e01b0316636f307dc360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b602083106128745780518252601f199092019160209182019101612855565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146128d5576040519150601f19603f3d011682016040523d82523d6000602084013e6128da565b606091505b5091509150816128f057600019925050506112b3565b80806020019051602081101561290557600080fd5b5051949350505050565b60008261291e575060006126af565b8282028284828161292b57fe5b04146114575760405162461bcd60e51b8152600401808060200182810382526021815260200180614fef6021913960400191505060405180910390fd5b600061145783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bfe565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129fa57600080fd5b505afa158015612a0e573d6000803e3d6000fd5b505050506040513d6020811015612a2457600080fd5b50514211612aaa5773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612a7957600080fd5b505afa158015612a8d573d6000803e3d6000fd5b505050506040513d6020811015612aa357600080fd5b5051612ab2565b612ab2613ca0565b90506117d68184613e2f565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0e57600080fd5b505afa158015612b22573d6000803e3d6000fd5b505050506040513d6020811015612b3857600080fd5b50514211612bbe5773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8d57600080fd5b505afa158015612ba1573d6000803e3d6000fd5b505050506040513d6020811015612bb757600080fd5b5051612bc6565b612bc6613ca0565b90506117d68382613e57565b16151590565b60009392505050565b600082820183811015611457576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061145783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e70565b60006001600160a01b03821615806126af57506001600160a01b0382166000805160206150108339815191521492915050565b60006001600160a01b0382161580612cde57506001600160a01b038216600080516020615010833981519152145b15612ceb575060126112b3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310612d565780518252601f199092019160209182019101612d37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612db7576040519150601f19603f3d011682016040523d82523d6000602084013e612dbc565b606091505b509150915081612e965760408051600481526024810182526020810180516001600160e01b0316632e0f262560e01b178152915181516001600160a01b038816936113889392918291908083835b60208310612e295780518252601f199092019160209182019101612e0a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612e8a576040519150601f19603f3d011682016040523d82523d6000602084013e612e8f565b606091505b5090925090505b816128f0576012949350505050565b80612eaf57612feb565b6001600160a01b0384161580612edb57506001600160a01b038416600080516020615010833981519152145b15612fd0576001600160a01b03831633148015612ef85750803410155b612f3d576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014612f85576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612f83573d6000803e3d6000fd5b505b80341115612fcb57336108fc612fa1348463ffffffff612c3b16565b6040518115909202916000818181858888f19350505050158015612fc9573d6000803e3d6000fd5b505b612feb565b612feb6001600160a01b03851684848463ffffffff613eca16565b50505050565b836001600160a01b0316856001600160a01b0316141561301057613a8c565b61302181601063ffffffff6126aa16565b156132325761302f856126b5565b156130e557600061303f866127e8565b9050856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561308757600080fd5b505af115801561309b573d6000803e3d6000fd5b505050506040513d60208110156130b157600080fd5b50600090506130cf6001600160a01b0383163063ffffffff613a9316565b90506130de8287838787612ff1565b5050613a8c565b6130ee846126b5565b156132325760006130fe856127e8565b905061310d8682868686612ff1565b60006131286001600160a01b0383163063ffffffff613a9316565b905061313c826001600160a01b0316612c7d565b156131af57600360009054906101000a90046001600160a01b03166001600160a01b0316631249c58b826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561319157600080fd5b505af11580156131a5573d6000803e3d6000fd5b50505050506130de565b6131b98287613f24565b856001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156131ff57600080fd5b505af1158015613213573d6000803e3d6000fd5b505050506040513d602081101561322957600080fd5b50505050613a8c565b61324381602063ffffffff6126aa16565b1561349b57600061325386610f40565b90506001600160a01b038082161461336757613277816001600160a01b0316612c7d565b156132fd576040805163081a6b2560e41b81523060048201526024810186905290516001600160a01b038816916381a6b2509160448083019260209291908290030181600087803b1580156132cb57600080fd5b505af11580156132df573d6000803e3d6000fd5b505050506040513d60208110156132f557600080fd5b5061334c9050565b60408051632770a7eb60e21b81523060048201526024810186905290516001600160a01b03881691639dc29fac9160448083019260209291908290030181600087803b15801561308757600080fd5b60006130cf6001600160a01b0383163063ffffffff613a9316565b61337085610f40565b90506001600160a01b03808216146134995761338f8682868686612ff1565b60006133aa6001600160a01b0383163063ffffffff613a9316565b90506133be826001600160a01b0316612c7d565b156134405760408051638f6ede1f60e01b815230600482015290516001600160a01b03881691638f6ede1f91849160248082019260209290919082900301818588803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b50505050506040513d602081101561343857600080fd5b506130de9050565b61344a8287613f24565b604080516340c10f1960e01b81523060048201526024810183905290516001600160a01b038816916340c10f199160448083019260209291908290030181600087803b1580156131ff57600080fd5b505b6134ac81604063ffffffff6126aa16565b156136f1576005546001600160a01b03868116911614156135bf576005546040805163ef693bed60e01b81523060048201526024810186905290516001600160a01b039092169163ef693bed9160448082019260009290919082900301818387803b15801561351a57600080fd5b505af115801561352e573d6000803e3d6000fd5b505060048054604080516370a0823160e01b81523093810193909352516135ba94506001600160a01b039091169250879183916370a0823191602480820192602092909190829003018186803b15801561358757600080fd5b505afa15801561359b573d6000803e3d6000fd5b505050506040513d60208110156135b157600080fd5b50518585612ff1565b613a8c565b6005546001600160a01b03858116911614156136f1576004546135ef9086906001600160a01b0316858585612ff1565b60045460055461360b916001600160a01b039081169116613f24565b60055460048054604080516370a0823160e01b81523093810184905290516001600160a01b0394851694633b4da69f949316916370a08231916024808301926020929190829003018186803b15801561366357600080fd5b505afa158015613677573d6000803e3d6000fd5b505050506040513d602081101561368d57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b1580156136dd57600080fd5b505af1158015613229573d6000803e3d6000fd5b61370281608063ffffffff6126aa16565b1561392d57600061371286611ba5565b90506001600160a01b038082161461379557856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561376a57600080fd5b505af115801561377e573d6000803e3d6000fd5b5050505061378f8186868686612ff1565b50613a8c565b61379e85611ba5565b90506001600160a01b038082161461392b576137bd8682868686612ff1565b60006137d86001600160a01b0383163063ffffffff613a9316565b905061385d82600660009054906101000a90046001600160a01b03166001600160a01b031663f2f4eb266040518163ffffffff1660e01b815260040160206040518083038186803b15801561382c57600080fd5b505afa158015613840573d6000803e3d6000fd5b505050506040513d602081101561385657600080fd5b5051613f24565b6006546001600160a01b039081169063d2d0e0669061387d908516612c7d565b61388857600061388a565b825b61389c856001600160a01b0316612c7d565b6138a657846138b6565b6000805160206150108339815191525b604080516001600160e01b031960e086901b1681526001600160a01b0390921660048301526024820186905261044d604483015251606480830192600092919082900301818588803b15801561390b57600080fd5b505af115801561391f573d6000803e3d6000fd5b50505050505050613a8c565b505b613935614f42565b5060408051608081018252613fdd815261423360208201526143969181019190915261481e6060820152600080805b60048110156139bd57600086828151811061397b57fe5b602002602001015111156139b5576139af86828151811061399857fe5b602002602001015184612be190919063ffffffff16565b92508091505b600101613964565b50600082116139fd5760405162461bcd60e51b815260040180806020018281038252602f815260200180614fc0602f913960400191505060405180910390fd5b8560005b6004811015613a8657868181518110613a1657fe5b602002602001015160001415613a2b57613a7e565b6000613a57856108d88a8581518110613a4057fe5b60200260200101518c61290f90919063ffffffff16565b905083821415613a645750815b8083039250613a7b8b8b83898660048110610ccd57fe5b50505b600101613a01565b50505050505b5050505050565b60006001600160a01b0383161580613ac157506001600160a01b038316600080516020615010833981519152145b15613ad757506001600160a01b038116316126af565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613b2d57600080fd5b505afa158015613b41573d6000803e3d6000fd5b505050506040513d6020811015613b5757600080fd5b505190506126af565b600081613b6f57506001611457565b6001600160a01b0384161580613b9b57506001600160a01b038416600080516020615010833981519152145b15613bdc576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015613bd6573d6000803e3d6000fd5b50611457565b613bf66001600160a01b038516848463ffffffff614ab816565b506001611457565b60008183613c8a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c4f578181015183820152602001613c37565b50505050905090810190601f168015613c7c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613c9657fe5b0495945050505050565b6000613e2a613dac73197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b815260040160206040518083038186803b158015613cf557600080fd5b505afa158015613d09573d6000803e3d6000fd5b505050506040513d6020811015613d1f57600080fd5b5051604080516320aba08b60e01b8152905173197e90f9fad81970ba7976f33cbd77088e5d7cf7916320aba08b916004808301926020929190829003018186803b158015613d6c57600080fd5b505afa158015613d80573d6000803e3d6000fd5b505050506040513d6020811015613d9657600080fd5b505142036b033b2e3c9fd0803ce8000000614b0f565b73197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015613df957600080fd5b505afa158015613e0d573d6000803e3d6000fd5b505050506040513d6020811015613e2357600080fd5b5051613e2f565b905090565b60006b033b2e3c9fd0803ce8000000613e488484614bce565b81613e4f57fe5b049392505050565b600081613e48846b033b2e3c9fd0803ce8000000614bce565b60008184841115613ec25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c4f578181015183820152602001613c37565b505050900390565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612feb908590614bf2565b613f36826001600160a01b0316612c7d565b613fd95760408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915160ff9285169163dd62ed3e916044808301926020929190829003018186803b158015613f8b57600080fd5b505afa158015613f9f573d6000803e3d6000fd5b505050506040513d6020811015613fb557600080fd5b5051901c613fd957613fd96001600160a01b0383168260001963ffffffff614daa16565b5050565b600081613ff26001600160a01b038616612c7d565b61411557600854604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561404757600080fd5b505afa15801561405b573d6000803e3d6000fd5b505050506040513d602081101561407157600080fd5b505190506001600160a01b038116156141135761408e8682613f24565b604080516395e3c50b60e01b8152600481018490526001602482015242604482015290516001600160a01b038316916395e3c50b9160648083019260209291908290030181600087803b1580156140e457600080fd5b505af11580156140f8573d6000803e3d6000fd5b505050506040513d602081101561410e57600080fd5b505191505b505b614127846001600160a01b0316612c7d565b6117d657600854604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561417c57600080fd5b505afa158015614190573d6000803e3d6000fd5b505050506040513d60208110156141a657600080fd5b505190506001600160a01b038116156117d457806001600160a01b031663f39b5b9b836001426040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b15801561420857600080fd5b505af115801561421c573d6000803e3d6000fd5b50505050506040513d6020811015611f8e57600080fd5b60075460009061424d9085906001600160a01b0316613f24565b6007546001600160a01b03908116906329589f619061426d908716612c7d565b61427857600061427a565b835b61428c876001600160a01b0316612c7d565b61429657866142a6565b6000805160206150108339815191525b856142b9886001600160a01b0316612c7d565b6142c357876142d3565b6000805160206150108339815191525b604080516001600160e01b031960e088901b1681526001600160a01b039485166004820152602481019390935292166044820152306064820152600160ff1b6084820152600060a48201819052734d37f28d2db99e8d35a6c725a5f1749a085850a360c483015261010060e4830152610104820152905161014480830192602092919082900301818588803b15801561436b57600080fd5b505af115801561437f573d6000803e3d6000fd5b50505050506040513d602081101561290557600080fd5b60006143aa846001600160a01b0316612c7d565b1561441957600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156143ff57600080fd5b505af1158015614413573d6000803e3d6000fd5b50505050505b60095460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561447457600080fd5b505afa158015614488573d6000803e3d6000fd5b505050506040513d602081101561449e57600080fd5b5051600a549091506060906001600160a01b03908116906375e1cc82906144c6908916612c7d565b6144d057876144dd565b6001546001600160a01b03165b6144ef886001600160a01b0316612c7d565b6144f95787614506565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561456557600080fd5b505afa158015614579573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156145a257600080fd5b81019080805160405193929190846401000000008211156145c257600080fd5b9083019060208201858111156145d757600080fd5b82518660208202830111640100000000821117156145f457600080fd5b82525081516020918201928201910280838360005b83811015614621578181015183820152602001614609565b505050509050016040525050509050614662614645876001600160a01b0316612c7d565b61464f578661465c565b6001546001600160a01b03165b83613f24565b6000826001600160a01b031663c7ba24bc838760016040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156146d25781810151838201526020016146ba565b50505050905001945050505050602060405180830381600087803b1580156146f957600080fd5b505af115801561470d573d6000803e3d6000fd5b505050506040513d602081101561472357600080fd5b505190506147396001600160a01b038716612c7d565b1561481457600154604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b15801561479157600080fd5b505afa1580156147a5573d6000803e3d6000fd5b505050506040513d60208110156147bb57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b1580156147fb57600080fd5b505af115801561480f573d6000803e3d6000fd5b505050505b9695505050505050565b6000614832846001600160a01b0316612c7d565b15614896576000805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692600480820193929182900301818588803b15801561487c57600080fd5b505af1158015614890573d6000803e3d6000fd5b50505050505b6148d36148ab856001600160a01b0316612c7d565b6148b557846148c2565b6000546001600160a01b03165b600b546001600160a01b0316613f24565b600b546000906001600160a01b0390811690630621b4f6906148f6908816612c7d565b614900578661490d565b6000546001600160a01b03165b85614920886001600160a01b0316612c7d565b61492a5787614937565b6000546001600160a01b03165b604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015260248101939093529216604482015260016064820152905160848083019260209291908290030181600087803b15801561499557600080fd5b505af11580156149a9573d6000803e3d6000fd5b505050506040513d60208110156149bf57600080fd5b505190506149d56001600160a01b038516612c7d565b156117d657600054604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b158015614a2d57600080fd5b505afa158015614a41573d6000803e3d6000fd5b505050506040513d6020811015614a5757600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015614a9757600080fd5b505af1158015614aab573d6000803e3d6000fd5b5050505090509392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052614b0a908490614bf2565b505050565b6000838015614bb057600184168015614b2a57859250614b2e565b8392505b50600283046002850494505b8415614baa578586028687820414614b5157600080fd5b81810181811015614b6157600080fd5b85810497506002870615614b9d578785028589820414158915151615614b8657600080fd5b83810181811015614b9657600080fd5b8790049550505b5050600285049450614b3a565b50614bc6565b838015614bc05760009250614bc4565b8392505b505b509392505050565b6000811580614be957505080820282828281614be657fe5b04145b6126af57600080fd5b614c04826001600160a01b0316614df8565b614c55576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310614c935780518252601f199092019160209182019101614c74565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614cf5576040519150601f19603f3d011682016040523d82523d6000602084013e614cfa565b606091505b509150915081614d51576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115612feb57808060200190516020811015614d6d57600080fd5b5051612feb5760405162461bcd60e51b815260040180806020018281038252602a815260200180615030602a913960400191505060405180910390fd5b6001600160a01b03831615801590614dd957506001600160a01b03831660008051602061501083398151915214155b15614b0a57614b0a6001600160a01b038416838363ffffffff614e2f16565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906117d65750141592915050565b801580614eb5575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614e8757600080fd5b505afa158015614e9b573d6000803e3d6000fd5b505050506040513d6020811015614eb157600080fd5b5051155b614ef05760405162461bcd60e51b815260040180806020018281038252603681526020018061505a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052614b0a908490614bf2565b60405180608001604052806004905b614f88815260200190600190039081614f515790505090565b60405180608001604052806004906020820280388339509192915050565bfefe4f6e6553706c69743a2061637475616c2072657475726e20616d6f756e74206973206c657373207468616e206d696e52657475726e4f6e6553706c69743a20646973747269627574696f6e2073686f756c6420636f6e7461696e206e6f6e2d7a65726f73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a723158209d907885771a554815b0063ba9ebad10e75ba4f4b281b50c05fb78a9a0fcbb4b64736f6c63430005100032
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80638bdb2afa116100f7578063d77366a411610095578063f4b9fa7511610064578063f4b9fa751461075b578063f64a9a4914610770578063f69e204614610785578063f82c50f11461079a576101cd565b8063d77366a4146105c8578063e2a7515e146105dd578063eb16df2a146106a7578063f484966b146106bc576101cd565b8063a1b4d011116100d1578063a1b4d01114610574578063a734f06e14610589578063b69d04561461059e578063ceb54115146105b3576101cd565b80638bdb2afa146105015780638c6c11f214610516578063955039451461052b576101cd565b80635cfcee281161016f57806372b6f1bf1161013e57806372b6f1bf14610461578063819faf7b1461049457806383366577146104a95780638a273858146104be576101cd565b80635cfcee281461037e57806364456efa146103935780636b9589aa146103d65780636f3a10531461041e576101cd565b80633c1a62dc116101ab5780633c1a62dc146102cc5780634037f967146102f35780634c914a4e146103265780635372d5481461033b576101cd565b8063085e2c5b146101dc57806312dea160146102865780631388b420146102b7575b333214156101da57600080fd5b005b3480156101e857600080fd5b5061022b600480360360a08110156101ff57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356107c4565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610271578181015183820152602001610259565b50505050905001935050505060405180910390f35b34801561029257600080fd5b5061029b610f1d565b604080516001600160a01b039092168252519081900360200190f35b3480156102c357600080fd5b5061029b610f2c565b3480156102d857600080fd5b506102e1610f3b565b60408051918252519081900360200190f35b3480156102ff57600080fd5b5061029b6004803603602081101561031657600080fd5b50356001600160a01b0316610f40565b34801561033257600080fd5b506102e16112b8565b34801561034757600080fd5b506102e16004803603606081101561035e57600080fd5b506001600160a01b038135811691602081013590911690604001356112bd565b34801561038a57600080fd5b506102e161145e565b34801561039f57600080fd5b506102e1600480360360608110156103b657600080fd5b506001600160a01b03813581169160208101359091169060400135611463565b6101da600480360360c08110156103ec57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a001356117de565b34801561042a57600080fd5b506102e16004803603606081101561044157600080fd5b506001600160a01b03813581169160208101359091169060400135611807565b34801561046d57600080fd5b5061029b6004803603602081101561048457600080fd5b50356001600160a01b0316611ba5565b3480156104a057600080fd5b5061029b611df5565b3480156104b557600080fd5b506102e1611e04565b3480156104ca57600080fd5b506102e1600480360360608110156104e157600080fd5b506001600160a01b03813581169160208101359091169060400135611e09565b34801561050d57600080fd5b5061029b611f9a565b34801561052257600080fd5b506102e1611fa9565b34801561053757600080fd5b506102e16004803603608081101561054e57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611fae565b34801561058057600080fd5b5061029b6124d6565b34801561059557600080fd5b5061029b6124e5565b3480156105aa57600080fd5b5061029b6124f7565b3480156105bf57600080fd5b506102e1612506565b3480156105d457600080fd5b5061029b61250b565b6101da600480360360c08110156105f357600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561063357600080fd5b82018360208201111561064557600080fd5b8035906020019184602083028401116401000000008311171561066757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061251a915050565b3480156106b357600080fd5b506102e16125f7565b3480156106c857600080fd5b5061070b600480360360a08110156106df57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356125fc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074757818101518382015260200161072f565b505050509050019250505060405180910390f35b34801561076757600080fd5b5061029b612684565b34801561077c57600080fd5b506102e1612693565b34801561079157600080fd5b5061029b612698565b3480156107a657600080fd5b506101da600480360360208110156107bd57600080fd5b50356126a7565b60408051600480825260a082019092526000916060919060208201608080388339019050509050856001600160a01b0316876001600160a01b0316141561080d57849150610f13565b61081e83601063ffffffff6126aa16565b156109c65761082c876126b5565b156108f857600061083c886127e8565b90506001600160a01b03808216146108f6576000886001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561088957600080fd5b505afa15801561089d573d6000803e3d6000fd5b505050506040513d60208110156108b357600080fd5b505190506108eb82896108e4670de0b6b3a76400006108d88c8763ffffffff61290f16565b9063ffffffff61296816565b89896107c4565b935093505050610f13565b505b610901866126b5565b156109c6576000610911876127e8565b90506001600160a01b03808216146109c4576000876001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561095e57600080fd5b505afa158015610972573d6000803e3d6000fd5b505050506040513d602081101561098857600080fd5b5051905061099989838989896107c4565b90945092506109ba816108d886670de0b6b3a764000063ffffffff61290f16565b9350610f13915050565b505b6109d783602063ffffffff6126aa16565b15610a8c5760006109e788610f40565b90506001600160a01b0380821614610a34576000886001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561088957600080fd5b610a3d87610f40565b90506001600160a01b0380821614610a8a576000876001600160a01b0316637ff9b5966040518163ffffffff1660e01b815260040160206040518083038186803b15801561095e57600080fd5b505b610a9d83604063ffffffff6126aa16565b15610b49576005546001600160a01b0388811691161415610af157600454600554610ae8916001600160a01b03908116918991610ae191168963ffffffff6129aa16565b87876107c4565b91509150610f13565b6005546001600160a01b0387811691161415610b4957600454610b219088906001600160a01b03168787876107c4565b6005549193509150610b42906001600160a01b03168363ffffffff612abe16565b9150610f13565b610b5a83608063ffffffff6126aa16565b15610bbd576000610b6a88611ba5565b90506001600160a01b0380821614610b9357610b8981888888886107c4565b9250925050610f13565b610b9c87611ba5565b90506001600160a01b0380821614610bbb57610b8988828888886107c4565b505b610bc5614f42565b604080516080810190915280610be286600163ffffffff612bd216565b610bee57611463610bf2565b612bd85b67ffffffffffffffff168152602001610c1286600263ffffffff612bd216565b610c1e576112bd610c22565b612bd85b67ffffffffffffffff168152602001610c4286600463ffffffff612bd216565b610c4e57611807610c52565b612bd85b67ffffffffffffffff168152602001610c7286600863ffffffff612bd216565b610c7e57611e09610c82565b612bd85b67ffffffffffffffff1690529050610c98614f6a565b610ca0614f6a565b60005b6004811015610d7857610cda8b8b610cc18c8c63ffffffff61296816565b878560048110610ccd57fe5b602002015163ffffffff16565b838260048110610ce657fe5b60200201523063f82c50f1848360048110610cfd57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610d3657600080fd5b505afa158015610d4a573d6000803e3d6000fd5b50505050828160048110610d5a57fe5b6020020151828260048110610d6b57fe5b6020020152600101610ca3565b5060005b87811015610f0e57600060015b6004811015610dc657848260048110610d9e57fe5b6020020151858260048110610daf57fe5b60200201511115610dbe578091505b600101610d89565b50610de8848260048110610dd657fe5b6020020151889063ffffffff612be116565b9650858181518110610df657fe5b6020026020010180518091906001018152505060008a905089836001011015610f04576000610e598e8e610e4d8e6108d88d8981518110610e3357fe5b60200260200101516001018861290f90919063ffffffff16565b8a8760048110610ccd57fe5b9050610e7c858460048110610e6a57fe5b6020020151829063ffffffff612c3b16565b868460048110610e8857fe5b60200201523063f82c50f1878560048110610e9f57fe5b60200201516040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015610ed857600080fd5b505afa158015610eec573d6000803e3d6000fd5b5050505080858460048110610efd57fe5b6020020152505b5050600101610d7c565b505050505b9550959350505050565b6009546001600160a01b031681565b600b546001600160a01b031681565b602081565b6000610f54826001600160a01b0316612c7d565b15610f6257506000196112b3565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310610fcd5780518252601f199092019160209182019101610fae565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461102e576040519150601f19603f3d011682016040523d82523d6000602084013e611033565b606091505b50915091508161104957600019925050506112b3565b6000805b60078351038110156111a25782816000018151811061106857fe5b6020910101516001600160f81b031916602360f91b1480156110ab575082816001018151811061109457fe5b6020910101516001600160f81b031916607560f81b145b80156110d857508281600201815181106110c157fe5b6020910101516001600160f81b031916601b60fa1b145b801561110557508281600301815181106110ee57fe5b6020910101516001600160f81b031916606360f81b145b8015611132575082816004018151811061111b57fe5b6020910101516001600160f81b031916603960f91b145b801561115f575082816005018151811061114857fe5b6020910101516001600160f81b031916607560f81b145b801561118c575082816006018151811061117557fe5b6020910101516001600160f81b031916606d60f81b145b1561119a57600191506111a2565b60010161104d565b50806111b55760001993505050506112b3565b60408051600481526024810182526020810180516001600160e01b031663797bf38560e01b178152915181516001600160a01b038916936113889392918291908083835b602083106112185780518252601f1990920191602091820191016111f9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611279576040519150601f19603f3d011682016040523d82523d6000602084013e61127e565b606091505b509093509150826112965760001993505050506112b3565b8180602001905160208110156112ab57600080fd5b505193505050505b919050565b604081565b60075460408051600481526024810182526020810180516001600160e01b0316634f61ff8b60e01b1781529151815160009485946060946001600160a01b03909216936108fc93909182918083835b6020831061132b5780518252601f19909201916020918201910161130c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461138c576040519150601f19603f3d011682016040523d82523d6000602084013e611391565b606091505b5091509150816113a657600092505050611457565b60008180602001905160208110156113bd57600080fd5b505190506113d36001600160a01b038816612c7d565b806113eb57506113eb866001600160a01b0316612c7d565b15611406576113fc81888888611fae565b9350505050611457565b6000611422828960008051602061501083398151915289611fae565b905080611436576000945050505050611457565b611450826000805160206150108339815191528984611fae565b9450505050505b9392505050565b601081565b6000816114786001600160a01b038616612c7d565b61161e57600854604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b1580156114cd57600080fd5b505afa1580156114e1573d6000803e3d6000fd5b505050506040513d60208110156114f757600080fd5b505190506001600160a01b0381161561161c5760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b03166395b68fe760e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b602083106115855780518252601f199092019160209182019101611566565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146115e6576040519150601f19603f3d011682016040523d82523d6000602084013e6115eb565b606091505b509150915081156116145780806020019051602081101561160b57600080fd5b50519350611619565b600093505b50505b505b611630846001600160a01b0316612c7d565b6117d657600854604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561168557600080fd5b505afa158015611699573d6000803e3d6000fd5b505050506040513d60208110156116af57600080fd5b505190506001600160a01b038116156117d45760408051602480820185905282518083039091018152604490910182526020810180516001600160e01b031663cd7724c360e01b178152915181516000936060936001600160a01b0387169362030d4093919290918291908083835b6020831061173d5780518252601f19909201916020918201910161171e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461179e576040519150601f19603f3d011682016040523d82523d6000602084013e6117a3565b606091505b509150915081156117cc578080602001905160208110156117c357600080fd5b505193506117d1565b600093505b50505b505b949350505050565b60606117ed87878786866107c4565b9150506117fe87878787858761251a565b50505050505050565b60095460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b6004820152905160009283926001600160a01b039091169163bb34534c91602480820192602092909190829003018186803b15801561186757600080fd5b505afa15801561187b573d6000803e3d6000fd5b505050506040513d602081101561189157600080fd5b5051600a549091506060906001600160a01b03908116906375e1cc82906118b9908916612c7d565b6118c357876118d0565b6001546001600160a01b03165b6118e2886001600160a01b0316612c7d565b6118ec57876118f9565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561195857600080fd5b505afa15801561196c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561199557600080fd5b81019080805160405193929190846401000000008211156119b557600080fd5b9083019060208201858111156119ca57600080fd5b82518660208202830111640100000000821117156119e757600080fd5b82525081516020918201928201910280838360005b83811015611a145781810151838201526020016119fc565b50505050905001604052505050905060006060836001600160a01b031662030d40856001600160a01b0316630c8496cc905060e01b85896040516024018080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015611a94578181015183820152602001611a7c565b505050509050019350505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b60208310611b025780518252601f199092019160209182019101611ae3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611b63576040519150601f19603f3d011682016040523d82523d6000602084013e611b68565b606091505b509150915081611b7f576000945050505050611457565b6000818060200190516040811015611b9657600080fd5b50519998505050505050505050565b6000611bb9826001600160a01b0316612c7d565b15611bc757506000196112b3565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310611c325780518252601f199092019160209182019101611c13565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611c93576040519150601f19603f3d011682016040523d82523d6000602084013e611c98565b606091505b509150915081611cae57600019925050506112b3565b6000805b6004835103811015611d8057828160000181518110611ccd57fe5b6020910101516001600160f81b031916604160f81b148015611d105750828160010181518110611cf957fe5b6020910101516001600160f81b031916606160f81b145b8015611d3d5750828160020181518110611d2657fe5b6020910101516001600160f81b031916603b60f91b145b8015611d6a5750828160030181518110611d5357fe5b6020910101516001600160f81b031916606560f81b145b15611d785760019150611d80565b600101611cb2565b5080611d935760001993505050506112b3565b60408051600481526024810182526020810180516001600160e01b0316632274683f60e21b178152915181516001600160a01b03891693611388939291829190808383602083106112185780518252601f1990920191602091820191016111f9565b6006546001600160a01b031681565b608081565b600b5460009081906060906001600160a01b03908116906207a12090630a2513a960e11b90611e39908916612c7d565b611e435787611e50565b6000546001600160a01b03165b611e628a6001600160a01b0316612c7d565b611e6c5789611e79565b6000546001600160a01b03165b604080516001600160a01b03938416602482015291909216604482015260648082018a905282518083039091018152608490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b60208310611efe5780518252601f199092019160209182019101611edf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114611f5f576040519150601f19603f3d011682016040523d82523d6000602084013e611f64565b606091505b509150915081611f7957600092505050611457565b808060200190516020811015611f8e57600080fd5b50519695505050505050565b6008546001600160a01b031681565b600881565b60008060606001600160a01b038088169062030d4090630611aecb60e11b90611fd8908a16612c7d565b611fe25788611ff2565b6000805160206150108339815191525b612004896001600160a01b0316612c7d565b61200e578861201e565b6000805160206150108339815191525b604080516001600160a01b0393841660248201529190921660448201526064810189905260016084808301919091528251808303909101815260a490910182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b602083106120ad5780518252601f19909201916020918201910161208e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461210e576040519150601f19603f3d011682016040523d82523d6000602084013e612113565b606091505b509150915081612128576000925050506117d6565b60008082806020019051604081101561214057600080fd5b50805160209091015190925090507354a4a1167b004b004520c605e3f01906f683413d6001600160a01b0383161480612195575073cf1394c5e2e879969fdb1f464ce1487147863dcb6001600160a01b038316145b806121bc575073053aa84fcc676113a57e0ebb0bd1913839874be46001600160a01b038316145b156121ce5760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b03166345ed957d60e11b178152915181516001600160a01b038616936108fc9392918291908083835b602083106122315780518252601f199092019160209182019101612212565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612292576040519150601f19603f3d011682016040523d82523d6000602084013e612297565b606091505b509094505083156122af5760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b0316630dad878f60e21b178152915181516001600160a01b038616936108fc9392918291908083835b602083106123125780518252601f1990920191602091820191016122f3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612373576040519150601f19603f3d011682016040523d82523d6000602084013e612378565b606091505b509094505083156123905760009450505050506117d6565b60408051600481526024810182526020810180516001600160e01b0316634d21dff760e01b178152915181516001600160a01b038616936108fc9392918291908083835b602083106123f35780518252601f1990920191602091820191016123d4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612454576040519150601f19603f3d011682016040523d82523d6000602084013e612459565b606091505b509094505083156124715760009450505050506117d6565b6124c9670de0b6b3a76400006108d86124928b6001600160a01b0316612cb0565b600a0a6108d86124aa8c6001600160a01b0316612cb0565b600a0a6124bd878d63ffffffff61290f16565b9063ffffffff61290f16565b9998505050505050505050565b6003546001600160a01b031681565b60008051602061501083398151915281565b6005546001600160a01b031681565b600281565b6007546001600160a01b031681565b6125356001600160a01b03871633308763ffffffff612ea516565b6125428686868585612ff1565b600061255d6001600160a01b0387163063ffffffff613a9316565b90508381101561259e5760405162461bcd60e51b8152600401808060200182810382526035815260200180614f8b6035913960400191505060405180910390fd5b6125b86001600160a01b038716338363ffffffff613b6016565b506125ed336125d66001600160a01b038a163063ffffffff613a9316565b6001600160a01b038a16919063ffffffff613b6016565b5050505050505050565b600181565b606082604051908082528060200260200182016040528015612628578160200160208202803883390190505b50905060005b8381101561267a5761265a8787612652876108d88a6001880163ffffffff61290f16565b6001876107c4565b5082828151811061266757fe5b602090810291909101015260010161262e565b5095945050505050565b6004546001600160a01b031681565b600481565b6002546001600160a01b031681565b50565b818116155b92915050565b6003546000906001600160a01b03838116911614156126d6575060016112b3565b600254604080516001600160a01b0385811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316638e8f294b60e01b17815292518251600095606095931693611388939092918291908083835b602083106127565780518252601f199092019160209182019101612737565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146127b7576040519150601f19603f3d011682016040523d82523d6000602084013e6127bc565b606091505b5091509150816127d1576000925050506112b3565b60008180602001905160408110156112ab57600080fd5b6003546000906001600160a01b0383811691161415612809575060006112b3565b60408051600481526024810182526020810180516001600160e01b0316636f307dc360e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b602083106128745780518252601f199092019160209182019101612855565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146128d5576040519150601f19603f3d011682016040523d82523d6000602084013e6128da565b606091505b5091509150816128f057600019925050506112b3565b80806020019051602081101561290557600080fd5b5051949350505050565b60008261291e575060006126af565b8282028284828161292b57fe5b04146114575760405162461bcd60e51b8152600401808060200182810382526021815260200180614fef6021913960400191505060405180910390fd5b600061145783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bfe565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129fa57600080fd5b505afa158015612a0e573d6000803e3d6000fd5b505050506040513d6020811015612a2457600080fd5b50514211612aaa5773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612a7957600080fd5b505afa158015612a8d573d6000803e3d6000fd5b505050506040513d6020811015612aa357600080fd5b5051612ab2565b612ab2613ca0565b90506117d68184613e2f565b60008073197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b0e57600080fd5b505afa158015612b22573d6000803e3d6000fd5b505050506040513d6020811015612b3857600080fd5b50514211612bbe5773197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8d57600080fd5b505afa158015612ba1573d6000803e3d6000fd5b505050506040513d6020811015612bb757600080fd5b5051612bc6565b612bc6613ca0565b90506117d68382613e57565b16151590565b60009392505050565b600082820183811015611457576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061145783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e70565b60006001600160a01b03821615806126af57506001600160a01b0382166000805160206150108339815191521492915050565b60006001600160a01b0382161580612cde57506001600160a01b038216600080516020615010833981519152145b15612ceb575060126112b3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b178152915181516000936060936001600160a01b0388169361138893919290918291908083835b60208310612d565780518252601f199092019160209182019101612d37565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612db7576040519150601f19603f3d011682016040523d82523d6000602084013e612dbc565b606091505b509150915081612e965760408051600481526024810182526020810180516001600160e01b0316632e0f262560e01b178152915181516001600160a01b038816936113889392918291908083835b60208310612e295780518252601f199092019160209182019101612e0a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114612e8a576040519150601f19603f3d011682016040523d82523d6000602084013e612e8f565b606091505b5090925090505b816128f0576012949350505050565b80612eaf57612feb565b6001600160a01b0384161580612edb57506001600160a01b038416600080516020615010833981519152145b15612fd0576001600160a01b03831633148015612ef85750803410155b612f3d576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014612f85576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612f83573d6000803e3d6000fd5b505b80341115612fcb57336108fc612fa1348463ffffffff612c3b16565b6040518115909202916000818181858888f19350505050158015612fc9573d6000803e3d6000fd5b505b612feb565b612feb6001600160a01b03851684848463ffffffff613eca16565b50505050565b836001600160a01b0316856001600160a01b0316141561301057613a8c565b61302181601063ffffffff6126aa16565b156132325761302f856126b5565b156130e557600061303f866127e8565b9050856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561308757600080fd5b505af115801561309b573d6000803e3d6000fd5b505050506040513d60208110156130b157600080fd5b50600090506130cf6001600160a01b0383163063ffffffff613a9316565b90506130de8287838787612ff1565b5050613a8c565b6130ee846126b5565b156132325760006130fe856127e8565b905061310d8682868686612ff1565b60006131286001600160a01b0383163063ffffffff613a9316565b905061313c826001600160a01b0316612c7d565b156131af57600360009054906101000a90046001600160a01b03166001600160a01b0316631249c58b826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561319157600080fd5b505af11580156131a5573d6000803e3d6000fd5b50505050506130de565b6131b98287613f24565b856001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156131ff57600080fd5b505af1158015613213573d6000803e3d6000fd5b505050506040513d602081101561322957600080fd5b50505050613a8c565b61324381602063ffffffff6126aa16565b1561349b57600061325386610f40565b90506001600160a01b038082161461336757613277816001600160a01b0316612c7d565b156132fd576040805163081a6b2560e41b81523060048201526024810186905290516001600160a01b038816916381a6b2509160448083019260209291908290030181600087803b1580156132cb57600080fd5b505af11580156132df573d6000803e3d6000fd5b505050506040513d60208110156132f557600080fd5b5061334c9050565b60408051632770a7eb60e21b81523060048201526024810186905290516001600160a01b03881691639dc29fac9160448083019260209291908290030181600087803b15801561308757600080fd5b60006130cf6001600160a01b0383163063ffffffff613a9316565b61337085610f40565b90506001600160a01b03808216146134995761338f8682868686612ff1565b60006133aa6001600160a01b0383163063ffffffff613a9316565b90506133be826001600160a01b0316612c7d565b156134405760408051638f6ede1f60e01b815230600482015290516001600160a01b03881691638f6ede1f91849160248082019260209290919082900301818588803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b50505050506040513d602081101561343857600080fd5b506130de9050565b61344a8287613f24565b604080516340c10f1960e01b81523060048201526024810183905290516001600160a01b038816916340c10f199160448083019260209291908290030181600087803b1580156131ff57600080fd5b505b6134ac81604063ffffffff6126aa16565b156136f1576005546001600160a01b03868116911614156135bf576005546040805163ef693bed60e01b81523060048201526024810186905290516001600160a01b039092169163ef693bed9160448082019260009290919082900301818387803b15801561351a57600080fd5b505af115801561352e573d6000803e3d6000fd5b505060048054604080516370a0823160e01b81523093810193909352516135ba94506001600160a01b039091169250879183916370a0823191602480820192602092909190829003018186803b15801561358757600080fd5b505afa15801561359b573d6000803e3d6000fd5b505050506040513d60208110156135b157600080fd5b50518585612ff1565b613a8c565b6005546001600160a01b03858116911614156136f1576004546135ef9086906001600160a01b0316858585612ff1565b60045460055461360b916001600160a01b039081169116613f24565b60055460048054604080516370a0823160e01b81523093810184905290516001600160a01b0394851694633b4da69f949316916370a08231916024808301926020929190829003018186803b15801561366357600080fd5b505afa158015613677573d6000803e3d6000fd5b505050506040513d602081101561368d57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b1580156136dd57600080fd5b505af1158015613229573d6000803e3d6000fd5b61370281608063ffffffff6126aa16565b1561392d57600061371286611ba5565b90506001600160a01b038082161461379557856001600160a01b031663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561376a57600080fd5b505af115801561377e573d6000803e3d6000fd5b5050505061378f8186868686612ff1565b50613a8c565b61379e85611ba5565b90506001600160a01b038082161461392b576137bd8682868686612ff1565b60006137d86001600160a01b0383163063ffffffff613a9316565b905061385d82600660009054906101000a90046001600160a01b03166001600160a01b031663f2f4eb266040518163ffffffff1660e01b815260040160206040518083038186803b15801561382c57600080fd5b505afa158015613840573d6000803e3d6000fd5b505050506040513d602081101561385657600080fd5b5051613f24565b6006546001600160a01b039081169063d2d0e0669061387d908516612c7d565b61388857600061388a565b825b61389c856001600160a01b0316612c7d565b6138a657846138b6565b6000805160206150108339815191525b604080516001600160e01b031960e086901b1681526001600160a01b0390921660048301526024820186905261044d604483015251606480830192600092919082900301818588803b15801561390b57600080fd5b505af115801561391f573d6000803e3d6000fd5b50505050505050613a8c565b505b613935614f42565b5060408051608081018252613fdd815261423360208201526143969181019190915261481e6060820152600080805b60048110156139bd57600086828151811061397b57fe5b602002602001015111156139b5576139af86828151811061399857fe5b602002602001015184612be190919063ffffffff16565b92508091505b600101613964565b50600082116139fd5760405162461bcd60e51b815260040180806020018281038252602f815260200180614fc0602f913960400191505060405180910390fd5b8560005b6004811015613a8657868181518110613a1657fe5b602002602001015160001415613a2b57613a7e565b6000613a57856108d88a8581518110613a4057fe5b60200260200101518c61290f90919063ffffffff16565b905083821415613a645750815b8083039250613a7b8b8b83898660048110610ccd57fe5b50505b600101613a01565b50505050505b5050505050565b60006001600160a01b0383161580613ac157506001600160a01b038316600080516020615010833981519152145b15613ad757506001600160a01b038116316126af565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613b2d57600080fd5b505afa158015613b41573d6000803e3d6000fd5b505050506040513d6020811015613b5757600080fd5b505190506126af565b600081613b6f57506001611457565b6001600160a01b0384161580613b9b57506001600160a01b038416600080516020615010833981519152145b15613bdc576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015613bd6573d6000803e3d6000fd5b50611457565b613bf66001600160a01b038516848463ffffffff614ab816565b506001611457565b60008183613c8a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c4f578181015183820152602001613c37565b50505050905090810190601f168015613c7c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613c9657fe5b0495945050505050565b6000613e2a613dac73197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b815260040160206040518083038186803b158015613cf557600080fd5b505afa158015613d09573d6000803e3d6000fd5b505050506040513d6020811015613d1f57600080fd5b5051604080516320aba08b60e01b8152905173197e90f9fad81970ba7976f33cbd77088e5d7cf7916320aba08b916004808301926020929190829003018186803b158015613d6c57600080fd5b505afa158015613d80573d6000803e3d6000fd5b505050506040513d6020811015613d9657600080fd5b505142036b033b2e3c9fd0803ce8000000614b0f565b73197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b815260040160206040518083038186803b158015613df957600080fd5b505afa158015613e0d573d6000803e3d6000fd5b505050506040513d6020811015613e2357600080fd5b5051613e2f565b905090565b60006b033b2e3c9fd0803ce8000000613e488484614bce565b81613e4f57fe5b049392505050565b600081613e48846b033b2e3c9fd0803ce8000000614bce565b60008184841115613ec25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c4f578181015183820152602001613c37565b505050900390565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612feb908590614bf2565b613f36826001600160a01b0316612c7d565b613fd95760408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915160ff9285169163dd62ed3e916044808301926020929190829003018186803b158015613f8b57600080fd5b505afa158015613f9f573d6000803e3d6000fd5b505050506040513d6020811015613fb557600080fd5b5051901c613fd957613fd96001600160a01b0383168260001963ffffffff614daa16565b5050565b600081613ff26001600160a01b038616612c7d565b61411557600854604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561404757600080fd5b505afa15801561405b573d6000803e3d6000fd5b505050506040513d602081101561407157600080fd5b505190506001600160a01b038116156141135761408e8682613f24565b604080516395e3c50b60e01b8152600481018490526001602482015242604482015290516001600160a01b038316916395e3c50b9160648083019260209291908290030181600087803b1580156140e457600080fd5b505af11580156140f8573d6000803e3d6000fd5b505050506040513d602081101561410e57600080fd5b505191505b505b614127846001600160a01b0316612c7d565b6117d657600854604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561417c57600080fd5b505afa158015614190573d6000803e3d6000fd5b505050506040513d60208110156141a657600080fd5b505190506001600160a01b038116156117d457806001600160a01b031663f39b5b9b836001426040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b15801561420857600080fd5b505af115801561421c573d6000803e3d6000fd5b50505050506040513d6020811015611f8e57600080fd5b60075460009061424d9085906001600160a01b0316613f24565b6007546001600160a01b03908116906329589f619061426d908716612c7d565b61427857600061427a565b835b61428c876001600160a01b0316612c7d565b61429657866142a6565b6000805160206150108339815191525b856142b9886001600160a01b0316612c7d565b6142c357876142d3565b6000805160206150108339815191525b604080516001600160e01b031960e088901b1681526001600160a01b039485166004820152602481019390935292166044820152306064820152600160ff1b6084820152600060a48201819052734d37f28d2db99e8d35a6c725a5f1749a085850a360c483015261010060e4830152610104820152905161014480830192602092919082900301818588803b15801561436b57600080fd5b505af115801561437f573d6000803e3d6000fd5b50505050506040513d602081101561290557600080fd5b60006143aa846001600160a01b0316612c7d565b1561441957600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156143ff57600080fd5b505af1158015614413573d6000803e3d6000fd5b50505050505b60095460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561447457600080fd5b505afa158015614488573d6000803e3d6000fd5b505050506040513d602081101561449e57600080fd5b5051600a549091506060906001600160a01b03908116906375e1cc82906144c6908916612c7d565b6144d057876144dd565b6001546001600160a01b03165b6144ef886001600160a01b0316612c7d565b6144f95787614506565b6001546001600160a01b03165b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060006040518083038186803b15801561456557600080fd5b505afa158015614579573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156145a257600080fd5b81019080805160405193929190846401000000008211156145c257600080fd5b9083019060208201858111156145d757600080fd5b82518660208202830111640100000000821117156145f457600080fd5b82525081516020918201928201910280838360005b83811015614621578181015183820152602001614609565b505050509050016040525050509050614662614645876001600160a01b0316612c7d565b61464f578661465c565b6001546001600160a01b03165b83613f24565b6000826001600160a01b031663c7ba24bc838760016040518463ffffffff1660e01b81526004018080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156146d25781810151838201526020016146ba565b50505050905001945050505050602060405180830381600087803b1580156146f957600080fd5b505af115801561470d573d6000803e3d6000fd5b505050506040513d602081101561472357600080fd5b505190506147396001600160a01b038716612c7d565b1561481457600154604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b15801561479157600080fd5b505afa1580156147a5573d6000803e3d6000fd5b505050506040513d60208110156147bb57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b1580156147fb57600080fd5b505af115801561480f573d6000803e3d6000fd5b505050505b9695505050505050565b6000614832846001600160a01b0316612c7d565b15614896576000805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692600480820193929182900301818588803b15801561487c57600080fd5b505af1158015614890573d6000803e3d6000fd5b50505050505b6148d36148ab856001600160a01b0316612c7d565b6148b557846148c2565b6000546001600160a01b03165b600b546001600160a01b0316613f24565b600b546000906001600160a01b0390811690630621b4f6906148f6908816612c7d565b614900578661490d565b6000546001600160a01b03165b85614920886001600160a01b0316612c7d565b61492a5787614937565b6000546001600160a01b03165b604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015260248101939093529216604482015260016064820152905160848083019260209291908290030181600087803b15801561499557600080fd5b505af11580156149a9573d6000803e3d6000fd5b505050506040513d60208110156149bf57600080fd5b505190506149d56001600160a01b038516612c7d565b156117d657600054604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b158015614a2d57600080fd5b505afa158015614a41573d6000803e3d6000fd5b505050506040513d6020811015614a5757600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015614a9757600080fd5b505af1158015614aab573d6000803e3d6000fd5b5050505090509392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052614b0a908490614bf2565b505050565b6000838015614bb057600184168015614b2a57859250614b2e565b8392505b50600283046002850494505b8415614baa578586028687820414614b5157600080fd5b81810181811015614b6157600080fd5b85810497506002870615614b9d578785028589820414158915151615614b8657600080fd5b83810181811015614b9657600080fd5b8790049550505b5050600285049450614b3a565b50614bc6565b838015614bc05760009250614bc4565b8392505b505b509392505050565b6000811580614be957505080820282828281614be657fe5b04145b6126af57600080fd5b614c04826001600160a01b0316614df8565b614c55576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310614c935780518252601f199092019160209182019101614c74565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614cf5576040519150601f19603f3d011682016040523d82523d6000602084013e614cfa565b606091505b509150915081614d51576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115612feb57808060200190516020811015614d6d57600080fd5b5051612feb5760405162461bcd60e51b815260040180806020018281038252602a815260200180615030602a913960400191505060405180910390fd5b6001600160a01b03831615801590614dd957506001600160a01b03831660008051602061501083398151915214155b15614b0a57614b0a6001600160a01b038416838363ffffffff614e2f16565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906117d65750141592915050565b801580614eb5575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614e8757600080fd5b505afa158015614e9b573d6000803e3d6000fd5b505050506040513d6020811015614eb157600080fd5b5051155b614ef05760405162461bcd60e51b815260040180806020018281038252603681526020018061505a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052614b0a908490614bf2565b60405180608001604052806004905b614f88815260200190600190039081614f515790505090565b60405180608001604052806004906020820280388339509192915050565bfefe4f6e6553706c69743a2061637475616c2072657475726e20616d6f756e74206973206c657373207468616e206d696e52657475726e4f6e6553706c69743a20646973747269627574696f6e2073686f756c6420636f6e7461696e206e6f6e2d7a65726f73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a723158209d907885771a554815b0063ba9ebad10e75ba4f4b281b50c05fb78a9a0fcbb4b64736f6c63430005100032
Deployed Bytecode Sourcemap
29430:29517:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31551:10;31565:9;31551:23;;31543:32;;;;;;29430:29517;32182:6258;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32182:6258:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;32182:6258: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;32182:6258:0;;;;;;;;;;;;;;;;;;31084:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31084:123:0;;;:::i;:::-;;;;-1:-1:-1;;;;;31084:123:0;;;;;;;;;;;;;;31340:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31340:96:0;;;:::i;30003:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30003:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;56640:1205;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56640:1205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56640:1205:0;-1:-1:-1;;;;;56640:1205:0;;:::i;30053:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30053:40:0;;;:::i;47711:946::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47711:946:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;47711:946:0;;;;;;;;;;;;;;;;;:::i;29952:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29952:44:0;;;:::i;46128:1575::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46128:1575:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46128:1575:0;;;;;;;;;;;;;;;;;:::i;45527:570::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;45527:570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50579:888::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50579:888:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;50579:888:0;;;;;;;;;;;;;;;;;:::i;57853:1091::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57853:1091:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57853:1091:0;-1:-1:-1;;;;;57853:1091:0;;:::i;30763:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30763:91:0;;;:::i;30100:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30100:40:0;;;:::i;51475:607::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51475:607:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51475:607:0;;;;;;;;;;;;;;;;;:::i;30978:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30978:99:0;;;:::i;29904:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29904:41:0;;;:::i;48665:1906::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48665:1906:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;48665:1906:0;;;;;;;;;;;;;;;;;;;;;;:::i;30514:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30514:87:0;;;:::i;30149:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30149:87:0;;;:::i;30687:69::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30687:69:0;;;:::i;29807:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29807:41:0;;;:::i;30863:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30863:108:0;;;:::i;38448:773::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;38448:773:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38448:773:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38448:773:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38448:773:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38448:773:0;;-1:-1:-1;;38448:773:0;;;-1:-1:-1;38448:773:0;;-1:-1:-1;;38448:773:0:i;29757:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29757:43:0;;;:::i;31643:531::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31643:531:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;31643: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;31643:531:0;;;;;;;;;;;;;;;;;30610:70;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30610:70:0;;;:::i;29855:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29855:42:0;;;:::i;30426:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30426:81:0;;;:::i;31591:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31591:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31591:44:0;;:::i;32182:6258::-;32629:16;;;32643:1;32629:16;;;;;;;;;32487:20;;32522:29;;32629:16;;;;17:15:-1;;105:10;32629:16:0;88:34:-1;136:17;;-1:-1;32629:16:0;32614:31;;32675:7;-1:-1:-1;;;;;32662:20:0;:9;-1:-1:-1;;;;;32662:20:0;;32658:124;;;32714:6;;-1:-1:-1;32735:35:0;;32658:124;32798:35;:12;29992:4;32798:35;:20;:35;:::i;:::-;32794:1347;;;32854:27;32871:9;32854:16;:27::i;:::-;32850:567;;;32902:17;32922:35;32947:9;32922:24;:35::i;:::-;32902:55;-1:-1:-1;;;;;;32980:24:0;;;;32976:426;;33029:20;33075:9;-1:-1:-1;;;;;33052:53:0;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33052:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33052:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33052:55:0;;-1:-1:-1;33139:243:0;33183:10;33220:7;33254:34;33283:4;33254:24;:6;33052:55;33254:24;:10;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;33315:5;33347:12;33139:17;:243::i;:::-;33132:250;;;;;;;;32976:426;32850:567;;33437:25;33454:7;33437:16;:25::i;:::-;33433:697;;;33483:17;33503:33;33528:7;33503:24;:33::i;:::-;33483:53;-1:-1:-1;;;;;;33559:24:0;;;;33555:560;;33608:20;33654:7;-1:-1:-1;;;;;33631:51:0;;:53;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33631:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33631:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33631:53:0;;-1:-1:-1;33740:217:0;33784:9;33820:10;33857:6;33890:5;33922:12;33740:17;:217::i;:::-;33709:248;;-1:-1:-1;33709:248:0;-1:-1:-1;33997:40:0;34024:12;33997:22;33709:248;34014:4;33997:22;:16;:22;:::i;:40::-;33982:55;-1:-1:-1;34060:35:0;;-1:-1:-1;;34060:35:0;33555:560;33433:697;;34157:34;:12;30042:4;34157:34;:20;:34;:::i;:::-;34153:1079;;;34208:17;34228:26;34244:9;34228:15;:26::i;:::-;34208:46;-1:-1:-1;;;;;;34273:24:0;;;;34269:379;;34318:19;34362:9;-1:-1:-1;;;;;34340:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;34269:379:0;34677:24;34693:7;34677:15;:24::i;:::-;34664:37;-1:-1:-1;;;;;;34720:24:0;;;;34716:505;;34765:19;34809:7;-1:-1:-1;;;;;34787:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;34716:505:0;34153:1079;;35248:31;:12;30089:4;35248:31;:20;:31;:::i;:::-;35244:703;;;35320:4;;-1:-1:-1;;;;;35300:25:0;;;35320:4;;35300:25;35296:273;;;35393:3;;35449:4;;35353:200;;-1:-1:-1;;;;;35393:3:0;;;;35419:7;;35449:22;;:4;35464:6;35449:22;:14;:22;:::i;:::-;35494:5;35522:12;35353:17;:200::i;:::-;35346:207;;;;;;35296:273;35607:4;;-1:-1:-1;;;;;35589:23:0;;;35607:4;;35589:23;35585:351;;;35736:3;;35664:186;;35704:9;;-1:-1:-1;;;;;35736:3:0;35762:6;35791:5;35819:12;35664:17;:186::i;:::-;35877:4;;35633:217;;-1:-1:-1;35633:217:0;-1:-1:-1;35877:28:0;;-1:-1:-1;;;;;35877:4:0;35633:217;35877:28;:14;:28;:::i;:::-;35869:51;-1:-1:-1;35869:51:0;;35585:351;35963:31;:12;30136:4;35963:31;:20;:31;:::i;:::-;35959:714;;;36011:17;36031:23;36044:9;36031:12;:23::i;:::-;36011:43;-1:-1:-1;;;;;;36073:24:0;;;;36069:263;;36125:191;36165:10;36198:7;36228:6;36257:5;36285:12;36125:17;:191::i;:::-;36118:198;;;;;;;36069:263;36361:21;36374:7;36361:12;:21::i;:::-;36348:34;-1:-1:-1;;;;;;36401:24:0;;;;36397:265;;36453:193;36493:9;36525:10;36558:6;36587:5;36615:12;36453:17;:193::i;36397:265::-;35959:714;;36685:72;;:::i;:::-;:465;;;;;;;;;;36775:35;:12;29796:4;36775:35;:21;:35;:::i;:::-;:81;;36834:22;36775:81;;;36813:18;36775:81;36685:465;;;;;;36871:33;:12;29844:4;36871:33;:21;:33;:::i;:::-;:79;;36930:20;36871:79;;;36909:18;36871:79;36685:465;;;;;;36965:34;:12;29893:4;36965:34;:21;:34;:::i;:::-;:80;;37024:21;36965:80;;;37003:18;36965:80;36685:465;;;;;;37060:33;:12;29941:4;37060:33;:21;:33;:::i;:::-;:79;;37119:20;37060:79;;;37098:18;37060:79;36685:465;;;;;-1:-1:-1;37163:23:0;;:::i;:::-;37197:27;;:::i;:::-;37240:6;37235:199;37256:12;37252:1;:16;37235:199;;;37301:50;37313:9;37324:7;37333:17;:6;37344:5;37333:17;:10;:17;:::i;:::-;37301:8;37310:1;37301:11;;;;;;;;;;;:50;;:::i;:::-;37290:5;37296:1;37290:8;;;;;;;;;;:61;37366:4;:8;37375:5;37381:1;37375:8;;;;;;;;;;;37366:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37366:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37366:18:0;;;;37414:5;37420:1;37414:8;;;;;;;;;;;37399:9;37409:1;37399:12;;;;;;;;;;:23;37270:3;;37235:199;;;-1:-1:-1;37451:6:0;37446:987;37467:5;37463:1;:9;37446:987;;;37525:17;37575:1;37561:163;37582:12;37578:1;:16;37561:163;;;37635:5;37641:9;37635:16;;;;;;;;;;;37624:5;37630:1;37624:8;;;;;;;;;;;:27;37620:89;;;37688:1;37676:13;;37620:89;37596:3;;37561:163;;;;37785:34;37802:5;37808:9;37802:16;;;;;;;;;;;37785:12;;:34;:16;:34;:::i;:::-;37770:49;;37834:12;37847:9;37834:23;;;;;;;;;;;;;:25;;;;;;;;;;;37928:17;37948:6;37928:26;;38021:5;38013:1;38017;38013:5;:13;38009:413;;;38047:15;38065:176;38107:9;38139:7;38169:53;38216:5;38169:42;38183:12;38196:9;38183:23;;;;;;;;;;;;;;38209:1;38183:27;38169:9;:13;;:42;;;;:::i;:53::-;38065:8;38074:9;38065:19;;;;;;:176;38047:194;;38279:33;38291:9;38301;38291:20;;;;;;;;;;;38279:7;;:33;:11;:33;:::i;:::-;38260:5;38266:9;38260:16;;;;;;;;;;:52;38331:4;:8;38340:5;38346:9;38340:16;;;;;;;;;;;38331:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38331:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38331:26:0;;;;38399:7;38376:9;38386;38376:20;;;;;;;;;;:30;-1:-1:-1;38009:413:0;-1:-1:-1;;37474:3:0;;37446:987;;;;32182:6258;;;;;;;;;;;;:::o;31084:123::-;;;-1:-1:-1;;;;;31084:123:0;;:::o;31340:96::-;;;-1:-1:-1;;;;;31340:96:0;;:::o;30003:43::-;30042:4;30003:43;:::o;56640:1205::-;56699:6;56722:13;:5;-1:-1:-1;;;;;56722:11:0;;:13::i;:::-;56718:63;;;-1:-1:-1;;;56752:17:0;;56718:63;56865:91;;;22:32:-1;6:49;;56865:91:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;56829:128:0;;;;56794:12;;56808:17;;-1:-1:-1;;;;;56829:25:0;;;56859:4;;56865:91;;56829:128;;;;25:18:-1;56829: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;;;56829: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;;56793:164:0;;;;56973:7;56968:58;;-1:-1:-1;;56997:17:0;;;;;;56968:58;57038:13;;57070:414;57105:1;57091:4;:11;:15;57087:1;:19;57070:414;;;57132:4;57137:1;57141;57137:5;57132:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57132:11:0;-1:-1:-1;;;57132:18:0;:57;;;;;57171:4;57176:1;57180;57176:5;57171:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57171:11:0;-1:-1:-1;;;57171:18:0;57132:57;:96;;;;;57210:4;57215:1;57219;57215:5;57210:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57210:11:0;-1:-1:-1;;;57210:18:0;57132:96;:135;;;;;57249:4;57254:1;57258;57254:5;57249:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57249:11:0;-1:-1:-1;;;57249:18:0;57132:135;:174;;;;;57288:4;57293:1;57297;57293:5;57288:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57288:11:0;-1:-1:-1;;;57288:18:0;57132:174;:213;;;;;57327:4;57332:1;57336;57332:5;57327:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57327:11:0;-1:-1:-1;;;57327:18:0;57132:213;:252;;;;;57366:4;57371:1;57375;57371:5;57366:11;;;;;;;;;;;;;-1:-1:-1;;;;;;57366:11:0;-1:-1:-1;;;57366:18:0;57132:252;57128:345;;;57429:4;57418:15;;57452:5;;57128:345;57108:3;;57070:414;;;;57499:8;57494:59;;-1:-1:-1;;57524:17:0;;;;;;;57494:59;57619:103;;;22:32:-1;6:49;;57619:103:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;57583:140:0;;;;-1:-1:-1;;;;;57583:25:0;;;57613:4;;57619:103;57583:140;;;25:18:-1;57583: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;;;57583: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;57565:158:0;;-1:-1:-1;57565:158:0;-1:-1:-1;57565:158:0;57734:58;;-1:-1:-1;;57763:17:0;;;;;;;57734:58;57822:4;57811:26;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57811:26:0;;-1:-1:-1;;;;56640:1205:0;;;;:::o;30053:40::-;30089:4;30053:40;:::o;47711:946::-;47909:17;;47949:95;;;22:32:-1;6:49;;47949:95:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;47901:144:0;;;;47845:7;;;;47880:17;;-1:-1:-1;;;;;47909:17:0;;;;47943:4;;47901:144;;;;;;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;;;47901:144: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;;47865:180:0;;;;48061:7;48056:49;;48092:1;48085:8;;;;;;48056:49;48117:42;48195:4;48184:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48184:27:0;;-1:-1:-1;48229:17:0;-1:-1:-1;;;;;48229:15:0;;;:17::i;:::-;:36;;;;48250:15;:7;-1:-1:-1;;;;;48250:13:0;;:15::i;:::-;48225:154;;;48289:78;48318:20;48340:9;48351:7;48360:6;48289:28;:78::i;:::-;48282:85;;;;;;;48225:154;48391:13;48407:82;48436:20;48458:9;-1:-1:-1;;;;;;;;;;;48482:6:0;48407:28;:82::i;:::-;48391:98;-1:-1:-1;48504:10:0;48500:51;;48538:1;48531:8;;;;;;;;48500:51;48570:79;48599:20;-1:-1:-1;;;;;;;;;;;48634:7:0;48643:5;48570:28;:79::i;:::-;48563:86;;;;;;47711:946;;;;;;:::o;29952:44::-;29992:4;29952:44;:::o;46128:1575::-;46264:7;46307:6;46331:17;-1:-1:-1;;;;;46331:15:0;;;:17::i;:::-;46326:669;;46397:14;;:37;;;-1:-1:-1;;;46397:37:0;;-1:-1:-1;;;;;46397:37:0;;;;;;;;;46365:29;;46397:14;;;;;:26;;:37;;;;;;;;;;;;;;;:14;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;46397:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46397:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46397:37:0;;-1:-1:-1;;;;;;46453:35:0;;;46449:535;;46612:156;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;46612:156:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;46545:242:0;;;;46510:12;;46524:17;;-1:-1:-1;;;;;46545:32:0;;;46582:6;;46612:156;;46545:242;;;;25:18:-1;46545:242: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;;;46545:242: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;;46509:278:0;;;;46810:7;46806:163;;;46868:4;46857:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46857:27:0;;-1:-1:-1;46806:163:0;;;46948:1;46933:16;;46806:163;46449:535;;;46326:669;;47012:15;:7;-1:-1:-1;;;;;47012:13:0;;:15::i;:::-;47007:657;;47074:14;;:35;;;-1:-1:-1;;;47074:35:0;;-1:-1:-1;;;;;47074:35:0;;;;;;;;;47044:27;;47074:14;;;;;:26;;:35;;;;;;;;;;;;;;;:14;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;47074:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47074:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47074:35:0;;-1:-1:-1;;;;;;47128:33:0;;;47124:529;;47283:154;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;47283:154:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;47218:238:0;;;;47183:12;;47197:17;;-1:-1:-1;;;;;47218:30:0;;;47253:6;;47283:154;;47218:238;;;;25:18:-1;47218:238: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;;;47218:238: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;;47182:274:0;;;;47479:7;47475:163;;;47537:4;47526:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47526:27:0;;-1:-1:-1;47475:163:0;;;47617:1;47602:16;;47475:163;47124:529;;;47007:657;;47683:12;46128:1575;-1:-1:-1;;;;46128:1575:0:o;45527:570::-;45819:29;45852:66;45870:9;45881:7;45890:6;45898:5;45905:12;45852:17;:66::i;:::-;45816:102;;;45929:160;45948:9;45972:7;45994:6;46015:9;46039:12;46066;45929:4;:160::i;:::-;45527:570;;;;;;;:::o;50579:888::-;50780:22;;:49;;;-1:-1:-1;;;50780:49:0;;-1:-1:-1;;;50780:49:0;;;;;;50714:7;;;;-1:-1:-1;;;;;50780:22:0;;;;:32;;:49;;;;;;;;;;;;;;;:22;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;50780:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50780:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50780:49:0;50865:23;;50780:49;;-1:-1:-1;50841:21:0;;-1:-1:-1;;;;;50865:23:0;;;;:36;;50916:17;;:15;;;:17::i;:::-;:48;;50955:9;50916:48;;;50936:16;;-1:-1:-1;;;;;50936:16:0;50916:48;50979:15;:7;-1:-1:-1;;;;;50979:13:0;;:15::i;:::-;:44;;51016:7;50979:44;;;50997:16;;-1:-1:-1;;;;;50997:16:0;50979:44;50865:169;;;;;;;;;;;;;-1:-1:-1;;;;;50865:169:0;-1:-1:-1;;;;;50865:169:0;;;;;;-1:-1:-1;;;;;50865:169:0;-1:-1:-1;;;;;50865:169:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50865:169:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50865:169:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;50865: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;50865:169:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;50865:169:0;;421:4:-1;412:14;;;;50865:169:0;;;;;412:14:-1;50865: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;50865:169:0;;;;;;;;;;;50841:193;;51048:12;51062:17;51091:13;-1:-1:-1;;;;;51083:33:0;51121:6;51184:13;-1:-1:-1;;;;;51184:29:0;;:38;;;;51241:4;51264:6;51143:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;51143:142:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;51143:142:0;;;;-1:-1:-1;;;;;51143:142:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;51143:142:0;51083:213;;;;;;;;;;;;;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;;;51083:213: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;;51047:249:0;;;;51312:7;51307:49;;51343:1;51336:8;;;;;;;;51307:49;51369:20;51405:4;51394:35;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51394:35:0;;50579:888;-1:-1:-1;;;;;;;;;50579:888:0:o;57853:1091::-;57909:6;57932:13;:5;-1:-1:-1;;;;;57932:11:0;;:13::i;:::-;57928:63;;;-1:-1:-1;;;57962:17:0;;57928:63;58075:91;;;22:32:-1;6:49;;58075:91:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;58039:128:0;;;;58004:12;;58018:17;;-1:-1:-1;;;;;58039:25:0;;;58069:4;;58075:91;;58039:128;;;;25:18:-1;58039: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;;;58039: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;;58003:164:0;;;;58183:7;58178:58;;-1:-1:-1;;58207:17:0;;;;;;58178:58;58248:14;;58281:298;58316:1;58302:4;:11;:15;58298:1;:19;58281:298;;;58343:4;58348:1;58352;58348:5;58343:11;;;;;;;;;;;;;-1:-1:-1;;;;;;58343:11:0;-1:-1:-1;;;58343:18:0;:57;;;;;58382:4;58387:1;58391;58387:5;58382:11;;;;;;;;;;;;;-1:-1:-1;;;;;;58382:11:0;-1:-1:-1;;;58382:18:0;58343:57;:96;;;;;58421:4;58426:1;58430;58426:5;58421:11;;;;;;;;;;;;;-1:-1:-1;;;;;;58421:11:0;-1:-1:-1;;;58421:18:0;58343:96;:135;;;;;58460:4;58465:1;58469;58465:5;58460:11;;;;;;;;;;;;;-1:-1:-1;;;;;;58460:11:0;-1:-1:-1;;;58460:18:0;58343:135;58339:229;;;58524:4;58512:16;;58547:5;;58339:229;58319:3;;58281:298;;;;58594:9;58589:60;;-1:-1:-1;;58620:17:0;;;;;;;58589:60;58715:106;;;22:32:-1;6:49;;58715:106:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;58679:143:0;;;;-1:-1:-1;;;;;58679:25:0;;;58709:4;;58715:106;58679:143;;;25:18:-1;58679: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;;30763:91:0;;;-1:-1:-1;;;;;30763:91:0;;:::o;30100:40::-;30136:4;30100:40;:::o;51475:607::-;51673:13;;51609:7;;;;51644:17;;-1:-1:-1;;;;;51673:13:0;;;;51703:6;;-1:-1:-1;;;51766:35:0;51820:15;;:13;;;:15::i;:::-;:37;;51850:7;51820:37;;;51838:9;;-1:-1:-1;;;;;51838:9:0;51820:37;51876:17;:9;-1:-1:-1;;;;;51876:15:0;;:17::i;:::-;:41;;51908:9;51876:41;;;51896:9;;-1:-1:-1;;;;;51896:9:0;51876:41;51725:232;;;-1:-1:-1;;;;;51725:232:0;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;51725:232:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;51725:232:0;;;179:29:-1;;;;160:49;;51665:303:0;;;;51725:232;;51665:303;;;;25:18:-1;51665:303: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;;;51665:303: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;;51629:339:0;;;;51984:7;51979:49;;52015:1;52008:8;;;;;;51979:49;52058:4;52047:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52047:27:0;;51475:607;-1:-1:-1;;;;;;51475:607:0:o;30978:99::-;;;-1:-1:-1;;;;;30978:99:0;;:::o;29904:41::-;29941:4;29904:41;:::o;48665:1906::-;48860:7;;48895:17;-1:-1:-1;;;;;48916:40:0;;;;48961:6;;-1:-1:-1;;;49006:44:0;49065:17;;:15;;;:17::i;:::-;:43;;49099:9;49065:43;;;-1:-1:-1;;;;;;;;;;;49065:43:0;49123:15;:7;-1:-1:-1;;;;;49123:13:0;;:15::i;:::-;:39;;49155:7;49123:39;;;-1:-1:-1;;;;;;;;;;;49123:39:0;48969:244;;;-1:-1:-1;;;;;48969:244:0;;;;;;;;;;;;;;;;;;;;;49198:4;48969:244;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;48969:244:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;48969:244:0;;;179:29:-1;;;;160:49;;48916:298:0;;;;48969:244;;48916:298;;;;25:18:-1;48916:298: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;;;48916:298: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;;48880:334:0;;;;49230:7;49225:49;;49261:1;49254:8;;;;;;49225:49;49287:15;49304:12;49331:4;49320:35;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49320:35:0;;;;;;;;;-1:-1:-1;49320:35:0;-1:-1:-1;49383:42:0;-1:-1:-1;;;;;49372:53:0;;;;:134;;-1:-1:-1;49464:42:0;-1:-1:-1;;;;;49453:53:0;;;49372:134;:213;;;-1:-1:-1;49543:42:0;-1:-1:-1;;;;;49532:53:0;;;49372:213;49368:275;;;49630:1;49623:8;;;;;;;;49368:275;49735:101;;;22:32:-1;6:49;;49735:101:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;49706:131:0;;;;-1:-1:-1;;;;;49706:18:0;;;49729:4;;49735:101;49706:131;;;25:18:-1;49706:131: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;;;49706:131: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;49693:144:0;;-1:-1:-1;;49848:48:0;;;;49883:1;49876:8;;;;;;;;49848:48;49986:88;;;22:32:-1;6:49;;49986:88:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;49957:118:0;;;;-1:-1:-1;;;;;49957:18:0;;;49980:4;;49986:88;49957:118;;;25:18:-1;49957:118: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;;;49957:118: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;49944:131:0;;-1:-1:-1;;50086:48:0;;;;50121:1;50114:8;;;;;;;;50086:48;50225:95;;;22:32:-1;6:49;;50225:95:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;50196:125:0;;;;-1:-1:-1;;;;;50196:18:0;;;50219:4;;50225:95;50196:125;;;25:18:-1;50196:125: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;;;50196:125: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;50183:138:0;;-1:-1:-1;;50332:48:0;;;;50367:1;50360:8;;;;;;;;50332:48;50399:164;50558:4;50399:140;50501:37;50508:9;-1:-1:-1;;;;;50501:35:0;;:37::i;:::-;50495:2;:43;50399:77;50440:35;50447:7;-1:-1:-1;;;;;50440:33:0;;:35::i;:::-;50434:2;:41;50399:16;:4;50408:6;50399:16;:8;:16;:::i;:::-;:34;:77;:34;:77;:::i;:164::-;50392:171;48665:1906;-1:-1:-1;;;;;;;;;48665:1906:0:o;30514:87::-;;;-1:-1:-1;;;;;30514:87:0;;:::o;30149:::-;-1:-1:-1;;;;;;;;;;;30149:87:0;:::o;30687:69::-;;;-1:-1:-1;;;;;30687:69:0;;:::o;29807:41::-;29844:4;29807:41;:::o;30863:108::-;;;-1:-1:-1;;;;;30863:108:0;;:::o;38448:773::-;38737:66;-1:-1:-1;;;;;38737:31:0;;38769:10;38789:4;38796:6;38737:66;:31;:66;:::i;:::-;38816:61;38822:9;38833:7;38842:6;38850:12;38864;38816:5;:61::i;:::-;38890:20;38913:41;-1:-1:-1;;;;;38913:26:0;;38948:4;38913:41;:26;:41;:::i;:::-;38890:64;;38989:9;38973:12;:25;;38965:91;;;;-1:-1:-1;;;38965:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39067:51;-1:-1:-1;;;;;39067:25:0;;39093:10;39105:12;39067:51;:25;:51;:::i;:::-;-1:-1:-1;39129:84:0;39157:10;39169:43;-1:-1:-1;;;;;39169:28:0;;39206:4;39169:43;:28;:43;:::i;:::-;-1:-1:-1;;;;;39129:27:0;;;:84;;:27;:84;:::i;:::-;;38448:773;;;;;;;:::o;29757:43::-;29796:4;29757:43;:::o;31643:531::-;31829:24;31890:5;31876:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;31876:20:0;-1:-1:-1;31866:30:0;-1:-1:-1;31912:6:0;31907:260;31928:5;31924:1;:9;31907:260;;;31971:184;32007:9;32035:7;32061:28;32083:5;32061:17;:6;32076:1;32072:5;;32061:17;:10;:17;:::i;:28::-;32108:1;32128:12;31971:17;:184::i;:::-;31955:200;31956:7;31964:1;31956:10;;;;;;;;;;;;;;;;;31955:200;31935:3;;31907:260;;;;31643:531;;;;;;;:::o;30610:70::-;;;-1:-1:-1;;;;;30610:70:0;;:::o;29855:42::-;29893:4;29855:42;:::o;30426:81::-;;;-1:-1:-1;;;;;30426:81:0;;:::o;31591:44::-;;:::o;29146:133::-;29246:19;;;29245:26;29146:133;;;;;:::o;55681:478::-;55773:4;;55743;;-1:-1:-1;;;;;55764:13:0;;;55773:4;;55764:13;55760:57;;;-1:-1:-1;55801:4:0;55794:11;;55760:57;55873:8;;55904:93;;;-1:-1:-1;;;;;55904:93:0;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;55904:93:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;55865:133:0;;;;55830:12;;55844:17;;55873:8;;;55898:4;;55904:93;;55865:133;;;25:18:-1;55865: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;;;55865: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;;55829:169:0;;;;56014:7;56009:53;;56045:5;56038:12;;;;;;56009:53;56075:13;56104:4;56093:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;56167:465:0;56269:4;;56237:6;;-1:-1:-1;;;;;56260:13:0;;;56269:4;;56260:13;56256:71;;;-1:-1:-1;56312:1:0;56290:25;;56256:71;56411:98;;;22:32:-1;6:49;;56411:98:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;56375:135:0;;;;56340:12;;56354:17;;-1:-1:-1;;;;;56375:25:0;;;56405:4;;56411:98;;56375:135;;;;25:18:-1;56375: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;;;56375: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;;56339:171:0;;;;56526:7;56521:58;;-1:-1:-1;;56550:17:0;;;;;;56521:58;56609:4;56598:26;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56598:26:0;;56167:465;-1:-1:-1;;;;56167:465:0:o;2285:471::-;2343:7;2588:6;2584:47;;-1:-1:-1;2618:1:0;2611:8;;2584:47;2655:5;;;2659:1;2655;:5;:1;2679:5;;;;;:10;2671:56;;;;-1:-1:-1;;;2671:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3224:132;3282:7;3309:39;3313:1;3316;3309:39;;;;;;;;;;;;;;;;;:3;:39::i;18852:189::-;18925:7;18945:8;16885:42;-1:-1:-1;;;;;18963:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18963:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18963:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18963:9:0;18957:3;:15;18956:41;;16885:42;-1:-1:-1;;;;;18988:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18988:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18988:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18988:9:0;18956:41;;;18976:9;:7;:9::i;:::-;18945:52;;19015:18;19021:3;19026:6;19015:5;:18::i;18655:189::-;18728:7;18748:8;16885:42;-1:-1:-1;;;;;18766:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18766:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18766:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18766:9:0;18760:3;:15;18759:41;;16885:42;-1:-1:-1;;;;;18791:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18791:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18791:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18791:9:0;18759:41;;;18779:9;:7;:9::i;:::-;18748:52;;18818:18;18824:6;18832:3;18818:5;:18::i;29287:134::-;29388:19;29387:26;;;29287:134::o;52090:178::-;52236:7;52090:178;;;;;:::o;913:181::-;971:7;1003:5;;;1027:6;;;;1019:46;;;;;-1:-1:-1;;;1019:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:136;1427:7;1454:43;1458:1;1461;1454:43;;;;;;;;;;;;;;;;;:3;:43::i;28845:166::-;28896:4;-1:-1:-1;;;;;28921:39:0;;;;:81;;-1:-1:-1;;;;;;28964:38:0;;-1:-1:-1;;;;;;;;;;;28964:38:0;28913:90;28845:166;-1:-1:-1;;28845:166:0:o;28273:564::-;28337:7;-1:-1:-1;;;;;28363:21:0;;;;:45;;-1:-1:-1;;;;;;28388:20:0;;-1:-1:-1;;;;;;;;;;;28388:20:0;28363:45;28359:87;;;-1:-1:-1;28432:2:0;28425:9;;28359:87;28544:37;;;22:32:-1;6:49;;28544:37:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;28494:98:0;;;;28459:12;;28473:17;;-1:-1:-1;;;;;28494:25:0;;;28524:4;;28544:37;;28494:98;;;;25:18:-1;28494:98: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;;;28494:98: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;;28458:134:0;;;;28608:7;28603:165;;28704:37;;;22:32:-1;6:49;;28704:37:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;28650:106:0;;;;-1:-1:-1;;;;;28650:25:0;;;28680:4;;28704:37;28650:106;;;25:18:-1;28650:106: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;;;28650:106: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;28632:124:0;;-1:-1:-1;28632:124:0;-1:-1:-1;28603:165:0;28787:7;:42;;28827:2;28780:49;28273:564;-1:-1:-1;;;;28273:564:0:o;27162:624::-;27273:11;27269:50;;27301:7;;27269:50;-1:-1:-1;;;;;27335:21:0;;;;:45;;-1:-1:-1;;;;;;27360:20:0;;-1:-1:-1;;;;;;;;;;;27360:20:0;27335:45;27331:448;;;-1:-1:-1;;;;;27405:18:0;;27413:10;27405:18;:41;;;;;27440:6;27427:9;:19;;27405:41;27397:71;;;;;-1:-1:-1;;;27397:71:0;;;;;;;;;;;;-1:-1:-1;;;27397:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27487:19:0;;27501:4;27487:19;27483:97;;27527:37;;-1:-1:-1;;;;;27527:29:0;;;:37;;;;;27557:6;;27527:37;;;;27557:6;27527:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27527:37:0;27483:97;27610:6;27598:9;:18;27594:101;;;27637:10;:42;27657:21;:9;27671:6;27657:21;:13;:21;:::i;:::-;27637:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27637:42:0;27594:101;27331:448;;;27727:40;-1:-1:-1;;;;;27727:22:0;;27750:4;27756:2;27760:6;27727:40;:22;:40;:::i;:::-;27162:624;;;;:::o;39229:6290::-;39488:7;-1:-1:-1;;;;;39475:20:0;:9;-1:-1:-1;;;;;39475:20:0;;39471:59;;;39512:7;;39471:59;39546:35;:12;29992:4;39546:35;:20;:35;:::i;:::-;39542:1338;;;39602:27;39619:9;39602:16;:27::i;:::-;39598:507;;;39650:17;39670:35;39695:9;39670:24;:35::i;:::-;39650:55;;39749:9;-1:-1:-1;;;;;39726:41:0;;39768:6;39726:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39726:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39726:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39794:24:0;;-1:-1:-1;39821:44:0;-1:-1:-1;;;;;39821:29:0;;39859:4;39821:44;:29;:44;:::i;:::-;39794:71;;39893:196;39921:10;39954:7;39984:16;40023:12;40058;39893:5;:196::i;:::-;39886:203;;;;39598:507;40125:25;40142:7;40125:16;:25::i;:::-;40121:748;;;40171:17;40191:33;40216:7;40191:24;:33::i;:::-;40171:53;;40245:188;40273:9;40305:10;40338:6;40367:12;40402;40245:5;:188::i;:::-;40454:24;40481:44;-1:-1:-1;;;;;40481:29:0;;40519:4;40481:44;:29;:44;:::i;:::-;40454:71;;40550:18;:10;-1:-1:-1;;;;;40550:16:0;;:18::i;:::-;40546:283;;;40593:4;;;;;;;;;-1:-1:-1;;;;;40593:4:0;-1:-1:-1;;;;;40593:9:0;;40609:16;40593:35;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40593:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40593:35:0;;;;;40546:283;;;40677:54;40702:10;40722:7;40677:24;:54::i;:::-;40777:7;-1:-1:-1;;;;;40754:37:0;;40792:16;40754:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40754:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40754:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;40847:7:0;;;;40121:748;40896:34;:12;30042:4;40896:34;:20;:34;:::i;:::-;40892:1556;;;40947:17;40967:26;40983:9;40967:15;:26::i;:::-;40947:46;-1:-1:-1;;;;;;41012:24:0;;;;41008:625;;41061:18;:10;-1:-1:-1;;;;;41061:16:0;;:18::i;:::-;41057:245;;;41104:68;;;-1:-1:-1;;;41104:68:0;;41158:4;41104:68;;;;;;;;;;;;-1:-1:-1;;;;;41104:45:0;;;;;:68;;;;;;;;;;;;;;-1:-1:-1;41104:45:0;:68;;;5:2:-1;;;;30:1;27;20:12;5:2;41104:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41104:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41057:245:0;;-1:-1:-1;41057:245:0;;41221:61;;;-1:-1:-1;;;41221:61:0;;41268:4;41221:61;;;;;;;;;;;;-1:-1:-1;;;;;41221:38:0;;;;;:61;;;;;;;;;;;;;;-1:-1:-1;41221:38:0;:61;;;5:2:-1;;;;30:1;27;20:12;41057:245:0;41322:24;41349:44;-1:-1:-1;;;;;41349:29:0;;41387:4;41349:44;:29;:44;:::i;41008:625::-;41662:24;41678:7;41662:15;:24::i;:::-;41649:37;-1:-1:-1;;;;;;41705:24:0;;;;41701:736;;41750:188;41778:9;41810:10;41843:6;41872:12;41907;41750:5;:188::i;:::-;41959:24;41986:44;-1:-1:-1;;;;;41986:29:0;;42024:4;41986:44;:29;:44;:::i;:::-;41959:71;;42055:18;:10;-1:-1:-1;;;;;42055:16:0;;:18::i;:::-;42051:346;;;42098:84;;;-1:-1:-1;;;42098:84:0;;42176:4;42098:84;;;;;;-1:-1:-1;;;;;42098:45:0;;;;;42150:16;;42098:84;;;;;;;;;;;;;;;42150:16;42098:45;:84;;;5:2:-1;;;;30:1;27;20:12;5:2;42098:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42098:84:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42051:346:0;;-1:-1:-1;42051:346:0;;42231:54;42256:10;42276:7;42231:24;:54::i;:::-;42308:69;;;-1:-1:-1;;;42308:69:0;;42353:4;42308:69;;;;;;;;;;;;-1:-1:-1;;;;;42308:36:0;;;;;:69;;;;;;;;;;;;;;-1:-1:-1;42308:36:0;:69;;;5:2:-1;;;;30:1;27;20:12;41701:736:0;40892:1556;;42464:31;:12;30089:4;42464:31;:20;:31;:::i;:::-;42460:814;;;42536:4;;-1:-1:-1;;;;;42516:25:0;;;42536:4;;42516:25;42512:327;;;42562:4;;:32;;;-1:-1:-1;;;42562:32:0;;42580:4;42562:32;;;;;;;;;;;;-1:-1:-1;;;;;42562:4:0;;;;:9;;:32;;;;;:4;;:32;;;;;;;;:4;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;42562:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42650:3:0;;;42706:28;;;-1:-1:-1;;;42706:28:0;;42728:4;42706:28;;;;;;;;42622:201;;-1:-1:-1;;;;;;42650:3:0;;;;-1:-1:-1;42676:7:0;;42650:3;;42706:13;;:28;;;;;;;;;;;;;;;42650:3;42706:28;;;5:2:-1;;;;30:1;27;20:12;5:2;42706:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42706:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42706:28:0;42757:12;42792;42622:5;:201::i;:::-;42615:208;;42512:327;42877:4;;-1:-1:-1;;;;;42859:23:0;;;42877:4;;42859:23;42855:408;;;42963:3;;42903:181;;42931:9;;-1:-1:-1;;;;;42963:3:0;42989:6;43018:12;43053;42903:5;:181::i;:::-;43130:3;;43143:4;;43105:44;;-1:-1:-1;;;;;43130:3:0;;;;43143:4;43105:24;:44::i;:::-;43168:4;;43193:3;;;:28;;;-1:-1:-1;;;43193:28:0;;43186:4;43193:28;;;;;;;;-1:-1:-1;;;;;43168:4:0;;;;:9;;43186:4;43193:3;;:13;;:28;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;43193:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43193:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43193:28:0;43168:54;;;-1:-1:-1;;;;;;43168:54:0;;;;;;;-1:-1:-1;;;;;43168:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43168:54:0;;;;;;;-1:-1:-1;43168:54:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;43168:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;42855:408:0;43290:31;:12;30136:4;43290:31;:20;:31;:::i;:::-;43286:1183;;;43338:17;43358:23;43371:9;43358:12;:23::i;:::-;43338:43;-1:-1:-1;;;;;;43400:24:0;;;;43396:324;;43464:9;-1:-1:-1;;;;;43445:37:0;;43483:6;43445:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43445:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43445:45:0;;;;43518:186;43546:10;43579:7;43609:6;43638:12;43673;43518:5;:186::i;:::-;43511:193;;;43396:324;43749:21;43762:7;43749:12;:21::i;:::-;43736:34;-1:-1:-1;;;;;;43789:24:0;;;;43785:673;;43834:188;43862:9;43894:10;43927:6;43956:12;43991;43834:5;:188::i;:::-;44043:24;44070:44;-1:-1:-1;;;;;44070:29:0;;44108:4;44070:44;:29;:44;:::i;:::-;44043:71;;44135:49;44160:10;44172:4;;;;;;;;;-1:-1:-1;;;;;44172:4:0;-1:-1:-1;;;;;44172:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44172:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44172:11:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44172:11:0;44135:24;:49::i;:::-;44203:4;;-1:-1:-1;;;;;44203:4:0;;;;:12;;44222:18;;:16;;;:18::i;:::-;:41;;44262:1;44222:41;;;44243:16;44222:41;44287:18;:10;-1:-1:-1;;;;;44287:16:0;;:18::i;:::-;:45;;44322:10;44287:45;;;-1:-1:-1;;;;;;;;;;;44287:45:0;44203:214;;;-1:-1:-1;;;;;;44203:214:0;;;;;;;-1:-1:-1;;;;;44203:214:0;;;;;;;;;;;;;44394:4;44203:214;;;;;;;;;;-1:-1:-1;;44203:214:0;;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;44203:214:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44203:214:0;;;;;44436:7;;;;43785:673;43286:1183;;44481:67;;:::i;:::-;-1:-1:-1;44481:192:0;;;;;;;;44566:14;44481:192;;44595:12;44481:192;;;;44622:13;44481:192;;;;;;;44650:12;44481:192;;;;-1:-1:-1;;;44753:202:0;44774:15;44770:1;:19;44753:202;;;44833:1;44815:12;44828:1;44815:15;;;;;;;;;;;;;;:19;44811:133;;;44863:26;44873:12;44886:1;44873:15;;;;;;;;;;;;;;44863:5;:9;;:26;;;;:::i;:::-;44855:34;;44927:1;44908:20;;44811:133;44791:3;;44753:202;;;;44983:1;44975:5;:9;44967:69;;;;-1:-1:-1;;;44967:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45075:6;45049:23;45092:420;45113:15;45109:1;:19;45092:420;;;45154:12;45167:1;45154:15;;;;;;;;;;;;;;45173:1;45154:20;45150:69;;;45195:8;;45150:69;45235:18;45256:38;45288:5;45256:27;45267:12;45280:1;45267:15;;;;;;;;;;;;;;45256:6;:10;;:27;;;;:::i;:38::-;45235:59;;45318:16;45313:1;:21;45309:90;;;-1:-1:-1;45368:15:0;45309:90;45432:10;45413:29;;;;45457:43;45469:9;45480:7;45489:10;45457:8;45466:1;45457:11;;;;;;:43;;45092:420;;45130:3;;45092:420;;;;39229:6290;;;;;;;;;;:::o;28004:261::-;28082:7;-1:-1:-1;;;;;28106:21:0;;;;:45;;-1:-1:-1;;;;;;28131:20:0;;-1:-1:-1;;;;;;;;;;;28131:20:0;28106:45;28102:156;;;-1:-1:-1;;;;;;28175:11:0;;;28168:18;;28102:156;28226:5;-1:-1:-1;;;;;28226:15:0;;28242:3;28226:20;;;;;;;;;;;;;-1:-1:-1;;;;;28226:20:0;-1:-1:-1;;;;;28226:20:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28226:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28226:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28226:20:0;;-1:-1:-1;28219:27:0;;26773:381;26859:4;26880:11;26876:55;;-1:-1:-1;26915:4:0;26908:11;;26876:55;-1:-1:-1;;;;;26947:21:0;;;;:45;;-1:-1:-1;;;;;;26972:20:0;;-1:-1:-1;;;;;;;;;;;26972:20:0;26947:45;26943:204;;;27009:37;;-1:-1:-1;;;;;27009:29:0;;;:37;;;;;27039:6;;27009:37;;;;27039:6;27009:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27009:37:0;26943:204;;;27079:30;-1:-1:-1;;;;;27079:18:0;;27098:2;27102:6;27079:30;:18;:30;:::i;:::-;-1:-1:-1;27131:4:0;27124:11;;3886:345;3972:7;4074:12;4067:5;4059:28;;;;-1:-1:-1;;;4059: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;4059:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4098:9;4114:1;4110;:5;;;;;;;3886:345;-1:-1:-1;;;;;3886:345:0:o;18517:130::-;18557:7;18584:55;18590:37;16885:42;-1:-1:-1;;;;;18595:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18595:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18595:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18595:9:0;18612;;;-1:-1:-1;;;18612:9:0;;;;16885:42;;18612:7;;:9;;;;;18595;;18612;;;;;;;16885:42;18612:9;;;5:2:-1;;;;30:1;27;20:12;5:2;18612:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18612:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18612:9:0;18606:3;:15;16966:8;18590:4;:37::i;:::-;16885:42;-1:-1:-1;;;;;18629:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;18629:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18629:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18629:9:0;18584:5;:55::i;:::-;18577:62;;18517:130;:::o;17109:131::-;17162:6;16966:8;17216:10;17221:1;17224;17216:4;:10::i;:::-;:16;;;;;;;17109:131;-1:-1:-1;;;17109:131:0:o;17248:::-;17301:6;17370:1;17355:12;17360:1;16966:8;17355:4;:12::i;1842:192::-;1928:7;1964:12;1956:6;;;;1948:29;;;;-1:-1:-1;;;1948:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1948:29:0;-1:-1:-1;;;2000:5:0;;;1842:192::o;23428:204::-;23555:68;;;-1:-1:-1;;;;;23555:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;23555:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23529:95:0;;23548:5;;23529:18;:95::i;55411:262::-;55496:13;:5;-1:-1:-1;;;;;55496:11:0;;:13::i;:::-;55491:175;;55531:34;;;-1:-1:-1;;;55531:34:0;;55555:4;55531:34;;;;-1:-1:-1;;;;;55531:34:0;;;;;;;;;55569:3;;55531:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;55531:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55531:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55531:34:0;:41;;55526:129;;55599:40;-1:-1:-1;;;;;55599:22:0;;55622:2;-1:-1:-1;;55599:40:0;:22;:40;:::i;:::-;55411:262;;:::o;52299:871::-;52424:7;52469:6;52493:17;-1:-1:-1;;;;;52493:15:0;;;:17::i;:::-;52488:356;;52559:14;;:37;;;-1:-1:-1;;;52559:37:0;;-1:-1:-1;;;;;52559:37:0;;;;;;;;;52527:29;;52559:14;;;;;:26;;:37;;;;;;;;;;;;;;;:14;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;52559:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52559:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52559:37:0;;-1:-1:-1;;;;;;52615:35:0;;;52611:222;;52671:58;52696:9;52715:12;52671:24;:58::i;:::-;52763:54;;;-1:-1:-1;;;52763:54:0;;;;;;;;52810:1;52763:54;;;;52813:3;52763:54;;;;;;-1:-1:-1;;;;;52763:32:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;52763:32:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;52763:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52763:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52763:54:0;;-1:-1:-1;52611:222:0;52488:356;;52861:15;:7;-1:-1:-1;;;;;52861:13:0;;:15::i;:::-;52856:275;;52923:14;;:35;;;-1:-1:-1;;;52923:35:0;;-1:-1:-1;;;;;52923:35:0;;;;;;;;;52893:27;;52923:14;;;;;:26;;:35;;;;;;;;;;;;;;;:14;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;52923:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52923:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52923:35:0;;-1:-1:-1;;;;;;52977:33:0;;;52973:147;;53046:10;-1:-1:-1;;;;;53046:30:0;;53083:12;53097:1;53100:3;53046:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53046:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53046:58:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;53178:586:0;53365:17;;53301:7;;53321:63;;53346:9;;-1:-1:-1;;;;;53365:17:0;53321:24;:63::i;:::-;53402:17;;-1:-1:-1;;;;;53402:17:0;;;;:31;;53440:17;;:15;;;:17::i;:::-;:30;;53469:1;53440:30;;;53460:6;53440:30;53486:17;:9;-1:-1:-1;;;;;53486:15:0;;:17::i;:::-;:43;;53520:9;53486:43;;;-1:-1:-1;;;;;;;;;;;53486:43:0;53544:6;53565:15;:7;-1:-1:-1;;;;;53565:13:0;;:15::i;:::-;:39;;53597:7;53565:39;;;-1:-1:-1;;;;;;;;;;;53565:39:0;53402:354;;;-1:-1:-1;;;;;;53402:354:0;;;;;;;-1:-1:-1;;;;;53402:354:0;;;;;;;;;;;;;;;;;;;;53627:4;53402:354;;;;-1:-1:-1;;;53402:354:0;;;;53670:1;53402:354;;;;;;53686:42;53402:354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;53402:354:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53402:354:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;53772:905:0;53896:7;53920:17;:9;-1:-1:-1;;;;;53920:15:0;;:17::i;:::-;53916:90;;;53954:16;;;;;;;;;-1:-1:-1;;;;;53954:16:0;-1:-1:-1;;;;;53954:24:0;;53985:6;53954:40;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53954:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53954:40:0;;;;;53916:90;54064:22;;:49;;;-1:-1:-1;;;54064:49:0;;-1:-1:-1;;;54064:49:0;;;;;;54018:28;;-1:-1:-1;;;;;54064:22:0;;:32;;:49;;;;;;;;;;;;;;:22;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;54064:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54064:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54064:49:0;54149:23;;54064:49;;-1:-1:-1;54125:21:0;;-1:-1:-1;;;;;54149:23:0;;;;:36;;54200:17;;:15;;;:17::i;:::-;:48;;54239:9;54200:48;;;54220:16;;-1:-1:-1;;;;;54220:16:0;54200:48;54263:15;:7;-1:-1:-1;;;;;54263:13:0;;:15::i;:::-;:44;;54300:7;54263:44;;;54281:16;;-1:-1:-1;;;;;54281:16:0;54263:44;54149:169;;;;;;;;;;;;;-1:-1:-1;;;;;54149:169:0;-1:-1:-1;;;;;54149:169:0;;;;;;-1:-1:-1;;;;;54149:169:0;-1:-1:-1;;;;;54149:169:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54149:169:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54149:169:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;54149: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;54149:169:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;54149:169:0;;421:4:-1;412:14;;;;54149:169:0;;;;;412:14:-1;54149: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;54149:169:0;;;;;;;;;;;54125:193;;54331:98;54356:17;:9;-1:-1:-1;;;;;54356:15:0;;:17::i;:::-;:48;;54395:9;54356:48;;;54376:16;;-1:-1:-1;;;;;54376:16:0;54356:48;54414:13;54331:24;:98::i;:::-;54440:20;54463:13;-1:-1:-1;;;;;54463:29:0;;54493:4;54499:6;54507:1;54463: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;54463:46:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54463:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54463:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54463:46:0;;-1:-1:-1;54526:15:0;-1:-1:-1;;;;;54526:13:0;;;:15::i;:::-;54522:116;;;54558:16;;54584:41;;;-1:-1:-1;;;54584:41:0;;54619:4;54584:41;;;;;;-1:-1:-1;;;;;54558:16:0;;;;:25;;:16;;54584:26;;:41;;;;;;;;;;;;;;;54558:16;54584:41;;;5:2:-1;;;;30:1;27;20:12;5:2;54584:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54584:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54584:41:0;54558:68;;;-1:-1:-1;;;;;;54558:68:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54558:68:0;;;;;;;-1:-1:-1;54558:68:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;54558:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54558:68:0;;;;54522:116;54657:12;53772:905;-1:-1:-1;;;;;;53772:905:0:o;54685:700::-;54808:7;54832:17;:9;-1:-1:-1;;;;;54832:15:0;;:17::i;:::-;54828:83;;;54866:9;;;:33;;;-1:-1:-1;;;54866:33:0;;;;-1:-1:-1;;;;;54866:9:0;;;;:17;;54890:6;;54866:33;;;;;:9;:33;;;;;;54890:6;54866:9;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;54866:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54866:33:0;;;;;54828:83;54923:91;54948:17;:9;-1:-1:-1;;;;;54948:15:0;;:17::i;:::-;:41;;54980:9;54948:41;;;54968:9;;-1:-1:-1;;;;;54968:9:0;54948:41;54999:13;;-1:-1:-1;;;;;54999:13:0;54923:24;:91::i;:::-;55048:13;;55025:20;;-1:-1:-1;;;;;55048:13:0;;;;:27;;55090:17;;:15;;;:17::i;:::-;:41;;55122:9;55090:41;;;55110:9;;-1:-1:-1;;;;;55110:9:0;55090:41;55146:6;55167:15;:7;-1:-1:-1;;;;;55167:13:0;;:15::i;:::-;:37;;55197:7;55167:37;;;55185:9;;-1:-1:-1;;;;;55185:9:0;55167:37;55048:183;;;-1:-1:-1;;;;;;55048:183:0;;;;;;;-1:-1:-1;;;;;55048:183:0;;;;;;;;;;;;;;;;;;;;55219:1;55048:183;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55048:183:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;55048:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55048:183:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55048:183:0;;-1:-1:-1;55248:15:0;-1:-1:-1;;;;;55248:13:0;;;:15::i;:::-;55244:102;;;55280:9;;55299:34;;;-1:-1:-1;;;55299:34:0;;55327:4;55299:34;;;;;;-1:-1:-1;;;;;55280:9:0;;;;:18;;:9;;55299:19;;:34;;;;;;;;;;;;;;;55280:9;55299:34;;;5:2:-1;;;;30:1;27;20:12;5:2;55299:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55299:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55299:34:0;55280:54;;;-1:-1:-1;;;;;;55280:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55280:54:0;;;;;;;-1:-1:-1;55280:54:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;55280:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55280:54:0;;;;55365:12;-1:-1:-1;54685:700:0;;;;;:::o;23244:176::-;23353:58;;;-1:-1:-1;;;;;23353:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;23353:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23327:85:0;;23346:5;;23327:18;:85::i;:::-;23244:176;;;:::o;17387:1122::-;17450:6;17565:1;17567:53;;;;17668:9;;;17678:20;;;;17714:1;17709:6;;17661:56;;17678:20;17692:4;17687:9;;17661:56;;17757:1;17751:4;17747:12;17813:1;17810;17806:9;17801:14;;17795:681;17818:1;17795:681;;;17878:1;17875;17871:9;17927:1;17923;17919:2;17915:10;17912:17;17902:2;;17942:1;17940;17933:11;17902:2;17991:4;17987:2;17983:13;18033:2;18024:7;18021:15;18018:2;;;18048:1;18046;18039:11;18018:2;18092:4;18083:7;18079:18;18074:23;;18128:1;18126;18122:8;18119:2;;;18175:1;18172;18168:9;18251:1;18247;18243:2;18239:10;18236:17;18229:25;18224:1;18217:9;18210:17;18206:49;18203:2;;;18267:1;18265;18258:11;18203:2;18320:4;18316:2;18312:13;18366:2;18357:7;18354:15;18351:2;;;18381:1;18379;18372:11;18351:2;18416:18;;;;-1:-1:-1;;18119:2:0;17838:638;;17833:1;17831;17827:8;17822:13;;17795:681;;;17642:849;17558:933;;17567:53;17582:1;17584:18;;;;17617:1;17612:6;;17575:44;;17584:18;17597:4;17592:9;;17575:44;;17558:933;;17543:959;;;;;:::o;16983:118::-;17035:6;17062;;;:30;;-1:-1:-1;;17077:5:0;;;17091:1;17086;17077:5;17086:1;17072:15;;;;;:20;17062:30;17054:39;;;;;25283:1114;25887:27;25895:5;-1:-1:-1;;;;;25887:25:0;;:27::i;:::-;25879:71;;;;;-1:-1:-1;;;25879:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26024:12;26038:23;26073:5;-1:-1:-1;;;;;26065:19:0;26085:4;26065: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;;;26065: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;;26023:67:0;;;;26109:7;26101:52;;;;;-1:-1:-1;;;26101:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26170:17;;:21;26166:224;;26312:10;26301:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26301:30:0;26293:85;;;;-1:-1:-1;;;26293:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27794:202;-1:-1:-1;;;;;27886:21:0;;;;;;:45;;-1:-1:-1;;;;;;27911:20:0;;-1:-1:-1;;;;;;;;;;;27911:20:0;;27886:45;27882:107;;;27948:29;-1:-1:-1;;;;;27948:17:0;;27966:2;27970:6;27948:29;:17;:29;:::i;20082:810::-;20142:4;20801:20;;20644:66;20841:15;;;;;:42;;-1:-1:-1;20860:23:0;;;20082:810;-1:-1:-1;;20082:810:0:o;23640:621::-;24010:10;;;24009:62;;-1:-1:-1;24026:39:0;;;-1:-1:-1;;;24026:39:0;;24050:4;24026:39;;;;-1:-1:-1;;;;;24026:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;24026:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24026:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24026:39:0;:44;24009:62;24001:152;;;;-1:-1:-1;;;24001:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24190:62;;;-1:-1:-1;;;;;24190:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;24190:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;24164:89:0;;24183:5;;24164:18;:89::i;29430:29517::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;29430:29517:0;;;-1:-1:-1;;29430:29517:0:o;:::-;
Swarm Source
bzzr://9d907885771a554815b0063ba9ebad10e75ba4f4b281b50c05fb78a9a0fcbb4b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $2.64 | 1 | $2.64 |
Loading...
Loading
Loading...
Loading
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.