Polygon Sponsored slots available. Book your slot here!
Overview
MATIC Balance
0 MATIC
MATIC Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator:
Latest 25 from a total of 907,905 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Create DODO Vend... | 54806370 | 18 hrs ago | IN | 0 MATIC | 0.08014977 | ||||
Create DODO Vend... | 54806336 | 18 hrs ago | IN | 0 MATIC | 0.07684415 | ||||
Create DODO Vend... | 54806287 | 18 hrs ago | IN | 0 MATIC | 0.09908421 | ||||
Create DODO Vend... | 54806251 | 18 hrs ago | IN | 0 MATIC | 0.09209452 | ||||
Create DODO Vend... | 54805807 | 18 hrs ago | IN | 0 MATIC | 0.07336948 | ||||
Create DODO Vend... | 54805765 | 18 hrs ago | IN | 0 MATIC | 0.08125062 | ||||
Create DODO Vend... | 54805737 | 18 hrs ago | IN | 0 MATIC | 0.07522918 | ||||
Create DODO Vend... | 54773593 | 39 hrs ago | IN | 1 MATIC | 0.0202605 | ||||
Add DVM Liquidit... | 54773553 | 39 hrs ago | IN | 0 MATIC | 0.00466029 | ||||
Create DODO Vend... | 54773522 | 39 hrs ago | IN | 0 MATIC | 0.02097892 | ||||
Add DVM Liquidit... | 54772803 | 40 hrs ago | IN | 0 MATIC | 0.00432489 | ||||
Add DVM Liquidit... | 54772781 | 40 hrs ago | IN | 0 MATIC | 0.00433196 | ||||
Create DODO Vend... | 54772513 | 40 hrs ago | IN | 0 MATIC | 0.02715272 | ||||
Add DVM Liquidit... | 54764756 | 45 hrs ago | IN | 0 MATIC | 0.00444009 | ||||
Create DODO Vend... | 54759658 | 2 days ago | IN | 1 MATIC | 0.05934794 | ||||
Create DODO Vend... | 54734376 | 2 days ago | IN | 0 MATIC | 0.02685238 | ||||
Create DODO Vend... | 54730127 | 2 days ago | IN | 0 MATIC | 0.05636089 | ||||
Create DODO Vend... | 54729637 | 2 days ago | IN | 0 MATIC | 0.06557312 | ||||
Create DODO Vend... | 54720966 | 3 days ago | IN | 0 MATIC | 0.03413913 | ||||
Add DVM Liquidit... | 54719230 | 3 days ago | IN | 0 MATIC | 0.01283873 | ||||
Add DVM Liquidit... | 54719171 | 3 days ago | IN | 0 MATIC | 0.00347168 | ||||
Create DODO Vend... | 54718989 | 3 days ago | IN | 0 MATIC | 0.04988684 | ||||
Create DODO Vend... | 54718893 | 3 days ago | IN | 0 MATIC | 0.04574078 | ||||
Create DODO Vend... | 54708272 | 3 days ago | IN | 0 MATIC | 0.03470282 | ||||
Create DODO Vend... | 54698000 | 3 days ago | IN | 1.5 MATIC | 0.06394365 |
Latest 25 internal transactions (View All)
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
54828146 | 4 hrs ago | 691.71737576 MATIC | ||||
54828146 | 4 hrs ago | 691.71737576 MATIC | ||||
54828056 | 4 hrs ago | 50 MATIC | ||||
54828056 | 4 hrs ago | 50 MATIC | ||||
54827843 | 4 hrs ago | 2,985.87086837 MATIC | ||||
54827843 | 4 hrs ago | 2,985.87086837 MATIC | ||||
54827366 | 5 hrs ago | 500 MATIC | ||||
54827366 | 5 hrs ago | 500 MATIC | ||||
54826393 | 5 hrs ago | 688.76665226 MATIC | ||||
54826393 | 5 hrs ago | 688.76665226 MATIC | ||||
54825230 | 6 hrs ago | 1,379.79943108 MATIC | ||||
54825230 | 6 hrs ago | 1,379.79943108 MATIC | ||||
54824241 | 7 hrs ago | 3,155.87376 MATIC | ||||
54824241 | 7 hrs ago | 3,155.87376 MATIC | ||||
54822471 | 8 hrs ago | 11.64140424 MATIC | ||||
54822471 | 8 hrs ago | 11.64140424 MATIC | ||||
54822426 | 8 hrs ago | 49.42286284 MATIC | ||||
54822426 | 8 hrs ago | 49.42286284 MATIC | ||||
54820354 | 9 hrs ago | 1,113.30602771 MATIC | ||||
54820354 | 9 hrs ago | 1,113.30602771 MATIC | ||||
54817381 | 11 hrs ago | 632.07226796 MATIC | ||||
54817381 | 11 hrs ago | 632.07226796 MATIC | ||||
54817301 | 11 hrs ago | 10.58409545 MATIC | ||||
54817301 | 11 hrs ago | 10.58409545 MATIC | ||||
54816871 | 11 hrs ago | 341.81659445 MATIC |
Loading...
Loading
Contract Name:
DODOV2Proxy02
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-11 */ // 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 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/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/SmartRoute/intf/IDODOAdapter.sol interface IDODOAdapter { function sellBase(address to, address pool, bytes memory data) external; function sellQuote(address to, address pool, bytes memory data) 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_; 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 payable weth, address dodoApproveProxy, address dodoSellHelper ) public { _DVM_FACTORY_ = dvmFactory; _DPP_FACTORY_ = dppFactory; _WETH_ = weth; _DODO_APPROVE_PROXY_ = dodoApproveProxy; _DODO_SELL_HELPER_ = dodoSellHelper; } function addWhiteList (address contractAddr) public onlyOwner { isWhiteListed[contractAddr] = true; } function removeWhiteList (address contractAddr) public onlyOwner { isWhiteListed[contractAddr] = false; } // ============ 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, 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 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"); emit OrderHistory( _ETH_ADDRESS_, toToken, msg.sender, msg.value, returnAmount ); } function dodoSwapV2TokenToETH( address fromToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool, uint256 deadLine ) external override judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); 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); 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, uint256 deadLine ) external override judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); 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"); 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, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); 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"); emit OrderHistory( fromToken, toToken, msg.sender, fromTokenAmount, returnAmount ); } function dodoSwapV1( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO"); 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_(); uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this)); IERC20(curDodoBase).universalApproveMax(curDodoPair, curAmountIn); IDODOV1(curDodoPair).sellBaseToken(curAmountIn, 0, ""); } else { address curDodoQuote = IDODOV1(curDodoPair)._QUOTE_TOKEN_(); 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); 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, 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; 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"); emit OrderHistory( _fromToken, _toToken, msg.sender, _fromTokenAmount, returnAmount ); } //============ CrowdPooling Functions (bid) ============ 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); } } } }
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 payable","name":"weth","type":"address"},{"internalType":"address","name":"dodoApproveProxy","type":"address"},{"internalType":"address","name":"dodoSellHelper","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":"_DODO_APPROVE_PROXY_","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":"_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":"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":"","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":"","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":"","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":"","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":"","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":"","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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
61012060405234801561001157600080fd5b506040516200523838038062005238833981810160405260a081101561003657600080fd5b508051602082015160408301516060808501516080958601516001600160601b031995831b861660e05293821b85166101005291811b8416909452831b821660a05290911b1660c05260805160601c60a05160601c60c05160601c60e05160601c6101005160601c6150f76200014160003980610dde5280610f8c5280613c375250806135be52806137785250806113e45280613c13525080611c7f5280612fc75280613e4b528061406b52806145bc525080610d245280610ed45280610f18528061153852806115ce528061201c52806120d152806125e4528061267a52806129f05280612a5452806136c4528061370e52806144d0528061455852806147fa52506150f76000f3fe60806040526004361061016a5760003560e01c8063674d9422116100d1578063af1280b01161008a578063e7cd4a0411610064578063e7cd4a0414610b39578063eb99be1214610b6c578063f2fde38b14610b81578063f87dc1b714610bb457610171565b8063af1280b014610ad4578063b730d15014610ae9578063db70b5c714610afe57610171565b8063674d94221461091157806369e4e4171461097c5780636f9170f6146109915780638456db15146109d85780638b3bb089146109ed57806399882c8f14610a6e57610171565b80631e6d24c2116101235780631e6d24c2146104775780632042e5c21461054e57806323c38fa3146105815780634e71e0c8146107595780635028bb951461076e57806354bacd131461083157610171565b80630d009297146101735780630d4eec8f146101a65780630d9be500146101d75780630dd4ebd91461023557806312ff148d1461031b57806316048bc41461046257610171565b3661017157005b005b34801561017f57600080fd5b506101716004803603602081101561019657600080fd5b50356001600160a01b0316610c95565b3480156101b257600080fd5b506101bb610d22565b604080516001600160a01b039092168252519081900360200190f35b6101bb60048036036101208110156101ee57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135610d46565b610309600480360361010081101561024c57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561028b57600080fd5b82018360208201111561029d57600080fd5b803590602001918460208302840111600160201b831117156102be57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060208101351515906040013561100a565b60408051918252519081900360200190f35b610171600480360360e081101561033157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561035b57600080fd5b82018360208201111561036d57600080fd5b803590602001918460208302840111600160201b8311171561038e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103dd57600080fd5b8201836020820111156103ef57600080fd5b803590602001918460208302840111600160201b8311171561041057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505060ff83351693505050602081013590604081013590606001356116fc565b34801561046e57600080fd5b506101bb611ba0565b34801561048357600080fd5b50610309600480360360e081101561049a57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156104d057600080fd5b8201836020820111156104e257600080fd5b803590602001918460208302840111600160201b8311171561050357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135611bb4565b34801561055a57600080fd5b506101716004803603602081101561057157600080fd5b50356001600160a01b03166121d8565b610309600480360361014081101561059857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156105d757600080fd5b8201836020820111156105e957600080fd5b803590602001918460208302840111600160201b8311171561060a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460208302840111600160201b8311171561068c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106db57600080fd5b8201836020820111156106ed57600080fd5b803590602001918460208302840111600160201b8311171561070e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612249565b34801561076557600080fd5b506101716127d0565b610309600480360360c081101561078457600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111600160201b831117156107e657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612894565b610309600480360361012081101561084857600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561089657600080fd5b8201836020820111156108a857600080fd5b803590602001918460018302840111600160201b831117156108c957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050505080351515915060200135612ed2565b61095e600480360360e081101561092757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c001356132b6565b60408051938452602084019290925282820152519081900360600190f35b34801561098857600080fd5b506101bb6135bc565b34801561099d57600080fd5b506109c4600480360360208110156109b457600080fd5b50356001600160a01b03166135e0565b604080519115158252519081900360200190f35b3480156109e457600080fd5b506101bb6135f5565b610a4b6004803603610120811015610a0457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135613604565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610abb600480360360e0811015610a8457600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c001356138d6565b6040805192835260208301919091528051918290030190f35b348015610ae057600080fd5b506101bb613c11565b348015610af557600080fd5b506101bb613c35565b61017160048036036080811015610b1457600080fd5b506001600160a01b038135169060208101359060ff6040820135169060600135613c59565b348015610b4557600080fd5b5061017160048036036020811015610b5c57600080fd5b50356001600160a01b0316613dd5565b348015610b7857600080fd5b506101bb613e49565b348015610b8d57600080fd5b5061017160048036036020811015610ba457600080fd5b50356001600160a01b0316613e6d565b348015610bc057600080fd5b506103096004803603610100811015610bd857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610c1757600080fd5b820183602082011115610c2957600080fd5b803590602001918460208302840111600160201b83111715610c4a57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135613f1d565b600154600160a01b900460ff1615610ce7576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000805460ff1615610d8b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558142811015610ddc576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166309b8adb86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e3757600080fd5b505af1158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b505191508a8a610e8d3385848e6001600160a01b038216600080516020614fab833981519152146144c2565b610eb33385838d6001600160a01b038216600080516020614fab833981519152146144c2565b6001600160a01b038216600080516020614fab8339815191521415610ef6577f000000000000000000000000000000000000000000000000000000000000000091505b6001600160a01b038116600080516020614fab8339815191521415610f3857507f00000000000000000000000000000000000000000000000000000000000000005b6040805162caf77f60e51b81526001600160a01b03868116600483015233602483015284811660448301528381166064830152608482018c905260a482018a905260c482018b905288151560e483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163195eefe0916101048082019260009290919082900301818387803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b50506000805460ff1916905550939d9c50505050505050505050505050565b60008142811015611050576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111611094576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b600087116110d35760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b89896110fb3330848d6001600160a01b038216600080516020614fab833981519152146144c2565b60005b88518110156114f857600089828151811061111557fe5b6020026020010151905088600116600014156112bd576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116657600080fd5b505afa15801561117a573d6000803e3d6000fd5b505050506040513d602081101561119057600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d602081101561120857600080fd5b505190506112266001600160a01b038316848363ffffffff61462616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b505050506040513d60208110156112b357600080fd5b506114eb92505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561137057600080fd5b505afa158015611384573d6000803e3d6000fd5b505050506040513d602081101561139a57600080fd5b505190506113b86001600160a01b038316848363ffffffff61462616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b1580156114bb57600080fd5b505af11580156114cf573d6000803e3d6000fd5b505050506040513d60208110156114e557600080fd5b50505050505b50600197881c97016110fe565b506001600160a01b038116600080516020614fab833981519152141561163357604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561157e57600080fd5b505afa158015611592573d6000803e3d6000fd5b505050506040513d60208110156115a857600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519195506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b15801561161657600080fd5b505af115801561162a573d6000803e3d6000fd5b5050505061164f565b61164c6001600160a01b0382163063ffffffff6146f016565b93505b8884101561168e5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b6116a86001600160a01b038216338663ffffffff61477d16565b604080516001600160a01b038085168252831660208201523381830152606081018c9052608081018690529051600080516020614eea8339815191529181900360a00190a150505098975050505050505050565b60005460ff1615611740576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015611791576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b61181c33898a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117cf57600080fd5b505afa1580156117e3573d6000803e3d6000fd5b505050506040513d60208110156117f957600080fd5b505189518a9060009061180857fe5b60200260200101518960ff166001146144c2565b6118a933898a6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d602081101561188457600080fd5b505189518a90600190811061189557fe5b60200260200101518960ff166002146144c2565b876001600160a01b03166316048bc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b505050506040513d602081101561190e57600080fd5b505187516001600160a01b0390911690638ff3928c9033908a9060009061193157fe5b60200260200101518a60018151811061194657fe5b60200260200101518b60028151811061195b57fe5b60200260200101518b60028151811061197057fe5b60200260200101518c60038151811061198557fe5b60200260200101518b8b6040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b158015611a0857600080fd5b505af1158015611a1c573d6000803e3d6000fd5b505050506040513d6020811015611a3257600080fd5b5051611a74576040805162461bcd60e51b815260206004820152600c60248201526b14995cd95d0811985a5b195960a21b604482015290519081900360640190fd5b611b0033896001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d6020811015611adb57600080fd5b5051885189906002908110611aec57fe5b60200260200101518860ff166003146147ec565b611b8c33896001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611b3d57600080fd5b505afa158015611b51573d6000803e3d6000fd5b505050506040513d6020811015611b6757600080fd5b5051885189906003908110611b7857fe5b60200260200101518860ff166004146147ec565b50506000805460ff19169055505050505050565b60005461010090046001600160a01b031681565b60008142811015611bfa576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111611c3e576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b60008711611c7d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a5ea4668a3389600081518110611cbb57fe5b60200260200101518c6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b506000925050505b8651811015611ffb576001875103811415611eb85760018616611e1b57868181518110611d8a57fe5b60200260200101516001600160a01b031663bd6015b4306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611de957600080fd5b505af1158015611dfd573d6000803e3d6000fd5b505050506040513d6020811015611e1357600080fd5b50611eb39050565b868181518110611e2757fe5b60200260200101516001600160a01b031663dd93f59a306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611e8657600080fd5b505af1158015611e9a573d6000803e3d6000fd5b505050506040513d6020811015611eb057600080fd5b50505b611fef565b60018616611f4157868181518110611ecc57fe5b60200260200101516001600160a01b031663bd6015b4888360010181518110611ef157fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611e8657600080fd5b868181518110611f4d57fe5b60200260200101516001600160a01b031663dd93f59a888360010181518110611f7257fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611fc257600080fd5b505af1158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b50505b600195861c9501611d61565b50604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561206257600080fd5b505afa158015612076573d6000803e3d6000fd5b505050506040513d602081101561208c57600080fd5b50519150868210156120cf5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561213557600080fd5b505af1158015612149573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f1935050505015801561217a573d6000803e3d6000fd5b50604080516001600160a01b038b168152600080516020614fab83398151915260208201523381830152606081018a9052608081018490529051600080516020614eea8339815191529181900360a00190a150979650505050505050565b60005461010090046001600160a01b03163314612228576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19169055565b6000814281101561228f576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008751116122d3576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b87518751146123135760405162461bcd60e51b8152600401808060200182810382526025815260200180614f0a6025913960400191505060405180910390fd5b60018651038751146123565760405162461bcd60e51b81526004018080602001828103825260258152602001806150676025913960400191505060405180910390fd5b600089116123955760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b8b8b8b60006123b36001600160a01b0384163363ffffffff6148c416565b90506123f8338b6000815181106123c657fe5b60200260200101518685600080516020614fab8339815191526001600160a01b0316896001600160a01b0316146144c2565b60005b8b518110156125a45760018a166124d4578c818151811061241857fe5b60200260200101516001600160a01b03166330e6ae318c836001018151811061243d57fe5b60200260200101518e848151811061245157fe5b6020908102919091010151604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260606044830152600060648301819052905160a48084019382900301818387803b1580156124b757600080fd5b505af11580156124cb573d6000803e3d6000fd5b50505050612598565b8c81815181106124e057fe5b60200260200101516001600160a01b0316636f7929f28c836001018151811061250557fe5b60200260200101518e848151811061251957fe5b6020908102919091010151604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260606044830152600060648301819052905160a48084019382900301818387803b15801561257f57600080fd5b505af1158015612593573d6000803e3d6000fd5b505050505b6001998a1c99016123fb565b506001600160a01b038316600080516020614fab833981519152141561270d57604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561262a57600080fd5b505afa15801561263e573d6000803e3d6000fd5b505050506040513d602081101561265457600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519197506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b1580156126c257600080fd5b505af11580156126d6573d6000803e3d6000fd5b505060405133925088156108fc02915088906000818181858888f19350505050158015612707573d6000803e3d6000fd5b50612739565b6127368161272a6001600160a01b0386163363ffffffff6146f016565b9063ffffffff61496e16565b95505b8c8610156127785760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b604080516001600160a01b03808716825285166020820152338183015260608101849052608081018890529051600080516020614eea8339815191529181900360a00190a150505050509a9950505050505050505050565b6001546001600160a01b0316331461281f576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600081428110156128da576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b600086511161291e576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b6000871161295d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038b16916370a0823191602480820192602092909190829003018186803b1580156129a757600080fd5b505afa1580156129bb573d6000803e3d6000fd5b505050506040513d60208110156129d157600080fd5b505160408051630d0e30db60e41b815290519192506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163d0e30db0913491600480830192600092919082900301818588803b158015612a3957600080fd5b505af1158015612a4d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb88600081518110612a8e57fe5b6020026020010151346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050506040513d6020811015612b1057600080fd5b50600090505b8751811015612db0576001885103811415612c6d5760018716612bd057878181518110612b3f57fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612b9e57600080fd5b505af1158015612bb2573d6000803e3d6000fd5b505050506040513d6020811015612bc857600080fd5b50612c689050565b878181518110612bdc57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c3b57600080fd5b505af1158015612c4f573d6000803e3d6000fd5b505050506040513d6020811015612c6557600080fd5b50505b612da4565b60018716612cf657878181518110612c8157fe5b60200260200101516001600160a01b031663bd6015b4898360010181518110612ca657fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c3b57600080fd5b878181518110612d0257fe5b60200260200101516001600160a01b031663dd93f59a898360010181518110612d2757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612d7757600080fd5b505af1158015612d8b573d6000803e3d6000fd5b505050506040513d6020811015612da157600080fd5b50505b600196871c9601612b16565b50604080516370a0823160e01b81523360048201529051612e359183916001600160a01b038d16916370a08231916024808301926020929190829003018186803b158015612dfd57600080fd5b505afa158015612e11573d6000803e3d6000fd5b505050506040513d6020811015612e2757600080fd5b50519063ffffffff61496e16565b925087831015612e765760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b60408051600080516020614fab83398151915281526001600160a01b038b1660208201523381830152346060820152608081018590529051600080516020614eea8339815191529181900360a00190a150509695505050505050565b60008142811015612f18576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008611612f575760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b6000612f726001600160a01b038c163363ffffffff6148c416565b90506001600160a01b038c16600080516020614fab8339815191521461303e576040805163052f523360e11b81526001600160a01b038e81166004830152336024830152306044830152606482018b905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b15801561301157600080fd5b505af1158015613025573d6000803e3d6000fd5b5061303e925050506001600160a01b038d168b8a614626565b6001600160a01b03891660009081526002602052604090205460ff166130955760405162461bcd60e51b8152600401808060200182810382526025815260200180614feb6025913960400191505060405180910390fd5b60006001600160a01b03808b16908e16600080516020614fab833981519152146130c05760006130c2565b345b886040518082805190602001908083835b602083106130f25780518252601f1990920191602091820191016130d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613154576040519150601f19603f3d011682016040523d82523d6000602084013e613159565b606091505b50509050806131995760405162461bcd60e51b815260040180806020018281038252602d815260200180615010602d913960400191505060405180910390fd5b6131cd336131b66001600160a01b038f163063ffffffff6148c416565b6001600160a01b038f16919063ffffffff61477d16565b6131ea8261272a6001600160a01b038f163363ffffffff6148c416565b93508784101561322b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b600080516020614eea8339815191528d8d338c8860405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050509998505050505050505050565b600080548190819060ff16156132ff576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558342811015613350576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b8a61335c818c8c6149b7565b90945092508884108015906133715750878310155b6133ac5760405162461bcd60e51b815260040180806020018281038252602b815260200180614f80602b913960400191505060405180910390fd5b6134233382836001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ea57600080fd5b505afa1580156133fe573d6000803e3d6000fd5b505050506040513d602081101561341457600080fd5b505187600160ff8d16146144c2565b61349a3382836001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561346157600080fd5b505afa158015613475573d6000803e3d6000fd5b505050506040513d602081101561348b57600080fd5b505186600260ff8d16146144c2565b60408051634c85b42560e01b815233600482015290516001600160a01b03831691634c85b4259160248083019260609291908290030181600087803b1580156134e257600080fd5b505af11580156134f6573d6000803e3d6000fd5b505050506040513d606081101561350c57600080fd5b50519450600160ff881614801561352257508334115b156135585760405133903486900380156108fc02916000818181858888f19350505050158015613556573d6000803e3d6000fd5b505b8660ff16600214801561356a57508234115b156135a05760405133903485900380156108fc02916000818181858888f1935050505015801561359e573d6000803e3d6000fd5b505b50506000805460ff191690559199909850909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026020526000908152604090205460ff1681565b6001546001600160a01b031681565b60008054819060ff161561364b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561369c576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60006001600160a01b038d16600080516020614fab833981519152146136c2578c6136e4565b7f00000000000000000000000000000000000000000000000000000000000000005b905060006001600160a01b038d16600080516020614fab8339815191521461370c578c61372e565b7f00000000000000000000000000000000000000000000000000000000000000005b6040805163e18c40c760e01b81526001600160a01b0385811660048301528381166024830152604482018e9052606482018d9052608482018c90528a151560a483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163e18c40c79160c4808201926020929091908290030181600087803b1580156137c357600080fd5b505af11580156137d7573d6000803e3d6000fd5b505050506040513d60208110156137ed57600080fd5b505194508d91508c905061381d3386848f6001600160a01b038216600080516020614fab833981519152146144c2565b6138433386838e6001600160a01b038216600080516020614fab833981519152146144c2565b505060408051634c85b42560e01b815233600482015290516001600160a01b03851691634c85b4259160248083019260609291908290030181600087803b15801561388d57600080fd5b505af11580156138a1573d6000803e3d6000fd5b505050506040513d60608110156138b757600080fd5b50516000805460ff19169055929c929b50919950505050505050505050565b60008054819060ff161561391d576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561396e576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a957600080fd5b505afa1580156139bd573d6000803e3d6000fd5b505050506040513d60208110156139d357600080fd5b505160408051636a5cb82360e11b815290519192506000916001600160a01b038e169163d4b97046916004808301926020929190829003018186803b158015613a1b57600080fd5b505afa158015613a2f573d6000803e3d6000fd5b505050506040513d6020811015613a4557600080fd5b50519050613a5c3330848e600160ff8d16146144c2565b613a6f3330838d8b60ff166002146144c2565b8a15613b0d57613a8f6001600160a01b0383168d8d63ffffffff61462616565b6040805163aa06ce9b60e01b8152336004820152602481018d905290516001600160a01b038e169163aa06ce9b9160448083019260209291908290030181600087803b158015613ade57600080fd5b505af1158015613af2573d6000803e3d6000fd5b505050506040513d6020811015613b0857600080fd5b505194505b8915613bab57613b2d6001600160a01b0382168d8c63ffffffff61462616565b604080516317c5e7d960e21b8152336004820152602481018c905290516001600160a01b038e1691635f179f649160448083019260209291908290030181600087803b158015613b7c57600080fd5b505af1158015613b90573d6000803e3d6000fd5b505050506040513d6020811015613ba657600080fd5b505193505b888510158015613bbb5750878410155b613bf65760405162461bcd60e51b8152600401808060200182810382526027815260200180614f596027913960400191505060405180910390fd5b50506000805460ff1916905550909890975095505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460ff1615613c9d576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015613cee576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b613d653386876001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015613d2c57600080fd5b505afa158015613d40573d6000803e3d6000fd5b505050506040513d6020811015613d5657600080fd5b505187600160ff8916146144c2565b60408051639cf5453d60e01b815233600482015290516001600160a01b03871691639cf5453d91602480830192600092919082900301818387803b158015613dac57600080fd5b505af1158015613dc0573d6000803e3d6000fd5b50506000805460ff1916905550505050505050565b60005461010090046001600160a01b03163314613e25576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005461010090046001600160a01b03163314613ebd576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008142811015613f63576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111613fa7576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b60008711613fe65760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038c16916370a0823191602480820192602092909190829003018186803b15801561403057600080fd5b505afa158015614044573d6000803e3d6000fd5b505050506040513d602081101561405a57600080fd5b505187519091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630a5ea466908d9033908b906000906140a157fe5b60200260200101518d6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561412b57600080fd5b505af115801561413f573d6000803e3d6000fd5b506000925050505b87518110156143e157600188510381141561429e57600187166142015787818151811061417057fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156141cf57600080fd5b505af11580156141e3573d6000803e3d6000fd5b505050506040513d60208110156141f957600080fd5b506142999050565b87818151811061420d57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561426c57600080fd5b505af1158015614280573d6000803e3d6000fd5b505050506040513d602081101561429657600080fd5b50505b6143d5565b60018716614327578781815181106142b257fe5b60200260200101516001600160a01b031663bd6015b48983600101815181106142d757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561426c57600080fd5b87818151811061433357fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061435857fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156143a857600080fd5b505af11580156143bc573d6000803e3d6000fd5b505050506040513d60208110156143d257600080fd5b50505b600196871c9601614147565b50604080516370a0823160e01b8152336004820152905161442e9183916001600160a01b038e16916370a08231916024808301926020929190829003018186803b158015612dfd57600080fd5b92508783101561446f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b604080516001600160a01b03808e1682528c1660208201523381830152606081018b9052608081018590529051600080516020614eea8339815191529181900360a00190a1505098975050505050505050565b801561458357811561457e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561452957600080fd5b505af115801561453d573d6000803e3d6000fd5b505050506001600160a01b0385163014905061457e5761457e7f00000000000000000000000000000000000000000000000000000000000000008584614ac9565b61461f565b6040805163052f523360e11b81526001600160a01b038581166004830152878116602483015286811660448301526064820185905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b15801561460657600080fd5b505af115801561461a573d6000803e3d6000fd5b505050505b5050505050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561467757600080fd5b505afa15801561468b573d6000803e3d6000fd5b505050506040513d60208110156146a157600080fd5b50519050818110156146ea5780156146ce576146ce6001600160a01b03851684600063ffffffff614b1b16565b6146ea6001600160a01b0385168460001963ffffffff614b1b16565b50505050565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561474857600080fd5b505afa15801561475c573d6000803e3d6000fd5b505050506040513d602081101561477257600080fd5b505190505b92915050565b80156147e75761478c83614c2e565b156147cd576040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156147c7573d6000803e3d6000fd5b506147e7565b6147e76001600160a01b038416838363ffffffff614ac916565b505050565b80156148b35781156148ae577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561485e57600080fd5b505af1158015614872573d6000803e3d6000fd5b50506040516001600160a01b038716925084156108fc02915084906000818181858888f193505050501580156148ac573d6000803e3d6000fd5b505b6146ea565b81156146ea576146ea838584614ac9565b60006148cf83614c2e565b156148e557506001600160a01b03811631614777565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561493b57600080fd5b505afa15801561494f573d6000803e3d6000fd5b505050506040513d602081101561496557600080fd5b50519050614777565b6000828211156149b1576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b600080600080866001600160a01b03166336223ce96040518163ffffffff1660e01b8152600401604080518083038186803b1580156149f557600080fd5b505afa158015614a09573d6000803e3d6000fd5b505050506040513d6040811015614a1f57600080fd5b508051602090910151909250905080158015614a39575081155b15614a45578593508492505b80158015614a535750600082115b15614a6057859350600092505b600081118015614a705750600082115b15614abf576000614a818784614c4d565b90506000614a8f8784614c4d565b9050808211614aac57879550614aa58383614c7e565b9450614abc565b869450614ab98482614c7e565b95505b50505b5050935093915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526147e7908490614ca8565b801580614ba1575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614b7357600080fd5b505afa158015614b87573d6000803e3d6000fd5b505050506040513d6020811015614b9d57600080fd5b5051155b614bdc5760405162461bcd60e51b815260040180806020018281038252603681526020018061508c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526147e7908490614ca8565b6001600160a01b038116600080516020614fab83398151915214919050565b6000614c7782614c6b85670de0b6b3a764000063ffffffff614dfd16565b9063ffffffff614e5816565b9392505050565b6000670de0b6b3a7640000614c99848463ffffffff614dfd16565b81614ca057fe5b049392505050565b60006060836001600160a01b0316836040518082805190602001908083835b60208310614ce65780518252601f199092019160209182019101614cc7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614d48576040519150601f19603f3d011682016040523d82523d6000602084013e614d4d565b606091505b509150915081614da4576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156146ea57808060200190516020811015614dc057600080fd5b50516146ea5760405162461bcd60e51b815260040180806020018281038252602a81526020018061503d602a913960400191505060405180910390fd5b600082614e0c57506000614777565b82820282848281614e1957fe5b0414614c77576040805162461bcd60e51b815260206004820152600960248201526826aaa62fa2a92927a960b91b604482015290519081900360640190fd5b6000808211614e9f576040805162461bcd60e51b815260206004820152600e60248201526d2224ab24a224a723afa2a92927a960911b604482015290519081900360640190fd5b818381614ca057fefe444f444f563250726f787930323a2052455455524e5f414d4f554e545f5a45524f444f444f563250726f787930323a20455850495245440000000000000000000092ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a5221787444f444f563250726f787930323a20504149525f414441505445525f4e4f545f4d41544348444f444f563250726f787930323a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563250726f787930323a2052657475726e20444c50206973206e6f7420656e6f756768444f444f563250726f787930323a206465706f73697420616d6f756e74206973206e6f7420656e6f756768000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee444f444f563250726f787930323a2050414952535f454d505459000000000000444f444f563250726f787930323a204e6f742057686974656c69737420436f6e7472616374444f444f563250726f787930323a2045787465726e616c205377617020657865637574696f6e204661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564444f444f563250726f787930323a20504149525f4153534554544f5f4e4f545f4d415443485361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220ad86b25d9015e44584397f703bb1c2372be77b108e36e771bb292a272b32ecdc64736f6c6343000609003300000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe1300000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a80000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127000000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d7000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a
Deployed Bytecode
0x60806040526004361061016a5760003560e01c8063674d9422116100d1578063af1280b01161008a578063e7cd4a0411610064578063e7cd4a0414610b39578063eb99be1214610b6c578063f2fde38b14610b81578063f87dc1b714610bb457610171565b8063af1280b014610ad4578063b730d15014610ae9578063db70b5c714610afe57610171565b8063674d94221461091157806369e4e4171461097c5780636f9170f6146109915780638456db15146109d85780638b3bb089146109ed57806399882c8f14610a6e57610171565b80631e6d24c2116101235780631e6d24c2146104775780632042e5c21461054e57806323c38fa3146105815780634e71e0c8146107595780635028bb951461076e57806354bacd131461083157610171565b80630d009297146101735780630d4eec8f146101a65780630d9be500146101d75780630dd4ebd91461023557806312ff148d1461031b57806316048bc41461046257610171565b3661017157005b005b34801561017f57600080fd5b506101716004803603602081101561019657600080fd5b50356001600160a01b0316610c95565b3480156101b257600080fd5b506101bb610d22565b604080516001600160a01b039092168252519081900360200190f35b6101bb60048036036101208110156101ee57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135610d46565b610309600480360361010081101561024c57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561028b57600080fd5b82018360208201111561029d57600080fd5b803590602001918460208302840111600160201b831117156102be57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060208101351515906040013561100a565b60408051918252519081900360200190f35b610171600480360360e081101561033157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561035b57600080fd5b82018360208201111561036d57600080fd5b803590602001918460208302840111600160201b8311171561038e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103dd57600080fd5b8201836020820111156103ef57600080fd5b803590602001918460208302840111600160201b8311171561041057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505060ff83351693505050602081013590604081013590606001356116fc565b34801561046e57600080fd5b506101bb611ba0565b34801561048357600080fd5b50610309600480360360e081101561049a57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156104d057600080fd5b8201836020820111156104e257600080fd5b803590602001918460208302840111600160201b8311171561050357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135611bb4565b34801561055a57600080fd5b506101716004803603602081101561057157600080fd5b50356001600160a01b03166121d8565b610309600480360361014081101561059857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156105d757600080fd5b8201836020820111156105e957600080fd5b803590602001918460208302840111600160201b8311171561060a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460208302840111600160201b8311171561068c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106db57600080fd5b8201836020820111156106ed57600080fd5b803590602001918460208302840111600160201b8311171561070e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612249565b34801561076557600080fd5b506101716127d0565b610309600480360360c081101561078457600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111600160201b831117156107e657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612894565b610309600480360361012081101561084857600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561089657600080fd5b8201836020820111156108a857600080fd5b803590602001918460018302840111600160201b831117156108c957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050505080351515915060200135612ed2565b61095e600480360360e081101561092757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c001356132b6565b60408051938452602084019290925282820152519081900360600190f35b34801561098857600080fd5b506101bb6135bc565b34801561099d57600080fd5b506109c4600480360360208110156109b457600080fd5b50356001600160a01b03166135e0565b604080519115158252519081900360200190f35b3480156109e457600080fd5b506101bb6135f5565b610a4b6004803603610120811015610a0457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135613604565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610abb600480360360e0811015610a8457600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c001356138d6565b6040805192835260208301919091528051918290030190f35b348015610ae057600080fd5b506101bb613c11565b348015610af557600080fd5b506101bb613c35565b61017160048036036080811015610b1457600080fd5b506001600160a01b038135169060208101359060ff6040820135169060600135613c59565b348015610b4557600080fd5b5061017160048036036020811015610b5c57600080fd5b50356001600160a01b0316613dd5565b348015610b7857600080fd5b506101bb613e49565b348015610b8d57600080fd5b5061017160048036036020811015610ba457600080fd5b50356001600160a01b0316613e6d565b348015610bc057600080fd5b506103096004803603610100811015610bd857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610c1757600080fd5b820183602082011115610c2957600080fd5b803590602001918460208302840111600160201b83111715610c4a57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135613f1d565b600154600160a01b900460ff1615610ce7576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127081565b6000805460ff1615610d8b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558142811015610ddc576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b7f00000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a86001600160a01b03166309b8adb86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e3757600080fd5b505af1158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b505191508a8a610e8d3385848e6001600160a01b038216600080516020614fab833981519152146144c2565b610eb33385838d6001600160a01b038216600080516020614fab833981519152146144c2565b6001600160a01b038216600080516020614fab8339815191521415610ef6577f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127091505b6001600160a01b038116600080516020614fab8339815191521415610f3857507f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12705b6040805162caf77f60e51b81526001600160a01b03868116600483015233602483015284811660448301528381166064830152608482018c905260a482018a905260c482018b905288151560e483015291517f00000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a89092169163195eefe0916101048082019260009290919082900301818387803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b50506000805460ff1916905550939d9c50505050505050505050505050565b60008142811015611050576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111611094576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b600087116110d35760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b89896110fb3330848d6001600160a01b038216600080516020614fab833981519152146144c2565b60005b88518110156114f857600089828151811061111557fe5b6020026020010151905088600116600014156112bd576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116657600080fd5b505afa15801561117a573d6000803e3d6000fd5b505050506040513d602081101561119057600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d602081101561120857600080fd5b505190506112266001600160a01b038316848363ffffffff61462616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b505050506040513d60208110156112b357600080fd5b506114eb92505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561137057600080fd5b505afa158015611384573d6000803e3d6000fd5b505050506040513d602081101561139a57600080fd5b505190506113b86001600160a01b038316848363ffffffff61462616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a169163ca19ebd9916044808301926020929190829003018186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b1580156114bb57600080fd5b505af11580156114cf573d6000803e3d6000fd5b505050506040513d60208110156114e557600080fd5b50505050505b50600197881c97016110fe565b506001600160a01b038116600080516020614fab833981519152141561163357604080516370a0823160e01b815230600482015290516001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127016916370a08231916024808301926020929190829003018186803b15801561157e57600080fd5b505afa158015611592573d6000803e3d6000fd5b505050506040513d60208110156115a857600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519195506001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12701691632e1a7d4d9160248082019260009290919082900301818387803b15801561161657600080fd5b505af115801561162a573d6000803e3d6000fd5b5050505061164f565b61164c6001600160a01b0382163063ffffffff6146f016565b93505b8884101561168e5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b6116a86001600160a01b038216338663ffffffff61477d16565b604080516001600160a01b038085168252831660208201523381830152606081018c9052608081018690529051600080516020614eea8339815191529181900360a00190a150505098975050505050505050565b60005460ff1615611740576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015611791576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b61181c33898a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117cf57600080fd5b505afa1580156117e3573d6000803e3d6000fd5b505050506040513d60208110156117f957600080fd5b505189518a9060009061180857fe5b60200260200101518960ff166001146144c2565b6118a933898a6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d602081101561188457600080fd5b505189518a90600190811061189557fe5b60200260200101518960ff166002146144c2565b876001600160a01b03166316048bc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b505050506040513d602081101561190e57600080fd5b505187516001600160a01b0390911690638ff3928c9033908a9060009061193157fe5b60200260200101518a60018151811061194657fe5b60200260200101518b60028151811061195b57fe5b60200260200101518b60028151811061197057fe5b60200260200101518c60038151811061198557fe5b60200260200101518b8b6040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b158015611a0857600080fd5b505af1158015611a1c573d6000803e3d6000fd5b505050506040513d6020811015611a3257600080fd5b5051611a74576040805162461bcd60e51b815260206004820152600c60248201526b14995cd95d0811985a5b195960a21b604482015290519081900360640190fd5b611b0033896001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d6020811015611adb57600080fd5b5051885189906002908110611aec57fe5b60200260200101518860ff166003146147ec565b611b8c33896001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611b3d57600080fd5b505afa158015611b51573d6000803e3d6000fd5b505050506040513d6020811015611b6757600080fd5b5051885189906003908110611b7857fe5b60200260200101518860ff166004146147ec565b50506000805460ff19169055505050505050565b60005461010090046001600160a01b031681565b60008142811015611bfa576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111611c3e576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b60008711611c7d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b7f00000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d76001600160a01b0316630a5ea4668a3389600081518110611cbb57fe5b60200260200101518c6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b506000925050505b8651811015611ffb576001875103811415611eb85760018616611e1b57868181518110611d8a57fe5b60200260200101516001600160a01b031663bd6015b4306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611de957600080fd5b505af1158015611dfd573d6000803e3d6000fd5b505050506040513d6020811015611e1357600080fd5b50611eb39050565b868181518110611e2757fe5b60200260200101516001600160a01b031663dd93f59a306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611e8657600080fd5b505af1158015611e9a573d6000803e3d6000fd5b505050506040513d6020811015611eb057600080fd5b50505b611fef565b60018616611f4157868181518110611ecc57fe5b60200260200101516001600160a01b031663bd6015b4888360010181518110611ef157fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611e8657600080fd5b868181518110611f4d57fe5b60200260200101516001600160a01b031663dd93f59a888360010181518110611f7257fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611fc257600080fd5b505af1158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b50505b600195861c9501611d61565b50604080516370a0823160e01b815230600482015290516001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127016916370a08231916024808301926020929190829003018186803b15801561206257600080fd5b505afa158015612076573d6000803e3d6000fd5b505050506040513d602081101561208c57600080fd5b50519150868210156120cf5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561213557600080fd5b505af1158015612149573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f1935050505015801561217a573d6000803e3d6000fd5b50604080516001600160a01b038b168152600080516020614fab83398151915260208201523381830152606081018a9052608081018490529051600080516020614eea8339815191529181900360a00190a150979650505050505050565b60005461010090046001600160a01b03163314612228576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19169055565b6000814281101561228f576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008751116122d3576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b87518751146123135760405162461bcd60e51b8152600401808060200182810382526025815260200180614f0a6025913960400191505060405180910390fd5b60018651038751146123565760405162461bcd60e51b81526004018080602001828103825260258152602001806150676025913960400191505060405180910390fd5b600089116123955760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b8b8b8b60006123b36001600160a01b0384163363ffffffff6148c416565b90506123f8338b6000815181106123c657fe5b60200260200101518685600080516020614fab8339815191526001600160a01b0316896001600160a01b0316146144c2565b60005b8b518110156125a45760018a166124d4578c818151811061241857fe5b60200260200101516001600160a01b03166330e6ae318c836001018151811061243d57fe5b60200260200101518e848151811061245157fe5b6020908102919091010151604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260606044830152600060648301819052905160a48084019382900301818387803b1580156124b757600080fd5b505af11580156124cb573d6000803e3d6000fd5b50505050612598565b8c81815181106124e057fe5b60200260200101516001600160a01b0316636f7929f28c836001018151811061250557fe5b60200260200101518e848151811061251957fe5b6020908102919091010151604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260606044830152600060648301819052905160a48084019382900301818387803b15801561257f57600080fd5b505af1158015612593573d6000803e3d6000fd5b505050505b6001998a1c99016123fb565b506001600160a01b038316600080516020614fab833981519152141561270d57604080516370a0823160e01b815230600482015290516001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127016916370a08231916024808301926020929190829003018186803b15801561262a57600080fd5b505afa15801561263e573d6000803e3d6000fd5b505050506040513d602081101561265457600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519197506001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12701691632e1a7d4d9160248082019260009290919082900301818387803b1580156126c257600080fd5b505af11580156126d6573d6000803e3d6000fd5b505060405133925088156108fc02915088906000818181858888f19350505050158015612707573d6000803e3d6000fd5b50612739565b6127368161272a6001600160a01b0386163363ffffffff6146f016565b9063ffffffff61496e16565b95505b8c8610156127785760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b604080516001600160a01b03808716825285166020820152338183015260608101849052608081018890529051600080516020614eea8339815191529181900360a00190a150505050509a9950505050505050505050565b6001546001600160a01b0316331461281f576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600081428110156128da576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b600086511161291e576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b6000871161295d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038b16916370a0823191602480820192602092909190829003018186803b1580156129a757600080fd5b505afa1580156129bb573d6000803e3d6000fd5b505050506040513d60208110156129d157600080fd5b505160408051630d0e30db60e41b815290519192506001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270169163d0e30db0913491600480830192600092919082900301818588803b158015612a3957600080fd5b505af1158015612a4d573d6000803e3d6000fd5b50505050507f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663a9059cbb88600081518110612a8e57fe5b6020026020010151346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050506040513d6020811015612b1057600080fd5b50600090505b8751811015612db0576001885103811415612c6d5760018716612bd057878181518110612b3f57fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612b9e57600080fd5b505af1158015612bb2573d6000803e3d6000fd5b505050506040513d6020811015612bc857600080fd5b50612c689050565b878181518110612bdc57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c3b57600080fd5b505af1158015612c4f573d6000803e3d6000fd5b505050506040513d6020811015612c6557600080fd5b50505b612da4565b60018716612cf657878181518110612c8157fe5b60200260200101516001600160a01b031663bd6015b4898360010181518110612ca657fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c3b57600080fd5b878181518110612d0257fe5b60200260200101516001600160a01b031663dd93f59a898360010181518110612d2757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612d7757600080fd5b505af1158015612d8b573d6000803e3d6000fd5b505050506040513d6020811015612da157600080fd5b50505b600196871c9601612b16565b50604080516370a0823160e01b81523360048201529051612e359183916001600160a01b038d16916370a08231916024808301926020929190829003018186803b158015612dfd57600080fd5b505afa158015612e11573d6000803e3d6000fd5b505050506040513d6020811015612e2757600080fd5b50519063ffffffff61496e16565b925087831015612e765760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b60408051600080516020614fab83398151915281526001600160a01b038b1660208201523381830152346060820152608081018590529051600080516020614eea8339815191529181900360a00190a150509695505050505050565b60008142811015612f18576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008611612f575760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b6000612f726001600160a01b038c163363ffffffff6148c416565b90506001600160a01b038c16600080516020614fab8339815191521461303e576040805163052f523360e11b81526001600160a01b038e81166004830152336024830152306044830152606482018b905291517f00000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d790921691630a5ea4669160848082019260009290919082900301818387803b15801561301157600080fd5b505af1158015613025573d6000803e3d6000fd5b5061303e925050506001600160a01b038d168b8a614626565b6001600160a01b03891660009081526002602052604090205460ff166130955760405162461bcd60e51b8152600401808060200182810382526025815260200180614feb6025913960400191505060405180910390fd5b60006001600160a01b03808b16908e16600080516020614fab833981519152146130c05760006130c2565b345b886040518082805190602001908083835b602083106130f25780518252601f1990920191602091820191016130d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613154576040519150601f19603f3d011682016040523d82523d6000602084013e613159565b606091505b50509050806131995760405162461bcd60e51b815260040180806020018281038252602d815260200180615010602d913960400191505060405180910390fd5b6131cd336131b66001600160a01b038f163063ffffffff6148c416565b6001600160a01b038f16919063ffffffff61477d16565b6131ea8261272a6001600160a01b038f163363ffffffff6148c416565b93508784101561322b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b600080516020614eea8339815191528d8d338c8860405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050509998505050505050505050565b600080548190819060ff16156132ff576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558342811015613350576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b8a61335c818c8c6149b7565b90945092508884108015906133715750878310155b6133ac5760405162461bcd60e51b815260040180806020018281038252602b815260200180614f80602b913960400191505060405180910390fd5b6134233382836001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ea57600080fd5b505afa1580156133fe573d6000803e3d6000fd5b505050506040513d602081101561341457600080fd5b505187600160ff8d16146144c2565b61349a3382836001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561346157600080fd5b505afa158015613475573d6000803e3d6000fd5b505050506040513d602081101561348b57600080fd5b505186600260ff8d16146144c2565b60408051634c85b42560e01b815233600482015290516001600160a01b03831691634c85b4259160248083019260609291908290030181600087803b1580156134e257600080fd5b505af11580156134f6573d6000803e3d6000fd5b505050506040513d606081101561350c57600080fd5b50519450600160ff881614801561352257508334115b156135585760405133903486900380156108fc02916000818181858888f19350505050158015613556573d6000803e3d6000fd5b505b8660ff16600214801561356a57508234115b156135a05760405133903485900380156108fc02916000818181858888f1935050505015801561359e573d6000803e3d6000fd5b505b50506000805460ff191690559199909850909650945050505050565b7f00000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe1381565b60026020526000908152604090205460ff1681565b6001546001600160a01b031681565b60008054819060ff161561364b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561369c576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60006001600160a01b038d16600080516020614fab833981519152146136c2578c6136e4565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12705b905060006001600160a01b038d16600080516020614fab8339815191521461370c578c61372e565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12705b6040805163e18c40c760e01b81526001600160a01b0385811660048301528381166024830152604482018e9052606482018d9052608482018c90528a151560a483015291519293507f00000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe139091169163e18c40c79160c4808201926020929091908290030181600087803b1580156137c357600080fd5b505af11580156137d7573d6000803e3d6000fd5b505050506040513d60208110156137ed57600080fd5b505194508d91508c905061381d3386848f6001600160a01b038216600080516020614fab833981519152146144c2565b6138433386838e6001600160a01b038216600080516020614fab833981519152146144c2565b505060408051634c85b42560e01b815233600482015290516001600160a01b03851691634c85b4259160248083019260609291908290030181600087803b15801561388d57600080fd5b505af11580156138a1573d6000803e3d6000fd5b505050506040513d60608110156138b757600080fd5b50516000805460ff19169055929c929b50919950505050505050505050565b60008054819060ff161561391d576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561396e576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a957600080fd5b505afa1580156139bd573d6000803e3d6000fd5b505050506040513d60208110156139d357600080fd5b505160408051636a5cb82360e11b815290519192506000916001600160a01b038e169163d4b97046916004808301926020929190829003018186803b158015613a1b57600080fd5b505afa158015613a2f573d6000803e3d6000fd5b505050506040513d6020811015613a4557600080fd5b50519050613a5c3330848e600160ff8d16146144c2565b613a6f3330838d8b60ff166002146144c2565b8a15613b0d57613a8f6001600160a01b0383168d8d63ffffffff61462616565b6040805163aa06ce9b60e01b8152336004820152602481018d905290516001600160a01b038e169163aa06ce9b9160448083019260209291908290030181600087803b158015613ade57600080fd5b505af1158015613af2573d6000803e3d6000fd5b505050506040513d6020811015613b0857600080fd5b505194505b8915613bab57613b2d6001600160a01b0382168d8c63ffffffff61462616565b604080516317c5e7d960e21b8152336004820152602481018c905290516001600160a01b038e1691635f179f649160448083019260209291908290030181600087803b158015613b7c57600080fd5b505af1158015613b90573d6000803e3d6000fd5b505050506040513d6020811015613ba657600080fd5b505193505b888510158015613bbb5750878410155b613bf65760405162461bcd60e51b8152600401808060200182810382526027815260200180614f596027913960400191505060405180910390fd5b50506000805460ff1916905550909890975095505050505050565b7f000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a81565b7f00000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a881565b60005460ff1615613c9d576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015613cee576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b613d653386876001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015613d2c57600080fd5b505afa158015613d40573d6000803e3d6000fd5b505050506040513d6020811015613d5657600080fd5b505187600160ff8916146144c2565b60408051639cf5453d60e01b815233600482015290516001600160a01b03871691639cf5453d91602480830192600092919082900301818387803b158015613dac57600080fd5b505af1158015613dc0573d6000803e3d6000fd5b50506000805460ff1916905550505050505050565b60005461010090046001600160a01b03163314613e25576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b7f00000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d781565b60005461010090046001600160a01b03163314613ebd576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008142811015613f63576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111613fa7576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b60008711613fe65760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038c16916370a0823191602480820192602092909190829003018186803b15801561403057600080fd5b505afa158015614044573d6000803e3d6000fd5b505050506040513d602081101561405a57600080fd5b505187519091506001600160a01b037f00000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d71690630a5ea466908d9033908b906000906140a157fe5b60200260200101518d6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561412b57600080fd5b505af115801561413f573d6000803e3d6000fd5b506000925050505b87518110156143e157600188510381141561429e57600187166142015787818151811061417057fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156141cf57600080fd5b505af11580156141e3573d6000803e3d6000fd5b505050506040513d60208110156141f957600080fd5b506142999050565b87818151811061420d57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561426c57600080fd5b505af1158015614280573d6000803e3d6000fd5b505050506040513d602081101561429657600080fd5b50505b6143d5565b60018716614327578781815181106142b257fe5b60200260200101516001600160a01b031663bd6015b48983600101815181106142d757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561426c57600080fd5b87818151811061433357fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061435857fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156143a857600080fd5b505af11580156143bc573d6000803e3d6000fd5b505050506040513d60208110156143d257600080fd5b50505b600196871c9601614147565b50604080516370a0823160e01b8152336004820152905161442e9183916001600160a01b038e16916370a08231916024808301926020929190829003018186803b158015612dfd57600080fd5b92508783101561446f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b604080516001600160a01b03808e1682528c1660208201523381830152606081018b9052608081018590529051600080516020614eea8339815191529181900360a00190a1505098975050505050505050565b801561458357811561457e577f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561452957600080fd5b505af115801561453d573d6000803e3d6000fd5b505050506001600160a01b0385163014905061457e5761457e7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708584614ac9565b61461f565b6040805163052f523360e11b81526001600160a01b038581166004830152878116602483015286811660448301526064820185905291517f00000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d790921691630a5ea4669160848082019260009290919082900301818387803b15801561460657600080fd5b505af115801561461a573d6000803e3d6000fd5b505050505b5050505050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561467757600080fd5b505afa15801561468b573d6000803e3d6000fd5b505050506040513d60208110156146a157600080fd5b50519050818110156146ea5780156146ce576146ce6001600160a01b03851684600063ffffffff614b1b16565b6146ea6001600160a01b0385168460001963ffffffff614b1b16565b50505050565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561474857600080fd5b505afa15801561475c573d6000803e3d6000fd5b505050506040513d602081101561477257600080fd5b505190505b92915050565b80156147e75761478c83614c2e565b156147cd576040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156147c7573d6000803e3d6000fd5b506147e7565b6147e76001600160a01b038416838363ffffffff614ac916565b505050565b80156148b35781156148ae577f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561485e57600080fd5b505af1158015614872573d6000803e3d6000fd5b50506040516001600160a01b038716925084156108fc02915084906000818181858888f193505050501580156148ac573d6000803e3d6000fd5b505b6146ea565b81156146ea576146ea838584614ac9565b60006148cf83614c2e565b156148e557506001600160a01b03811631614777565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561493b57600080fd5b505afa15801561494f573d6000803e3d6000fd5b505050506040513d602081101561496557600080fd5b50519050614777565b6000828211156149b1576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b600080600080866001600160a01b03166336223ce96040518163ffffffff1660e01b8152600401604080518083038186803b1580156149f557600080fd5b505afa158015614a09573d6000803e3d6000fd5b505050506040513d6040811015614a1f57600080fd5b508051602090910151909250905080158015614a39575081155b15614a45578593508492505b80158015614a535750600082115b15614a6057859350600092505b600081118015614a705750600082115b15614abf576000614a818784614c4d565b90506000614a8f8784614c4d565b9050808211614aac57879550614aa58383614c7e565b9450614abc565b869450614ab98482614c7e565b95505b50505b5050935093915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526147e7908490614ca8565b801580614ba1575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614b7357600080fd5b505afa158015614b87573d6000803e3d6000fd5b505050506040513d6020811015614b9d57600080fd5b5051155b614bdc5760405162461bcd60e51b815260040180806020018281038252603681526020018061508c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526147e7908490614ca8565b6001600160a01b038116600080516020614fab83398151915214919050565b6000614c7782614c6b85670de0b6b3a764000063ffffffff614dfd16565b9063ffffffff614e5816565b9392505050565b6000670de0b6b3a7640000614c99848463ffffffff614dfd16565b81614ca057fe5b049392505050565b60006060836001600160a01b0316836040518082805190602001908083835b60208310614ce65780518252601f199092019160209182019101614cc7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614d48576040519150601f19603f3d011682016040523d82523d6000602084013e614d4d565b606091505b509150915081614da4576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156146ea57808060200190516020811015614dc057600080fd5b50516146ea5760405162461bcd60e51b815260040180806020018281038252602a81526020018061503d602a913960400191505060405180910390fd5b600082614e0c57506000614777565b82820282848281614e1957fe5b0414614c77576040805162461bcd60e51b815260206004820152600960248201526826aaa62fa2a92927a960b91b604482015290519081900360640190fd5b6000808211614e9f576040805162461bcd60e51b815260206004820152600e60248201526d2224ab24a224a723afa2a92927a960911b604482015290519081900360640190fd5b818381614ca057fefe444f444f563250726f787930323a2052455455524e5f414d4f554e545f5a45524f444f444f563250726f787930323a20455850495245440000000000000000000092ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a5221787444f444f563250726f787930323a20504149525f414441505445525f4e4f545f4d41544348444f444f563250726f787930323a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563250726f787930323a2052657475726e20444c50206973206e6f7420656e6f756768444f444f563250726f787930323a206465706f73697420616d6f756e74206973206e6f7420656e6f756768000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee444f444f563250726f787930323a2050414952535f454d505459000000000000444f444f563250726f787930323a204e6f742057686974656c69737420436f6e7472616374444f444f563250726f787930323a2045787465726e616c205377617020657865637574696f6e204661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564444f444f563250726f787930323a20504149525f4153534554544f5f4e4f545f4d415443485361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220ad86b25d9015e44584397f703bb1c2372be77b108e36e771bb292a272b32ecdc64736f6c63430006090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe1300000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a80000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127000000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d7000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a
-----Decoded View---------------
Arg [0] : dvmFactory (address): 0x79887f65f83bdf15Bcc8736b5e5BcDB48fb8fE13
Arg [1] : dppFactory (address): 0x95E887aDF9EAa22cC1c6E3Cb7f07adC95b4b25a8
Arg [2] : weth (address): 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270
Arg [3] : dodoApproveProxy (address): 0x01FEEA29da5Ae41B0b5F6b10b93EE34752eF80d7
Arg [4] : dodoSellHelper (address): 0xDfaf9584F5d229A9DBE5978523317820A8897C5A
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe13
Arg [1] : 00000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a8
Arg [2] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [3] : 00000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d7
Arg [4] : 000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a
Deployed Bytecode Sourcemap
32555:22846:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10246:127;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10246:127:0;-1:-1:-1;;;;;10246:127:0;;:::i;32841:31::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;32841:31:0;;;;;;;;;;;;;;38678:1270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38678:1270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48308:2378::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48308:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48308:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48308:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48308:2378:0;;-1:-1:-1;;48308:2378:0;;;-1:-1:-1;;;48308:2378:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39956:1391;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39956:1391:0;;;;;;;;;;;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39956:1391:0;;;;;;;;-1:-1:-1;39956:1391:0;;-1:-1:-1;;;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39956:1391:0;;-1:-1:-1;;39956:1391:0;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;:::i;9613:22::-;;;;;;;;;;;;;:::i;43096:1716::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43096:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43096:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43096:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43096:1716:0;;-1:-1:-1;;43096:1716:0;;;-1:-1:-1;;;43096:1716:0;;;;;;;;;;;:::i;34120:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34120:119:0;-1:-1:-1;;;;;34120:119:0;;:::i;50696:2075::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50696:2075:0;;;;;;;;-1:-1:-1;50696:2075:0;;-1:-1:-1;;;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50696:2075:0;;;;;;;;-1:-1:-1;50696:2075:0;;-1:-1:-1;;;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50696:2075:0;;-1:-1:-1;;50696:2075:0;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;:::i;10552:228::-;;;;;;;;;;;;;:::i;41396:1692::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41396:1692:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41396:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41396:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41396:1692:0;;-1:-1:-1;;41396:1692:0;;;-1:-1:-1;;;41396:1692:0;;;;;;;;;;;:::i;46564:1736::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46564:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46564:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46564:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46564:1736:0;;-1:-1:-1;;;;46564:1736:0;;;;;-1:-1:-1;46564:1736:0;;;;:::i;35854:1465::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35854:1465:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;32981:38;;;;;;;;;;;;;:::i;33071:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33071:46:0;-1:-1:-1;;;;;33071:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;9642:26;;;;;;;;;;;;;:::i;34322:1524::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34322:1524:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;34322:1524:0;;;;;;;;;;;;;;;;;;;;;53227:1214;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53227:1214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32931:43;;;;;;;;;;;;;:::i;33026:38::-;;;;;;;;;;;;;:::i;52841:376::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52841:376:0;;;;;;;;;;;;;;;;;;;;:::i;33997:115::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33997:115:0;-1:-1:-1;;;;;33997:115:0;;:::i;32879:45::-;;;;;;;;;;;;;:::i;10381:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10381:163:0;-1:-1:-1;;;;;10381:163:0;;:::i;44820:1736::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44820:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44820:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44820:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44820:1736:0;;-1:-1:-1;;44820:1736:0;;;-1:-1:-1;;;44820:1736:0;;;;;;;;;;;:::i;10246:127::-;10035:13;;-1:-1:-1;;;10035:13:0;;;;10034:14;10026:43;;;;;-1:-1:-1;;;10026:43:0;;;;;;;;;;;;-1:-1:-1;;;10026:43:0;;;;;;;;;;;;;;;10332:4:::1;10316:20:::0;;-1:-1:-1;;;;10316:20:0::1;-1:-1:-1::0;;;10316:20:0::1;::::0;;;10347:18;;-1:-1:-1;;;;;10347:18:0;;::::1;10316:20;10347:18;-1:-1:-1::0;;;;;;10347:18:0;;::::1;::::0;;;::::1;::::0;;10246:127::o;32841:31::-;;;:::o;38678:1270::-;39086:22;32013:9;;;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;39058:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;39151:13:::2;-1:-1:-1::0;;;;;39143:44:0::2;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;39143:46:0;;-1:-1:-1;39223:9:0;39265:10;39286:91:::2;39295:10;39143:46:::0;39223:9;39335:12;-1:-1:-1;;;;;39349:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39349:27:0::2;39286:8;:91::i;:::-;39388:170;39411:10;39436:14:::0;39465:11;39491:13;-1:-1:-1;;;;;39519:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39519:28:0::2;39388:8;:170::i;:::-;-1:-1:-1::0;;;;;39575:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39575:27:0::2;39571:52;;;39617:6;39604:19;;39571:52;-1:-1:-1::0;;;;;39638:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39638:28:0::2;39634:54;;;-1:-1:-1::0;39682:6:0::2;39634:54;39701:239;::::0;;-1:-1:-1;;;39701:239:0;;-1:-1:-1;;;;;39701:239:0;;::::2;;::::0;::::2;::::0;39787:10:::2;39701:239:::0;;;;;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;39709:13:::2;39701:42:::0;;::::2;::::0;::::2;::::0;:239;;;;;-1:-1:-1;;39701:239:0;;;;;;;;-1:-1:-1;39701:42:0;:239;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;38678:1270:0;;;-1:-1:-1;;;;;;;;;;;;;38678:1270:0:o;48308:2378::-;48668:20;48640:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;48733:1:::1;48714:9;:16;:20;48706:59;;;::::0;;-1:-1:-1;;;48706:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;48706:59:0;;;;;;;;;;;;;::::1;;48802:1;48784:15;:19;48776:65;;;;-1:-1:-1::0;;;48776:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48885:9:::0;48924:7;48952:93:::1;48961:10;48981:4;48885:9:::0;49000:15;-1:-1:-1;;;;;49017:27:0;::::1;-1:-1:-1::0;;;;;;;;;;;49017:27:0::1;48952:8;:93::i;:::-;49063:9;49058:1070;49082:9;:16;49078:1;:20;49058:1070;;;49120:19;49142:9;49152:1;49142:12;;;;;;;;;;;;;;49120:34;;49173:10;49186:1;49173:14;49191:1;49173:19;49169:905;;;49213:19;49243:11;-1:-1:-1::0;;;;;49235:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49235:35:0;49311:44:::1;::::0;;-1:-1:-1;;;49311:44:0;;49349:4:::1;49311:44;::::0;::::1;::::0;;;49235:35;;-1:-1:-1;49289:19:0::1;::::0;-1:-1:-1;;;;;49311:29:0;::::1;::::0;::::1;::::0;:44;;;;;49235:35:::1;::::0;49311:44;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49311:44:0;;-1:-1:-1;49374:65:0::1;-1:-1:-1::0;;;;;49374:39:0;::::1;49414:11:::0;49311:44;49374:65:::1;:39;:65;:::i;:::-;49466:11;-1:-1:-1::0;;;;;49458:34:0::1;;49493:11;49506:1;49458:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49169:905:0::1;::::0;-1:-1:-1;;;49169:905:0::1;;49553:20;49584:11;-1:-1:-1::0;;;;;49576:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49576:36:0;49653:45:::1;::::0;;-1:-1:-1;;;49653:45:0;;49692:4:::1;49653:45;::::0;::::1;::::0;;;49576:36;;-1:-1:-1;49631:19:0::1;::::0;-1:-1:-1;;;;;49653:30:0;::::1;::::0;::::1;::::0;:45;;;;;49576:36:::1;::::0;49653:45;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49653:45:0;;-1:-1:-1;49717:66:0::1;-1:-1:-1::0;;;;;49717:40:0;::::1;49758:11:::0;49653:45;49717:66:::1;:40;:66;:::i;:::-;49829:142;::::0;;-1:-1:-1;;;49829:142:0;;-1:-1:-1;;;;;49829:142:0;;::::1;;::::0;::::1;::::0;;;;;;;;;49802:24:::1;::::0;49845:18:::1;49829:55;::::0;::::1;::::0;:142;;;;;::::1;::::0;;;;;;;;:55;:142;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49829:142:0;49990:68:::1;::::0;;-1:-1:-1;;;49990:68:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;49990:68:0;;;;;;;;49829:142;;-1:-1:-1;;;;;;49990:33:0;::::1;::::0;::::1;::::0;:68;;;;;49829:142:::1;::::0;49990:68;;;;;;;;;;;:33;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;49169:905:0::1;-1:-1:-1::0;50115:1:0::1;50101:15:::0;;::::1;::::0;49100:3:::1;49058:1070;;;-1:-1:-1::0;;;;;;50154:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;50154:25:0::1;50150:256;;;50211:38;::::0;;-1:-1:-1;;;50211:38:0;;50243:4:::1;50211:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;50217:6:0::1;50211:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50211:38:0;50264:36:::1;::::0;;-1:-1:-1;;;50264:36:0;;::::1;::::0;::::1;::::0;;;;;50211:38;;-1:-1:-1;;;;;;50270:6:0::1;50264:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;50264:36:0;;;;;;;;-1:-1:-1;50264:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50150:256;;;50348:46;-1:-1:-1::0;;;;;50348:31:0;::::1;50388:4;50348:46;:31;:46;:::i;:::-;50333:61;;50150:256;50450:15;50434:12;:31;;50426:86;;;;-1:-1:-1::0;;;50426:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50523:60;-1:-1:-1::0;;;;;50523:34:0;::::1;50558:10;50570:12:::0;50523:60:::1;:34;:60;:::i;:::-;50601:77;::::0;;-1:-1:-1;;;;;50601:77:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;50636:10:::1;50601:77:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;50601:77:0;;;;;;;::::1;33512:1;;48308:2378:::0;;;;;;;;;;;:::o;39956:1391::-;32013:9;;;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;40461:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;40482:170:::2;40505:10;40530;40563;-1:-1:-1::0;;;;;40555:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40555:34:0;40604:13;;:10;;40615:1:::2;::::0;40604:13:::2;;;;;;;;;;40632:4;:9;;40640:1;40632:9;40482:8;:170::i;:::-;40663:171;40686:10;40711;40744;-1:-1:-1::0;;;;;40736:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40736:35:0;40786:13;;:10;;40797:1:::2;::::0;40786:13;::::2;;;;;;;;;;;40814:4;:9;;40822:1;40814:9;40663:8;:171::i;:::-;40871:10;-1:-1:-1::0;;;;;40863:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40863:29:0;40939:12;;-1:-1:-1;;;;;40855:44:0;;::::2;::::0;::::2;::::0;40914:10:::2;::::0;40939:9;;40949:1:::2;::::0;40939:12:::2;;;;;;;;;;40966:9;40976:1;40966:12;;;;;;;;;;;;;;40993:9;41003:1;40993:12;;;;;;;;;;;;;;41020:10;41031:1;41020:13;;;;;;;;;;;;;;41048:10;41059:1;41048:13;;;;;;;;;;;;;;41076:14;41105:15;40855:276;;;;;;;;;;;;;-1:-1:-1::0;;;;;40855:276:0::2;-1:-1:-1::0;;;;;40855:276:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40855:276:0;40847:301:::2;;;::::0;;-1:-1:-1;;;40847:301:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40847:301:0;;;;;;;;;;;;;::::2;;41161:83;41171:10;41191;-1:-1:-1::0;;;;;41183:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;41183:34:0;41219:13;;:10;;41230:1:::2;::::0;41219:13;::::2;;;;;;;;;;;41234:4;:9;;41242:1;41234:9;41161;:83::i;:::-;41255:84;41265:10;41285;-1:-1:-1::0;;;;;41277:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;41277:35:0;41314:13;;:10;;41325:1:::2;::::0;41314:13;::::2;;;;;;;;;;;41329:4;:9;;41337:1;41329:9;41255;:84::i;:::-;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;;;;;;39956:1391:0:o;9613:22::-;;;;;;-1:-1:-1;;;;;9613:22:0;;:::o;43096:1716::-;43423:20;43395:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;43488:1:::1;43469:9;:16;:20;43461:59;;;::::0;;-1:-1:-1;;;43461:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;43461:59:0;;;;;;;;;;;;;::::1;;43557:1;43539:15;:19;43531:65;;;;-1:-1:-1::0;;;43531:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43635:20;-1:-1:-1::0;;;;;43617:51:0::1;;43669:9;43680:10;43692:9;43702:1;43692:12;;;;;;;;;;;;;;43706:15;43617:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;43617:105:0::1;-1:-1:-1::0;;;;;43617:105:0::1;;;;;;-1:-1:-1::0;;;;;43617:105:0::1;-1:-1:-1::0;;;;;43617:105:0::1;;;;;;-1:-1:-1::0;;;;;43617:105:0::1;-1:-1:-1::0;;;;;43617:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43740:9:0::1;::::0;-1:-1:-1;;;43735:643:0::1;43759:9;:16;43755:1;:20;43735:643;;;43825:1;43806:9;:16;:20;43801:1;:25;43797:527;;;43864:1;43851:14:::0;::::1;43847:208;;43903:9;43913:1;43903:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43895:30:0::1;;43934:4;43895:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;43895:45:0::1;-1:-1:-1::0;;;;;43895:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43847:208:0::1;::::0;-1:-1:-1;43847:208:0::1;;43997:9;44007:1;43997:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43989:31:0::1;;44029:4;43989:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;43989:46:0::1;-1:-1:-1::0;;;;;43989:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;43847:208:0::1;43797:527;;;44112:1;44099:14:::0;::::1;44095:214;;44151:9;44161:1;44151:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;44143:30:0::1;;44174:9;44184:1;44188;44184:5;44174:16;;;;;;;;;;;;;;44143:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;44143:48:0::1;-1:-1:-1::0;;;;;44143:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;44095:214;44248:9;44258:1;44248:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;44240:31:0::1;;44272:9;44282:1;44286;44282:5;44272:16;;;;;;;;;;;;;;44240:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;44240:49:0::1;-1:-1:-1::0;;;;;44240:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;44095:214:0::1;44365:1;44351:15:::0;;::::1;::::0;43777:3:::1;43735:643;;;-1:-1:-1::0;44403:38:0::1;::::0;;-1:-1:-1;;;44403:38:0;;44435:4:::1;44403:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;44409:6:0::1;44403:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44403:38:0;;-1:-1:-1;44460:31:0;;::::1;;44452:86;;;;-1:-1:-1::0;;;44452:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44555:6;-1:-1:-1::0;;;;;44549:22:0::1;;44572:12;44549:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;44596:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;44596:33:0;::::1;;;::::0;-1:-1:-1;44616:12:0;;44596:33:::1;::::0;;;44616:12;44596:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44647:157:0::1;::::0;;-1:-1:-1;;;;;44647:157:0;::::1;::::0;;-1:-1:-1;;;;;;;;;;;44647:157:0::1;::::0;::::1;::::0;44726:10:::1;44647:157:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44647:157:0;;;;;;;::::1;43096:1716:::0;;;;;;;;;;:::o;34120:119::-;10151:7;;;;;-1:-1:-1;;;;;10151:7:0;10137:10;:21;10129:43;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34196:27:0::1;34226:5;34196:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;34196:35:0::1;::::0;;34120:119::o;50696:2075::-;51081:20;51062:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;51140:1:::1;51122:8;:15;:19;51114:58;;;::::0;;-1:-1:-1;;;51114:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;51114:58:0;;;;;;;;;;;;;::::1;;51210:11;:18;51191:8;:15;:37;51183:87;;;;-1:-1:-1::0;;;51183:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51325:1;51308:7;:14;:18;51289:8;:15;:37;51281:87;;;;-1:-1:-1::0;;;51281:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51405:1;51387:15;:19;51379:65;;;;-1:-1:-1::0;;;51379:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51478:9:::0;51517:7;51562:15;51457:18:::1;51629:47;-1:-1:-1::0;;;;;51629:35:0;::::1;51665:10;51629:47;:35;:47;:::i;:::-;51598:78;;51697:91;51706:10;51718:7;51726:1;51718:10;;;;;;;;;;;;;;51730;51742:16;-1:-1:-1::0;;;;;;;;;;;;;;;;51760:27:0::1;:10;-1:-1:-1::0;;;;;51760:27:0::1;;51697:8;:91::i;:::-;51806:9;51801:355;51825:8;:15;51821:1;:19;51801:355;;;51879:1;51866:14:::0;::::1;51862:240;;51919:11;51931:1;51919:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;51906:37:0::1;;51944:7;51952:1;51956;51952:5;51944:14;;;;;;;;;;;;;;51959:8;51968:1;51959:11;;;;;;;;;::::0;;::::1;::::0;;;;;;51906:69:::1;::::0;;-1:-1:-1;;;;;;51906:69:0::1;::::0;;;;;;-1:-1:-1;;;;;51906:69:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;-1:-1:-1;51906:69:0;;;;;;;;;;;;;;;;;;-1:-1:-1;51906:69:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51862:240;;;52029:11;52041:1;52029:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;52016:38:0::1;;52055:7;52063:1;52067;52063:5;52055:14;;;;;;;;;;;;;;52070:8;52079:1;52070:11;;;;;;;;;::::0;;::::1;::::0;;;;;;52016:70:::1;::::0;;-1:-1:-1;;;;;;52016:70:0::1;::::0;;;;;;-1:-1:-1;;;;;52016:70:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;-1:-1:-1;52016:70:0;;;;;;;;;;;;;;;;;;-1:-1:-1;52016:70:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51862:240;52143:1;52129:15:::0;;::::1;::::0;51842:3:::1;51801:355;;;-1:-1:-1::0;;;;;;52171:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;52171:25:0::1;52168:325;;;52228:38;::::0;;-1:-1:-1;;;52228:38:0;;52260:4:::1;52228:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;52234:6:0::1;52228:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52228:38:0;52281:36:::1;::::0;;-1:-1:-1;;;52281:36:0;;::::1;::::0;::::1;::::0;;;;;52228:38;;-1:-1:-1;;;;;;52287:6:0::1;52281:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;52281:36:0;;;;;;;;-1:-1:-1;52281:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52332:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;52332:33:0;::::1;;;::::0;-1:-1:-1;52352:12:0;;52332:33:::1;::::0;;;52352:12;52332:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;52168:325;;;52412:69;52460:20:::0;52412:43:::1;-1:-1:-1::0;;;;;52412:31:0;::::1;52444:10;52412:43;:31;:43;:::i;:::-;:47:::0;:69:::1;:47;:69;:::i;:::-;52397:84;;52168:325;52529:15;52513:12;:31;;52505:86;;;;-1:-1:-1::0;;;52505:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52609:154;::::0;;-1:-1:-1;;;;;52609:154:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;52684:10:::1;52609:154:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52609:154:0;;;;;;;::::1;33512:1;;;;50696:2075:::0;;;;;;;;;;;;;:::o;10552:228::-;10618:11;;-1:-1:-1;;;;;10618:11:0;10604:10;:25;10596:51;;;;;-1:-1:-1;;;10596:51:0;;;;;;;;;;;;-1:-1:-1;;;10596:51:0;;;;;;;;;;;;;;;10693:11;;;10684:7;;10663:42;;-1:-1:-1;;;;;10693:11:0;;;;;10684:7;;;;;;;10663:42;;;10726:11;;;;10716:21;;-1:-1:-1;;;;;;10716:21:0;10726:11;-1:-1:-1;;;;;10726:11:0;;10716:21;;;;-1:-1:-1;;;;;;10748:24:0;;;10552:228::o;41396:1692::-;41704:20;41676:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;41769:1:::1;41750:9;:16;:20;41742:59;;;::::0;;-1:-1:-1;;;41742:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;41742:59:0;;;;;;;;;;;;;::::1;;41838:1;41820:15;:19;41812:65;;;;-1:-1:-1::0;;;41812:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41929:37;::::0;;-1:-1:-1;;;41929:37:0;;41955:10:::1;41929:37;::::0;::::1;::::0;;;41898:28:::1;::::0;-1:-1:-1;;;;;41929:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41929:37:0;41977:41:::1;::::0;;-1:-1:-1;;;41977:41:0;;;;41929:37;;-1:-1:-1;;;;;;41983:6:0::1;41977:21;::::0;::::1;::::0;42006:9:::1;::::0;41977:41:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;42006:9;41977:21;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;42035:6;-1:-1:-1::0;;;;;42029:22:0::1;;42052:9;42062:1;42052:12;;;;;;;;;;;;;;42066:9;42029:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;42029:47:0::1;-1:-1:-1::0;;;;;42029:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42094:9:0::1;::::0;-1:-1:-1;42089:637:0::1;42113:9;:16;42109:1;:20;42089:637;;;42179:1;42160:9;:16;:20;42155:1;:25;42151:521;;;42218:1;42205:14:::0;::::1;42201:202;;42257:9;42267:1;42257:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42249:30:0::1;;42280:10;42249:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;42249:42:0::1;-1:-1:-1::0;;;;;42249:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42201:202:0::1;::::0;-1:-1:-1;42201:202:0::1;;42348:9;42358:1;42348:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42340:31:0::1;;42372:10;42340:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;42340:43:0::1;-1:-1:-1::0;;;;;42340:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42201:202:0::1;42151:521;;;42460:1;42447:14:::0;::::1;42443:214;;42499:9;42509:1;42499:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42491:30:0::1;;42522:9;42532:1;42536;42532:5;42522:16;;;;;;;;;;;;;;42491:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;42491:48:0::1;-1:-1:-1::0;;;;;42491:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;42443:214;42596:9;42606:1;42596:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42588:31:0::1;;42620:9;42630:1;42634;42630:5;42620:16;;;;;;;;;;;;;;42588:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;42588:49:0::1;-1:-1:-1::0;;;;;42588:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42443:214:0::1;42713:1;42699:15:::0;;::::1;::::0;42131:3:::1;42089:637;;;-1:-1:-1::0;42753:37:0::1;::::0;;-1:-1:-1;;;42753:37:0;;42779:10:::1;42753:37;::::0;::::1;::::0;;;:63:::1;::::0;42795:20;;-1:-1:-1;;;;;42753:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42753:37:0;;:63:::1;:41;:63;:::i;:::-;42738:78;;42851:15;42835:12;:31;;42827:86;;;;-1:-1:-1::0;;;42827:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42931:149;::::0;;-1:-1:-1;;;;;;;;;;;42931:149:0;;-1:-1:-1;;;;;42931:149:0;::::1;;::::0;::::1;::::0;43008:10:::1;42931:149:::0;;;;43033:9:::1;42931:149:::0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42931:149:0;;;;;;;::::1;33512:1;41396:1692:::0;;;;;;;;;:::o;46564:1736::-;46959:20;46931:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;47023:1:::1;47005:15;:19;46997:65;;;;-1:-1:-1::0;;;46997:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47083:28;47114:46;-1:-1:-1::0;;;;;47114:34:0;::::1;47149:10;47114:46;:34;:46;:::i;:::-;47083:77:::0;-1:-1:-1;;;;;;47175:26:0;::::1;-1:-1:-1::0;;;;;;;;;;;47175:26:0::1;47171:332;;47218:189;::::0;;-1:-1:-1;;;47218:189:0;;-1:-1:-1;;;;;47218:189:0;;::::1;;::::0;::::1;::::0;47316:10:::1;47218:189:::0;;;;47353:4:::1;47218:189:::0;;;;;;;;;;;;47236:20:::1;47218:51:::0;;::::1;::::0;::::1;::::0;:189;;;;;-1:-1:-1;;47218:189:0;;;;;;;;-1:-1:-1;47218:51:0;:189;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;47422:69:0::1;::::0;-1:-1:-1;;;;;;;;47422:37:0;::::1;47460:13:::0;47475:15;47422:37:::1;:69::i;:::-;-1:-1:-1::0;;;;;47523:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;47515:75;;;;-1:-1:-1::0;;;47515:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47602:12;-1:-1:-1::0;;;;;47620:15:0;;::::1;::::0;47643:26;::::1;-1:-1:-1::0;;;;;;;;;;;47643:26:0::1;:42;;47684:1;47643:42;;;47672:9;47643:42;47687:14;47620:82;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;47620:82:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47601:101;;;47723:7;47715:65;;;;-1:-1:-1::0;;;47715:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47793:133;47841:10;47866:49;-1:-1:-1::0;;;;;47866:34:0;::::1;47909:4;47866:49;:34;:49;:::i;:::-;-1:-1:-1::0;;;;;47793:33:0;::::1;::::0;:133;::::1;:33;:133;:::i;:::-;47954:72;48005:20:::0;47954:46:::1;-1:-1:-1::0;;;;;47954:34:0;::::1;47989:10;47954:46;:34;:46;:::i;:72::-;47939:87;;48061:15;48045:12;:31;;48037:86;;;;-1:-1:-1::0;;;48037:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;48168:9:0::1;48192:7;48214:10;48239:15;48269:12;48141:151;;;;-1:-1:-1::0;;;;;48141:151:0::1;-1:-1:-1::0;;;;;48141:151:0::1;;;;;;-1:-1:-1::0;;;;;48141:151:0::1;-1:-1:-1::0;;;;;48141:151:0::1;;;;;;-1:-1:-1::0;;;;;48141:151:0::1;-1:-1:-1::0;;;;;48141:151:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33512:1;;46564:1736:::0;;;;;;;;;;;;:::o;35854:1465::-;36278:14;32013:9;;36278:14;;;;32013:9;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;36236:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;36422:10:::0;36491:101:::2;36422:10:::0;36541:12;36568:13;36491:16:::2;:101::i;:::-;36443:149:::0;;-1:-1:-1;36443:149:0;-1:-1:-1;36625:37:0;;::::2;::::0;::::2;::::0;:80:::2;;;36691:14;36666:21;:39;;36625:80;36603:173;;;;-1:-1:-1::0;;;36603:173:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36789:89;36798:10;36810:4;36824;-1:-1:-1::0;;;;;36816:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36816:28:0;36846:20;36876:1:::2;36868:9;::::0;::::2;;36789:8;:89::i;:::-;36889:91;36898:10;36910:4;36924;-1:-1:-1::0;;;;;36916:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36916:29:0;36947:21;36978:1:::2;36970:9;::::0;::::2;;36889:8;:91::i;:::-;37016:35;::::0;;-1:-1:-1;;;37016:35:0;;37040:10:::2;37016:35;::::0;::::2;::::0;;;-1:-1:-1;;;;;37016:23:0;::::2;::::0;::::2;::::0;:35;;;;;::::2;::::0;;;;;;;;-1:-1:-1;37016:23:0;:35;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37016:35:0;;-1:-1:-1;37102:1:0::2;37094:9;::::0;::::2;;:45:::0;::::2;;;;37119:20;37107:9;:32;37094:45;37090:104;;;37141:53;::::0;:10:::2;::::0;37161:9:::2;:32:::0;;::::2;37141:53:::0;::::2;;;::::0;::::2;::::0;;;37161:32;37141:10;:53;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;37090:104;37209:4;:9;;37217:1;37209:9;:46;;;;;37234:21;37222:9;:33;37209:46;37205:106;;;37257:54;::::0;:10:::2;::::0;37277:9:::2;:33:::0;;::::2;37257:54:::0;::::2;;;::::0;::::2;::::0;;;37277:33;37257:10;:54;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;37205:106;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;35854:1465;;;;-1:-1:-1;35854:1465:0;;-1:-1:-1;35854:1465:0;-1:-1:-1;;;;;35854:1465:0:o;32981:38::-;;;:::o;33071:46::-;;;;;;;;;;;;;;;:::o;9642:26::-;;;-1:-1:-1;;;;;9642:26:0;;:::o;34322:1524::-;34733:25;32013:9;;34733:25;;32013:9;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;34705:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;34807:18:::2;-1:-1:-1::0;;;;;34828:26:0;::::2;-1:-1:-1::0;;;;;;;;;;;34828:26:0::2;:47;;34866:9;34828:47;;;34857:6;34828:47;34807:68:::0;-1:-1:-1;34890:19:0::2;-1:-1:-1::0;;;;;34912:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;34912:27:0::2;:49;;34951:10;34912:49;;;34942:6;34912:49;34996:218;::::0;;-1:-1:-1;;;34996:218:0;;-1:-1:-1;;;;;34996:218:0;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;;;-1:-1:-1;35004:13:0::2;34996:47:::0;;::::2;::::0;::::2;::::0;:218;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;34996:47:0;:218;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34996:218:0;;-1:-1:-1;35274:9:0;;-1:-1:-1;35320:10:0;;-1:-1:-1;35345:194:0::2;35372:10;34996:218:::0;35274:9;35466:12;-1:-1:-1;;;;;35497:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;35497:27:0::2;35345:8;:194::i;:::-;35554:197;35581:10;35610:17:::0;35646:11;35676:13;-1:-1:-1;;;;;35708:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;35708:28:0::2;35554:8;:197::i;:::-;-1:-1:-1::0;;35790:48:0::2;::::0;;-1:-1:-1;;;35790:48:0;;35827:10:::2;35790:48;::::0;::::2;::::0;;;-1:-1:-1;;;;;35790:36:0;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;-1:-1:-1;35790:36:0;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;35790:48:0;32098:5;32086:17;;-1:-1:-1;;32086:17:0;;;34322:1524;;35790:48;;-1:-1:-1;34322:1524:0;;-1:-1:-1;;;;;;;;;;34322:1524:0:o;53227:1214::-;53572:18;32013:9;;53572:18;;32013:9;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;53554:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;53624:18:::2;53653:4;-1:-1:-1::0;;;;;53645:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53645:28:0;53706:29:::2;::::0;;-1:-1:-1;;;53706:29:0;;;;53645:28;;-1:-1:-1;53684:19:0::2;::::0;-1:-1:-1;;;;;53706:27:0;::::2;::::0;::::2;::::0;:29:::2;::::0;;::::2;::::0;53645:28:::2;::::0;53706:29;;;;;;;:27;:29;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53706:29:0;;-1:-1:-1;53756:70:0::2;53765:10;53785:4;53792:10:::0;53804;53824:1:::2;53816:9;::::0;::::2;;53756:8;:70::i;:::-;53837:72;53846:10;53866:4;53873:11;53886;53899:4;:9;;53907:1;53899:9;53837:8;:72::i;:::-;53935:14:::0;;53932:181:::2;;53966:56;-1:-1:-1::0;;;;;53966:38:0;::::2;54005:4:::0;54011:10;53966:56:::2;:38;:56;:::i;:::-;54050:51;::::0;;-1:-1:-1;;;54050:51:0;;54078:10:::2;54050:51;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;54050:27:0;::::2;::::0;::::2;::::0;:51;;;;;::::2;::::0;;;;;;;;-1:-1:-1;54050:27:0;:51;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;54050:51:0;;-1:-1:-1;53932:181:0::2;54126:15:::0;;54123:187:::2;;54158:58;-1:-1:-1::0;;;;;54158:39:0;::::2;54198:4:::0;54204:11;54158:58:::2;:39;:58;:::i;:::-;54245:53;::::0;;-1:-1:-1;;;54245:53:0;;54274:10:::2;54245:53;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;54245:28:0;::::2;::::0;::::2;::::0;:53;;;;;::::2;::::0;;;;;;;;-1:-1:-1;54245:28:0;:53;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;54245:53:0;;-1:-1:-1;54123:187:0::2;54344:13;54330:10;:27;;:60;;;;;54376:14;54361:11;:29;;54330:60;54322:111;;;;-1:-1:-1::0;;;54322:111:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;53227:1214:0;;;;-1:-1:-1;53227:1214:0;-1:-1:-1;;;;;;53227:1214:0:o;32931:43::-;;;:::o;33026:38::-;;;:::o;52841:376::-;32013:9;;;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;53052:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;53073:91:::2;53082:10;53094:9;53113;-1:-1:-1::0;;;;;53105:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53105:34:0;53141:11;53162:1:::2;53154:9;::::0;::::2;;53073:8;:91::i;:::-;53175:34;::::0;;-1:-1:-1;;;53175:34:0;;53198:10:::2;53175:34;::::0;::::2;::::0;;;-1:-1:-1;;;;;53175:22:0;::::2;::::0;::::2;::::0;:34;;;;;-1:-1:-1;;53175:34:0;;;;;;;-1:-1:-1;53175:22:0;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;;;;;;;52841:376:0:o;33997:115::-;10151:7;;;;;-1:-1:-1;;;;;10151:7:0;10137:10;:21;10129:43;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34070:27:0::1;;::::0;;;:13:::1;:27;::::0;;;;:34;;-1:-1:-1;;34070:34:0::1;34100:4;34070:34;::::0;;33997:115::o;32879:45::-;;;:::o;10381:163::-;10151:7;;;;;-1:-1:-1;;;;;10151:7:0;10137:10;:21;10129:43;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;;;;10485:7:::1;::::0;;10459:44:::1;::::0;-1:-1:-1;;;;;10459:44:0;;::::1;::::0;10485:7:::1;::::0;;::::1;;::::0;10459:44:::1;::::0;::::1;10514:11;:22:::0;;-1:-1:-1;;;;;;10514:22:0::1;-1:-1:-1::0;;;;;10514:22:0;;;::::1;::::0;;;::::1;::::0;;10381:163::o;44820:1736::-;45175:20;45147:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;45240:1:::1;45221:9;:16;:20;45213:59;;;::::0;;-1:-1:-1;;;45213:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;45213:59:0;;;;;;;;;;;;;::::1;;45309:1;45291:15;:19;45283:65;;;;-1:-1:-1::0;;;45283:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45392:37;::::0;;-1:-1:-1;;;45392:37:0;;45418:10:::1;45392:37;::::0;::::1;::::0;;;45361:28:::1;::::0;-1:-1:-1;;;;;45392:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45392:37:0;45515:12;;45392:37;;-1:-1:-1;;;;;;45458:20:0::1;45440:51;::::0;::::1;::::0;45492:9;;45503:10:::1;::::0;45515:9;;45525:1:::1;::::0;45515:12:::1;;;;;;;;;;45529:15;45440:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;45440:105:0::1;-1:-1:-1::0;;;;;45440:105:0::1;;;;;;-1:-1:-1::0;;;;;45440:105:0::1;-1:-1:-1::0;;;;;45440:105:0::1;;;;;;-1:-1:-1::0;;;;;45440:105:0::1;-1:-1:-1::0;;;;;45440:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;45563:9:0::1;::::0;-1:-1:-1;;;45558:636:0::1;45582:9;:16;45578:1;:20;45558:636;;;45648:1;45629:9;:16;:20;45624:1;:25;45620:520;;;45687:1;45674:14:::0;::::1;45670:202;;45726:9;45736:1;45726:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45718:30:0::1;;45749:10;45718:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;45718:42:0::1;-1:-1:-1::0;;;;;45718:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45670:202:0::1;::::0;-1:-1:-1;45670:202:0::1;;45817:9;45827:1;45817:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45809:31:0::1;;45841:10;45809:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;45809:43:0::1;-1:-1:-1::0;;;;;45809:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45670:202:0::1;45620:520;;;45928:1;45916:13:::0;::::1;45912:213;;45967:9;45977:1;45967:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45959:30:0::1;;45990:9;46000:1;46004;46000:5;45990:16;;;;;;;;;;;;;;45959:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;45959:48:0::1;-1:-1:-1::0;;;;;45959:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;45912:213;46064:9;46074:1;46064:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46056:31:0::1;;46088:9;46098:1;46102;46098:5;46088:16;;;;;;;;;;;;;;46056:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;46056:49:0::1;-1:-1:-1::0;;;;;46056:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45912:213:0::1;46181:1;46167:15:::0;;::::1;::::0;45600:3:::1;45558:636;;;-1:-1:-1::0;46219:37:0::1;::::0;;-1:-1:-1;;;46219:37:0;;46245:10:::1;46219:37;::::0;::::1;::::0;;;:63:::1;::::0;46261:20;;-1:-1:-1;;;;;46219:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;:63;46204:78;;46317:15;46301:12;:31;;46293:86;;;;-1:-1:-1::0;;;46293:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46397:151;::::0;;-1:-1:-1;;;;;46397:151:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;46470:10:::1;46397:151:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;46397:151:0;;;;;;;::::1;33512:1;44820:1736:::0;;;;;;;;;;;:::o;54455:495::-;54618:5;54614:329;;;54644:10;;54640:183;;54681:6;-1:-1:-1;;;;;54675:21:0;;54704:6;54675:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;54736:19:0;;54750:4;54736:19;;-1:-1:-1;54732:75:0;;54757:50;54787:6;54796:2;54800:6;54757:22;:50::i;:::-;54614:329;;;54855:76;;;-1:-1:-1;;;54855:76:0;;-1:-1:-1;;;;;54855:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54873:20;54855:51;;;;;;:76;;;;;-1:-1:-1;;54855:76:0;;;;;;;;-1:-1:-1;54855:51:0;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54614:329;54455:495;;;;;:::o;30708:374::-;30853:34;;;-1:-1:-1;;;30853:34:0;;30877:4;30853:34;;;;-1:-1:-1;;;;;30853:34:0;;;;;;;;;30833:17;;30853:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30853:34:0;;-1:-1:-1;30902:18:0;;;30898:177;;;30941:13;;30937:78;;30975:24;-1:-1:-1;;;;;30975:17:0;;30993:2;30997:1;30975:24;:17;:24;:::i;:::-;31029:34;-1:-1:-1;;;;;31029:17:0;;31047:2;-1:-1:-1;;31029:34:0;:17;:34;:::i;:::-;30708:374;;;;:::o;31326:129::-;31400:7;31427:5;-1:-1:-1;;;;;31427:15:0;;31443:3;31427:20;;;;;;;;;;;;;-1:-1:-1;;;;;31427:20:0;-1:-1:-1;;;;;31427:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31427:20:0;;-1:-1:-1;31326:129:0;;;;;:::o;30377:323::-;30512:10;;30508:185;;30543:12;30549:5;30543;:12::i;:::-;30539:143;;;30576:19;;-1:-1:-1;;;;;30576:11:0;;;:19;;;;;30588:6;;30576:19;;;;30588:6;30576:11;:19;;;;;;;;;;;;;;;;;;;;;30539:143;;;30636:30;-1:-1:-1;;;;;30636:18:0;;30655:2;30659:6;30636:30;:18;:30;:::i;:::-;30377:323;;;:::o;54958:440::-;55107:5;55103:288;;;55133:10;;55129:119;;55170:6;-1:-1:-1;;;;;55164:22:0;;55187:6;55164:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55213:19:0;;-1:-1:-1;;;;;55213:11:0;;;-1:-1:-1;55213:19:0;;;;;-1:-1:-1;55225:6:0;;55213:19;;;;55225:6;55213:11;:19;;;;;;;;;;;;;;;;;;;;;55129:119;55103:288;;;55284:10;;55280:100;;55315:49;55345:5;55353:2;55357:6;55315:22;:49::i;31090:228::-;31168:7;31192:12;31198:5;31192;:12::i;:::-;31188:123;;;-1:-1:-1;;;;;;31228:11:0;;;31221:18;;31188:123;31279:5;-1:-1:-1;;;;;31279:15:0;;31295:3;31279:20;;;;;;;;;;;;;-1:-1:-1;;;;;31279:20:0;-1:-1:-1;;;;;31279:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31279:20:0;;-1:-1:-1;31272:27:0;;14035:137;14093:7;14126:1;14121;:6;;14113:28;;;;;-1:-1:-1;;;14113:28:0;;;;;;;;;;;;-1:-1:-1;;;14113:28:0;;;;;;;;;;;;;;;-1:-1:-1;14159:5:0;;;14035:137::o;37327:1276::-;37475:28;37505:29;37548:19;37569:20;37601:10;-1:-1:-1;;;;;37593:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37593:37:0;;;;;;;;;-1:-1:-1;37593:37:0;-1:-1:-1;37645:17:0;;:37;;;;-1:-1:-1;37666:16:0;;37645:37;37641:157;;;37722:12;37699:35;;37773:13;37749:37;;37641:157;37812:17;;:36;;;;;37847:1;37833:11;:15;37812:36;37808:144;;;37888:12;37865:35;;37939:1;37915:25;;37808:144;37981:1;37966:12;:16;:35;;;;;38000:1;37986:11;:15;37966:35;37962:634;;;38018:25;38046:47;38067:12;38081:11;38046:20;:47::i;:::-;38018:75;;38108:26;38137:49;38158:13;38173:12;38137:20;:49::i;:::-;38108:78;;38226:18;38205:17;:39;38201:384;;38288:12;38265:35;;38343:53;38364:12;38378:17;38343:20;:53::i;:::-;38319:77;;38201:384;;;38461:13;38437:37;;38516:53;38537:11;38550:18;38516:20;:53::i;:::-;38493:76;;38201:384;37962:634;;;37327:1276;;;;;;;;:::o;27498:211::-;27642:58;;;-1:-1:-1;;;;;27642:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27642:58:0;-1:-1:-1;;;27642:58:0;;;27615:86;;27635:5;;27615:19;:86::i;28010:670::-;28428:10;;;28427:62;;-1:-1:-1;28444:39:0;;;-1:-1:-1;;;28444:39:0;;28468:4;28444:39;;;;-1:-1:-1;;;;;28444:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28444:39:0;:44;28427:62;28405:166;;;;-1:-1:-1;;;28405:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28609:62;;;-1:-1:-1;;;;;28609:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28609:62:0;-1:-1:-1;;;28609:62:0;;;28582:90;;28602:5;;28582:19;:90::i;31463:104::-;-1:-1:-1;;;;;31539:20:0;;-1:-1:-1;;;;;;;;;;;31539:20:0;31463:104;;;:::o;15156:128::-;15224:7;15251:25;15274:1;15251:18;:6;15262;15251:18;:10;:18;:::i;:::-;:22;:25;:22;:25;:::i;:::-;15244:32;15156:128;-1:-1:-1;;;15156:128:0:o;14882:127::-;14950:7;14994:6;14977:13;:6;14988:1;14977:13;:10;:13;:::i;:::-;:24;;;;;;;14882:127;-1:-1:-1;;;14882:127:0:o;29071:1046::-;29731:12;29745:23;29780:5;-1:-1:-1;;;;;29772:19:0;29792:4;29772:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29772:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29730:67;;;;29816:7;29808:52;;;;;-1:-1:-1;;;29808:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29877:17;;:21;29873:237;;30032:10;30021:30;;;;;;;;;;;;;;;-1:-1:-1;30021:30:0;30013:85;;;;-1:-1:-1;;;30013:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13356:226;13414:7;13438:6;13434:47;;-1:-1:-1;13468:1:0;13461:8;;13434:47;13505:5;;;13509:1;13505;:5;:1;13529:5;;;;;:10;13521:32;;;;;-1:-1:-1;;;13521:32:0;;;;;;;;;;;;-1:-1:-1;;;13521:32:0;;;;;;;;;;;;;;13590:141;13648:7;13680:1;13676;:5;13668:32;;;;;-1:-1:-1;;;13668:32:0;;;;;;;;;;;;-1:-1:-1;;;13668:32:0;;;;;;;;;;;;;;;13722:1;13718;:5;;;
Swarm Source
ipfs://ad86b25d9015e44584397f703bb1c2372be77b108e36e771bb292a272b32ecdc
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.