Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xb07cd651dd6f634cdd58922b50c10d4f881c6736f54edc85bdee2ba5cca857c8 | External Swap | (pending) | 1 hrs ago | IN | 0.0002 ETH | (Pending) | |||
0xc4135de978d68123ae44e67bd72513ceb38c1be9e0c71c101e94901073a51c41 | External Swap | (pending) | 19 days ago | IN | 0.0008 ETH | (Pending) | |||
0xdfc2b9abec35c1e33ea031a6f42010b27bd18c6df3de296c4ce81a2c264161f1 | Dodo Swap V2Toke... | (pending) | 19 days ago | IN | 0 ETH | (Pending) | |||
Add DVM Liquidit... | 21249778 | 2 hrs ago | IN | 0 ETH | 0.00164874 | ||||
Add DVM Liquidit... | 21249763 | 2 hrs ago | IN | 0 ETH | 0.00159522 | ||||
Create DODO Vend... | 21247754 | 9 hrs ago | IN | 0 ETH | 0.00616878 | ||||
Add DVM Liquidit... | 21246003 | 15 hrs ago | IN | 0 ETH | 0.00293457 | ||||
Create DODO Vend... | 21241934 | 28 hrs ago | IN | 0 ETH | 0.00622632 | ||||
Add DVM Liquidit... | 21237172 | 44 hrs ago | IN | 0 ETH | 0.00463233 | ||||
Add DVM Liquidit... | 21236748 | 46 hrs ago | IN | 0 ETH | 0.00536424 | ||||
Create DODO Vend... | 21228886 | 3 days ago | IN | 0.11608685 ETH | 0.00737122 | ||||
Create DODO Vend... | 21228603 | 3 days ago | IN | 1 ETH | 0.00670525 | ||||
Add DVM Liquidit... | 21225038 | 3 days ago | IN | 0 ETH | 0.0012799 | ||||
Create DODO Vend... | 21221245 | 4 days ago | IN | 0 ETH | 0.0080973 | ||||
Add DVM Liquidit... | 21215880 | 4 days ago | IN | 0 ETH | 0.00346257 | ||||
Create DODO Vend... | 21213888 | 5 days ago | IN | 0 ETH | 0.0061724 | ||||
Add DVM Liquidit... | 21203086 | 6 days ago | IN | 0 ETH | 0.00147675 | ||||
Create DODO Vend... | 21201546 | 6 days ago | IN | 0 ETH | 0.00985184 | ||||
Add DVM Liquidit... | 21200744 | 6 days ago | IN | 0 ETH | 0.00227639 | ||||
Add DVM Liquidit... | 21196882 | 7 days ago | IN | 0 ETH | 0.00192939 | ||||
Add DVM Liquidit... | 21196850 | 7 days ago | IN | 0 ETH | 0.00214202 | ||||
Add DVM Liquidit... | 21178538 | 10 days ago | IN | 0 ETH | 0.00430639 | ||||
Create DODO Vend... | 21173644 | 10 days ago | IN | 0 ETH | 0.02169323 | ||||
Create DODO Vend... | 21167179 | 11 days ago | IN | 0.14945106 ETH | 0.0258449 | ||||
Create DODO Vend... | 21160943 | 12 days ago | IN | 0 ETH | 0.00941566 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21243663 | 22 hrs ago | 0.01562015 ETH | ||||
21243663 | 22 hrs ago | 0.01562015 ETH | ||||
21228886 | 3 days ago | 0.11608685 ETH | ||||
21228603 | 3 days ago | 1 ETH | ||||
21167179 | 11 days ago | 0.14945106 ETH | ||||
21117649 | 18 days ago | 0.02975844 ETH | ||||
21114479 | 18 days ago | 0.03116805 ETH | ||||
21114479 | 18 days ago | 0.03116805 ETH | ||||
21114479 | 18 days ago | 0.03116805 ETH | ||||
21114479 | 18 days ago | 0.03116805 ETH | ||||
21114419 | 18 days ago | 0.04594842 ETH | ||||
21114419 | 18 days ago | 0.04594842 ETH | ||||
21072919 | 24 days ago | 0.00860014 ETH | ||||
21072919 | 24 days ago | 0.00860014 ETH | ||||
21003863 | 34 days ago | 0.2 ETH | ||||
20996287 | 35 days ago | 0.08818208 ETH | ||||
20996287 | 35 days ago | 0.08818208 ETH | ||||
20963301 | 40 days ago | 0.016 ETH | ||||
20961295 | 40 days ago | 0.1 ETH | ||||
20959393 | 40 days ago | 0.08055265 ETH | ||||
20955475 | 41 days ago | 0.10437706 ETH | ||||
20955459 | 41 days ago | 0.0452324 ETH | ||||
20954690 | 41 days ago | 0.10411413 ETH | ||||
20954090 | 41 days ago | 0.12835802 ETH | ||||
20940152 | 43 days ago | 0.02441231 ETH |
Loading...
Loading
Contract Name:
DODOV2Proxy02
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-26 */ // File: contracts/SmartRoute/intf/IDODOV2Proxy01.sol /* Copyright 2020 DODO ZOO. SPDX-License-Identifier: Apache-2.0 */ pragma solidity 0.6.9; interface IDODOV2Proxy01 { function dodoSwapV2ETHToToken( address toToken, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external payable returns (uint256 returnAmount); function dodoSwapV2TokenToETH( address fromToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external returns (uint256 returnAmount); function dodoSwapV2TokenToToken( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external returns (uint256 returnAmount); function createDODOVendingMachine( address baseToken, address quoteToken, uint256 baseInAmount, uint256 quoteInAmount, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTWAP, uint256 deadLine ) external payable returns (address newVendingMachine, uint256 shares); function addDVMLiquidity( address dvmAddress, uint256 baseInAmount, uint256 quoteInAmount, uint256 baseMinAmount, uint256 quoteMinAmount, uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH uint256 deadLine ) external payable returns ( uint256 shares, uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount ); function createDODOPrivatePool( address baseToken, address quoteToken, uint256 baseInAmount, uint256 quoteInAmount, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTwap, uint256 deadLine ) external payable returns (address newPrivatePool); function resetDODOPrivatePool( address dppAddress, uint256[] memory paramList, //0 - newLpFeeRate, 1 - newI, 2 - newK uint256[] memory amountList, //0 - baseInAmount, 1 - quoteInAmount, 2 - baseOutAmount, 3 - quoteOutAmount uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH uint256 minBaseReserve, uint256 minQuoteReserve, uint256 deadLine ) external payable; function createCrowdPooling( address baseToken, address quoteToken, uint256 baseInAmount, uint256[] memory timeLine, uint256[] memory valueList, bool isOpenTWAP, uint256 deadLine ) external payable returns (address payable newCrowdPooling); function bid( address cpAddress, uint256 quoteAmount, uint8 flag, // 0 - ERC20, 1 - quoteInETH uint256 deadLine ) external payable; function addLiquidityToV1( address pair, uint256 baseAmount, uint256 quoteAmount, uint256 baseMinShares, uint256 quoteMinShares, uint8 flag, // 0 erc20 Out 1 baseInETH 2 quoteInETH uint256 deadLine ) external payable returns(uint256, uint256); function dodoSwapV1( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external payable returns (uint256 returnAmount); function externalSwap( address fromToken, address toToken, address approveTarget, address to, uint256 fromTokenAmount, uint256 minReturnAmount, bytes memory callDataConcat, bool isIncentive, uint256 deadLine ) external payable returns (uint256 returnAmount); function mixSwap( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory mixAdapters, address[] memory mixPairs, address[] memory assetTo, uint256 directions, bool isIncentive, uint256 deadLine ) external payable returns (uint256 returnAmount); } // File: contracts/SmartRoute/intf/IDODOV2.sol interface IDODOV2 { //========== Common ================== function sellBase(address to) external returns (uint256 receiveQuoteAmount); function sellQuote(address to) external returns (uint256 receiveBaseAmount); function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve); function _BASE_TOKEN_() external view returns (address); function _QUOTE_TOKEN_() external view returns (address); function getPMMStateForCall() external view returns ( uint256 i, uint256 K, uint256 B, uint256 Q, uint256 B0, uint256 Q0, uint256 R ); function getUserFeeRate(address user) external view returns (uint256 lpFeeRate, uint256 mtFeeRate); function getDODOPoolBidirection(address token0, address token1) external view returns (address[] memory, address[] memory); //========== DODOVendingMachine ======== function createDODOVendingMachine( address baseToken, address quoteToken, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTWAP ) external returns (address newVendingMachine); function buyShares(address to) external returns (uint256,uint256,uint256); //========== DODOPrivatePool =========== function createDODOPrivatePool() external returns (address newPrivatePool); function initDODOPrivatePool( address dppAddress, address creator, address baseToken, address quoteToken, uint256 lpFeeRate, uint256 k, uint256 i, bool isOpenTwap ) external; function reset( address operator, uint256 newLpFeeRate, uint256 newI, uint256 newK, uint256 baseOutAmount, uint256 quoteOutAmount, uint256 minBaseReserve, uint256 minQuoteReserve ) external returns (bool); function _OWNER_() external returns (address); //========== CrowdPooling =========== function createCrowdPooling() external returns (address payable newCrowdPooling); function initCrowdPooling( address cpAddress, address creator, address baseToken, address quoteToken, uint256[] memory timeLine, uint256[] memory valueList, bool isOpenTWAP ) external; function bid(address to) external; } // File: contracts/SmartRoute/intf/IDODOV1.sol interface IDODOV1 { function init( address owner, address supervisor, address maintainer, address baseToken, address quoteToken, address oracle, uint256 lpFeeRate, uint256 mtFeeRate, uint256 k, uint256 gasPriceLimit ) external; function transferOwnership(address newOwner) external; function claimOwnership() external; function sellBaseToken( uint256 amount, uint256 minReceiveQuote, bytes calldata data ) external returns (uint256); function buyBaseToken( uint256 amount, uint256 maxPayQuote, bytes calldata data ) external returns (uint256); function querySellBaseToken(uint256 amount) external view returns (uint256 receiveQuote); function queryBuyBaseToken(uint256 amount) external view returns (uint256 payQuote); function depositBaseTo(address to, uint256 amount) external returns (uint256); function withdrawBase(uint256 amount) external returns (uint256); function withdrawAllBase() external returns (uint256); function depositQuoteTo(address to, uint256 amount) external returns (uint256); function withdrawQuote(uint256 amount) external returns (uint256); function withdrawAllQuote() external returns (uint256); function _BASE_CAPITAL_TOKEN_() external returns (address); function _QUOTE_CAPITAL_TOKEN_() external returns (address); function _BASE_TOKEN_() external view returns (address); function _QUOTE_TOKEN_() external view returns (address); function _R_STATUS_() external view returns (uint8); function _QUOTE_BALANCE_() external view returns (uint256); function _BASE_BALANCE_() external view returns (uint256); function _K_() external view returns (uint256); function _MT_FEE_RATE_() external view returns (uint256); function _LP_FEE_RATE_() external view returns (uint256); function getExpectedTarget() external view returns (uint256 baseTarget, uint256 quoteTarget); function getOraclePrice() external view returns (uint256); function getMidPrice() external view returns (uint256 midPrice); } // File: contracts/intf/IDODOApprove.sol interface IDODOApprove { function claimTokens(address token,address who,address dest,uint256 amount) external; function getDODOProxy() external view returns (address); } // File: contracts/lib/InitializableOwnable.sol /** * @title Ownable * @author DODO Breeder * * @notice Ownership related functions */ contract InitializableOwnable { address public _OWNER_; address public _NEW_OWNER_; bool internal _INITIALIZED_; // ============ Events ============ event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // ============ Modifiers ============ modifier notInitialized() { require(!_INITIALIZED_, "DODO_INITIALIZED"); _; } modifier onlyOwner() { require(msg.sender == _OWNER_, "NOT_OWNER"); _; } // ============ Functions ============ function initOwner(address newOwner) public notInitialized { _INITIALIZED_ = true; _OWNER_ = newOwner; } function transferOwnership(address newOwner) public onlyOwner { emit OwnershipTransferPrepared(_OWNER_, newOwner); _NEW_OWNER_ = newOwner; } function claimOwnership() public { require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM"); emit OwnershipTransferred(_OWNER_, _NEW_OWNER_); _OWNER_ = _NEW_OWNER_; _NEW_OWNER_ = address(0); } } // File: contracts/SmartRoute/DODOApproveProxy.sol interface IDODOApproveProxy { function isAllowedProxy(address _proxy) external view returns (bool); function claimTokens(address token,address who,address dest,uint256 amount) external; } /** * @title DODOApproveProxy * @author DODO Breeder * * @notice Allow different version dodoproxy to claim from DODOApprove */ contract DODOApproveProxy is InitializableOwnable { // ============ Storage ============ uint256 private constant _TIMELOCK_DURATION_ = 3 days; mapping (address => bool) public _IS_ALLOWED_PROXY_; uint256 public _TIMELOCK_; address public _PENDING_ADD_DODO_PROXY_; address public immutable _DODO_APPROVE_; // ============ Modifiers ============ modifier notLocked() { require( _TIMELOCK_ <= block.timestamp, "SetProxy is timelocked" ); _; } constructor(address dodoApporve) public { _DODO_APPROVE_ = dodoApporve; } function init(address owner, address[] memory proxies) external { initOwner(owner); for(uint i = 0; i < proxies.length; i++) _IS_ALLOWED_PROXY_[proxies[i]] = true; } function unlockAddProxy(address newDodoProxy) public onlyOwner { _TIMELOCK_ = block.timestamp + _TIMELOCK_DURATION_; _PENDING_ADD_DODO_PROXY_ = newDodoProxy; } function lockAddProxy() public onlyOwner { _PENDING_ADD_DODO_PROXY_ = address(0); _TIMELOCK_ = 0; } function addDODOProxy() external onlyOwner notLocked() { _IS_ALLOWED_PROXY_[_PENDING_ADD_DODO_PROXY_] = true; lockAddProxy(); } function removeDODOProxy (address oldDodoProxy) public onlyOwner { _IS_ALLOWED_PROXY_[oldDodoProxy] = false; } function claimTokens( address token, address who, address dest, uint256 amount ) external { require(_IS_ALLOWED_PROXY_[msg.sender], "DODOApproveProxy:Access restricted"); IDODOApprove(_DODO_APPROVE_).claimTokens( token, who, dest, amount ); } function isAllowedProxy(address _proxy) external view returns (bool) { return _IS_ALLOWED_PROXY_[_proxy]; } } // File: contracts/lib/SafeMath.sol /** * @title SafeMath * @author DODO Breeder * * @notice Math operations with safety checks that revert on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "MUL_ERROR"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "DIVIDING_ERROR"); return a / b; } function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { uint256 quotient = div(a, b); uint256 remainder = a - quotient * b; if (remainder > 0) { return quotient + 1; } else { return quotient; } } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SUB_ERROR"); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ADD_ERROR"); return c; } function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = x / 2 + 1; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } } // File: contracts/lib/DecimalMath.sol /** * @title DecimalMath * @author DODO Breeder * * @notice Functions for fixed point number with 18 decimals */ library DecimalMath { using SafeMath for uint256; uint256 internal constant ONE = 10**18; uint256 internal constant ONE2 = 10**36; function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d) / (10**18); } function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d).divCeil(10**18); } function divFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).div(d); } function divCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).divCeil(d); } function reciprocalFloor(uint256 target) internal pure returns (uint256) { return uint256(10**36).div(target); } function reciprocalCeil(uint256 target) internal pure returns (uint256) { return uint256(10**36).divCeil(target); } } // File: contracts/SmartRoute/helper/DODOSellHelper.sol // import {DODOMath} from "../lib/DODOMath.sol"; interface IDODOSellHelper { function querySellQuoteToken(address dodo, uint256 amount) external view returns (uint256); function querySellBaseToken(address dodo, uint256 amount) external view returns (uint256); } library DODOMath { using SafeMath for uint256; /* Integrate dodo curve fron V1 to V2 require V0>=V1>=V2>0 res = (1-k)i(V1-V2)+ikV0*V0(1/V2-1/V1) let V1-V2=delta res = i*delta*(1-k+k(V0^2/V1/V2)) */ function _GeneralIntegrate( uint256 V0, uint256 V1, uint256 V2, uint256 i, uint256 k ) internal pure returns (uint256) { uint256 fairAmount = DecimalMath.mulFloor(i, V1.sub(V2)); // i*delta uint256 V0V0V1V2 = DecimalMath.divCeil(V0.mul(V0).div(V1), V2); uint256 penalty = DecimalMath.mulFloor(k, V0V0V1V2); // k(V0^2/V1/V2) return DecimalMath.mulFloor(fairAmount, DecimalMath.ONE.sub(k).add(penalty)); } /* The same with integration expression above, we have: i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Given Q1 and deltaB, solve Q2 This is a quadratic function and the standard version is aQ2^2 + bQ2 + c = 0, where a=1-k -b=(1-k)Q1-kQ0^2/Q1+i*deltaB c=-kQ0^2 and Q2=(-b+sqrt(b^2+4(1-k)kQ0^2))/2(1-k) note: another root is negative, abondan if deltaBSig=true, then Q2>Q1 if deltaBSig=false, then Q2<Q1 */ function _SolveQuadraticFunctionForTrade( uint256 Q0, uint256 Q1, uint256 ideltaB, bool deltaBSig, uint256 k ) internal pure returns (uint256) { // calculate -b value and sig // -b = (1-k)Q1-kQ0^2/Q1+i*deltaB uint256 kQ02Q1 = DecimalMath.mulFloor(k, Q0).mul(Q0).div(Q1); // kQ0^2/Q1 uint256 b = DecimalMath.mulFloor(DecimalMath.ONE.sub(k), Q1); // (1-k)Q1 bool minusbSig = true; if (deltaBSig) { b = b.add(ideltaB); // (1-k)Q1+i*deltaB } else { kQ02Q1 = kQ02Q1.add(ideltaB); // i*deltaB+kQ0^2/Q1 } if (b >= kQ02Q1) { b = b.sub(kQ02Q1); minusbSig = true; } else { b = kQ02Q1.sub(b); minusbSig = false; } // calculate sqrt uint256 squareRoot = DecimalMath.mulFloor( DecimalMath.ONE.sub(k).mul(4), DecimalMath.mulFloor(k, Q0).mul(Q0) ); // 4(1-k)kQ0^2 squareRoot = b.mul(b).add(squareRoot).sqrt(); // sqrt(b*b+4(1-k)kQ0*Q0) // final res uint256 denominator = DecimalMath.ONE.sub(k).mul(2); // 2(1-k) uint256 numerator; if (minusbSig) { numerator = b.add(squareRoot); } else { numerator = squareRoot.sub(b); } if (deltaBSig) { return DecimalMath.divFloor(numerator, denominator); } else { return DecimalMath.divCeil(numerator, denominator); } } /* Start from the integration function i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Assume Q2=Q0, Given Q1 and deltaB, solve Q0 let fairAmount = i*deltaB */ function _SolveQuadraticFunctionForTarget( uint256 V1, uint256 k, uint256 fairAmount ) internal pure returns (uint256 V0) { // V0 = V1+V1*(sqrt-1)/2k uint256 sqrt = DecimalMath.divCeil(DecimalMath.mulFloor(k, fairAmount).mul(4), V1); sqrt = sqrt.add(DecimalMath.ONE).mul(DecimalMath.ONE).sqrt(); uint256 premium = DecimalMath.divCeil(sqrt.sub(DecimalMath.ONE), k.mul(2)); // V0 is greater than or equal to V1 according to the solution return DecimalMath.mulFloor(V1, DecimalMath.ONE.add(premium)); } } contract DODOSellHelper { using SafeMath for uint256; enum RStatus {ONE, ABOVE_ONE, BELOW_ONE} uint256 constant ONE = 10**18; struct DODOState { uint256 oraclePrice; uint256 K; uint256 B; uint256 Q; uint256 baseTarget; uint256 quoteTarget; RStatus rStatus; } function querySellBaseToken(address dodo, uint256 amount) public view returns (uint256) { return IDODOV1(dodo).querySellBaseToken(amount); } function querySellQuoteToken(address dodo, uint256 amount) public view returns (uint256) { DODOState memory state; (state.baseTarget, state.quoteTarget) = IDODOV1(dodo).getExpectedTarget(); state.rStatus = RStatus(IDODOV1(dodo)._R_STATUS_()); state.oraclePrice = IDODOV1(dodo).getOraclePrice(); state.Q = IDODOV1(dodo)._QUOTE_BALANCE_(); state.B = IDODOV1(dodo)._BASE_BALANCE_(); state.K = IDODOV1(dodo)._K_(); uint256 boughtAmount; // Determine the status (RStatus) and calculate the amount // based on the state if (state.rStatus == RStatus.ONE) { boughtAmount = _ROneSellQuoteToken(amount, state); } else if (state.rStatus == RStatus.ABOVE_ONE) { boughtAmount = _RAboveSellQuoteToken(amount, state); } else { uint256 backOneBase = state.B.sub(state.baseTarget); uint256 backOneQuote = state.quoteTarget.sub(state.Q); if (amount <= backOneQuote) { boughtAmount = _RBelowSellQuoteToken(amount, state); } else { boughtAmount = backOneBase.add( _ROneSellQuoteToken(amount.sub(backOneQuote), state) ); } } // Calculate fees return DecimalMath.divFloor( boughtAmount, DecimalMath.ONE.add(IDODOV1(dodo)._MT_FEE_RATE_()).add( IDODOV1(dodo)._LP_FEE_RATE_() ) ); } function _ROneSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receiveBaseToken) { uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade( state.baseTarget, state.baseTarget, DecimalMath.mulFloor(i, amount), false, state.K ); return state.baseTarget.sub(B2); } function _RAboveSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receieBaseToken) { uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade( state.baseTarget, state.B, DecimalMath.mulFloor(i, amount), false, state.K ); return state.B.sub(B2); } function _RBelowSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receiveBaseToken) { uint256 Q1 = state.Q.add(amount); uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); return DODOMath._GeneralIntegrate(state.quoteTarget, Q1, state.Q, i, state.K); } } // File: contracts/intf/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() external view returns (string memory); /** * @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); } // File: contracts/intf/IWETH.sol interface IWETH { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address src, address dst, uint256 wad ) external returns (bool); function deposit() external payable; function withdraw(uint256 wad) external; } // File: contracts/SmartRoute/intf/IUni.sol interface IUni { function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function token0() external view returns (address); function token1() external view returns (address); } // File: contracts/SmartRoute/intf/IChi.sol interface IChi { function freeUpTo(uint256 value) external returns (uint256); } // File: contracts/lib/SafeERC20.sol /** * @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; 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)); } /** * @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 // 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/SmartRoute/lib/UniversalERC20.sol library UniversalERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); function universalTransfer( IERC20 token, address payable to, uint256 amount ) internal { if (amount > 0) { if (isETH(token)) { to.transfer(amount); } else { token.safeTransfer(to, amount); } } } function universalApproveMax( IERC20 token, address to, uint256 amount ) internal { uint256 allowance = token.allowance(address(this), to); if (allowance < amount) { if (allowance > 0) { token.safeApprove(to, 0); } token.safeApprove(to, uint256(-1)); } } function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) { if (isETH(token)) { return who.balance; } else { return token.balanceOf(who); } } function tokenBalanceOf(IERC20 token, address who) internal view returns (uint256) { return token.balanceOf(who); } function isETH(IERC20 token) internal pure returns (bool) { return token == ETH_ADDRESS; } } // File: contracts/lib/ReentrancyGuard.sol /** * @title ReentrancyGuard * @author DODO Breeder * * @notice Protect functions from Reentrancy Attack */ contract ReentrancyGuard { // https://solidity.readthedocs.io/en/latest/control-structures.html?highlight=zero-state#scoping-and-declarations // zero-state of _ENTERED_ is false bool private _ENTERED_; modifier preventReentrant() { require(!_ENTERED_, "REENTRANT"); _ENTERED_ = true; _; _ENTERED_ = false; } } // File: contracts/DODOToken/DODOIncentive.sol interface IDODOIncentive { function triggerIncentive( address fromToken, address toToken, address assetTo ) external; } /** * @title DODOIncentive * @author DODO Breeder * * @notice Trade Incentive in DODO platform */ contract DODOIncentive is InitializableOwnable { using SafeMath for uint256; using SafeERC20 for IERC20; // ============ Storage ============ address public immutable _DODO_TOKEN_; address public _DODO_PROXY_; uint256 public dodoPerBlock; uint256 public defaultRate = 10; mapping(address => uint256) public boosts; uint32 public lastRewardBlock; uint112 public totalReward; uint112 public totalDistribution; // ============ Events ============ event SetBoost(address token, uint256 boostRate); event SetNewProxy(address dodoProxy); event SetPerReward(uint256 dodoPerBlock); event SetDefaultRate(uint256 defaultRate); event Incentive(address user, uint256 reward); constructor(address _dodoToken) public { _DODO_TOKEN_ = _dodoToken; } // ============ Ownable ============ function changeBoost(address _token, uint256 _boostRate) public onlyOwner { require(_token != address(0)); require(_boostRate + defaultRate <= 1000); boosts[_token] = _boostRate; emit SetBoost(_token, _boostRate); } function changePerReward(uint256 _dodoPerBlock) public onlyOwner { _updateTotalReward(); dodoPerBlock = _dodoPerBlock; emit SetPerReward(dodoPerBlock); } function changeDefaultRate(uint256 _defaultRate) public onlyOwner { defaultRate = _defaultRate; emit SetDefaultRate(defaultRate); } function changeDODOProxy(address _dodoProxy) public onlyOwner { _DODO_PROXY_ = _dodoProxy; emit SetNewProxy(_DODO_PROXY_); } function emptyReward(address assetTo) public onlyOwner { uint256 balance = IERC20(_DODO_TOKEN_).balanceOf(address(this)); IERC20(_DODO_TOKEN_).transfer(assetTo, balance); } // ============ Incentive function ============ function triggerIncentive( address fromToken, address toToken, address assetTo ) external { require(msg.sender == _DODO_PROXY_, "DODOIncentive:Access restricted"); uint256 curTotalDistribution = totalDistribution; uint256 fromRate = boosts[fromToken]; uint256 toRate = boosts[toToken]; uint256 rate = (fromRate >= toRate ? fromRate : toRate) + defaultRate; require(rate <= 1000, "RATE_INVALID"); uint256 _totalReward = _getTotalReward(); uint256 reward = ((_totalReward - curTotalDistribution) * rate) / 1000; uint256 _totalDistribution = curTotalDistribution + reward; _update(_totalReward, _totalDistribution); if (reward != 0) { IERC20(_DODO_TOKEN_).transfer(assetTo, reward); emit Incentive(assetTo, reward); } } function _updateTotalReward() internal { uint256 _totalReward = _getTotalReward(); require(_totalReward < uint112(-1), "OVERFLOW"); totalReward = uint112(_totalReward); lastRewardBlock = uint32(block.number); } function _update(uint256 _totalReward, uint256 _totalDistribution) internal { require( _totalReward < uint112(-1) && _totalDistribution < uint112(-1) && block.number < uint32(-1), "OVERFLOW" ); lastRewardBlock = uint32(block.number); totalReward = uint112(_totalReward); totalDistribution = uint112(_totalDistribution); } function _getTotalReward() internal view returns (uint256) { if (lastRewardBlock == 0) { return totalReward; } else { return totalReward + (block.number - lastRewardBlock) * dodoPerBlock; } } // ============= Helper function =============== function incentiveStatus(address fromToken, address toToken) external view returns ( uint256 reward, uint256 baseRate, uint256 totalRate, uint256 curTotalReward, uint256 perBlockReward ) { baseRate = defaultRate; uint256 fromRate = boosts[fromToken]; uint256 toRate = boosts[toToken]; totalRate = (fromRate >= toRate ? fromRate : toRate) + defaultRate; uint256 _totalReward = _getTotalReward(); reward = ((_totalReward - totalDistribution) * totalRate) / 1000; curTotalReward = _totalReward - totalDistribution; perBlockReward = dodoPerBlock; } } // File: contracts/SmartRoute/intf/IDODOAdapter.sol interface IDODOAdapter { function sellBase(address to, address pool) external; function sellQuote(address to, address pool) external; } // File: contracts/SmartRoute/DODOV2Proxy02.sol /** * @title DODOV2Proxy02 * @author DODO Breeder * * @notice Entrance of trading in DODO platform */ contract DODOV2Proxy02 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable { using SafeMath for uint256; using UniversalERC20 for IERC20; // ============ Storage ============ address constant _ETH_ADDRESS_ = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public immutable _WETH_; address public immutable _DODO_APPROVE_PROXY_; address public immutable _DODO_SELL_HELPER_; address public immutable _DVM_FACTORY_; address public immutable _DPP_FACTORY_; address public immutable _CP_FACTORY_; address public immutable _DODO_INCENTIVE_; address public immutable _CHI_TOKEN_; uint256 public _GAS_DODO_MAX_RETURN_ = 0; uint256 public _GAS_EXTERNAL_RETURN_ = 0; mapping (address => bool) public isWhiteListed; // ============ Events ============ event OrderHistory( address fromToken, address toToken, address sender, uint256 fromAmount, uint256 returnAmount ); // ============ Modifiers ============ modifier judgeExpired(uint256 deadLine) { require(deadLine >= block.timestamp, "DODOV2Proxy02: EXPIRED"); _; } fallback() external payable {} receive() external payable {} constructor( address dvmFactory, address dppFactory, address cpFactory, address payable weth, address dodoApproveProxy, address dodoSellHelper, address chiToken, address dodoIncentive ) public { _DVM_FACTORY_ = dvmFactory; _DPP_FACTORY_ = dppFactory; _CP_FACTORY_ = cpFactory; _WETH_ = weth; _DODO_APPROVE_PROXY_ = dodoApproveProxy; _DODO_SELL_HELPER_ = dodoSellHelper; _CHI_TOKEN_ = chiToken; _DODO_INCENTIVE_ = dodoIncentive; } function addWhiteList (address contractAddr) public onlyOwner { isWhiteListed[contractAddr] = true; } function removeWhiteList (address contractAddr) public onlyOwner { isWhiteListed[contractAddr] = false; } function updateGasReturn(uint256 newDodoGasReturn, uint256 newExternalGasReturn) public onlyOwner { _GAS_DODO_MAX_RETURN_ = newDodoGasReturn; _GAS_EXTERNAL_RETURN_ = newExternalGasReturn; } // ============ DVM Functions (create & add liquidity) ============ function createDODOVendingMachine( address baseToken, address quoteToken, uint256 baseInAmount, uint256 quoteInAmount, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTWAP, uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) returns (address newVendingMachine, uint256 shares) { { address _baseToken = baseToken == _ETH_ADDRESS_ ? _WETH_ : baseToken; address _quoteToken = quoteToken == _ETH_ADDRESS_ ? _WETH_ : quoteToken; newVendingMachine = IDODOV2(_DVM_FACTORY_).createDODOVendingMachine( _baseToken, _quoteToken, lpFeeRate, i, k, isOpenTWAP ); } { address _baseToken = baseToken; address _quoteToken = quoteToken; _deposit( msg.sender, newVendingMachine, _baseToken, baseInAmount, _baseToken == _ETH_ADDRESS_ ); _deposit( msg.sender, newVendingMachine, _quoteToken, quoteInAmount, _quoteToken == _ETH_ADDRESS_ ); } (shares, , ) = IDODOV2(newVendingMachine).buyShares(msg.sender); } function addDVMLiquidity( address dvmAddress, uint256 baseInAmount, uint256 quoteInAmount, uint256 baseMinAmount, uint256 quoteMinAmount, uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) returns ( uint256 shares, uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount ) { address _dvm = dvmAddress; (baseAdjustedInAmount, quoteAdjustedInAmount) = _addDVMLiquidity( _dvm, baseInAmount, quoteInAmount ); require( baseAdjustedInAmount >= baseMinAmount && quoteAdjustedInAmount >= quoteMinAmount, "DODOV2Proxy02: deposit amount is not enough" ); _deposit(msg.sender, _dvm, IDODOV2(_dvm)._BASE_TOKEN_(), baseAdjustedInAmount, flag == 1); _deposit(msg.sender, _dvm, IDODOV2(_dvm)._QUOTE_TOKEN_(), quoteAdjustedInAmount, flag == 2); (shares, , ) = IDODOV2(_dvm).buyShares(msg.sender); // refund dust eth if (flag == 1 && msg.value > baseAdjustedInAmount) msg.sender.transfer(msg.value - baseAdjustedInAmount); if (flag == 2 && msg.value > quoteAdjustedInAmount) msg.sender.transfer(msg.value - quoteAdjustedInAmount); } function _addDVMLiquidity( address dvmAddress, uint256 baseInAmount, uint256 quoteInAmount ) internal view returns (uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount) { (uint256 baseReserve, uint256 quoteReserve) = IDODOV2(dvmAddress).getVaultReserve(); if (quoteReserve == 0 && baseReserve == 0) { baseAdjustedInAmount = baseInAmount; quoteAdjustedInAmount = quoteInAmount; } if (quoteReserve == 0 && baseReserve > 0) { baseAdjustedInAmount = baseInAmount; quoteAdjustedInAmount = 0; } if (quoteReserve > 0 && baseReserve > 0) { uint256 baseIncreaseRatio = DecimalMath.divFloor(baseInAmount, baseReserve); uint256 quoteIncreaseRatio = DecimalMath.divFloor(quoteInAmount, quoteReserve); if (baseIncreaseRatio <= quoteIncreaseRatio) { baseAdjustedInAmount = baseInAmount; quoteAdjustedInAmount = DecimalMath.mulFloor(quoteReserve, baseIncreaseRatio); } else { quoteAdjustedInAmount = quoteInAmount; baseAdjustedInAmount = DecimalMath.mulFloor(baseReserve, quoteIncreaseRatio); } } } // ============ DPP Functions (create & reset) ============ function createDODOPrivatePool( address baseToken, address quoteToken, uint256 baseInAmount, uint256 quoteInAmount, uint256 lpFeeRate, uint256 i, uint256 k, bool isOpenTwap, uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) returns (address newPrivatePool) { newPrivatePool = IDODOV2(_DPP_FACTORY_).createDODOPrivatePool(); address _baseToken = baseToken; address _quoteToken = quoteToken; _deposit(msg.sender, newPrivatePool, _baseToken, baseInAmount, _baseToken == _ETH_ADDRESS_); _deposit( msg.sender, newPrivatePool, _quoteToken, quoteInAmount, _quoteToken == _ETH_ADDRESS_ ); if (_baseToken == _ETH_ADDRESS_) _baseToken = _WETH_; if (_quoteToken == _ETH_ADDRESS_) _quoteToken = _WETH_; IDODOV2(_DPP_FACTORY_).initDODOPrivatePool( newPrivatePool, msg.sender, _baseToken, _quoteToken, lpFeeRate, k, i, isOpenTwap ); } function resetDODOPrivatePool( address dppAddress, uint256[] memory paramList, //0 - newLpFeeRate, 1 - newI, 2 - newK uint256[] memory amountList, //0 - baseInAmount, 1 - quoteInAmount, 2 - baseOutAmount, 3- quoteOutAmount uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH uint256 minBaseReserve, uint256 minQuoteReserve, uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) { _deposit( msg.sender, dppAddress, IDODOV2(dppAddress)._BASE_TOKEN_(), amountList[0], flag == 1 ); _deposit( msg.sender, dppAddress, IDODOV2(dppAddress)._QUOTE_TOKEN_(), amountList[1], flag == 2 ); require(IDODOV2(IDODOV2(dppAddress)._OWNER_()).reset( msg.sender, paramList[0], paramList[1], paramList[2], amountList[2], amountList[3], minBaseReserve, minQuoteReserve ), "Reset Failed"); _withdraw(msg.sender, IDODOV2(dppAddress)._BASE_TOKEN_(), amountList[2], flag == 3); _withdraw(msg.sender, IDODOV2(dppAddress)._QUOTE_TOKEN_(), amountList[3], flag == 4); } // ============ Swap ============ function dodoSwapV2ETHToToken( address toToken, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); uint256 originGas = gasleft(); uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender); IWETH(_WETH_).deposit{value: msg.value}(); IWETH(_WETH_).transfer(dodoPairs[0], msg.value); for (uint256 i = 0; i < dodoPairs.length; i++) { if (i == dodoPairs.length - 1) { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(msg.sender); } else { IDODOV2(dodoPairs[i]).sellQuote(msg.sender); } } else { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]); } else { IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]); } } directions = directions >> 1; } returnAmount = IERC20(toToken).balanceOf(msg.sender).sub(originToTokenBalance); require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); _dodoGasReturn(originGas); _execIncentive(isIncentive, _ETH_ADDRESS_, toToken); emit OrderHistory( _ETH_ADDRESS_, toToken, msg.sender, msg.value, returnAmount ); } function dodoSwapV2TokenToETH( address fromToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external override judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); uint256 originGas = gasleft(); IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount); for (uint256 i = 0; i < dodoPairs.length; i++) { if (i == dodoPairs.length - 1) { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(address(this)); } else { IDODOV2(dodoPairs[i]).sellQuote(address(this)); } } else { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]); } else { IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]); } } directions = directions >> 1; } returnAmount = IWETH(_WETH_).balanceOf(address(this)); require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); IWETH(_WETH_).withdraw(returnAmount); msg.sender.transfer(returnAmount); _dodoGasReturn(originGas); _execIncentive(isIncentive, fromToken, _ETH_ADDRESS_); emit OrderHistory( fromToken, _ETH_ADDRESS_, msg.sender, fromTokenAmount, returnAmount ); } function dodoSwapV2TokenToToken( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external override judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); uint256 originGas = gasleft(); uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender); IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount); for (uint256 i = 0; i < dodoPairs.length; i++) { if (i == dodoPairs.length - 1) { if (directions & 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(msg.sender); } else { IDODOV2(dodoPairs[i]).sellQuote(msg.sender); } } else { if (directions& 1 == 0) { IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]); } else { IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]); } } directions = directions >> 1; } returnAmount = IERC20(toToken).balanceOf(msg.sender).sub(originToTokenBalance); require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); _dodoGasReturn(originGas); _execIncentive(isIncentive, fromToken, toToken); emit OrderHistory( fromToken, toToken, msg.sender, fromTokenAmount, returnAmount ); } function externalSwap( address fromToken, address toToken, address approveTarget, address swapTarget, uint256 fromTokenAmount, uint256 minReturnAmount, bytes memory callDataConcat, bool isIncentive, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV2Proxy02: NOT_SUPPORT_SELL_CHI"); require(toToken != _CHI_TOKEN_, "DODOV2Proxy02: NOT_SUPPORT_BUY_CHI"); uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender); if (fromToken != _ETH_ADDRESS_) { IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens( fromToken, msg.sender, address(this), fromTokenAmount ); IERC20(fromToken).universalApproveMax(approveTarget, fromTokenAmount); } require(isWhiteListed[swapTarget], "DODOV2Proxy02: Not Whitelist Contract"); (bool success, ) = swapTarget.call{value: fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat); require(success, "DODOV2Proxy02: External Swap execution Failed"); IERC20(toToken).universalTransfer( msg.sender, IERC20(toToken).universalBalanceOf(address(this)) ); returnAmount = IERC20(toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance); require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); _externalGasReturn(); _execIncentive(isIncentive, fromToken, toToken); emit OrderHistory( fromToken, toToken, msg.sender, fromTokenAmount, returnAmount ); } function dodoSwapV1( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV2Proxy02: NOT_SUPPORT_SELL_CHI"); require(toToken != _CHI_TOKEN_, "DODOV2Proxy02: NOT_SUPPORT_BUY_CHI"); uint256 originGas = gasleft(); address _fromToken = fromToken; address _toToken = toToken; _deposit(msg.sender, address(this), _fromToken, fromTokenAmount, _fromToken == _ETH_ADDRESS_); for (uint256 i = 0; i < dodoPairs.length; i++) { address curDodoPair = dodoPairs[i]; if (directions & 1 == 0) { address curDodoBase = IDODOV1(curDodoPair)._BASE_TOKEN_(); require(curDodoBase != _CHI_TOKEN_, "DODOV2Proxy02: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this)); IERC20(curDodoBase).universalApproveMax(curDodoPair, curAmountIn); IDODOV1(curDodoPair).sellBaseToken(curAmountIn, 0, ""); } else { address curDodoQuote = IDODOV1(curDodoPair)._QUOTE_TOKEN_(); require(curDodoQuote != _CHI_TOKEN_, "DODOV2Proxy02: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoQuote).balanceOf(address(this)); IERC20(curDodoQuote).universalApproveMax(curDodoPair, curAmountIn); uint256 canBuyBaseAmount = IDODOSellHelper(_DODO_SELL_HELPER_).querySellQuoteToken( curDodoPair, curAmountIn ); IDODOV1(curDodoPair).buyBaseToken(canBuyBaseAmount, curAmountIn, ""); } directions = directions >> 1; } if (_toToken == _ETH_ADDRESS_) { returnAmount = IWETH(_WETH_).balanceOf(address(this)); IWETH(_WETH_).withdraw(returnAmount); } else { returnAmount = IERC20(_toToken).tokenBalanceOf(address(this)); } require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); IERC20(_toToken).universalTransfer(msg.sender, returnAmount); _dodoGasReturn(originGas); _execIncentive(isIncentive, _fromToken, _toToken); emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount); } function mixSwap( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory mixAdapters, address[] memory mixPairs, address[] memory assetTo, uint256 directions, bool isIncentive, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(mixPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(mixPairs.length == mixAdapters.length, "DODOV2Proxy02: PAIR_ADAPTER_NOT_MATCH"); require(mixPairs.length == assetTo.length - 1, "DODOV2Proxy02: PAIR_ASSETTO_NOT_MATCH"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); address _fromToken = fromToken; address _toToken = toToken; uint256 _fromTokenAmount = fromTokenAmount; require(_fromToken != _CHI_TOKEN_, "DODOV2Proxy02: NOT_SUPPORT_SELL_CHI"); require(_toToken != _CHI_TOKEN_, "DODOV2Proxy02: NOT_SUPPORT_BUY_CHI"); uint256 originGas = gasleft(); uint256 toTokenOriginBalance = IERC20(_toToken).universalBalanceOf(msg.sender); _deposit(msg.sender, assetTo[0], _fromToken, _fromTokenAmount, _fromToken == _ETH_ADDRESS_); for (uint256 i = 0; i < mixPairs.length; i++) { if (directions & 1 == 0) { IDODOAdapter(mixAdapters[i]).sellBase(assetTo[i + 1],mixPairs[i]); } else { IDODOAdapter(mixAdapters[i]).sellQuote(assetTo[i + 1],mixPairs[i]); } directions = directions >> 1; } if(_toToken == _ETH_ADDRESS_) { returnAmount = IWETH(_WETH_).balanceOf(address(this)); IWETH(_WETH_).withdraw(returnAmount); msg.sender.transfer(returnAmount); }else { returnAmount = IERC20(_toToken).tokenBalanceOf(msg.sender).sub(toTokenOriginBalance); } require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough"); _dodoGasReturn(originGas); _execIncentive(isIncentive, _fromToken, _toToken); emit OrderHistory( _fromToken, _toToken, msg.sender, _fromTokenAmount, returnAmount ); } //============ CrowdPooling Functions (create & bid) ============ function createCrowdPooling( address baseToken, address quoteToken, uint256 baseInAmount, uint256[] memory timeLine, uint256[] memory valueList, bool isOpenTWAP, uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) returns (address payable newCrowdPooling) { address _baseToken = baseToken; address _quoteToken = quoteToken == _ETH_ADDRESS_ ? _WETH_ : quoteToken; newCrowdPooling = IDODOV2(_CP_FACTORY_).createCrowdPooling(); _deposit( msg.sender, newCrowdPooling, _baseToken, baseInAmount, false ); newCrowdPooling.transfer(msg.value); IDODOV2(_CP_FACTORY_).initCrowdPooling( newCrowdPooling, msg.sender, _baseToken, _quoteToken, timeLine, valueList, isOpenTWAP ); } function bid( address cpAddress, uint256 quoteAmount, uint8 flag, // 0 - ERC20, 1 - quoteInETH uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) { _deposit(msg.sender, cpAddress, IDODOV2(cpAddress)._QUOTE_TOKEN_(), quoteAmount, flag == 1); IDODOV2(cpAddress).bid(msg.sender); } function addLiquidityToV1( address pair, uint256 baseAmount, uint256 quoteAmount, uint256 baseMinShares, uint256 quoteMinShares, uint8 flag, // 0 erc20 In 1 baseInETH 2 quoteIn ETH uint256 deadLine ) external override payable preventReentrant judgeExpired(deadLine) returns(uint256 baseShares, uint256 quoteShares) { address _baseToken = IDODOV1(pair)._BASE_TOKEN_(); address _quoteToken = IDODOV1(pair)._QUOTE_TOKEN_(); _deposit(msg.sender, address(this), _baseToken, baseAmount, flag == 1); _deposit(msg.sender, address(this), _quoteToken, quoteAmount, flag == 2); if(baseAmount > 0) { IERC20(_baseToken).universalApproveMax(pair, baseAmount); baseShares = IDODOV1(pair).depositBaseTo(msg.sender, baseAmount); } if(quoteAmount > 0) { IERC20(_quoteToken).universalApproveMax(pair, quoteAmount); quoteShares = IDODOV1(pair).depositQuoteTo(msg.sender, quoteAmount); } require(baseShares >= baseMinShares && quoteShares >= quoteMinShares,"DODOV2Proxy02: Return DLP is not enough"); } function _deposit( address from, address to, address token, uint256 amount, bool isETH ) internal { if (isETH) { if (amount > 0) { IWETH(_WETH_).deposit{value: amount}(); if (to != address(this)) SafeERC20.safeTransfer(IERC20(_WETH_), to, amount); } } else { IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(token, from, to, amount); } } function _withdraw( address payable to, address token, uint256 amount, bool isETH ) internal { if (isETH) { if (amount > 0) { IWETH(_WETH_).withdraw(amount); to.transfer(amount); } } else { if (amount > 0) { SafeERC20.safeTransfer(IERC20(token), to, amount); } } } function _dodoGasReturn(uint256 originGas) internal { uint256 _gasDodoMaxReturn = _GAS_DODO_MAX_RETURN_; if(_gasDodoMaxReturn > 0) { uint256 calcGasTokenBurn = originGas.sub(gasleft()) / 65000; uint256 gasTokenBurn = calcGasTokenBurn > _gasDodoMaxReturn ? _gasDodoMaxReturn : calcGasTokenBurn; if(gasTokenBurn >= 3 && gasleft() > 27710 + gasTokenBurn * 6080) IChi(_CHI_TOKEN_).freeUpTo(gasTokenBurn); } } function _externalGasReturn() internal { uint256 _gasExternalReturn = _GAS_EXTERNAL_RETURN_; if(_gasExternalReturn > 0) { if(gasleft() > 27710 + _gasExternalReturn * 6080) IChi(_CHI_TOKEN_).freeUpTo(_gasExternalReturn); } } function _execIncentive(bool isIncentive, address fromToken,address toToken) internal { if(isIncentive && gasleft() > 30000) { IDODOIncentive(_DODO_INCENTIVE_).triggerIncentive(fromToken, toToken, msg.sender); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"dvmFactory","type":"address"},{"internalType":"address","name":"dppFactory","type":"address"},{"internalType":"address","name":"cpFactory","type":"address"},{"internalType":"address payable","name":"weth","type":"address"},{"internalType":"address","name":"dodoApproveProxy","type":"address"},{"internalType":"address","name":"dodoSellHelper","type":"address"},{"internalType":"address","name":"chiToken","type":"address"},{"internalType":"address","name":"dodoIncentive","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromToken","type":"address"},{"indexed":false,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"OrderHistory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_CHI_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_CP_FACTORY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DODO_APPROVE_PROXY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DODO_INCENTIVE_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DODO_SELL_HELPER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DPP_FACTORY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DVM_FACTORY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_GAS_DODO_MAX_RETURN_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_GAS_EXTERNAL_RETURN_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_NEW_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_WETH_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dvmAddress","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"baseMinAmount","type":"uint256"},{"internalType":"uint256","name":"quoteMinAmount","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"addDVMLiquidity","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"baseAdjustedInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAdjustedInAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"uint256","name":"baseMinShares","type":"uint256"},{"internalType":"uint256","name":"quoteMinShares","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"addLiquidityToV1","outputs":[{"internalType":"uint256","name":"baseShares","type":"uint256"},{"internalType":"uint256","name":"quoteShares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cpAddress","type":"address"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256[]","name":"timeLine","type":"uint256[]"},{"internalType":"uint256[]","name":"valueList","type":"uint256[]"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"createCrowdPooling","outputs":[{"internalType":"address payable","name":"newCrowdPooling","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTwap","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"createDODOPrivatePool","outputs":[{"internalType":"address","name":"newPrivatePool","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"createDODOVendingMachine","outputs":[{"internalType":"address","name":"newVendingMachine","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"isIncentive","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV1","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"isIncentive","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2ETHToToken","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"isIncentive","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2TokenToETH","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"isIncentive","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2TokenToToken","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"address","name":"approveTarget","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"bytes","name":"callDataConcat","type":"bytes"},{"internalType":"bool","name":"isIncentive","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"externalSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"mixAdapters","type":"address[]"},{"internalType":"address[]","name":"mixPairs","type":"address[]"},{"internalType":"address[]","name":"assetTo","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"isIncentive","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"mixSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dppAddress","type":"address"},{"internalType":"uint256[]","name":"paramList","type":"uint256[]"},{"internalType":"uint256[]","name":"amountList","type":"uint256[]"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"minBaseReserve","type":"uint256"},{"internalType":"uint256","name":"minQuoteReserve","type":"uint256"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"resetDODOPrivatePool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDodoGasReturn","type":"uint256"},{"internalType":"uint256","name":"newExternalGasReturn","type":"uint256"}],"name":"updateGasReturn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610180604052600060025560006003553480156200001c57600080fd5b50604051620060373803806200603783398181016040526101008110156200004357600080fd5b5080516020820151604083015160608085015160808087015160a08089015160c0808b015160e09b8c01516001600160601b03199b891b8c16909c5298871b8a166101005296861b89166101205293851b8816909252831b86169052811b841690915290811b8216610160529190911b166101405260805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c6101605160601c615e50620001e76000398061123452806116965280611707528061183e5280611a525280612b835280612bef528061388b52806138fc5280615313528061563a5250806130b852806153ed525080610fd852806110a55280614f6c52508061139f528061154d528061466a525080613feb52806141a5525080611b90528061464652508061244552806139db52806148d95280614afe5280615088525080610fb452806112e5528061149552806114d95280611ce45280611d7a52806127e252806128975280612eb55280612f4b52806132ff528061336352806140f1528061413b5280614f9c528061502452806154625250615e506000f3fe6080604052600436106101e75760003560e01c806369dba8ee11610102578063b730d15011610095578063eb99be1211610064578063eb99be1214610db7578063f2fde38b14610dcc578063f87dc1b714610dff578063faa980e414610ee0576101ee565b8063b730d15014610d04578063d6354c3e14610d19578063db70b5c714610d49578063e7cd4a0414610d84576101ee565b80638b3bb089116100d15780638b3bb08914610bf357806399882c8f14610c745780639f68732214610cda578063af1280b014610cef576101ee565b806369dba8ee14610b6d57806369e4e41714610b825780636f9170f614610b975780638456db1514610bde576101ee565b80631e6d24c21161017a5780634e71e0c8116101495780634e71e0c81461094a5780635028bb951461095f57806354bacd1314610a22578063674d942214610b02576101ee565b80631e6d24c2146106535780632042e5c21461072a57806323c38fa31461075d57806341cf716014610935576101ee565b80630d9be500116101b65780630d9be500146103b35780630dd4ebd91461041157806312ff148d146104f757806316048bc41461063e576101ee565b8063018c9fda146101f0578063056fc2ee146103565780630d0092971461036b5780630d4eec8f1461039e576101ee565b366101ee57005b005b61033a600480360360e081101561020657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561024057600080fd5b82018360208201111561025257600080fd5b803590602001918460208302840111600160201b8311171561027357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156102c257600080fd5b8201836020820111156102d457600080fd5b803590602001918460208302840111600160201b831117156102f557600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050505080351515915060200135610ef5565b604080516001600160a01b039092168252519081900360200190f35b34801561036257600080fd5b5061033a611232565b34801561037757600080fd5b506101ee6004803603602081101561038e57600080fd5b50356001600160a01b0316611256565b3480156103aa57600080fd5b5061033a6112e3565b61033a60048036036101208110156103ca57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135611307565b6104e5600480360361010081101561042857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561046757600080fd5b82018360208201111561047957600080fd5b803590602001918460208302840111600160201b8311171561049a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550508235935050506020810135151590604001356115cb565b60408051918252519081900360200190f35b6101ee600480360360e081101561050d57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561053757600080fd5b82018360208201111561054957600080fd5b803590602001918460208302840111600160201b8311171561056a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105b957600080fd5b8201836020820111156105cb57600080fd5b803590602001918460208302840111600160201b831117156105ec57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505060ff8335169350505060208101359060408101359060600135611ebd565b34801561064a57600080fd5b5061033a612361565b34801561065f57600080fd5b506104e5600480360360e081101561067657600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156106ac57600080fd5b8201836020820111156106be57600080fd5b803590602001918460208302840111600160201b831117156106df57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612375565b34801561073657600080fd5b506101ee6004803603602081101561074d57600080fd5b50356001600160a01b03166129c1565b6104e5600480360361014081101561077457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111600160201b831117156107e657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561083557600080fd5b82018360208201111561084757600080fd5b803590602001918460208302840111600160201b8311171561086857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108b757600080fd5b8201836020820111156108c957600080fd5b803590602001918460208302840111600160201b831117156108ea57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612a32565b34801561094157600080fd5b5061033a6130b6565b34801561095657600080fd5b506101ee6130da565b6104e5600480360360c081101561097557600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156109a457600080fd5b8201836020820111156109b657600080fd5b803590602001918460208302840111600160201b831117156109d757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060208101351515906040013561319e565b6104e56004803603610120811015610a3957600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b811115610a8757600080fd5b820183602082011115610a9957600080fd5b803590602001918460018302840111600160201b83111715610aba57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050505080351515915060200135613804565b610b4f600480360360e0811015610b1857600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c00135613cdd565b60408051938452602084019290925282820152519081900360600190f35b348015610b7957600080fd5b506104e5613fe3565b348015610b8e57600080fd5b5061033a613fe9565b348015610ba357600080fd5b50610bca60048036036020811015610bba57600080fd5b50356001600160a01b031661400d565b604080519115158252519081900360200190f35b348015610bea57600080fd5b5061033a614022565b610c516004803603610120811015610c0a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135614031565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610cc1600480360360e0811015610c8a57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c00135614303565b6040805192835260208301919091528051918290030190f35b348015610ce657600080fd5b506104e561463e565b348015610cfb57600080fd5b5061033a614644565b348015610d1057600080fd5b5061033a614668565b348015610d2557600080fd5b506101ee60048036036040811015610d3c57600080fd5b508035906020013561468c565b6101ee60048036036080811015610d5f57600080fd5b506001600160a01b038135169060208101359060ff60408201351690606001356146e7565b348015610d9057600080fd5b506101ee60048036036020811015610da757600080fd5b50356001600160a01b0316614863565b348015610dc357600080fd5b5061033a6148d7565b348015610dd857600080fd5b506101ee60048036036020811015610def57600080fd5b50356001600160a01b03166148fb565b348015610e0b57600080fd5b506104e56004803603610100811015610e2357600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610e6257600080fd5b820183602082011115610e7457600080fd5b803590602001918460208302840111600160201b83111715610e9557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550508235935050506020810135151590604001356149ab565b348015610eec57600080fd5b5061033a614f6a565b6000805460ff1615610f3a576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558142811015610f8b576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b8860006001600160a01b038a16600080516020615d0483398151915214610fb25789610fd4565b7f00000000000000000000000000000000000000000000000000000000000000005b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166389edcf146040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561103157600080fd5b505af1158015611045573d6000803e3d6000fd5b505050506040513d602081101561105b57600080fd5b5051935061106d3385848c6000614f8e565b6040516001600160a01b038516903480156108fc02916000818181858888f193505050501580156110a2573d6000803e3d6000fd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ecfc2db0853385858d8d8d6040518863ffffffff1660e01b815260040180886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001806020018060200184151515158152602001838103835286818151815260200191508051906020019060200280838360005b8381101561119657818101518382015260200161117e565b50505050905001838103825285818151815260200191508051906020019060200280838360005b838110156111d55781810151838201526020016111bd565b505050509050019950505050505050505050600060405180830381600087803b15801561120157600080fd5b505af1158015611215573d6000803e3d6000fd5b50506000805460ff1916905550939b9a5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600154600160a01b900460ff16156112a8576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000805460ff161561134c576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055814281101561139d576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166309b8adb86040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156113f857600080fd5b505af115801561140c573d6000803e3d6000fd5b505050506040513d602081101561142257600080fd5b505191508a8a61144e3385848e6001600160a01b038216600080516020615d0483398151915214614f8e565b6114743385838d6001600160a01b038216600080516020615d0483398151915214614f8e565b6001600160a01b038216600080516020615d0483398151915214156114b7577f000000000000000000000000000000000000000000000000000000000000000091505b6001600160a01b038116600080516020615d0483398151915214156114f957507f00000000000000000000000000000000000000000000000000000000000000005b6040805162caf77f60e51b81526001600160a01b03868116600483015233602483015284811660448301528381166064830152608482018c905260a482018a905260c482018b905288151560e483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163195eefe0916101048082019260009290919082900301818387803b15801561159857600080fd5b505af11580156115ac573d6000803e3d6000fd5b50506000805460ff1916905550939d9c50505050505050505050505050565b60008142811015611611576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6000865111611655576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b600087116116945760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b031614156117055760405162461bcd60e51b8152600401808060200182810382526023815260200180615c436023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614156117765760405162461bcd60e51b8152600401808060200182810382526022815260200180615ce26022913960400191505060405180910390fd5b60005a90508a8a6117a33330848e6001600160a01b038216600080516020615d0483398151915214614f8e565b60005b8951811015611ca45760008a82815181106117bd57fe5b6020026020010151905089600116600014156119e7576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561180e57600080fd5b505afa158015611822573d6000803e3d6000fd5b505050506040513d602081101561183857600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811690821614156118be576040805162461bcd60e51b815260206004820152601e60248201527f444f444f563250726f787930323a204e4f545f535550504f52545f4348490000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561190857600080fd5b505afa15801561191c573d6000803e3d6000fd5b505050506040513d602081101561193257600080fd5b505190506119506001600160a01b038316848363ffffffff6150f216565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b1580156119b357600080fd5b505af11580156119c7573d6000803e3d6000fd5b505050506040513d60208110156119dd57600080fd5b50611c9792505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2257600080fd5b505afa158015611a36573d6000803e3d6000fd5b505050506040513d6020811015611a4c57600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169082161415611ad2576040805162461bcd60e51b815260206004820152601e60248201527f444f444f563250726f787930323a204e4f545f535550504f52545f4348490000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611b1c57600080fd5b505afa158015611b30573d6000803e3d6000fd5b505050506040513d6020811015611b4657600080fd5b50519050611b646001600160a01b038316848363ffffffff6150f216565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b158015611bd657600080fd5b505afa158015611bea573d6000803e3d6000fd5b505050506040513d6020811015611c0057600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b158015611c6757600080fd5b505af1158015611c7b573d6000803e3d6000fd5b505050506040513d6020811015611c9157600080fd5b50505050505b50600198891c98016117a6565b506001600160a01b038116600080516020615d048339815191521415611ddf57604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b158015611d2a57600080fd5b505afa158015611d3e573d6000803e3d6000fd5b505050506040513d6020811015611d5457600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519196506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b158015611dc257600080fd5b505af1158015611dd6573d6000803e3d6000fd5b50505050611dfb565b611df86001600160a01b0382163063ffffffff6151bc16565b94505b89851015611e3a5760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b611e546001600160a01b038216338763ffffffff61524916565b611e5d836152b8565b611e688783836153aa565b604080516001600160a01b038085168252831660208201523381830152606081018d9052608081018790529051600080516020615bfe8339815191529181900360a00190a15050505098975050505050505050565b60005460ff1615611f01576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015611f52576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b611fdd33898a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9057600080fd5b505afa158015611fa4573d6000803e3d6000fd5b505050506040513d6020811015611fba57600080fd5b505189518a90600090611fc957fe5b60200260200101518960ff16600114614f8e565b61206a33898a6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561201b57600080fd5b505afa15801561202f573d6000803e3d6000fd5b505050506040513d602081101561204557600080fd5b505189518a90600190811061205657fe5b60200260200101518960ff16600214614f8e565b876001600160a01b03166316048bc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156120a557600080fd5b505af11580156120b9573d6000803e3d6000fd5b505050506040513d60208110156120cf57600080fd5b505187516001600160a01b0390911690638ff3928c9033908a906000906120f257fe5b60200260200101518a60018151811061210757fe5b60200260200101518b60028151811061211c57fe5b60200260200101518b60028151811061213157fe5b60200260200101518c60038151811061214657fe5b60200260200101518b8b6040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b1580156121c957600080fd5b505af11580156121dd573d6000803e3d6000fd5b505050506040513d60208110156121f357600080fd5b5051612235576040805162461bcd60e51b815260206004820152600c60248201526b14995cd95d0811985a5b195960a21b604482015290519081900360640190fd5b6122c133896001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227257600080fd5b505afa158015612286573d6000803e3d6000fd5b505050506040513d602081101561229c57600080fd5b50518851899060029081106122ad57fe5b60200260200101518860ff16600314615454565b61234d33896001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156122fe57600080fd5b505afa158015612312573d6000803e3d6000fd5b505050506040513d602081101561232857600080fd5b505188518990600390811061233957fe5b60200260200101518860ff16600414615454565b50506000805460ff19169055505050505050565b60005461010090046001600160a01b031681565b600081428110156123bb576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b60008651116123ff576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b6000871161243e5760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b60005a90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a5ea4668b338a60008151811061248157fe5b60200260200101518d6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561250b57600080fd5b505af115801561251f573d6000803e3d6000fd5b506000925050505b87518110156127c157600188510381141561267e57600187166125e15787818151811061255057fe5b60200260200101516001600160a01b031663bd6015b4306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156125af57600080fd5b505af11580156125c3573d6000803e3d6000fd5b505050506040513d60208110156125d957600080fd5b506126799050565b8781815181106125ed57fe5b60200260200101516001600160a01b031663dd93f59a306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561264c57600080fd5b505af1158015612660573d6000803e3d6000fd5b505050506040513d602081101561267657600080fd5b50505b6127b5565b600187166127075787818151811061269257fe5b60200260200101516001600160a01b031663bd6015b48983600101815181106126b757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561264c57600080fd5b87818151811061271357fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061273857fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561278857600080fd5b505af115801561279c573d6000803e3d6000fd5b505050506040513d60208110156127b257600080fd5b50505b600196871c9601612527565b50604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561282857600080fd5b505afa15801561283c573d6000803e3d6000fd5b505050506040513d602081101561285257600080fd5b50519250878310156128955760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156128fb57600080fd5b505af115801561290f573d6000803e3d6000fd5b505060405133925085156108fc02915085906000818181858888f19350505050158015612940573d6000803e3d6000fd5b5061294a816152b8565b612963858b600080516020615d048339815191526153aa565b604080516001600160a01b038c168152600080516020615d0483398151915260208201523381830152606081018b9052608081018590529051600080516020615bfe8339815191529181900360a00190a15050979650505050505050565b60005461010090046001600160a01b03163314612a11576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60008142811015612a78576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6000875111612abc576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b8751875114612afc5760405162461bcd60e51b8152600401808060200182810382526025815260200180615c1e6025913960400191505060405180910390fd5b6001865103875114612b3f5760405162461bcd60e51b8152600401808060200182810382526025815260200180615dc06025913960400191505060405180910390fd5b60008911612b7e5760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b8b8b8b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169084161415612bed5760405162461bcd60e51b8152600401808060200182810382526023815260200180615c436023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612c5e5760405162461bcd60e51b8152600401808060200182810382526022815260200180615ce26022913960400191505060405180910390fd5b60005a90506000612c7e6001600160a01b0385163363ffffffff61552c16565b9050612cc3338c600081518110612c9157fe5b60200260200101518786600080516020615d048339815191526001600160a01b03168a6001600160a01b031614614f8e565b60005b8c51811015612e755760018b16612da2578d8181518110612ce357fe5b60200260200101516001600160a01b031663815846958d8360010181518110612d0857fe5b60200260200101518f8481518110612d1c57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015612d8557600080fd5b505af1158015612d99573d6000803e3d6000fd5b50505050612e69565b8d8181518110612dae57fe5b60200260200101516001600160a01b0316637c9a7c978d8360010181518110612dd357fe5b60200260200101518f8481518110612de757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015612e5057600080fd5b505af1158015612e64573d6000803e3d6000fd5b505050505b60019a8b1c9a01612cc6565b506001600160a01b038416600080516020615d048339815191521415612fde57604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b158015612efb57600080fd5b505afa158015612f0f573d6000803e3d6000fd5b505050506040513d6020811015612f2557600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519198506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505060405133925089156108fc02915089906000818181858888f19350505050158015612fd8573d6000803e3d6000fd5b5061300a565b61300781612ffb6001600160a01b0387163363ffffffff6151bc16565b9063ffffffff6155d616565b96505b8d8710156130495760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b613052826152b8565b61305d8986866153aa565b604080516001600160a01b03808816825286166020820152338183015260608101859052608081018990529051600080516020615bfe8339815191529181900360a00190a15050505050509a9950505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b03163314613129576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600081428110156131e4576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6000865111613228576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b600087116132675760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b60005a604080516370a0823160e01b815233600482015290519192506000916001600160a01b038c16916370a08231916024808301926020929190829003018186803b1580156132b657600080fd5b505afa1580156132ca573d6000803e3d6000fd5b505050506040513d60208110156132e057600080fd5b505160408051630d0e30db60e41b815290519192506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163d0e30db0913491600480830192600092919082900301818588803b15801561334857600080fd5b505af115801561335c573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb8960008151811061339d57fe5b6020026020010151346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156133f557600080fd5b505af1158015613409573d6000803e3d6000fd5b505050506040513d602081101561341f57600080fd5b50600090505b88518110156136bf57600189510381141561357c57600188166134df5788818151811061344e57fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156134ad57600080fd5b505af11580156134c1573d6000803e3d6000fd5b505050506040513d60208110156134d757600080fd5b506135779050565b8881815181106134eb57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561354a57600080fd5b505af115801561355e573d6000803e3d6000fd5b505050506040513d602081101561357457600080fd5b50505b6136b3565b600188166136055788818151811061359057fe5b60200260200101516001600160a01b031663bd6015b48a83600101815181106135b557fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561354a57600080fd5b88818151811061361157fe5b60200260200101516001600160a01b031663dd93f59a8a836001018151811061363657fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561368657600080fd5b505af115801561369a573d6000803e3d6000fd5b505050506040513d60208110156136b057600080fd5b50505b600197881c9701613425565b50604080516370a0823160e01b815233600482015290516137449183916001600160a01b038e16916370a08231916024808301926020929190829003018186803b15801561370c57600080fd5b505afa158015613720573d6000803e3d6000fd5b505050506040513d602081101561373657600080fd5b50519063ffffffff6155d616565b9350888410156137855760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b61378e826152b8565b6137a786600080516020615d048339815191528c6153aa565b60408051600080516020615d0483398151915281526001600160a01b038c1660208201523381830152346060820152608081018690529051600080516020615bfe8339815191529181900360a00190a15050509695505050505050565b6000814281101561384a576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b600086116138895760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168b6001600160a01b031614156138fa5760405162461bcd60e51b8152600401808060200182810382526023815260200180615c436023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b0316141561396b5760405162461bcd60e51b8152600401808060200182810382526022815260200180615ce26022913960400191505060405180910390fd5b60006139866001600160a01b038c163363ffffffff61552c16565b90506001600160a01b038c16600080516020615d0483398151915214613a52576040805163052f523360e11b81526001600160a01b038e81166004830152336024830152306044830152606482018b905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b158015613a2557600080fd5b505af1158015613a39573d6000803e3d6000fd5b50613a52925050506001600160a01b038d168b8a6150f2565b6001600160a01b03891660009081526004602052604090205460ff16613aa95760405162461bcd60e51b8152600401808060200182810382526025815260200180615d446025913960400191505060405180910390fd5b60006001600160a01b03808b16908e16600080516020615d0483398151915214613ad4576000613ad6565b345b886040518082805190602001908083835b60208310613b065780518252601f199092019160209182019101613ae7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613b68576040519150601f19603f3d011682016040523d82523d6000602084013e613b6d565b606091505b5050905080613bad5760405162461bcd60e51b815260040180806020018281038252602d815260200180615d69602d913960400191505060405180910390fd5b613be133613bca6001600160a01b038f163063ffffffff61552c16565b6001600160a01b038f16919063ffffffff61524916565b613bfe82612ffb6001600160a01b038f163363ffffffff61552c16565b935087841015613c3f5760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b613c4761561f565b613c52868e8e6153aa565b600080516020615bfe8339815191528d8d338c8860405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050509998505050505050505050565b600080548190819060ff1615613d26576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558342811015613d77576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b8a613d83818c8c6156cb565b9094509250888410801590613d985750878310155b613dd35760405162461bcd60e51b815260040180806020018281038252602b815260200180615cb7602b913960400191505060405180910390fd5b613e4a3382836001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015613e1157600080fd5b505afa158015613e25573d6000803e3d6000fd5b505050506040513d6020811015613e3b57600080fd5b505187600160ff8d1614614f8e565b613ec13382836001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015613e8857600080fd5b505afa158015613e9c573d6000803e3d6000fd5b505050506040513d6020811015613eb257600080fd5b505186600260ff8d1614614f8e565b60408051634c85b42560e01b815233600482015290516001600160a01b03831691634c85b4259160248083019260609291908290030181600087803b158015613f0957600080fd5b505af1158015613f1d573d6000803e3d6000fd5b505050506040513d6060811015613f3357600080fd5b50519450600160ff8816148015613f4957508334115b15613f7f5760405133903486900380156108fc02916000818181858888f19350505050158015613f7d573d6000803e3d6000fd5b505b8660ff166002148015613f9157508234115b15613fc75760405133903485900380156108fc02916000818181858888f19350505050158015613fc5573d6000803e3d6000fd5b505b50506000805460ff191690559199909850909650945050505050565b60035481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60046020526000908152604090205460ff1681565b6001546001600160a01b031681565b60008054819060ff1615614078576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff1916600117905582428110156140c9576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b60006001600160a01b038d16600080516020615d04833981519152146140ef578c614111565b7f00000000000000000000000000000000000000000000000000000000000000005b905060006001600160a01b038d16600080516020615d0483398151915214614139578c61415b565b7f00000000000000000000000000000000000000000000000000000000000000005b6040805163e18c40c760e01b81526001600160a01b0385811660048301528381166024830152604482018e9052606482018d9052608482018c90528a151560a483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163e18c40c79160c4808201926020929091908290030181600087803b1580156141f057600080fd5b505af1158015614204573d6000803e3d6000fd5b505050506040513d602081101561421a57600080fd5b505194508d91508c905061424a3386848f6001600160a01b038216600080516020615d0483398151915214614f8e565b6142703386838e6001600160a01b038216600080516020615d0483398151915214614f8e565b505060408051634c85b42560e01b815233600482015290516001600160a01b03851691634c85b4259160248083019260609291908290030181600087803b1580156142ba57600080fd5b505af11580156142ce573d6000803e3d6000fd5b505050506040513d60608110156142e457600080fd5b50516000805460ff19169055929c929b50919950505050505050505050565b60008054819060ff161561434a576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561439b576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b60008a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156143d657600080fd5b505afa1580156143ea573d6000803e3d6000fd5b505050506040513d602081101561440057600080fd5b505160408051636a5cb82360e11b815290519192506000916001600160a01b038e169163d4b97046916004808301926020929190829003018186803b15801561444857600080fd5b505afa15801561445c573d6000803e3d6000fd5b505050506040513d602081101561447257600080fd5b505190506144893330848e600160ff8d1614614f8e565b61449c3330838d8b60ff16600214614f8e565b8a1561453a576144bc6001600160a01b0383168d8d63ffffffff6150f216565b6040805163aa06ce9b60e01b8152336004820152602481018d905290516001600160a01b038e169163aa06ce9b9160448083019260209291908290030181600087803b15801561450b57600080fd5b505af115801561451f573d6000803e3d6000fd5b505050506040513d602081101561453557600080fd5b505194505b89156145d85761455a6001600160a01b0382168d8c63ffffffff6150f216565b604080516317c5e7d960e21b8152336004820152602481018c905290516001600160a01b038e1691635f179f649160448083019260209291908290030181600087803b1580156145a957600080fd5b505af11580156145bd573d6000803e3d6000fd5b505050506040513d60208110156145d357600080fd5b505193505b8885101580156145e85750878410155b6146235760405162461bcd60e51b8152600401808060200182810382526027815260200180615c906027913960400191505060405180910390fd5b50506000805460ff1916905550909890975095505050505050565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005461010090046001600160a01b031633146146dc576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600291909155600355565b60005460ff161561472b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055804281101561477c576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6147f33386876001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156147ba57600080fd5b505afa1580156147ce573d6000803e3d6000fd5b505050506040513d60208110156147e457600080fd5b505187600160ff891614614f8e565b60408051639cf5453d60e01b815233600482015290516001600160a01b03871691639cf5453d91602480830192600092919082900301818387803b15801561483a57600080fd5b505af115801561484e573d6000803e3d6000fd5b50506000805460ff1916905550505050505050565b60005461010090046001600160a01b031633146148b3576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005461010090046001600160a01b0316331461494b576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600081428110156149f1576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6000865111614a35576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b60008711614a745760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b60005a604080516370a0823160e01b815233600482015290519192506000916001600160a01b038d16916370a08231916024808301926020929190829003018186803b158015614ac357600080fd5b505afa158015614ad7573d6000803e3d6000fd5b505050506040513d6020811015614aed57600080fd5b505188519091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630a5ea466908e9033908c90600090614b3457fe5b60200260200101518e6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015614bbe57600080fd5b505af1158015614bd2573d6000803e3d6000fd5b506000925050505b8851811015614e74576001895103811415614d315760018816614c9457888181518110614c0357fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015614c6257600080fd5b505af1158015614c76573d6000803e3d6000fd5b505050506040513d6020811015614c8c57600080fd5b50614d2c9050565b888181518110614ca057fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015614cff57600080fd5b505af1158015614d13573d6000803e3d6000fd5b505050506040513d6020811015614d2957600080fd5b50505b614e68565b60018816614dba57888181518110614d4557fe5b60200260200101516001600160a01b031663bd6015b48a8360010181518110614d6a57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015614cff57600080fd5b888181518110614dc657fe5b60200260200101516001600160a01b031663dd93f59a8a8360010181518110614deb57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015614e3b57600080fd5b505af1158015614e4f573d6000803e3d6000fd5b505050506040513d6020811015614e6557600080fd5b50505b600197881c9701614bda565b50604080516370a0823160e01b81523360048201529051614ec19183916001600160a01b038f16916370a08231916024808301926020929190829003018186803b15801561370c57600080fd5b935088841015614f025760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b614f0b826152b8565b614f16868d8d6153aa565b604080516001600160a01b03808f1682528d1660208201523381830152606081018c9052608081018690529051600080516020615bfe8339815191529181900360a00190a150505098975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b801561504f57811561504a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015614ff557600080fd5b505af1158015615009573d6000803e3d6000fd5b505050506001600160a01b0385163014905061504a5761504a7f000000000000000000000000000000000000000000000000000000000000000085846157dd565b6150eb565b6040805163052f523360e11b81526001600160a01b038581166004830152878116602483015286811660448301526064820185905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b1580156150d257600080fd5b505af11580156150e6573d6000803e3d6000fd5b505050505b5050505050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561514357600080fd5b505afa158015615157573d6000803e3d6000fd5b505050506040513d602081101561516d57600080fd5b50519050818110156151b657801561519a5761519a6001600160a01b03851684600063ffffffff61582f16565b6151b66001600160a01b0385168460001963ffffffff61582f16565b50505050565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561521457600080fd5b505afa158015615228573d6000803e3d6000fd5b505050506040513d602081101561523e57600080fd5b505190505b92915050565b80156152b35761525883615942565b15615299576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015615293573d6000803e3d6000fd5b506152b3565b6152b36001600160a01b038416838363ffffffff6157dd16565b505050565b60025480156153a657600061fde86152d75a859063ffffffff6155d616565b816152de57fe5b04905060008282116152f057816152f2565b825b90506003811015801561530c5750806117c002616c3e015a115b156151b6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561537757600080fd5b505af115801561538b573d6000803e3d6000fd5b505050506040513d60208110156153a157600080fd5b505050505b5050565b8280156153b857506175305a115b156152b35760408051630622aa5960e21b81526001600160a01b038481166004830152838116602483015233604483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163188aa9649160648082019260009290919082900301818387803b15801561543757600080fd5b505af115801561544b573d6000803e3d6000fd5b50505050505050565b801561551b578115615516577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156154c657600080fd5b505af11580156154da573d6000803e3d6000fd5b50506040516001600160a01b038716925084156108fc02915084906000818181858888f19350505050158015615514573d6000803e3d6000fd5b505b6151b6565b81156151b6576151b68385846157dd565b600061553783615942565b1561554d57506001600160a01b03811631615243565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156155a357600080fd5b505afa1580156155b7573d6000803e3d6000fd5b505050506040513d60208110156155cd57600080fd5b50519050615243565b600082821115615619576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b60035480156156c857806117c002616c3e015a11156156c8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561569e57600080fd5b505af11580156156b2573d6000803e3d6000fd5b505050506040513d60208110156152b357600080fd5b50565b600080600080866001600160a01b03166336223ce96040518163ffffffff1660e01b8152600401604080518083038186803b15801561570957600080fd5b505afa15801561571d573d6000803e3d6000fd5b505050506040513d604081101561573357600080fd5b50805160209091015190925090508015801561574d575081155b15615759578593508492505b801580156157675750600082115b1561577457859350600092505b6000811180156157845750600082115b156157d35760006157958784615961565b905060006157a38784615961565b90508082116157c0578795506157b98383615992565b94506157d0565b8694506157cd8482615992565b95505b50505b5050935093915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526152b39084906159bc565b8015806158b5575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561588757600080fd5b505afa15801561589b573d6000803e3d6000fd5b505050506040513d60208110156158b157600080fd5b5051155b6158f05760405162461bcd60e51b8152600401808060200182810382526036815260200180615de56036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526152b39084906159bc565b6001600160a01b038116600080516020615d0483398151915214919050565b600061598b8261597f85670de0b6b3a764000063ffffffff615b1116565b9063ffffffff615b6c16565b9392505050565b6000670de0b6b3a76400006159ad848463ffffffff615b1116565b816159b457fe5b049392505050565b60006060836001600160a01b0316836040518082805190602001908083835b602083106159fa5780518252601f1990920191602091820191016159db565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615a5c576040519150601f19603f3d011682016040523d82523d6000602084013e615a61565b606091505b509150915081615ab8576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156151b657808060200190516020811015615ad457600080fd5b50516151b65760405162461bcd60e51b815260040180806020018281038252602a815260200180615d96602a913960400191505060405180910390fd5b600082615b2057506000615243565b82820282848281615b2d57fe5b041461598b576040805162461bcd60e51b815260206004820152600960248201526826aaa62fa2a92927a960b91b604482015290519081900360640190fd5b6000808211615bb3576040805162461bcd60e51b815260206004820152600e60248201526d2224ab24a224a723afa2a92927a960911b604482015290519081900360640190fd5b8183816159b457fefe444f444f563250726f787930323a2052455455524e5f414d4f554e545f5a45524f444f444f563250726f787930323a20455850495245440000000000000000000092ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a5221787444f444f563250726f787930323a20504149525f414441505445525f4e4f545f4d41544348444f444f563250726f787930323a204e4f545f535550504f52545f53454c4c5f434849444f444f563250726f787930323a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563250726f787930323a2052657475726e20444c50206973206e6f7420656e6f756768444f444f563250726f787930323a206465706f73697420616d6f756e74206973206e6f7420656e6f756768444f444f563250726f787930323a204e4f545f535550504f52545f4255595f434849000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee444f444f563250726f787930323a2050414952535f454d505459000000000000444f444f563250726f787930323a204e6f742057686974656c69737420436f6e7472616374444f444f563250726f787930323a2045787465726e616c205377617020657865637574696f6e204661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564444f444f563250726f787930323a20504149525f4153534554544f5f4e4f545f4d415443485361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220e0e4332977b9bd0f0a4ced23cda6d5342bc99c6036a424bca0c59481c6adedad64736f6c6343000609003300000000000000000000000072d220ce168c4f361dd4dee5d826a01ad8598f6c0000000000000000000000006b4fa0bc61eddc928e0df9c7f01e407bfcd3e5ef000000000000000000000000e8c9a78725d0451fa19878d5f8a3dc0d55fecf25000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc619000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c000000000000000000000000989dcaa95801c527c5b73aa65d3962df9ace1b0c
Deployed Bytecode
0x6080604052600436106101e75760003560e01c806369dba8ee11610102578063b730d15011610095578063eb99be1211610064578063eb99be1214610db7578063f2fde38b14610dcc578063f87dc1b714610dff578063faa980e414610ee0576101ee565b8063b730d15014610d04578063d6354c3e14610d19578063db70b5c714610d49578063e7cd4a0414610d84576101ee565b80638b3bb089116100d15780638b3bb08914610bf357806399882c8f14610c745780639f68732214610cda578063af1280b014610cef576101ee565b806369dba8ee14610b6d57806369e4e41714610b825780636f9170f614610b975780638456db1514610bde576101ee565b80631e6d24c21161017a5780634e71e0c8116101495780634e71e0c81461094a5780635028bb951461095f57806354bacd1314610a22578063674d942214610b02576101ee565b80631e6d24c2146106535780632042e5c21461072a57806323c38fa31461075d57806341cf716014610935576101ee565b80630d9be500116101b65780630d9be500146103b35780630dd4ebd91461041157806312ff148d146104f757806316048bc41461063e576101ee565b8063018c9fda146101f0578063056fc2ee146103565780630d0092971461036b5780630d4eec8f1461039e576101ee565b366101ee57005b005b61033a600480360360e081101561020657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561024057600080fd5b82018360208201111561025257600080fd5b803590602001918460208302840111600160201b8311171561027357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156102c257600080fd5b8201836020820111156102d457600080fd5b803590602001918460208302840111600160201b831117156102f557600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050505080351515915060200135610ef5565b604080516001600160a01b039092168252519081900360200190f35b34801561036257600080fd5b5061033a611232565b34801561037757600080fd5b506101ee6004803603602081101561038e57600080fd5b50356001600160a01b0316611256565b3480156103aa57600080fd5b5061033a6112e3565b61033a60048036036101208110156103ca57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135611307565b6104e5600480360361010081101561042857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561046757600080fd5b82018360208201111561047957600080fd5b803590602001918460208302840111600160201b8311171561049a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550508235935050506020810135151590604001356115cb565b60408051918252519081900360200190f35b6101ee600480360360e081101561050d57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561053757600080fd5b82018360208201111561054957600080fd5b803590602001918460208302840111600160201b8311171561056a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105b957600080fd5b8201836020820111156105cb57600080fd5b803590602001918460208302840111600160201b831117156105ec57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505060ff8335169350505060208101359060408101359060600135611ebd565b34801561064a57600080fd5b5061033a612361565b34801561065f57600080fd5b506104e5600480360360e081101561067657600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156106ac57600080fd5b8201836020820111156106be57600080fd5b803590602001918460208302840111600160201b831117156106df57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612375565b34801561073657600080fd5b506101ee6004803603602081101561074d57600080fd5b50356001600160a01b03166129c1565b6104e5600480360361014081101561077457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111600160201b831117156107e657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561083557600080fd5b82018360208201111561084757600080fd5b803590602001918460208302840111600160201b8311171561086857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108b757600080fd5b8201836020820111156108c957600080fd5b803590602001918460208302840111600160201b831117156108ea57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612a32565b34801561094157600080fd5b5061033a6130b6565b34801561095657600080fd5b506101ee6130da565b6104e5600480360360c081101561097557600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156109a457600080fd5b8201836020820111156109b657600080fd5b803590602001918460208302840111600160201b831117156109d757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060208101351515906040013561319e565b6104e56004803603610120811015610a3957600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b811115610a8757600080fd5b820183602082011115610a9957600080fd5b803590602001918460018302840111600160201b83111715610aba57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050505080351515915060200135613804565b610b4f600480360360e0811015610b1857600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c00135613cdd565b60408051938452602084019290925282820152519081900360600190f35b348015610b7957600080fd5b506104e5613fe3565b348015610b8e57600080fd5b5061033a613fe9565b348015610ba357600080fd5b50610bca60048036036020811015610bba57600080fd5b50356001600160a01b031661400d565b604080519115158252519081900360200190f35b348015610bea57600080fd5b5061033a614022565b610c516004803603610120811015610c0a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135614031565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610cc1600480360360e0811015610c8a57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c00135614303565b6040805192835260208301919091528051918290030190f35b348015610ce657600080fd5b506104e561463e565b348015610cfb57600080fd5b5061033a614644565b348015610d1057600080fd5b5061033a614668565b348015610d2557600080fd5b506101ee60048036036040811015610d3c57600080fd5b508035906020013561468c565b6101ee60048036036080811015610d5f57600080fd5b506001600160a01b038135169060208101359060ff60408201351690606001356146e7565b348015610d9057600080fd5b506101ee60048036036020811015610da757600080fd5b50356001600160a01b0316614863565b348015610dc357600080fd5b5061033a6148d7565b348015610dd857600080fd5b506101ee60048036036020811015610def57600080fd5b50356001600160a01b03166148fb565b348015610e0b57600080fd5b506104e56004803603610100811015610e2357600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610e6257600080fd5b820183602082011115610e7457600080fd5b803590602001918460208302840111600160201b83111715610e9557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550508235935050506020810135151590604001356149ab565b348015610eec57600080fd5b5061033a614f6a565b6000805460ff1615610f3a576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558142811015610f8b576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b8860006001600160a01b038a16600080516020615d0483398151915214610fb25789610fd4565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b90507f000000000000000000000000e8c9a78725d0451fa19878d5f8a3dc0d55fecf256001600160a01b03166389edcf146040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561103157600080fd5b505af1158015611045573d6000803e3d6000fd5b505050506040513d602081101561105b57600080fd5b5051935061106d3385848c6000614f8e565b6040516001600160a01b038516903480156108fc02916000818181858888f193505050501580156110a2573d6000803e3d6000fd5b507f000000000000000000000000e8c9a78725d0451fa19878d5f8a3dc0d55fecf256001600160a01b031663ecfc2db0853385858d8d8d6040518863ffffffff1660e01b815260040180886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001806020018060200184151515158152602001838103835286818151815260200191508051906020019060200280838360005b8381101561119657818101518382015260200161117e565b50505050905001838103825285818151815260200191508051906020019060200280838360005b838110156111d55781810151838201526020016111bd565b505050509050019950505050505050505050600060405180830381600087803b15801561120157600080fd5b505af1158015611215573d6000803e3d6000fd5b50506000805460ff1916905550939b9a5050505050505050505050565b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c81565b600154600160a01b900460ff16156112a8576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000805460ff161561134c576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055814281101561139d576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b7f0000000000000000000000006b4fa0bc61eddc928e0df9c7f01e407bfcd3e5ef6001600160a01b03166309b8adb86040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156113f857600080fd5b505af115801561140c573d6000803e3d6000fd5b505050506040513d602081101561142257600080fd5b505191508a8a61144e3385848e6001600160a01b038216600080516020615d0483398151915214614f8e565b6114743385838d6001600160a01b038216600080516020615d0483398151915214614f8e565b6001600160a01b038216600080516020615d0483398151915214156114b7577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291505b6001600160a01b038116600080516020615d0483398151915214156114f957507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b6040805162caf77f60e51b81526001600160a01b03868116600483015233602483015284811660448301528381166064830152608482018c905260a482018a905260c482018b905288151560e483015291517f0000000000000000000000006b4fa0bc61eddc928e0df9c7f01e407bfcd3e5ef9092169163195eefe0916101048082019260009290919082900301818387803b15801561159857600080fd5b505af11580156115ac573d6000803e3d6000fd5b50506000805460ff1916905550939d9c50505050505050505050505050565b60008142811015611611576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6000865111611655576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b600087116116945760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168a6001600160a01b031614156117055760405162461bcd60e51b8152600401808060200182810382526023815260200180615c436023913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316896001600160a01b031614156117765760405162461bcd60e51b8152600401808060200182810382526022815260200180615ce26022913960400191505060405180910390fd5b60005a90508a8a6117a33330848e6001600160a01b038216600080516020615d0483398151915214614f8e565b60005b8951811015611ca45760008a82815181106117bd57fe5b6020026020010151905089600116600014156119e7576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561180e57600080fd5b505afa158015611822573d6000803e3d6000fd5b505050506040513d602081101561183857600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0390811690821614156118be576040805162461bcd60e51b815260206004820152601e60248201527f444f444f563250726f787930323a204e4f545f535550504f52545f4348490000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561190857600080fd5b505afa15801561191c573d6000803e3d6000fd5b505050506040513d602081101561193257600080fd5b505190506119506001600160a01b038316848363ffffffff6150f216565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b1580156119b357600080fd5b505af11580156119c7573d6000803e3d6000fd5b505050506040513d60208110156119dd57600080fd5b50611c9792505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2257600080fd5b505afa158015611a36573d6000803e3d6000fd5b505050506040513d6020811015611a4c57600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b039081169082161415611ad2576040805162461bcd60e51b815260206004820152601e60248201527f444f444f563250726f787930323a204e4f545f535550504f52545f4348490000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611b1c57600080fd5b505afa158015611b30573d6000803e3d6000fd5b505050506040513d6020811015611b4657600080fd5b50519050611b646001600160a01b038316848363ffffffff6150f216565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb169163ca19ebd9916044808301926020929190829003018186803b158015611bd657600080fd5b505afa158015611bea573d6000803e3d6000fd5b505050506040513d6020811015611c0057600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b158015611c6757600080fd5b505af1158015611c7b573d6000803e3d6000fd5b505050506040513d6020811015611c9157600080fd5b50505050505b50600198891c98016117a6565b506001600160a01b038116600080516020615d048339815191521415611ddf57604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a08231916024808301926020929190829003018186803b158015611d2a57600080fd5b505afa158015611d3e573d6000803e3d6000fd5b505050506040513d6020811015611d5457600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519196506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21691632e1a7d4d9160248082019260009290919082900301818387803b158015611dc257600080fd5b505af1158015611dd6573d6000803e3d6000fd5b50505050611dfb565b611df86001600160a01b0382163063ffffffff6151bc16565b94505b89851015611e3a5760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b611e546001600160a01b038216338763ffffffff61524916565b611e5d836152b8565b611e688783836153aa565b604080516001600160a01b038085168252831660208201523381830152606081018d9052608081018790529051600080516020615bfe8339815191529181900360a00190a15050505098975050505050505050565b60005460ff1615611f01576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015611f52576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b611fdd33898a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9057600080fd5b505afa158015611fa4573d6000803e3d6000fd5b505050506040513d6020811015611fba57600080fd5b505189518a90600090611fc957fe5b60200260200101518960ff16600114614f8e565b61206a33898a6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561201b57600080fd5b505afa15801561202f573d6000803e3d6000fd5b505050506040513d602081101561204557600080fd5b505189518a90600190811061205657fe5b60200260200101518960ff16600214614f8e565b876001600160a01b03166316048bc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156120a557600080fd5b505af11580156120b9573d6000803e3d6000fd5b505050506040513d60208110156120cf57600080fd5b505187516001600160a01b0390911690638ff3928c9033908a906000906120f257fe5b60200260200101518a60018151811061210757fe5b60200260200101518b60028151811061211c57fe5b60200260200101518b60028151811061213157fe5b60200260200101518c60038151811061214657fe5b60200260200101518b8b6040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b1580156121c957600080fd5b505af11580156121dd573d6000803e3d6000fd5b505050506040513d60208110156121f357600080fd5b5051612235576040805162461bcd60e51b815260206004820152600c60248201526b14995cd95d0811985a5b195960a21b604482015290519081900360640190fd5b6122c133896001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227257600080fd5b505afa158015612286573d6000803e3d6000fd5b505050506040513d602081101561229c57600080fd5b50518851899060029081106122ad57fe5b60200260200101518860ff16600314615454565b61234d33896001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156122fe57600080fd5b505afa158015612312573d6000803e3d6000fd5b505050506040513d602081101561232857600080fd5b505188518990600390811061233957fe5b60200260200101518860ff16600414615454565b50506000805460ff19169055505050505050565b60005461010090046001600160a01b031681565b600081428110156123bb576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b60008651116123ff576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b6000871161243e5760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b60005a90507f000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc6196001600160a01b0316630a5ea4668b338a60008151811061248157fe5b60200260200101518d6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561250b57600080fd5b505af115801561251f573d6000803e3d6000fd5b506000925050505b87518110156127c157600188510381141561267e57600187166125e15787818151811061255057fe5b60200260200101516001600160a01b031663bd6015b4306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156125af57600080fd5b505af11580156125c3573d6000803e3d6000fd5b505050506040513d60208110156125d957600080fd5b506126799050565b8781815181106125ed57fe5b60200260200101516001600160a01b031663dd93f59a306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561264c57600080fd5b505af1158015612660573d6000803e3d6000fd5b505050506040513d602081101561267657600080fd5b50505b6127b5565b600187166127075787818151811061269257fe5b60200260200101516001600160a01b031663bd6015b48983600101815181106126b757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561264c57600080fd5b87818151811061271357fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061273857fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561278857600080fd5b505af115801561279c573d6000803e3d6000fd5b505050506040513d60208110156127b257600080fd5b50505b600196871c9601612527565b50604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a08231916024808301926020929190829003018186803b15801561282857600080fd5b505afa15801561283c573d6000803e3d6000fd5b505050506040513d602081101561285257600080fd5b50519250878310156128955760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156128fb57600080fd5b505af115801561290f573d6000803e3d6000fd5b505060405133925085156108fc02915085906000818181858888f19350505050158015612940573d6000803e3d6000fd5b5061294a816152b8565b612963858b600080516020615d048339815191526153aa565b604080516001600160a01b038c168152600080516020615d0483398151915260208201523381830152606081018b9052608081018590529051600080516020615bfe8339815191529181900360a00190a15050979650505050505050565b60005461010090046001600160a01b03163314612a11576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60008142811015612a78576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6000875111612abc576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b8751875114612afc5760405162461bcd60e51b8152600401808060200182810382526025815260200180615c1e6025913960400191505060405180910390fd5b6001865103875114612b3f5760405162461bcd60e51b8152600401808060200182810382526025815260200180615dc06025913960400191505060405180910390fd5b60008911612b7e5760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b8b8b8b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b039081169084161415612bed5760405162461bcd60e51b8152600401808060200182810382526023815260200180615c436023913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316826001600160a01b03161415612c5e5760405162461bcd60e51b8152600401808060200182810382526022815260200180615ce26022913960400191505060405180910390fd5b60005a90506000612c7e6001600160a01b0385163363ffffffff61552c16565b9050612cc3338c600081518110612c9157fe5b60200260200101518786600080516020615d048339815191526001600160a01b03168a6001600160a01b031614614f8e565b60005b8c51811015612e755760018b16612da2578d8181518110612ce357fe5b60200260200101516001600160a01b031663815846958d8360010181518110612d0857fe5b60200260200101518f8481518110612d1c57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015612d8557600080fd5b505af1158015612d99573d6000803e3d6000fd5b50505050612e69565b8d8181518110612dae57fe5b60200260200101516001600160a01b0316637c9a7c978d8360010181518110612dd357fe5b60200260200101518f8481518110612de757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015612e5057600080fd5b505af1158015612e64573d6000803e3d6000fd5b505050505b60019a8b1c9a01612cc6565b506001600160a01b038416600080516020615d048339815191521415612fde57604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a08231916024808301926020929190829003018186803b158015612efb57600080fd5b505afa158015612f0f573d6000803e3d6000fd5b505050506040513d6020811015612f2557600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519198506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21691632e1a7d4d9160248082019260009290919082900301818387803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505060405133925089156108fc02915089906000818181858888f19350505050158015612fd8573d6000803e3d6000fd5b5061300a565b61300781612ffb6001600160a01b0387163363ffffffff6151bc16565b9063ffffffff6155d616565b96505b8d8710156130495760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b613052826152b8565b61305d8986866153aa565b604080516001600160a01b03808816825286166020820152338183015260608101859052608081018990529051600080516020615bfe8339815191529181900360a00190a15050505050509a9950505050505050505050565b7f000000000000000000000000989dcaa95801c527c5b73aa65d3962df9ace1b0c81565b6001546001600160a01b03163314613129576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600081428110156131e4576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6000865111613228576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b600087116132675760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b60005a604080516370a0823160e01b815233600482015290519192506000916001600160a01b038c16916370a08231916024808301926020929190829003018186803b1580156132b657600080fd5b505afa1580156132ca573d6000803e3d6000fd5b505050506040513d60208110156132e057600080fd5b505160408051630d0e30db60e41b815290519192506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169163d0e30db0913491600480830192600092919082900301818588803b15801561334857600080fd5b505af115801561335c573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb8960008151811061339d57fe5b6020026020010151346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156133f557600080fd5b505af1158015613409573d6000803e3d6000fd5b505050506040513d602081101561341f57600080fd5b50600090505b88518110156136bf57600189510381141561357c57600188166134df5788818151811061344e57fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156134ad57600080fd5b505af11580156134c1573d6000803e3d6000fd5b505050506040513d60208110156134d757600080fd5b506135779050565b8881815181106134eb57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561354a57600080fd5b505af115801561355e573d6000803e3d6000fd5b505050506040513d602081101561357457600080fd5b50505b6136b3565b600188166136055788818151811061359057fe5b60200260200101516001600160a01b031663bd6015b48a83600101815181106135b557fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561354a57600080fd5b88818151811061361157fe5b60200260200101516001600160a01b031663dd93f59a8a836001018151811061363657fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561368657600080fd5b505af115801561369a573d6000803e3d6000fd5b505050506040513d60208110156136b057600080fd5b50505b600197881c9701613425565b50604080516370a0823160e01b815233600482015290516137449183916001600160a01b038e16916370a08231916024808301926020929190829003018186803b15801561370c57600080fd5b505afa158015613720573d6000803e3d6000fd5b505050506040513d602081101561373657600080fd5b50519063ffffffff6155d616565b9350888410156137855760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b61378e826152b8565b6137a786600080516020615d048339815191528c6153aa565b60408051600080516020615d0483398151915281526001600160a01b038c1660208201523381830152346060820152608081018690529051600080516020615bfe8339815191529181900360a00190a15050509695505050505050565b6000814281101561384a576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b600086116138895760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168b6001600160a01b031614156138fa5760405162461bcd60e51b8152600401808060200182810382526023815260200180615c436023913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168a6001600160a01b0316141561396b5760405162461bcd60e51b8152600401808060200182810382526022815260200180615ce26022913960400191505060405180910390fd5b60006139866001600160a01b038c163363ffffffff61552c16565b90506001600160a01b038c16600080516020615d0483398151915214613a52576040805163052f523360e11b81526001600160a01b038e81166004830152336024830152306044830152606482018b905291517f000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc61990921691630a5ea4669160848082019260009290919082900301818387803b158015613a2557600080fd5b505af1158015613a39573d6000803e3d6000fd5b50613a52925050506001600160a01b038d168b8a6150f2565b6001600160a01b03891660009081526004602052604090205460ff16613aa95760405162461bcd60e51b8152600401808060200182810382526025815260200180615d446025913960400191505060405180910390fd5b60006001600160a01b03808b16908e16600080516020615d0483398151915214613ad4576000613ad6565b345b886040518082805190602001908083835b60208310613b065780518252601f199092019160209182019101613ae7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613b68576040519150601f19603f3d011682016040523d82523d6000602084013e613b6d565b606091505b5050905080613bad5760405162461bcd60e51b815260040180806020018281038252602d815260200180615d69602d913960400191505060405180910390fd5b613be133613bca6001600160a01b038f163063ffffffff61552c16565b6001600160a01b038f16919063ffffffff61524916565b613bfe82612ffb6001600160a01b038f163363ffffffff61552c16565b935087841015613c3f5760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b613c4761561f565b613c52868e8e6153aa565b600080516020615bfe8339815191528d8d338c8860405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050509998505050505050505050565b600080548190819060ff1615613d26576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558342811015613d77576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b8a613d83818c8c6156cb565b9094509250888410801590613d985750878310155b613dd35760405162461bcd60e51b815260040180806020018281038252602b815260200180615cb7602b913960400191505060405180910390fd5b613e4a3382836001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015613e1157600080fd5b505afa158015613e25573d6000803e3d6000fd5b505050506040513d6020811015613e3b57600080fd5b505187600160ff8d1614614f8e565b613ec13382836001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015613e8857600080fd5b505afa158015613e9c573d6000803e3d6000fd5b505050506040513d6020811015613eb257600080fd5b505186600260ff8d1614614f8e565b60408051634c85b42560e01b815233600482015290516001600160a01b03831691634c85b4259160248083019260609291908290030181600087803b158015613f0957600080fd5b505af1158015613f1d573d6000803e3d6000fd5b505050506040513d6060811015613f3357600080fd5b50519450600160ff8816148015613f4957508334115b15613f7f5760405133903486900380156108fc02916000818181858888f19350505050158015613f7d573d6000803e3d6000fd5b505b8660ff166002148015613f9157508234115b15613fc75760405133903485900380156108fc02916000818181858888f19350505050158015613fc5573d6000803e3d6000fd5b505b50506000805460ff191690559199909850909650945050505050565b60035481565b7f00000000000000000000000072d220ce168c4f361dd4dee5d826a01ad8598f6c81565b60046020526000908152604090205460ff1681565b6001546001600160a01b031681565b60008054819060ff1615614078576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff1916600117905582428110156140c9576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b60006001600160a01b038d16600080516020615d04833981519152146140ef578c614111565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b905060006001600160a01b038d16600080516020615d0483398151915214614139578c61415b565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b6040805163e18c40c760e01b81526001600160a01b0385811660048301528381166024830152604482018e9052606482018d9052608482018c90528a151560a483015291519293507f00000000000000000000000072d220ce168c4f361dd4dee5d826a01ad8598f6c9091169163e18c40c79160c4808201926020929091908290030181600087803b1580156141f057600080fd5b505af1158015614204573d6000803e3d6000fd5b505050506040513d602081101561421a57600080fd5b505194508d91508c905061424a3386848f6001600160a01b038216600080516020615d0483398151915214614f8e565b6142703386838e6001600160a01b038216600080516020615d0483398151915214614f8e565b505060408051634c85b42560e01b815233600482015290516001600160a01b03851691634c85b4259160248083019260609291908290030181600087803b1580156142ba57600080fd5b505af11580156142ce573d6000803e3d6000fd5b505050506040513d60608110156142e457600080fd5b50516000805460ff19169055929c929b50919950505050505050505050565b60008054819060ff161561434a576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561439b576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b60008a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156143d657600080fd5b505afa1580156143ea573d6000803e3d6000fd5b505050506040513d602081101561440057600080fd5b505160408051636a5cb82360e11b815290519192506000916001600160a01b038e169163d4b97046916004808301926020929190829003018186803b15801561444857600080fd5b505afa15801561445c573d6000803e3d6000fd5b505050506040513d602081101561447257600080fd5b505190506144893330848e600160ff8d1614614f8e565b61449c3330838d8b60ff16600214614f8e565b8a1561453a576144bc6001600160a01b0383168d8d63ffffffff6150f216565b6040805163aa06ce9b60e01b8152336004820152602481018d905290516001600160a01b038e169163aa06ce9b9160448083019260209291908290030181600087803b15801561450b57600080fd5b505af115801561451f573d6000803e3d6000fd5b505050506040513d602081101561453557600080fd5b505194505b89156145d85761455a6001600160a01b0382168d8c63ffffffff6150f216565b604080516317c5e7d960e21b8152336004820152602481018c905290516001600160a01b038e1691635f179f649160448083019260209291908290030181600087803b1580156145a957600080fd5b505af11580156145bd573d6000803e3d6000fd5b505050506040513d60208110156145d357600080fd5b505193505b8885101580156145e85750878410155b6146235760405162461bcd60e51b8152600401808060200182810382526027815260200180615c906027913960400191505060405180910390fd5b50506000805460ff1916905550909890975095505050505050565b60025481565b7f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb81565b7f0000000000000000000000006b4fa0bc61eddc928e0df9c7f01e407bfcd3e5ef81565b60005461010090046001600160a01b031633146146dc576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600291909155600355565b60005460ff161561472b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055804281101561477c576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6147f33386876001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156147ba57600080fd5b505afa1580156147ce573d6000803e3d6000fd5b505050506040513d60208110156147e457600080fd5b505187600160ff891614614f8e565b60408051639cf5453d60e01b815233600482015290516001600160a01b03871691639cf5453d91602480830192600092919082900301818387803b15801561483a57600080fd5b505af115801561484e573d6000803e3d6000fd5b50506000805460ff1916905550505050505050565b60005461010090046001600160a01b031633146148b3576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b7f000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc61981565b60005461010090046001600160a01b0316331461494b576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600081428110156149f1576040805162461bcd60e51b81526020600482015260166024820152600080516020615bde833981519152604482015290519081900360640190fd5b6000865111614a35576040805162461bcd60e51b815260206004820152601a6024820152600080516020615d24833981519152604482015290519081900360640190fd5b60008711614a745760405162461bcd60e51b8152600401808060200182810382526021815260200180615bbd6021913960400191505060405180910390fd5b60005a604080516370a0823160e01b815233600482015290519192506000916001600160a01b038d16916370a08231916024808301926020929190829003018186803b158015614ac357600080fd5b505afa158015614ad7573d6000803e3d6000fd5b505050506040513d6020811015614aed57600080fd5b505188519091506001600160a01b037f000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc6191690630a5ea466908e9033908c90600090614b3457fe5b60200260200101518e6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015614bbe57600080fd5b505af1158015614bd2573d6000803e3d6000fd5b506000925050505b8851811015614e74576001895103811415614d315760018816614c9457888181518110614c0357fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015614c6257600080fd5b505af1158015614c76573d6000803e3d6000fd5b505050506040513d6020811015614c8c57600080fd5b50614d2c9050565b888181518110614ca057fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015614cff57600080fd5b505af1158015614d13573d6000803e3d6000fd5b505050506040513d6020811015614d2957600080fd5b50505b614e68565b60018816614dba57888181518110614d4557fe5b60200260200101516001600160a01b031663bd6015b48a8360010181518110614d6a57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015614cff57600080fd5b888181518110614dc657fe5b60200260200101516001600160a01b031663dd93f59a8a8360010181518110614deb57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015614e3b57600080fd5b505af1158015614e4f573d6000803e3d6000fd5b505050506040513d6020811015614e6557600080fd5b50505b600197881c9701614bda565b50604080516370a0823160e01b81523360048201529051614ec19183916001600160a01b038f16916370a08231916024808301926020929190829003018186803b15801561370c57600080fd5b935088841015614f025760405162461bcd60e51b815260040180806020018281038252602a815260200180615c66602a913960400191505060405180910390fd5b614f0b826152b8565b614f16868d8d6153aa565b604080516001600160a01b03808f1682528d1660208201523381830152606081018c9052608081018690529051600080516020615bfe8339815191529181900360a00190a150505098975050505050505050565b7f000000000000000000000000e8c9a78725d0451fa19878d5f8a3dc0d55fecf2581565b801561504f57811561504a577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015614ff557600080fd5b505af1158015615009573d6000803e3d6000fd5b505050506001600160a01b0385163014905061504a5761504a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc285846157dd565b6150eb565b6040805163052f523360e11b81526001600160a01b038581166004830152878116602483015286811660448301526064820185905291517f000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc61990921691630a5ea4669160848082019260009290919082900301818387803b1580156150d257600080fd5b505af11580156150e6573d6000803e3d6000fd5b505050505b5050505050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561514357600080fd5b505afa158015615157573d6000803e3d6000fd5b505050506040513d602081101561516d57600080fd5b50519050818110156151b657801561519a5761519a6001600160a01b03851684600063ffffffff61582f16565b6151b66001600160a01b0385168460001963ffffffff61582f16565b50505050565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561521457600080fd5b505afa158015615228573d6000803e3d6000fd5b505050506040513d602081101561523e57600080fd5b505190505b92915050565b80156152b35761525883615942565b15615299576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015615293573d6000803e3d6000fd5b506152b3565b6152b36001600160a01b038416838363ffffffff6157dd16565b505050565b60025480156153a657600061fde86152d75a859063ffffffff6155d616565b816152de57fe5b04905060008282116152f057816152f2565b825b90506003811015801561530c5750806117c002616c3e015a115b156151b6577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561537757600080fd5b505af115801561538b573d6000803e3d6000fd5b505050506040513d60208110156153a157600080fd5b505050505b5050565b8280156153b857506175305a115b156152b35760408051630622aa5960e21b81526001600160a01b038481166004830152838116602483015233604483015291517f000000000000000000000000989dcaa95801c527c5b73aa65d3962df9ace1b0c9092169163188aa9649160648082019260009290919082900301818387803b15801561543757600080fd5b505af115801561544b573d6000803e3d6000fd5b50505050505050565b801561551b578115615516577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156154c657600080fd5b505af11580156154da573d6000803e3d6000fd5b50506040516001600160a01b038716925084156108fc02915084906000818181858888f19350505050158015615514573d6000803e3d6000fd5b505b6151b6565b81156151b6576151b68385846157dd565b600061553783615942565b1561554d57506001600160a01b03811631615243565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156155a357600080fd5b505afa1580156155b7573d6000803e3d6000fd5b505050506040513d60208110156155cd57600080fd5b50519050615243565b600082821115615619576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b60035480156156c857806117c002616c3e015a11156156c8577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561569e57600080fd5b505af11580156156b2573d6000803e3d6000fd5b505050506040513d60208110156152b357600080fd5b50565b600080600080866001600160a01b03166336223ce96040518163ffffffff1660e01b8152600401604080518083038186803b15801561570957600080fd5b505afa15801561571d573d6000803e3d6000fd5b505050506040513d604081101561573357600080fd5b50805160209091015190925090508015801561574d575081155b15615759578593508492505b801580156157675750600082115b1561577457859350600092505b6000811180156157845750600082115b156157d35760006157958784615961565b905060006157a38784615961565b90508082116157c0578795506157b98383615992565b94506157d0565b8694506157cd8482615992565b95505b50505b5050935093915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526152b39084906159bc565b8015806158b5575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561588757600080fd5b505afa15801561589b573d6000803e3d6000fd5b505050506040513d60208110156158b157600080fd5b5051155b6158f05760405162461bcd60e51b8152600401808060200182810382526036815260200180615de56036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526152b39084906159bc565b6001600160a01b038116600080516020615d0483398151915214919050565b600061598b8261597f85670de0b6b3a764000063ffffffff615b1116565b9063ffffffff615b6c16565b9392505050565b6000670de0b6b3a76400006159ad848463ffffffff615b1116565b816159b457fe5b049392505050565b60006060836001600160a01b0316836040518082805190602001908083835b602083106159fa5780518252601f1990920191602091820191016159db565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615a5c576040519150601f19603f3d011682016040523d82523d6000602084013e615a61565b606091505b509150915081615ab8576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156151b657808060200190516020811015615ad457600080fd5b50516151b65760405162461bcd60e51b815260040180806020018281038252602a815260200180615d96602a913960400191505060405180910390fd5b600082615b2057506000615243565b82820282848281615b2d57fe5b041461598b576040805162461bcd60e51b815260206004820152600960248201526826aaa62fa2a92927a960b91b604482015290519081900360640190fd5b6000808211615bb3576040805162461bcd60e51b815260206004820152600e60248201526d2224ab24a224a723afa2a92927a960911b604482015290519081900360640190fd5b8183816159b457fefe444f444f563250726f787930323a2052455455524e5f414d4f554e545f5a45524f444f444f563250726f787930323a20455850495245440000000000000000000092ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a5221787444f444f563250726f787930323a20504149525f414441505445525f4e4f545f4d41544348444f444f563250726f787930323a204e4f545f535550504f52545f53454c4c5f434849444f444f563250726f787930323a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563250726f787930323a2052657475726e20444c50206973206e6f7420656e6f756768444f444f563250726f787930323a206465706f73697420616d6f756e74206973206e6f7420656e6f756768444f444f563250726f787930323a204e4f545f535550504f52545f4255595f434849000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee444f444f563250726f787930323a2050414952535f454d505459000000000000444f444f563250726f787930323a204e6f742057686974656c69737420436f6e7472616374444f444f563250726f787930323a2045787465726e616c205377617020657865637574696f6e204661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564444f444f563250726f787930323a20504149525f4153534554544f5f4e4f545f4d415443485361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220e0e4332977b9bd0f0a4ced23cda6d5342bc99c6036a424bca0c59481c6adedad64736f6c63430006090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000072d220ce168c4f361dd4dee5d826a01ad8598f6c0000000000000000000000006b4fa0bc61eddc928e0df9c7f01e407bfcd3e5ef000000000000000000000000e8c9a78725d0451fa19878d5f8a3dc0d55fecf25000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc619000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c000000000000000000000000989dcaa95801c527c5b73aa65d3962df9ace1b0c
-----Decoded View---------------
Arg [0] : dvmFactory (address): 0x72d220cE168C4f361dD4deE5D826a01AD8598f6C
Arg [1] : dppFactory (address): 0x6B4Fa0bc61Eddc928e0Df9c7f01e407BfcD3e5EF
Arg [2] : cpFactory (address): 0xE8C9A78725D0451FA19878D5f8A3dC0D55FECF25
Arg [3] : weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [4] : dodoApproveProxy (address): 0x335aC99bb3E51BDbF22025f092Ebc1Cf2c5cC619
Arg [5] : dodoSellHelper (address): 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb
Arg [6] : chiToken (address): 0x0000000000004946c0e9F43F4Dee607b0eF1fA1c
Arg [7] : dodoIncentive (address): 0x989DcAA95801C527C5B73AA65d3962dF9aCe1b0C
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000072d220ce168c4f361dd4dee5d826a01ad8598f6c
Arg [1] : 0000000000000000000000006b4fa0bc61eddc928e0df9c7f01e407bfcd3e5ef
Arg [2] : 000000000000000000000000e8c9a78725d0451fa19878d5f8a3dc0d55fecf25
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc619
Arg [5] : 000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb
Arg [6] : 0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c
Arg [7] : 000000000000000000000000989dcaa95801c527c5b73aa65d3962df9ace1b0c
Deployed Bytecode Sourcemap
37879:27127:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60370:1016;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60370:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60370:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60370:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60370:1016:0;;;;;;;;-1:-1:-1;60370:1016:0;;-1:-1:-1;;;;;60370:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60370:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60370:1016:0;;-1:-1:-1;;;;60370:1016:0;;;;;-1:-1:-1;60370:1016:0;;;;:::i;:::-;;;;-1:-1:-1;;;;;60370:1016:0;;;;;;;;;;;;;;38487:36;;;;;;;;;;;;;:::i;10564:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10564:127:0;-1:-1:-1;;;;;10564:127:0;;:::i;38165:31::-;;;;;;;;;;;;;:::i;44649:1270::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44649:1270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55015:2870::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55015:2870:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55015:2870:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55015:2870:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55015:2870:0;;-1:-1:-1;;55015:2870:0;;;-1:-1:-1;;;55015:2870:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45927:1391;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45927:1391:0;;;;;;;;;;;;;;;-1:-1:-1;;;45927:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45927:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45927:1391:0;;;;;;;;-1:-1:-1;45927:1391:0;;-1:-1:-1;;;;;45927:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45927:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45927:1391:0;;-1:-1:-1;;45927:1391:0;;;;;-1:-1:-1;;;45927:1391:0;;;;;;;;;;;;;;:::i;9931:22::-;;;;;;;;;;;;;:::i;49221:1872::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49221:1872:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49221:1872:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49221:1872:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49221:1872:0;;-1:-1:-1;;49221:1872:0;;;-1:-1:-1;;;49221:1872:0;;;;;;;;;;;:::i;39871:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39871:119:0;-1:-1:-1;;;;;39871:119:0;;:::i;57895:2394::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57895:2394:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57895:2394:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57895:2394:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57895:2394:0;;;;;;;;-1:-1:-1;57895:2394:0;;-1:-1:-1;;;;;57895:2394:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57895:2394:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57895:2394:0;;;;;;;;-1:-1:-1;57895:2394:0;;-1:-1:-1;;;;;57895:2394:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57895:2394:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57895:2394:0;;-1:-1:-1;;57895:2394:0;;;-1:-1:-1;;;57895:2394:0;;;;;;;;;;;:::i;38439:41::-;;;;;;;;;;;;;:::i;10870:228::-;;;;;;;;;;;;;:::i;47367:1846::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47367:1846:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47367:1846:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47367:1846:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47367:1846:0;;-1:-1:-1;;47367:1846:0;;;-1:-1:-1;;;47367:1846:0;;;;;;;;;;;:::i;53003:2004::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53003:2004:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53003:2004:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53003:2004:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53003:2004:0;;-1:-1:-1;;;;53003:2004:0;;;;;-1:-1:-1;53003:2004:0;;;;:::i;41825:1465::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41825:1465:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;38577:40;;;;;;;;;;;;;:::i;38305:38::-;;;;;;;;;;;;;:::i;38624:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38624:46:0;-1:-1:-1;;;;;38624:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;9960:26;;;;;;;;;;;;;:::i;40293:1524::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40293:1524:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;40293:1524:0;;;;;;;;;;;;;;;;;;;;;61780:1214;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;61780:1214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38530:40;;;;;;;;;;;;;:::i;38255:43::-;;;;;;;;;;;;;:::i;38350:38::-;;;;;;;;;;;;;:::i;39998:212::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39998:212:0;;;;;;;:::i;61394:376::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;61394:376:0;;;;;;;;;;;;;;;;;;;;:::i;39748:115::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39748:115:0;-1:-1:-1;;;;;39748:115:0;;:::i;38203:45::-;;;;;;;;;;;;;:::i;10699:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10699:163:0;-1:-1:-1;;;;;10699:163:0;;:::i;51101:1894::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51101:1894:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51101:1894:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51101:1894:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51101:1894:0;;-1:-1:-1;;51101:1894:0;;;-1:-1:-1;;;51101:1894:0;;;;;;;;;;;:::i;38395:37::-;;;;;;;;;;;;;:::i;60370:1016::-;60694:31;32487:9;;;;32486:10;32478:32;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;;;;32521:9;:16;;-1:-1:-1;;32521:16:0;32533:4;32521:16;;;60675:8;39012:15:::1;39000:27:::0;::::1;;38992:62;;;::::0;;-1:-1:-1;;;38992:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;::::1;;60759:9:::0;60738:18:::2;-1:-1:-1::0;;;;;60801:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;60801:27:0::2;:49;;60840:10;60801:49;;;60831:6;60801:49;60779:71;;60897:12;-1:-1:-1::0;;;;;60889:40:0::2;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;60889:42:0;;-1:-1:-1;60944:146:0::2;60967:10;60889:42:::0;61022:10;61047:12;61074:5:::2;60944:8;:146::i;:::-;61103:35;::::0;-1:-1:-1;;;;;61103:24:0;::::2;::::0;61128:9:::2;61103:35:::0;::::2;;;::::0;::::2;::::0;;;61128:9;61103:24;:35;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;61159:12;-1:-1:-1::0;;;;;61151:38:0::2;;61204:15;61234:10;61259;61284:11;61310:8;61333:9;61357:10;61151:227;;;;;;;;;;;;;-1:-1:-1::0;;;;;61151:227:0::2;-1:-1:-1::0;;;;;61151:227:0::2;;;;;;-1:-1:-1::0;;;;;61151:227:0::2;-1:-1:-1::0;;;;;61151:227:0::2;;;;;;-1:-1:-1::0;;;;;61151:227:0::2;-1:-1:-1::0;;;;;61151:227:0::2;;;;;;-1:-1:-1::0;;;;;61151:227:0::2;-1:-1:-1::0;;;;;61151:227:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32572:5:0;32560:17;;-1:-1:-1;;32560:17:0;;;-1:-1:-1;60370:1016:0;;;-1:-1:-1;;;;;;;;;;;60370:1016:0:o;38487:36::-;;;:::o;10564:127::-;10353:13;;-1:-1:-1;;;10353:13:0;;;;10352:14;10344:43;;;;;-1:-1:-1;;;10344:43:0;;;;;;;;;;;;-1:-1:-1;;;10344:43:0;;;;;;;;;;;;;;;10650:4:::1;10634:20:::0;;-1:-1:-1;;;;10634:20:0::1;-1:-1:-1::0;;;10634:20:0::1;::::0;;;10665:18;;-1:-1:-1;;;;;10665:18:0;;::::1;10634:20;10665:18;-1:-1:-1::0;;;;;;10665:18:0;;::::1;::::0;;;::::1;::::0;;10564:127::o;38165:31::-;;;:::o;44649:1270::-;45057:22;32487:9;;;;32486:10;32478:32;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;;;;32521:9;:16;;-1:-1:-1;;32521:16:0;32533:4;32521:16;;;45029:8;39012:15:::1;39000:27:::0;::::1;;38992:62;;;::::0;;-1:-1:-1;;;38992:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;::::1;;45122:13:::2;-1:-1:-1::0;;;;;45114:44:0::2;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;45114:46:0;;-1:-1:-1;45194:9:0;45236:10;45257:91:::2;45266:10;45114:46:::0;45194:9;45306:12;-1:-1:-1;;;;;45320:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;45320:27:0::2;45257:8;:91::i;:::-;45359:170;45382:10;45407:14:::0;45436:11;45462:13;-1:-1:-1;;;;;45490:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;45490:28:0::2;45359:8;:170::i;:::-;-1:-1:-1::0;;;;;45546:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;45546:27:0::2;45542:52;;;45588:6;45575:19;;45542:52;-1:-1:-1::0;;;;;45609:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;45609:28:0::2;45605:54;;;-1:-1:-1::0;45653:6:0::2;45605:54;45672:239;::::0;;-1:-1:-1;;;45672:239:0;;-1:-1:-1;;;;;45672:239:0;;::::2;;::::0;::::2;::::0;45758:10:::2;45672:239:::0;;;;;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;45680:13:::2;45672:42:::0;;::::2;::::0;::::2;::::0;:239;;;;;-1:-1:-1;;45672:239:0;;;;;;;;-1:-1:-1;45672:42:0;:239;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32572:5:0;32560:17;;-1:-1:-1;;32560:17:0;;;-1:-1:-1;44649:1270:0;;;-1:-1:-1;;;;;;;;;;;;;44649:1270:0:o;55015:2870::-;55387:20;55359:8;39012:15;39000:8;:27;;38992:62;;;;;-1:-1:-1;;;38992:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;;;55452:1:::1;55433:9;:16;:20;55425:59;;;::::0;;-1:-1:-1;;;55425:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;55425:59:0;;;;;;;;;;;;;::::1;;55521:1;55503:15;:19;55495:65;;;;-1:-1:-1::0;;;55495:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55592:11;-1:-1:-1::0;;;;;55579:24:0::1;:9;-1:-1:-1::0;;;;;55579:24:0::1;;;55571:72;;;;-1:-1:-1::0;;;55571:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55673:11;-1:-1:-1::0;;;;;55662:22:0::1;:7;-1:-1:-1::0;;;;;55662:22:0::1;;;55654:69;;;;-1:-1:-1::0;;;55654:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55744:17;55764:9;55744:29:::0;-1:-1:-1;55807:9:0;55846:7;55874:93:::1;55883:10;55903:4;55807:9:::0;55922:15;-1:-1:-1;;;;;55939:27:0;::::1;-1:-1:-1::0;;;;;;;;;;;55939:27:0::1;55874:8;:93::i;:::-;55985:9;55980:1247;56004:9;:16;56000:1;:20;55980:1247;;;56042:19;56064:9;56074:1;56064:12;;;;;;;;;;;;;;56042:34;;56095:10;56108:1;56095:14;56113:1;56095:19;56091:1082;;;56135:19;56165:11;-1:-1:-1::0;;;;;56157:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;56157:35:0;;-1:-1:-1;56234:11:0::1;-1:-1:-1::0;;;;;56219:26:0;;::::1;::::0;;::::1;;;56211:69;;;::::0;;-1:-1:-1;;;56211:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;56321:44;::::0;;-1:-1:-1;;;56321:44:0;;56359:4:::1;56321:44;::::0;::::1;::::0;;;56299:19:::1;::::0;-1:-1:-1;;;;;56321:29:0;::::1;::::0;::::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;56321:44:0;;-1:-1:-1;56384:65:0::1;-1:-1:-1::0;;;;;56384:39:0;::::1;56424:11:::0;56321:44;56384:65:::1;:39;:65;:::i;:::-;56476:11;-1:-1:-1::0;;;;;56468:34:0::1;;56503:11;56516:1;56468:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;56091:1082:0::1;::::0;-1:-1:-1;;;56091:1082:0::1;;56563:20;56594:11;-1:-1:-1::0;;;;;56586:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;56586:36:0;;-1:-1:-1;56665:11:0::1;-1:-1:-1::0;;;;;56649:27:0;;::::1;::::0;;::::1;;;56641:70;;;::::0;;-1:-1:-1;;;56641:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;56752:45;::::0;;-1:-1:-1;;;56752:45:0;;56791:4:::1;56752:45;::::0;::::1;::::0;;;56730:19:::1;::::0;-1:-1:-1;;;;;56752:30:0;::::1;::::0;::::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;56752:45:0;;-1:-1:-1;56816:66:0::1;-1:-1:-1::0;;;;;56816:40:0;::::1;56857:11:::0;56752:45;56816:66:::1;:40;:66;:::i;:::-;56928:142;::::0;;-1:-1:-1;;;56928:142:0;;-1:-1:-1;;;;;56928:142:0;;::::1;;::::0;::::1;::::0;;;;;;;;;56901:24:::1;::::0;56944:18:::1;56928:55;::::0;::::1;::::0;:142;;;;;::::1;::::0;;;;;;;;:55;:142;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;56928:142:0;57089:68:::1;::::0;;-1:-1:-1;;;57089:68:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;57089:68:0;;;;;;;;56928:142;;-1:-1:-1;;;;;;57089:33:0;::::1;::::0;::::1;::::0;:68;;;;;56928:142:::1;::::0;57089:68;;;;;;;;;;;:33;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;56091:1082:0::1;-1:-1:-1::0;57214:1:0::1;57200:15:::0;;::::1;::::0;56022:3:::1;55980:1247;;;-1:-1:-1::0;;;;;;57253:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;57253:25:0::1;57249:256;;;57310:38;::::0;;-1:-1:-1;;;57310:38:0;;57342:4:::1;57310:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;57316:6:0::1;57310:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;57310:38:0;57363:36:::1;::::0;;-1:-1:-1;;;57363:36:0;;::::1;::::0;::::1;::::0;;;;;57310:38;;-1:-1:-1;;;;;;57369:6:0::1;57363:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;57363:36:0;;;;;;;;-1:-1:-1;57363:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57249:256;;;57447:46;-1:-1:-1::0;;;;;57447:31:0;::::1;57487:4;57447:46;:31;:46;:::i;:::-;57432:61;;57249:256;57549:15;57533:12;:31;;57525:86;;;;-1:-1:-1::0;;;57525:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57622:60;-1:-1:-1::0;;;;;57622:34:0;::::1;57657:10;57669:12:::0;57622:60:::1;:34;:60;:::i;:::-;57695:25;57710:9;57695:14;:25::i;:::-;57733:49;57748:11;57761:10;57773:8;57733:14;:49::i;:::-;57800:77;::::0;;-1:-1:-1;;;;;57800:77:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;57835:10:::1;57800:77:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;57800:77:0;;;;;;;::::1;39065:1;;;55015:2870:::0;;;;;;;;;;;:::o;45927:1391::-;32487:9;;;;32486:10;32478:32;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;;;;32521:9;:16;;-1:-1:-1;;32521:16:0;32533:4;32521:16;;;46432:8;39012:15:::1;39000:27:::0;::::1;;38992:62;;;::::0;;-1:-1:-1;;;38992:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;::::1;;46453:170:::2;46476:10;46501;46534;-1:-1:-1::0;;;;;46526:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;46526:34:0;46575:13;;:10;;46586:1:::2;::::0;46575:13:::2;;;;;;;;;;46603:4;:9;;46611:1;46603:9;46453:8;:170::i;:::-;46634:171;46657:10;46682;46715;-1:-1:-1::0;;;;;46707:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;46707:35:0;46757:13;;:10;;46768:1:::2;::::0;46757:13;::::2;;;;;;;;;;;46785:4;:9;;46793:1;46785:9;46634:8;:171::i;:::-;46842:10;-1:-1:-1::0;;;;;46834:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;46834:29:0;46910:12;;-1:-1:-1;;;;;46826:44:0;;::::2;::::0;::::2;::::0;46885:10:::2;::::0;46910:9;;46920:1:::2;::::0;46910:12:::2;;;;;;;;;;46937:9;46947:1;46937:12;;;;;;;;;;;;;;46964:9;46974:1;46964:12;;;;;;;;;;;;;;46991:10;47002:1;46991:13;;;;;;;;;;;;;;47019:10;47030:1;47019:13;;;;;;;;;;;;;;47047:14;47076:15;46826:276;;;;;;;;;;;;;-1:-1:-1::0;;;;;46826:276:0::2;-1:-1:-1::0;;;;;46826:276:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;46826:276:0;46818:301:::2;;;::::0;;-1:-1:-1;;;46818:301:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46818:301:0;;;;;;;;;;;;;::::2;;47132:83;47142:10;47162;-1:-1:-1::0;;;;;47154:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;47154:34:0;47190:13;;:10;;47201:1:::2;::::0;47190:13;::::2;;;;;;;;;;;47205:4;:9;;47213:1;47205:9;47132;:83::i;:::-;47226:84;47236:10;47256;-1:-1:-1::0;;;;;47248:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;47248:35:0;47285:13;;:10;;47296:1:::2;::::0;47285:13;::::2;;;;;;;;;;;47300:4;:9;;47308:1;47300:9;47226;:84::i;:::-;-1:-1:-1::0;;32572:5:0;32560:17;;-1:-1:-1;;32560:17:0;;;-1:-1:-1;;;;;;45927:1391:0:o;9931:22::-;;;;;;-1:-1:-1;;;;;9931:22:0;;:::o;49221:1872::-;49560:20;49532:8;39012:15;39000:8;:27;;38992:62;;;;;-1:-1:-1;;;38992:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;;;49625:1:::1;49606:9;:16;:20;49598:59;;;::::0;;-1:-1:-1;;;49598:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;49598:59:0;;;;;;;;;;;;;::::1;;49694:1;49676:15;:19;49668:65;;;;-1:-1:-1::0;;;49668:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49744:17;49764:9;49744:29;;49812:20;-1:-1:-1::0;;;;;49794:51:0::1;;49846:9;49857:10;49869:9;49879:1;49869:12;;;;;;;;;;;;;;49883:15;49794:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;49794:105:0::1;-1:-1:-1::0;;;;;49794:105:0::1;;;;;;-1:-1:-1::0;;;;;49794:105:0::1;-1:-1:-1::0;;;;;49794:105:0::1;;;;;;-1:-1:-1::0;;;;;49794:105:0::1;-1:-1:-1::0;;;;;49794:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;49917:9:0::1;::::0;-1:-1:-1;;;49912:643:0::1;49936:9;:16;49932:1;:20;49912:643;;;50002:1;49983:9;:16;:20;49978:1;:25;49974:527;;;50041:1;50028:14:::0;::::1;50024:208;;50080:9;50090:1;50080:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;50072:30:0::1;;50111:4;50072:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;50072:45:0::1;-1:-1:-1::0;;;;;50072:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50024:208:0::1;::::0;-1:-1:-1;50024:208:0::1;;50174:9;50184:1;50174:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;50166:31:0::1;;50206:4;50166:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;50166:46:0::1;-1:-1:-1::0;;;;;50166:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;50024:208:0::1;49974:527;;;50289:1;50276:14:::0;::::1;50272:214;;50328:9;50338:1;50328:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;50320:30:0::1;;50351:9;50361:1;50365;50361:5;50351:16;;;;;;;;;;;;;;50320:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;50320:48:0::1;-1:-1:-1::0;;;;;50320:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;50272:214;50425:9;50435:1;50425:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;50417:31:0::1;;50449:9;50459:1;50463;50459:5;50449:16;;;;;;;;;;;;;;50417:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;50417:49:0::1;-1:-1:-1::0;;;;;50417:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;50272:214:0::1;50542:1;50528:15:::0;;::::1;::::0;49954:3:::1;49912:643;;;-1:-1:-1::0;50580:38:0::1;::::0;;-1:-1:-1;;;50580:38:0;;50612:4:::1;50580:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;50586:6:0::1;50580:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50580:38:0;;-1:-1:-1;50637:31:0;;::::1;;50629:86;;;;-1:-1:-1::0;;;50629:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50732:6;-1:-1:-1::0;;;;;50726:22:0::1;;50749:12;50726:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;50773:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;50773:33:0;::::1;;;::::0;-1:-1:-1;50793:12:0;;50773:33:::1;::::0;;;50793:12;50773:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50819:25;50834:9;50819:14;:25::i;:::-;50857:53;50872:11;50885:9;-1:-1:-1::0;;;;;;;;;;;50857:14:0::1;:53::i;:::-;50928:157;::::0;;-1:-1:-1;;;;;50928:157:0;::::1;::::0;;-1:-1:-1;;;;;;;;;;;50928:157:0::1;::::0;::::1;::::0;51007:10:::1;50928:157:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;50928:157:0;;;;;;;::::1;39065:1;49221:1872:::0;;;;;;;;;;:::o;39871:119::-;10469:7;;;;;-1:-1:-1;;;;;10469:7:0;10455:10;:21;10447:43;;;;;-1:-1:-1;;;10447:43:0;;;;;;;;;;;;-1:-1:-1;;;10447:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39947:27:0::1;39977:5;39947:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;39947:35:0::1;::::0;;39871:119::o;57895:2394::-;58292:20;58273:8;39012:15;39000:8;:27;;38992:62;;;;;-1:-1:-1;;;38992:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;;;58351:1:::1;58333:8;:15;:19;58325:58;;;::::0;;-1:-1:-1;;;58325:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;58325:58:0;;;;;;;;;;;;;::::1;;58421:11;:18;58402:8;:15;:37;58394:87;;;;-1:-1:-1::0;;;58394:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58536:1;58519:7;:14;:18;58500:8;:15;:37;58492:87;;;;-1:-1:-1::0;;;58492:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58616:1;58598:15;:19;58590:65;;;;-1:-1:-1::0;;;58590:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58689:9:::0;58728:7;58773:15;58823:11:::1;-1:-1:-1::0;;;;;58809:25:0;;::::1;::::0;;::::1;;;58801:73;;;;-1:-1:-1::0;;;58801:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58905:11;-1:-1:-1::0;;;;;58893:23:0::1;:8;-1:-1:-1::0;;;;;58893:23:0::1;;;58885:70;;;;-1:-1:-1::0;;;58885:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58976:17;58996:9;58976:29:::0;-1:-1:-1;59016:28:0::1;59047:47;-1:-1:-1::0;;;;;59047:35:0;::::1;59083:10;59047:47;:35;:47;:::i;:::-;59016:78;;59115:91;59124:10;59136:7;59144:1;59136:10;;;;;;;;;;;;;;59148;59160:16;-1:-1:-1::0;;;;;;;;;;;;;;;;59178:27:0::1;:10;-1:-1:-1::0;;;;;59178:27:0::1;;59115:8;:91::i;:::-;59224:9;59219:347;59243:8;:15;59239:1;:19;59219:347;;;59297:1;59284:14:::0;::::1;59280:232;;59337:11;59349:1;59337:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;59324:37:0::1;;59362:7;59370:1;59374;59370:5;59362:14;;;;;;;;;;;;;;59377:8;59386:1;59377:11;;;;;;;;;;;;;;59324:65;;;;;;;;;;;;;-1:-1:-1::0;;;;;59324:65:0::1;-1:-1:-1::0;;;;;59324:65:0::1;;;;;;-1:-1:-1::0;;;;;59324:65:0::1;-1:-1:-1::0;;;;;59324:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59280:232;;;59443:11;59455:1;59443:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;59430:38:0::1;;59469:7;59477:1;59481;59477:5;59469:14;;;;;;;;;;;;;;59484:8;59493:1;59484:11;;;;;;;;;;;;;;59430:66;;;;;;;;;;;;;-1:-1:-1::0;;;;;59430:66:0::1;-1:-1:-1::0;;;;;59430:66:0::1;;;;;;-1:-1:-1::0;;;;;59430:66:0::1;-1:-1:-1::0;;;;;59430:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59280:232;59553:1;59539:15:::0;;::::1;::::0;59260:3:::1;59219:347;;;-1:-1:-1::0;;;;;;59581:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;59581:25:0::1;59578:325;;;59638:38;::::0;;-1:-1:-1;;;59638:38:0;;59670:4:::1;59638:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;59644:6:0::1;59638:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;59638:38:0;59691:36:::1;::::0;;-1:-1:-1;;;59691:36:0;;::::1;::::0;::::1;::::0;;;;;59638:38;;-1:-1:-1;;;;;;59697:6:0::1;59691:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;59691:36:0;;;;;;;;-1:-1:-1;59691:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;59742:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;59742:33:0;::::1;;;::::0;-1:-1:-1;59762:12:0;;59742:33:::1;::::0;;;59762:12;59742:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;59578:325;;;59822:69;59870:20:::0;59822:43:::1;-1:-1:-1::0;;;;;59822:31:0;::::1;59854:10;59822:43;:31;:43;:::i;:::-;:47:::0;:69:::1;:47;:69;:::i;:::-;59807:84;;59578:325;59939:15;59923:12;:31;;59915:86;;;;-1:-1:-1::0;;;59915:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60022:25;60037:9;60022:14;:25::i;:::-;60060:49;60075:11;60088:10;60100:8;60060:14;:49::i;:::-;60127:154;::::0;;-1:-1:-1;;;;;60127:154:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;60202:10:::1;60127:154:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;60127:154:0;;;;;;;::::1;39065:1;;;;;57895:2394:::0;;;;;;;;;;;;;:::o;38439:41::-;;;:::o;10870:228::-;10936:11;;-1:-1:-1;;;;;10936:11:0;10922:10;:25;10914:51;;;;;-1:-1:-1;;;10914:51:0;;;;;;;;;;;;-1:-1:-1;;;10914:51:0;;;;;;;;;;;;;;;11011:11;;;11002:7;;10981:42;;-1:-1:-1;;;;;11011:11:0;;;;;11002:7;;;;;;;10981:42;;;11044:11;;;;11034:21;;-1:-1:-1;;;;;;11034:21:0;11044:11;-1:-1:-1;;;;;11044:11:0;;11034:21;;;;-1:-1:-1;;;;;;11066:24:0;;;10870:228::o;47367:1846::-;47687:20;47659:8;39012:15;39000:8;:27;;38992:62;;;;;-1:-1:-1;;;38992:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;;;47752:1:::1;47733:9;:16;:20;47725:59;;;::::0;;-1:-1:-1;;;47725:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;47725:59:0;;;;;;;;;;;;;::::1;;47821:1;47803:15;:19;47795:65;;;;-1:-1:-1::0;;;47795:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47871:17;47891:9;47952:37;::::0;;-1:-1:-1;;;47952:37:0;;47978:10:::1;47952:37;::::0;::::1;::::0;;;47871:29;;-1:-1:-1;47921:28:0::1;::::0;-1:-1:-1;;;;;47952:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47952:37:0;48000:41:::1;::::0;;-1:-1:-1;;;48000:41:0;;;;47952:37;;-1:-1:-1;;;;;;48006:6:0::1;48000:21;::::0;::::1;::::0;48029:9:::1;::::0;48000:41:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;48029:9;48000:21;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;48058:6;-1:-1:-1::0;;;;;48052:22:0::1;;48075:9;48085:1;48075:12;;;;;;;;;;;;;;48089:9;48052:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;48052:47:0::1;-1:-1:-1::0;;;;;48052:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48117:9:0::1;::::0;-1:-1:-1;48112:637:0::1;48136:9;:16;48132:1;:20;48112:637;;;48202:1;48183:9;:16;:20;48178:1;:25;48174:521;;;48241:1;48228:14:::0;::::1;48224:202;;48280:9;48290:1;48280:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48272:30:0::1;;48303:10;48272:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;48272:42:0::1;-1:-1:-1::0;;;;;48272:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48224:202:0::1;::::0;-1:-1:-1;48224:202:0::1;;48371:9;48381:1;48371:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48363:31:0::1;;48395:10;48363:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;48363:43:0::1;-1:-1:-1::0;;;;;48363:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;48224:202:0::1;48174:521;;;48483:1;48470:14:::0;::::1;48466:214;;48522:9;48532:1;48522:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48514:30:0::1;;48545:9;48555:1;48559;48555:5;48545:16;;;;;;;;;;;;;;48514:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;48514:48:0::1;-1:-1:-1::0;;;;;48514:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;48466:214;48619:9;48629:1;48619:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48611:31:0::1;;48643:9;48653:1;48657;48653:5;48643:16;;;;;;;;;;;;;;48611:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;48611:49:0::1;-1:-1:-1::0;;;;;48611:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;48466:214:0::1;48736:1;48722:15:::0;;::::1;::::0;48154:3:::1;48112:637;;;-1:-1:-1::0;48776:37:0::1;::::0;;-1:-1:-1;;;48776:37:0;;48802:10:::1;48776:37;::::0;::::1;::::0;;;:63:::1;::::0;48818:20;;-1:-1:-1;;;;;48776:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48776:37:0;;:63:::1;:41;:63;:::i;:::-;48761:78;;48874:15;48858:12;:31;;48850:86;;;;-1:-1:-1::0;;;48850:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48949:25;48964:9;48949:14;:25::i;:::-;48987:51;49002:11;-1:-1:-1::0;;;;;;;;;;;49030:7:0::1;48987:14;:51::i;:::-;49056:149;::::0;;-1:-1:-1;;;;;;;;;;;49056:149:0;;-1:-1:-1;;;;;49056:149:0;::::1;;::::0;::::1;::::0;49133:10:::1;49056:149:::0;;;;49158:9:::1;49056:149:::0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;49056:149:0;;;;;;;::::1;39065:1;;47367:1846:::0;;;;;;;;;:::o;53003:2004::-;53410:20;53382:8;39012:15;39000:8;:27;;38992:62;;;;;-1:-1:-1;;;38992:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;;;53474:1:::1;53456:15;:19;53448:65;;;;-1:-1:-1::0;;;53448:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53545:11;-1:-1:-1::0;;;;;53532:24:0::1;:9;-1:-1:-1::0;;;;;53532:24:0::1;;;53524:72;;;;-1:-1:-1::0;;;53524:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53626:11;-1:-1:-1::0;;;;;53615:22:0::1;:7;-1:-1:-1::0;;;;;53615:22:0::1;;;53607:69;;;;-1:-1:-1::0;;;53607:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53697:28;53728:46;-1:-1:-1::0;;;;;53728:34:0;::::1;53763:10;53728:46;:34;:46;:::i;:::-;53697:77:::0;-1:-1:-1;;;;;;53789:26:0;::::1;-1:-1:-1::0;;;;;;;;;;;53789:26:0::1;53785:332;;53832:189;::::0;;-1:-1:-1;;;53832:189:0;;-1:-1:-1;;;;;53832:189:0;;::::1;;::::0;::::1;::::0;53930:10:::1;53832:189:::0;;;;53967:4:::1;53832:189:::0;;;;;;;;;;;;53850:20:::1;53832:51:::0;;::::1;::::0;::::1;::::0;:189;;;;;-1:-1:-1;;53832:189:0;;;;;;;;-1:-1:-1;53832:51:0;:189;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;54036:69:0::1;::::0;-1:-1:-1;;;;;;;;54036:37:0;::::1;54074:13:::0;54089:15;54036:37:::1;:69::i;:::-;-1:-1:-1::0;;;;;54137:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;54129:75;;;;-1:-1:-1::0;;;54129:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54216:12;-1:-1:-1::0;;;;;54234:15:0;;::::1;::::0;54257:26;::::1;-1:-1:-1::0;;;;;;;;;;;54257:26:0::1;:42;;54298:1;54257:42;;;54286:9;54257:42;54301:14;54234:82;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;54234:82:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54215:101;;;54337:7;54329:65;;;;-1:-1:-1::0;;;54329:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54407:133;54455:10;54480:49;-1:-1:-1::0;;;;;54480:34:0;::::1;54523:4;54480:49;:34;:49;:::i;:::-;-1:-1:-1::0;;;;;54407:33:0;::::1;::::0;:133;::::1;:33;:133;:::i;:::-;54568:72;54619:20:::0;54568:46:::1;-1:-1:-1::0;;;;;54568:34:0;::::1;54603:10;54568:46;:34;:46;:::i;:72::-;54553:87;;54675:15;54659:12;:31;;54651:86;;;;-1:-1:-1::0;;;54651:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54750:20;:18;:20::i;:::-;54783:47;54798:11;54811:9;54822:7;54783:14;:47::i;:::-;-1:-1:-1::0;;;;;;;;;;;54875:9:0::1;54899:7;54921:10;54946:15;54976:12;54848:151;;;;-1:-1:-1::0;;;;;54848:151:0::1;-1:-1:-1::0;;;;;54848:151:0::1;;;;;;-1:-1:-1::0;;;;;54848:151:0::1;-1:-1:-1::0;;;;;54848:151:0::1;;;;;;-1:-1:-1::0;;;;;54848:151:0::1;-1:-1:-1::0;;;;;54848:151:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39065:1;;53003:2004:::0;;;;;;;;;;;;:::o;41825:1465::-;42249:14;32487:9;;42249:14;;;;32487:9;;32486:10;32478:32;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;;;;32521:9;:16;;-1:-1:-1;;32521:16:0;32533:4;32521:16;;;42207:8;39012:15:::1;39000:27:::0;::::1;;38992:62;;;::::0;;-1:-1:-1;;;38992:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;::::1;;42393:10:::0;42462:101:::2;42393:10:::0;42512:12;42539:13;42462:16:::2;:101::i;:::-;42414:149:::0;;-1:-1:-1;42414:149:0;-1:-1:-1;42596:37:0;;::::2;::::0;::::2;::::0;:80:::2;;;42662:14;42637:21;:39;;42596:80;42574:173;;;;-1:-1:-1::0;;;42574:173:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42760:89;42769:10;42781:4;42795;-1:-1:-1::0;;;;;42787:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;42787:28:0;42817:20;42847:1:::2;42839:9;::::0;::::2;;42760:8;:89::i;:::-;42860:91;42869:10;42881:4;42895;-1:-1:-1::0;;;;;42887:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;42887:29:0;42918:21;42949:1:::2;42941:9;::::0;::::2;;42860:8;:91::i;:::-;42987:35;::::0;;-1:-1:-1;;;42987:35:0;;43011:10:::2;42987:35;::::0;::::2;::::0;;;-1:-1:-1;;;;;42987:23:0;::::2;::::0;::::2;::::0;:35;;;;;::::2;::::0;;;;;;;;-1:-1:-1;42987:23:0;:35;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;42987:35:0;;-1:-1:-1;43073:1:0::2;43065:9;::::0;::::2;;:45:::0;::::2;;;;43090:20;43078:9;:32;43065:45;43061:104;;;43112:53;::::0;:10:::2;::::0;43132:9:::2;:32:::0;;::::2;43112:53:::0;::::2;;;::::0;::::2;::::0;;;43132:32;43112:10;:53;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;43061:104;43180:4;:9;;43188:1;43180:9;:46;;;;;43205:21;43193:9;:33;43180:46;43176:106;;;43228:54;::::0;:10:::2;::::0;43248:9:::2;:33:::0;;::::2;43228:54:::0;::::2;;;::::0;::::2;::::0;;;43248:33;43228:10;:54;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;43176:106;-1:-1:-1::0;;32572:5:0;32560:17;;-1:-1:-1;;32560:17:0;;;41825:1465;;;;-1:-1:-1;41825:1465:0;;-1:-1:-1;41825:1465:0;-1:-1:-1;;;;;41825:1465:0:o;38577:40::-;;;;:::o;38305:38::-;;;:::o;38624:46::-;;;;;;;;;;;;;;;:::o;9960:26::-;;;-1:-1:-1;;;;;9960:26:0;;:::o;40293:1524::-;40704:25;32487:9;;40704:25;;32487:9;;32486:10;32478:32;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;;;;32521:9;:16;;-1:-1:-1;;32521:16:0;32533:4;32521:16;;;40676:8;39012:15:::1;39000:27:::0;::::1;;38992:62;;;::::0;;-1:-1:-1;;;38992:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;::::1;;40778:18:::2;-1:-1:-1::0;;;;;40799:26:0;::::2;-1:-1:-1::0;;;;;;;;;;;40799:26:0::2;:47;;40837:9;40799:47;;;40828:6;40799:47;40778:68:::0;-1:-1:-1;40861:19:0::2;-1:-1:-1::0;;;;;40883:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;40883:27:0::2;:49;;40922:10;40883:49;;;40913:6;40883:49;40967:218;::::0;;-1:-1:-1;;;40967:218:0;;-1:-1:-1;;;;;40967:218:0;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;;;-1:-1:-1;40975:13:0::2;40967:47:::0;;::::2;::::0;::::2;::::0;:218;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;40967:47:0;:218;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40967:218:0;;-1:-1:-1;41245:9:0;;-1:-1:-1;41291:10:0;;-1:-1:-1;41316:194:0::2;41343:10;40967:218:::0;41245:9;41437:12;-1:-1:-1;;;;;41468:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;41468:27:0::2;41316:8;:194::i;:::-;41525:197;41552:10;41581:17:::0;41617:11;41647:13;-1:-1:-1;;;;;41679:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;41679:28:0::2;41525:8;:197::i;:::-;-1:-1:-1::0;;41761:48:0::2;::::0;;-1:-1:-1;;;41761:48:0;;41798:10:::2;41761:48;::::0;::::2;::::0;;;-1:-1:-1;;;;;41761:36:0;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;-1:-1:-1;41761:36:0;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;41761:48:0;32572:5;32560:17;;-1:-1:-1;;32560:17:0;;;40293:1524;;41761:48;;-1:-1:-1;40293:1524:0;;-1:-1:-1;;;;;;;;;;40293:1524:0:o;61780:1214::-;62125:18;32487:9;;62125:18;;32487:9;;32486:10;32478:32;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;;;;32521:9;:16;;-1:-1:-1;;32521:16:0;32533:4;32521:16;;;62107:8;39012:15:::1;39000:27:::0;::::1;;38992:62;;;::::0;;-1:-1:-1;;;38992:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;::::1;;62177:18:::2;62206:4;-1:-1:-1::0;;;;;62198:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;62198:28:0;62259:29:::2;::::0;;-1:-1:-1;;;62259:29:0;;;;62198:28;;-1:-1:-1;62237:19:0::2;::::0;-1:-1:-1;;;;;62259:27:0;::::2;::::0;::::2;::::0;:29:::2;::::0;;::::2;::::0;62198:28:::2;::::0;62259:29;;;;;;;:27;:29;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;62259:29:0;;-1:-1:-1;62309:70:0::2;62318:10;62338:4;62345:10:::0;62357;62377:1:::2;62369:9;::::0;::::2;;62309:8;:70::i;:::-;62390:72;62399:10;62419:4;62426:11;62439;62452:4;:9;;62460:1;62452:9;62390:8;:72::i;:::-;62488:14:::0;;62485:181:::2;;62519:56;-1:-1:-1::0;;;;;62519:38:0;::::2;62558:4:::0;62564:10;62519:56:::2;:38;:56;:::i;:::-;62603:51;::::0;;-1:-1:-1;;;62603:51:0;;62631:10:::2;62603:51;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;62603:27:0;::::2;::::0;::::2;::::0;:51;;;;;::::2;::::0;;;;;;;;-1:-1:-1;62603:27:0;:51;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;62603:51:0;;-1:-1:-1;62485:181:0::2;62679:15:::0;;62676:187:::2;;62711:58;-1:-1:-1::0;;;;;62711:39:0;::::2;62751:4:::0;62757:11;62711:58:::2;:39;:58;:::i;:::-;62798:53;::::0;;-1:-1:-1;;;62798:53:0;;62827:10:::2;62798:53;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;62798:28:0;::::2;::::0;::::2;::::0;:53;;;;;::::2;::::0;;;;;;;;-1:-1:-1;62798:28:0;:53;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;62798:53:0;;-1:-1:-1;62676:187:0::2;62897:13;62883:10;:27;;:60;;;;;62929:14;62914:11;:29;;62883:60;62875:111;;;;-1:-1:-1::0;;;62875:111:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;32572:5:0;32560:17;;-1:-1:-1;;32560:17:0;;;-1:-1:-1;61780:1214:0;;;;-1:-1:-1;61780:1214:0;-1:-1:-1;;;;;;61780:1214:0:o;38530:40::-;;;;:::o;38255:43::-;;;:::o;38350:38::-;;;:::o;39998:212::-;10469:7;;;;;-1:-1:-1;;;;;10469:7:0;10455:10;:21;10447:43;;;;;-1:-1:-1;;;10447:43:0;;;;;;;;;;;;-1:-1:-1;;;10447:43:0;;;;;;;;;;;;;;;40107:21:::1;:40:::0;;;;40158:21:::1;:44:::0;39998:212::o;61394:376::-;32487:9;;;;32486:10;32478:32;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;-1:-1:-1;;;32478:32:0;;;;;;;;;;;;;;;32521:9;:16;;-1:-1:-1;;32521:16:0;32533:4;32521:16;;;61605:8;39012:15:::1;39000:27:::0;::::1;;38992:62;;;::::0;;-1:-1:-1;;;38992:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;::::1;;61626:91:::2;61635:10;61647:9;61666;-1:-1:-1::0;;;;;61658:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;61658:34:0;61694:11;61715:1:::2;61707:9;::::0;::::2;;61626:8;:91::i;:::-;61728:34;::::0;;-1:-1:-1;;;61728:34:0;;61751:10:::2;61728:34;::::0;::::2;::::0;;;-1:-1:-1;;;;;61728:22:0;::::2;::::0;::::2;::::0;:34;;;;;-1:-1:-1;;61728:34:0;;;;;;;-1:-1:-1;61728:22:0;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32572:5:0;32560:17;;-1:-1:-1;;32560:17:0;;;-1:-1:-1;;;;;;;61394:376:0:o;39748:115::-;10469:7;;;;;-1:-1:-1;;;;;10469:7:0;10455:10;:21;10447:43;;;;;-1:-1:-1;;;10447:43:0;;;;;;;;;;;;-1:-1:-1;;;10447:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39821:27:0::1;;::::0;;;:13:::1;:27;::::0;;;;:34;;-1:-1:-1;;39821:34:0::1;39851:4;39821:34;::::0;;39748:115::o;38203:45::-;;;:::o;10699:163::-;10469:7;;;;;-1:-1:-1;;;;;10469:7:0;10455:10;:21;10447:43;;;;;-1:-1:-1;;;10447:43:0;;;;;;;;;;;;-1:-1:-1;;;10447:43:0;;;;;;;;;;;;;;;10803:7:::1;::::0;;10777:44:::1;::::0;-1:-1:-1;;;;;10777:44:0;;::::1;::::0;10803:7:::1;::::0;;::::1;;::::0;10777:44:::1;::::0;::::1;10832:11;:22:::0;;-1:-1:-1;;;;;;10832:22:0::1;-1:-1:-1::0;;;;;10832:22:0;;;::::1;::::0;;;::::1;::::0;;10699:163::o;51101:1894::-;51468:20;51440:8;39012:15;39000:8;:27;;38992:62;;;;;-1:-1:-1;;;38992:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;38992:62:0;;;;;;;;;;;;;;;51533:1:::1;51514:9;:16;:20;51506:59;;;::::0;;-1:-1:-1;;;51506:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;51506:59:0;;;;;;;;;;;;;::::1;;51602:1;51584:15;:19;51576:65;;;;-1:-1:-1::0;;;51576:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51652:17;51672:9;51725:37;::::0;;-1:-1:-1;;;51725:37:0;;51751:10:::1;51725:37;::::0;::::1;::::0;;;51652:29;;-1:-1:-1;51694:28:0::1;::::0;-1:-1:-1;;;;;51725:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;51725:37:0;51848:12;;51725:37;;-1:-1:-1;;;;;;51791:20:0::1;51773:51;::::0;::::1;::::0;51825:9;;51836:10:::1;::::0;51848:9;;51858:1:::1;::::0;51848:12:::1;;;;;;;;;;51862:15;51773:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;51773:105:0::1;-1:-1:-1::0;;;;;51773:105:0::1;;;;;;-1:-1:-1::0;;;;;51773:105:0::1;-1:-1:-1::0;;;;;51773:105:0::1;;;;;;-1:-1:-1::0;;;;;51773:105:0::1;-1:-1:-1::0;;;;;51773:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;51896:9:0::1;::::0;-1:-1:-1;;;51891:636:0::1;51915:9;:16;51911:1;:20;51891:636;;;51981:1;51962:9;:16;:20;51957:1;:25;51953:520;;;52020:1;52007:14:::0;::::1;52003:202;;52059:9;52069:1;52059:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;52051:30:0::1;;52082:10;52051:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;52051:42:0::1;-1:-1:-1::0;;;;;52051:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52003:202:0::1;::::0;-1:-1:-1;52003:202:0::1;;52150:9;52160:1;52150:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;52142:31:0::1;;52174:10;52142:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;52142:43:0::1;-1:-1:-1::0;;;;;52142:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;52003:202:0::1;51953:520;;;52261:1;52249:13:::0;::::1;52245:213;;52300:9;52310:1;52300:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;52292:30:0::1;;52323:9;52333:1;52337;52333:5;52323:16;;;;;;;;;;;;;;52292:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;52292:48:0::1;-1:-1:-1::0;;;;;52292:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;52245:213;52397:9;52407:1;52397:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;52389:31:0::1;;52421:9;52431:1;52435;52431:5;52421:16;;;;;;;;;;;;;;52389:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;52389:49:0::1;-1:-1:-1::0;;;;;52389:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;52245:213:0::1;52514:1;52500:15:::0;;::::1;::::0;51933:3:::1;51891:636;;;-1:-1:-1::0;52552:37:0::1;::::0;;-1:-1:-1;;;52552:37:0;;52578:10:::1;52552:37;::::0;::::1;::::0;;;:63:::1;::::0;52594:20;;-1:-1:-1;;;;;52552:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;:63;52537:78;;52650:15;52634:12;:31;;52626:86;;;;-1:-1:-1::0;;;52626:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52733:25;52748:9;52733:14;:25::i;:::-;52771:47;52786:11;52799:9;52810:7;52771:14;:47::i;:::-;52836:151;::::0;;-1:-1:-1;;;;;52836:151:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;52909:10:::1;52836:151:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52836:151:0;;;;;;;::::1;39065:1;;51101:1894:::0;;;;;;;;;;;:::o;38395:37::-;;;:::o;63008:495::-;63171:5;63167:329;;;63197:10;;63193:183;;63234:6;-1:-1:-1;;;;;63228:21:0;;63257:6;63228:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;63289:19:0;;63303:4;63289:19;;-1:-1:-1;63285:75:0;;63310:50;63340:6;63349:2;63353:6;63310:22;:50::i;:::-;63167:329;;;63408:76;;;-1:-1:-1;;;63408:76:0;;-1:-1:-1;;;;;63408:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63426:20;63408:51;;;;;;:76;;;;;-1:-1:-1;;63408:76:0;;;;;;;;-1:-1:-1;63408:51:0;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63167:329;63008:495;;;;;:::o;31182:374::-;31327:34;;;-1:-1:-1;;;31327:34:0;;31351:4;31327:34;;;;-1:-1:-1;;;;;31327:34:0;;;;;;;;;31307:17;;31327:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31327:34:0;;-1:-1:-1;31376:18:0;;;31372:177;;;31415:13;;31411:78;;31449:24;-1:-1:-1;;;;;31449:17:0;;31467:2;31471:1;31449:24;:17;:24;:::i;:::-;31503:34;-1:-1:-1;;;;;31503:17:0;;31521:2;-1:-1:-1;;31503:34:0;:17;:34;:::i;:::-;31182:374;;;;:::o;31800:129::-;31874:7;31901:5;-1:-1:-1;;;;;31901:15:0;;31917:3;31901:20;;;;;;;;;;;;;-1:-1:-1;;;;;31901:20:0;-1:-1:-1;;;;;31901:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31901:20:0;;-1:-1:-1;31800:129:0;;;;;:::o;30851:323::-;30986:10;;30982:185;;31017:12;31023:5;31017;:12::i;:::-;31013:143;;;31050:19;;-1:-1:-1;;;;;31050:11:0;;;:19;;;;;31062:6;;31050:19;;;;31062:6;31050:11;:19;;;;;;;;;;;;;;;;;;;;;31013:143;;;31110:30;-1:-1:-1;;;;;31110:18:0;;31129:2;31133:6;31110:30;:18;:30;:::i;:::-;30851:323;;;:::o;63959:492::-;64050:21;;64085;;64082:362;;64123:24;64177:5;64150:24;64164:9;64150;;:24;:13;:24;:::i;:::-;:32;;;;;;64123:59;;64197:20;64239:17;64220:16;:36;:75;;64279:16;64220:75;;;64259:17;64220:75;64197:98;;64329:1;64313:12;:17;;:60;;;;;64354:12;64369:4;64354:19;64346:5;:27;64334:9;:39;64313:60;64310:122;;;64397:11;-1:-1:-1;;;;;64392:26:0;;64419:12;64392:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64082:362:0;;;63959:492;;:::o;64752:249::-;64852:11;:32;;;;;64879:5;64867:9;:17;64852:32;64849:145;;;64901:81;;;-1:-1:-1;;;64901:81:0;;-1:-1:-1;;;;;64901:81:0;;;;;;;;;;;;;;64971:10;64901:81;;;;;;64916:16;64901:49;;;;;;:81;;;;;-1:-1:-1;;64901:81:0;;;;;;;;-1:-1:-1;64901:49:0;:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64752:249;;;:::o;63511:440::-;63660:5;63656:288;;;63686:10;;63682:119;;63723:6;-1:-1:-1;;;;;63717:22:0;;63740:6;63717:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63766:19:0;;-1:-1:-1;;;;;63766:11:0;;;-1:-1:-1;63766:19:0;;;;;-1:-1:-1;63778:6:0;;63766:19;;;;63778:6;63766:11;:19;;;;;;;;;;;;;;;;;;;;;63682:119;63656:288;;;63837:10;;63833:100;;63868:49;63898:5;63906:2;63910:6;63868:22;:49::i;31564:228::-;31642:7;31666:12;31672:5;31666;:12::i;:::-;31662:123;;;-1:-1:-1;;;;;;31702:11:0;;;31695:18;;31662:123;31753:5;-1:-1:-1;;;;;31753:15:0;;31769:3;31753:20;;;;;;;;;;;;;-1:-1:-1;;;;;31753:20:0;-1:-1:-1;;;;;31753:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31753:20:0;;-1:-1:-1;31746:27:0;;14355:137;14413:7;14446:1;14441;:6;;14433:28;;;;;-1:-1:-1;;;14433:28:0;;;;;;;;;;;;-1:-1:-1;;;14433:28:0;;;;;;;;;;;;;;;-1:-1:-1;14479:5:0;;;14355:137::o;64459:285::-;64538:21;;64573:22;;64570:167;;64635:18;64656:4;64635:25;64627:5;:33;64615:9;:45;64612:113;;;64684:11;-1:-1:-1;;;;;64679:26:0;;64706:18;64679:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64612:113;64459:285;:::o;43298:1276::-;43446:28;43476:29;43519:19;43540:20;43572:10;-1:-1:-1;;;;;43564:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43564:37:0;;;;;;;;;-1:-1:-1;43564:37:0;-1:-1:-1;43616:17:0;;:37;;;;-1:-1:-1;43637:16:0;;43616:37;43612:157;;;43693:12;43670:35;;43744:13;43720:37;;43612:157;43783:17;;:36;;;;;43818:1;43804:11;:15;43783:36;43779:144;;;43859:12;43836:35;;43910:1;43886:25;;43779:144;43952:1;43937:12;:16;:35;;;;;43971:1;43957:11;:15;43937:35;43933:634;;;43989:25;44017:47;44038:12;44052:11;44017:20;:47::i;:::-;43989:75;;44079:26;44108:49;44129:13;44144:12;44108:20;:49::i;:::-;44079:78;;44197:18;44176:17;:39;44172:384;;44259:12;44236:35;;44314:53;44335:12;44349:17;44314:20;:53::i;:::-;44290:77;;44172:384;;;44432:13;44408:37;;44487:53;44508:11;44521:18;44487:20;:53::i;:::-;44464:76;;44172:384;43933:634;;;43298:1276;;;;;;;;:::o;27966:211::-;28110:58;;;-1:-1:-1;;;;;28110:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28110:58:0;-1:-1:-1;;;28110:58:0;;;28083:86;;28103:5;;28083:19;:86::i;28478:670::-;28896:10;;;28895:62;;-1:-1:-1;28912:39:0;;;-1:-1:-1;;;28912:39:0;;28936:4;28912:39;;;;-1:-1:-1;;;;;28912:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28912:39:0;:44;28895:62;28873:166;;;;-1:-1:-1;;;28873:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29077:62;;;-1:-1:-1;;;;;29077:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29077:62:0;-1:-1:-1;;;29077:62:0;;;29050:90;;29070:5;;29050:19;:90::i;31937:104::-;-1:-1:-1;;;;;32013:20:0;;-1:-1:-1;;;;;;;;;;;32013:20:0;31937:104;;;:::o;15480:128::-;15548:7;15575:25;15598:1;15575:18;:6;15586;15575:18;:10;:18;:::i;:::-;:22;:25;:22;:25;:::i;:::-;15568:32;15480:128;-1:-1:-1;;;15480:128:0:o;15206:127::-;15274:7;15318:6;15301:13;:6;15312:1;15301:13;:10;:13;:::i;:::-;:24;;;;;;;15206:127;-1:-1:-1;;;15206:127:0:o;29539:1046::-;30199:12;30213:23;30248:5;-1:-1:-1;;;;;30240:19:0;30260:4;30240:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30240:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30198:67;;;;30284:7;30276:52;;;;;-1:-1:-1;;;30276:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30345:17;;:21;30341:237;;30500:10;30489:30;;;;;;;;;;;;;;;-1:-1:-1;30489:30:0;30481:85;;;;-1:-1:-1;;;30481:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13676:226;13734:7;13758:6;13754:47;;-1:-1:-1;13788:1:0;13781:8;;13754:47;13825:5;;;13829:1;13825;:5;:1;13849:5;;;;;:10;13841:32;;;;;-1:-1:-1;;;13841:32:0;;;;;;;;;;;;-1:-1:-1;;;13841:32:0;;;;;;;;;;;;;;13910:141;13968:7;14000:1;13996;:5;13988:32;;;;;-1:-1:-1;;;13988:32:0;;;;;;;;;;;;-1:-1:-1;;;13988:32:0;;;;;;;;;;;;;;;14042:1;14038;:5;;;
Swarm Source
ipfs://e0e4332977b9bd0f0a4ced23cda6d5342bc99c6036a424bca0c59481c6adedad
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.