Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xfe7e19de0dd221caee54d42c6dbc2682d8e8afdd24c964f207bc99579dd01fe0 | Sell Base | 30259269 | 272 days 1 hr ago | 0xf402487cb65b3d006d70b7a7d7edbdf5456fa339 | IN | 0xe020008465cd72301a18b97d33d73bf44858a4b7 | 0 MATIC | 0.003951828141 | |
0x1a85094fe7002a7b7ee6de6012d039c0d23ffb7597cfa2794821f8be082ac136 | Sell Base | 30259074 | 272 days 1 hr ago | 0x261e24907f66fea18594bdd144ad81908fec005a | IN | 0xe020008465cd72301a18b97d33d73bf44858a4b7 | 0 MATIC | 0.004423673686 | |
0xf1b15a644ebfd216f525c7b5ac14374742d50e127e8ce01c5a1ff7585ca358cc | Init | 15577588 | 658 days 12 hrs ago | 0x16cc37d06fe5061cd0023fb8d142abaabb396a2b | IN | 0xe020008465cd72301a18b97d33d73bf44858a4b7 | 0 MATIC | 0.000207167 | |
0x81c169f15750ad9fdb362067664405a5f1672a76036b22c6b16703a1afe7f6a4 | 0x60806040 | 15576070 | 658 days 12 hrs ago | 0x16cc37d06fe5061cd0023fb8d142abaabb396a2b | IN | Contract Creation | 0 MATIC | 0.00338984 |
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x10Dd6d8A29D489BEDE472CC1b22dc695c144c5c7
Contract Name:
DPPAdvanced
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-11 */ // File: contracts/lib/InitializableOwnable.sol /* Copyright 2020 DODO ZOO. SPDX-License-Identifier: Apache-2.0 */ pragma solidity 0.6.9; pragma experimental ABIEncoderV2; /** * @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/lib/FeeRateModel.sol interface IFeeRateImpl { function getFeeRate(address pool, address trader) external view returns (uint256); } interface IFeeRateModel { function getFeeRate(address trader) external view returns (uint256); } contract FeeRateModel is InitializableOwnable { address public feeRateImpl; function setFeeProxy(address _feeRateImpl) public onlyOwner { feeRateImpl = _feeRateImpl; } function getFeeRate(address trader) external view returns (uint256) { if(feeRateImpl == address(0)) return 0; return IFeeRateImpl(feeRateImpl).getFeeRate(msg.sender,trader); } } // 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/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/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/lib/DODOMath.sol /** * @title DODOMath * @author DODO Breeder * * @notice Functions for complex calculating. Including ONE Integration and TWO Quadratic solutions */ library DODOMath { using SafeMath for uint256; /* Integrate dodo curve from 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)) i is the price of V-res trading pair support k=1 & k=0 case [round down] */ function _GeneralIntegrate( uint256 V0, uint256 V1, uint256 V2, uint256 i, uint256 k ) internal pure returns (uint256) { require(V0 > 0, "TARGET_IS_ZERO"); uint256 fairAmount = i.mul(V1.sub(V2)); // i*delta if (k == 0) { return fairAmount.div(DecimalMath.ONE); } uint256 V0V0V1V2 = DecimalMath.divFloor(V0.mul(V0).div(V1), V2); uint256 penalty = DecimalMath.mulFloor(k, V0V0V1V2); // k(V0^2/V1/V2) return DecimalMath.ONE.sub(k).add(penalty).mul(fairAmount).div(DecimalMath.ONE2); } /* Follow the integration function above i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Assume Q2=Q0, Given Q1 and deltaB, solve Q0 i is the price of delta-V trading pair give out target of V support k=1 & k=0 case [round down] */ function _SolveQuadraticFunctionForTarget( uint256 V1, uint256 delta, uint256 i, uint256 k ) internal pure returns (uint256) { if (V1 == 0) { return 0; } if (k == 0) { return V1.add(DecimalMath.mulFloor(i, delta)); } // V0 = V1*(1+(sqrt-1)/2k) // sqrt = √(1+4kidelta/V1) // premium = 1+(sqrt-1)/2k // uint256 sqrt = (4 * k).mul(i).mul(delta).div(V1).add(DecimalMath.ONE2).sqrt(); uint256 sqrt; uint256 ki = (4 * k).mul(i); if (ki == 0) { sqrt = DecimalMath.ONE; } else if ((ki * delta) / ki == delta) { sqrt = (ki * delta).div(V1).add(DecimalMath.ONE2).sqrt(); } else { sqrt = ki.div(V1).mul(delta).add(DecimalMath.ONE2).sqrt(); } uint256 premium = DecimalMath.divFloor(sqrt.sub(DecimalMath.ONE), k * 2).add(DecimalMath.ONE); // V0 is greater than or equal to V1 according to the solution return DecimalMath.mulFloor(V1, premium); } /* Follow the 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, user sell Q and receive B if deltaBSig=false, then Q2<Q1, user sell B and receive Q return |Q1-Q2| as we only support sell amount as delta, the deltaB is always negative the input ideltaB is actually -ideltaB in the equation i is the price of delta-V trading pair support k=1 & k=0 case [round down] */ function _SolveQuadraticFunctionForTrade( uint256 V0, uint256 V1, uint256 delta, uint256 i, uint256 k ) internal pure returns (uint256) { require(V0 > 0, "TARGET_IS_ZERO"); if (delta == 0) { return 0; } if (k == 0) { return DecimalMath.mulFloor(i, delta) > V1 ? V1 : DecimalMath.mulFloor(i, delta); } if (k == DecimalMath.ONE) { // if k==1 // Q2=Q1/(1+ideltaBQ1/Q0/Q0) // temp = ideltaBQ1/Q0/Q0 // Q2 = Q1/(1+temp) // Q1-Q2 = Q1*(1-1/(1+temp)) = Q1*(temp/(1+temp)) // uint256 temp = i.mul(delta).mul(V1).div(V0.mul(V0)); uint256 temp; uint256 idelta = i.mul(delta); if (idelta == 0) { temp = 0; } else if ((idelta * V1) / idelta == V1) { temp = (idelta * V1).div(V0.mul(V0)); } else { temp = delta.mul(V1).div(V0).mul(i).div(V0); } return V1.mul(temp).div(temp.add(DecimalMath.ONE)); } // calculate -b value and sig // b = kQ0^2/Q1-i*deltaB-(1-k)Q1 // part1 = (1-k)Q1 >=0 // part2 = kQ0^2/Q1-i*deltaB >=0 // bAbs = abs(part1-part2) // if part1>part2 => b is negative => bSig is false // if part2>part1 => b is positive => bSig is true uint256 part2 = k.mul(V0).div(V1).mul(V0).add(i.mul(delta)); // kQ0^2/Q1-i*deltaB uint256 bAbs = DecimalMath.ONE.sub(k).mul(V1); // (1-k)Q1 bool bSig; if (bAbs >= part2) { bAbs = bAbs - part2; bSig = false; } else { bAbs = part2 - bAbs; bSig = true; } bAbs = bAbs.div(DecimalMath.ONE); // calculate sqrt uint256 squareRoot = DecimalMath.mulFloor( DecimalMath.ONE.sub(k).mul(4), DecimalMath.mulFloor(k, V0).mul(V0) ); // 4(1-k)kQ0^2 squareRoot = bAbs.mul(bAbs).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 (bSig) { numerator = squareRoot.sub(bAbs); } else { numerator = bAbs.add(squareRoot); } uint256 V2 = DecimalMath.divCeil(numerator, denominator); if (V2 > V1) { return 0; } else { return V1 - V2; } } } // File: contracts/lib/PMMPricing.sol /** * @title Pricing * @author DODO Breeder * * @notice DODO Pricing model */ library PMMPricing { using SafeMath for uint256; enum RState {ONE, ABOVE_ONE, BELOW_ONE} struct PMMState { uint256 i; uint256 K; uint256 B; uint256 Q; uint256 B0; uint256 Q0; RState R; } // ============ buy & sell ============ function sellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns (uint256 receiveQuoteAmount, RState newR) { if (state.R == RState.ONE) { // case 1: R=1 // R falls below one receiveQuoteAmount = _ROneSellBaseToken(state, payBaseAmount); newR = RState.BELOW_ONE; } else if (state.R == RState.ABOVE_ONE) { uint256 backToOnePayBase = state.B0.sub(state.B); uint256 backToOneReceiveQuote = state.Q.sub(state.Q0); // case 2: R>1 // complex case, R status depends on trading amount if (payBaseAmount < backToOnePayBase) { // case 2.1: R status do not change receiveQuoteAmount = _RAboveSellBaseToken(state, payBaseAmount); newR = RState.ABOVE_ONE; if (receiveQuoteAmount > backToOneReceiveQuote) { // [Important corner case!] may enter this branch when some precision problem happens. And consequently contribute to negative spare quote amount // to make sure spare quote>=0, mannually set receiveQuote=backToOneReceiveQuote receiveQuoteAmount = backToOneReceiveQuote; } } else if (payBaseAmount == backToOnePayBase) { // case 2.2: R status changes to ONE receiveQuoteAmount = backToOneReceiveQuote; newR = RState.ONE; } else { // case 2.3: R status changes to BELOW_ONE receiveQuoteAmount = backToOneReceiveQuote.add( _ROneSellBaseToken(state, payBaseAmount.sub(backToOnePayBase)) ); newR = RState.BELOW_ONE; } } else { // state.R == RState.BELOW_ONE // case 3: R<1 receiveQuoteAmount = _RBelowSellBaseToken(state, payBaseAmount); newR = RState.BELOW_ONE; } } function sellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns (uint256 receiveBaseAmount, RState newR) { if (state.R == RState.ONE) { receiveBaseAmount = _ROneSellQuoteToken(state, payQuoteAmount); newR = RState.ABOVE_ONE; } else if (state.R == RState.ABOVE_ONE) { receiveBaseAmount = _RAboveSellQuoteToken(state, payQuoteAmount); newR = RState.ABOVE_ONE; } else { uint256 backToOnePayQuote = state.Q0.sub(state.Q); uint256 backToOneReceiveBase = state.B.sub(state.B0); if (payQuoteAmount < backToOnePayQuote) { receiveBaseAmount = _RBelowSellQuoteToken(state, payQuoteAmount); newR = RState.BELOW_ONE; if (receiveBaseAmount > backToOneReceiveBase) { receiveBaseAmount = backToOneReceiveBase; } } else if (payQuoteAmount == backToOnePayQuote) { receiveBaseAmount = backToOneReceiveBase; newR = RState.ONE; } else { receiveBaseAmount = backToOneReceiveBase.add( _ROneSellQuoteToken(state, payQuoteAmount.sub(backToOnePayQuote)) ); newR = RState.ABOVE_ONE; } } } // ============ R = 1 cases ============ function _ROneSellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns ( uint256 // receiveQuoteToken ) { // in theory Q2 <= targetQuoteTokenAmount // however when amount is close to 0, precision problems may cause Q2 > targetQuoteTokenAmount return DODOMath._SolveQuadraticFunctionForTrade( state.Q0, state.Q0, payBaseAmount, state.i, state.K ); } function _ROneSellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns ( uint256 // receiveBaseToken ) { return DODOMath._SolveQuadraticFunctionForTrade( state.B0, state.B0, payQuoteAmount, DecimalMath.reciprocalFloor(state.i), state.K ); } // ============ R < 1 cases ============ function _RBelowSellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns ( uint256 // receiveBaseToken ) { return DODOMath._GeneralIntegrate( state.Q0, state.Q.add(payQuoteAmount), state.Q, DecimalMath.reciprocalFloor(state.i), state.K ); } function _RBelowSellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns ( uint256 // receiveQuoteToken ) { return DODOMath._SolveQuadraticFunctionForTrade( state.Q0, state.Q, payBaseAmount, state.i, state.K ); } // ============ R > 1 cases ============ function _RAboveSellBaseToken(PMMState memory state, uint256 payBaseAmount) internal pure returns ( uint256 // receiveQuoteToken ) { return DODOMath._GeneralIntegrate( state.B0, state.B.add(payBaseAmount), state.B, state.i, state.K ); } function _RAboveSellQuoteToken(PMMState memory state, uint256 payQuoteAmount) internal pure returns ( uint256 // receiveBaseToken ) { return DODOMath._SolveQuadraticFunctionForTrade( state.B0, state.B, payQuoteAmount, DecimalMath.reciprocalFloor(state.i), state.K ); } // ============ Helper functions ============ function adjustedTarget(PMMState memory state) internal pure { if (state.R == RState.BELOW_ONE) { state.Q0 = DODOMath._SolveQuadraticFunctionForTarget( state.Q, state.B.sub(state.B0), state.i, state.K ); } else if (state.R == RState.ABOVE_ONE) { state.B0 = DODOMath._SolveQuadraticFunctionForTarget( state.B, state.Q.sub(state.Q0), DecimalMath.reciprocalFloor(state.i), state.K ); } } function getMidPrice(PMMState memory state) internal pure returns (uint256) { if (state.R == RState.BELOW_ONE) { uint256 R = DecimalMath.divFloor(state.Q0.mul(state.Q0).div(state.Q), state.Q); R = DecimalMath.ONE.sub(state.K).add(DecimalMath.mulFloor(state.K, R)); return DecimalMath.divFloor(state.i, R); } else { uint256 R = DecimalMath.divFloor(state.B0.mul(state.B0).div(state.B), state.B); R = DecimalMath.ONE.sub(state.K).add(DecimalMath.mulFloor(state.K, R)); return DecimalMath.mulFloor(state.i, R); } } } // File: contracts/DODOPrivatePool/impl/DPPStorage.sol contract DPPStorage is InitializableOwnable, ReentrancyGuard { using SafeMath for uint256; bool public _IS_OPEN_TWAP_ = false; // ============ Core Address ============ address public _MAINTAINER_; IERC20 public _BASE_TOKEN_; IERC20 public _QUOTE_TOKEN_; uint112 public _BASE_RESERVE_; uint112 public _QUOTE_RESERVE_; uint32 public _BLOCK_TIMESTAMP_LAST_; uint112 public _BASE_TARGET_; uint112 public _QUOTE_TARGET_; uint32 public _RState_; uint256 public _BASE_PRICE_CUMULATIVE_LAST_; // ============ Variables for Pricing ============ IFeeRateModel public _MT_FEE_RATE_MODEL_; uint64 public _LP_FEE_RATE_; uint64 public _K_; uint128 public _I_; // ============ Helper Functions ============ function getPMMState() public view returns (PMMPricing.PMMState memory state) { state.i = _I_; state.K = _K_; state.B = _BASE_RESERVE_; state.Q = _QUOTE_RESERVE_; state.B0 = _BASE_TARGET_; state.Q0 = _QUOTE_TARGET_; state.R = PMMPricing.RState(_RState_); PMMPricing.adjustedTarget(state); } function getPMMStateForCall() external view returns ( uint256 i, uint256 K, uint256 B, uint256 Q, uint256 B0, uint256 Q0, uint256 R ) { PMMPricing.PMMState memory state = getPMMState(); i = state.i; K = state.K; B = state.B; Q = state.Q; B0 = state.B0; Q0 = state.Q0; R = uint256(state.R); } function getMidPrice() public view returns (uint256 midPrice) { return PMMPricing.getMidPrice(getPMMState()); } } // File: contracts/intf/IDODOCallee.sol interface IDODOCallee { function DVMSellShareCall( address sender, uint256 burnShareAmount, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function DVMFlashLoanCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function DPPFlashLoanCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; function CPCancelCall( address sender, uint256 amount, bytes calldata data ) external; function CPClaimBidCall( address sender, uint256 baseAmount, uint256 quoteAmount, bytes calldata data ) external; } // 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/DODOPrivatePool/impl/DPPVault.sol contract DPPVault is DPPStorage { using SafeMath for uint256; using SafeERC20 for IERC20; // ============ Events ============ event LpFeeRateChange(uint256 newLpFeeRate); // ============ View Functions ============ function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve) { baseReserve = _BASE_RESERVE_; quoteReserve = _QUOTE_RESERVE_; } function getUserFeeRate(address user) external view returns (uint256 lpFeeRate, uint256 mtFeeRate) { lpFeeRate = _LP_FEE_RATE_; mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(user); } // ============ Get Input ============ function getBaseInput() public view returns (uint256 input) { return _BASE_TOKEN_.balanceOf(address(this)).sub(uint256(_BASE_RESERVE_)); } function getQuoteInput() public view returns (uint256 input) { return _QUOTE_TOKEN_.balanceOf(address(this)).sub(uint256(_QUOTE_RESERVE_)); } // ============ TWAP UPDATE =========== function _twapUpdate() internal { uint32 blockTimestamp = uint32(block.timestamp % 2**32); uint32 timeElapsed = blockTimestamp - _BLOCK_TIMESTAMP_LAST_; if (timeElapsed > 0 && _BASE_RESERVE_ != 0 && _QUOTE_RESERVE_ != 0) { _BASE_PRICE_CUMULATIVE_LAST_ += getMidPrice() * timeElapsed; } _BLOCK_TIMESTAMP_LAST_ = blockTimestamp; } // ============ Set Status ============ function _setReserve(uint256 baseReserve, uint256 quoteReserve) internal { require(baseReserve <= uint112(-1) && quoteReserve <= uint112(-1), "OVERFLOW"); _BASE_RESERVE_ = uint112(baseReserve); _QUOTE_RESERVE_ = uint112(quoteReserve); if(_IS_OPEN_TWAP_) _twapUpdate(); } function _sync() internal { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); require(baseBalance <= uint112(-1) && quoteBalance <= uint112(-1), "OVERFLOW"); if (baseBalance != _BASE_RESERVE_) { _BASE_RESERVE_ = uint112(baseBalance); } if (quoteBalance != _QUOTE_RESERVE_) { _QUOTE_RESERVE_ = uint112(quoteBalance); } if(_IS_OPEN_TWAP_) _twapUpdate(); } function _resetTargetAndReserve() internal { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); require(baseBalance <= uint112(-1) && quoteBalance <= uint112(-1), "OVERFLOW"); _BASE_RESERVE_ = uint112(baseBalance); _QUOTE_RESERVE_ = uint112(quoteBalance); _BASE_TARGET_ = uint112(baseBalance); _QUOTE_TARGET_ = uint112(quoteBalance); _RState_ = uint32(PMMPricing.RState.ONE); if(_IS_OPEN_TWAP_) _twapUpdate(); } function ratioSync() external preventReentrant onlyOwner { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); require(baseBalance <= uint112(-1) && quoteBalance <= uint112(-1), "OVERFLOW"); if (baseBalance != _BASE_RESERVE_) { _BASE_TARGET_ = uint112(uint256(_BASE_TARGET_).mul(baseBalance).div(uint256(_BASE_RESERVE_))); _BASE_RESERVE_ = uint112(baseBalance); } if (quoteBalance != _QUOTE_RESERVE_) { _QUOTE_TARGET_ = uint112(uint256(_QUOTE_TARGET_).mul(quoteBalance).div(uint256(_QUOTE_RESERVE_))); _QUOTE_RESERVE_ = uint112(quoteBalance); } if(_IS_OPEN_TWAP_) _twapUpdate(); } function reset( address assetTo, uint256 newLpFeeRate, uint256 newI, uint256 newK, uint256 baseOutAmount, uint256 quoteOutAmount, uint256 minBaseReserve, uint256 minQuoteReserve ) public preventReentrant onlyOwner returns (bool) { require( _BASE_RESERVE_ >= minBaseReserve && _QUOTE_RESERVE_ >= minQuoteReserve, "RESERVE_AMOUNT_IS_NOT_ENOUGH" ); require(newLpFeeRate <= 1e18, "LP_FEE_RATE_OUT_OF_RANGE"); require(newK <= 1e18, "K_OUT_OF_RANGE"); require(newI > 0 && newI <= 1e36, "I_OUT_OF_RANGE"); _LP_FEE_RATE_ = uint64(newLpFeeRate); _K_ = uint64(newK); _I_ = uint128(newI); _transferBaseOut(assetTo, baseOutAmount); _transferQuoteOut(assetTo, quoteOutAmount); _resetTargetAndReserve(); emit LpFeeRateChange(newLpFeeRate); return true; } // ============ Asset Out ============ function _transferBaseOut(address to, uint256 amount) internal { if (amount > 0) { _BASE_TOKEN_.safeTransfer(to, amount); } } function _transferQuoteOut(address to, uint256 amount) internal { if (amount > 0) { _QUOTE_TOKEN_.safeTransfer(to, amount); } } function retrieve( address to, address token, uint256 amount ) external preventReentrant onlyOwner { require(token != address(_BASE_TOKEN_) && token != address(_QUOTE_TOKEN_), "USE_RESET"); IERC20(token).safeTransfer(to, amount); } } // File: contracts/DODOPrivatePool/impl/DPPTrader.sol contract DPPTrader is DPPVault { using SafeMath for uint256; // ============ Events ============ event DODOSwap( address fromToken, address toToken, uint256 fromAmount, uint256 toAmount, address trader, address receiver ); event DODOFlashLoan( address borrower, address assetTo, uint256 baseAmount, uint256 quoteAmount ); event RChange(PMMPricing.RState newRState); // ============ Trade Functions ============ function sellBase(address to) external preventReentrant returns (uint256 receiveQuoteAmount) { uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 baseInput = baseBalance.sub(uint256(_BASE_RESERVE_)); uint256 mtFee; uint256 newBaseTarget; PMMPricing.RState newRState; (receiveQuoteAmount, mtFee, newRState, newBaseTarget) = querySellBase(tx.origin, baseInput); _transferQuoteOut(to, receiveQuoteAmount); _transferQuoteOut(_MAINTAINER_, mtFee); // update TARGET if (_RState_ != uint32(newRState)) { require(newBaseTarget <= uint112(-1),"OVERFLOW"); _BASE_TARGET_ = uint112(newBaseTarget); _RState_ = uint32(newRState); emit RChange(newRState); } _setReserve(baseBalance, _QUOTE_TOKEN_.balanceOf(address(this))); emit DODOSwap( address(_BASE_TOKEN_), address(_QUOTE_TOKEN_), baseInput, receiveQuoteAmount, msg.sender, to ); } function sellQuote(address to) external preventReentrant returns (uint256 receiveBaseAmount) { uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); uint256 quoteInput = quoteBalance.sub(uint256(_QUOTE_RESERVE_)); uint256 mtFee; uint256 newQuoteTarget; PMMPricing.RState newRState; (receiveBaseAmount, mtFee, newRState, newQuoteTarget) = querySellQuote( tx.origin, quoteInput ); _transferBaseOut(to, receiveBaseAmount); _transferBaseOut(_MAINTAINER_, mtFee); // update TARGET if (_RState_ != uint32(newRState)) { require(newQuoteTarget <= uint112(-1),"OVERFLOW"); _QUOTE_TARGET_ = uint112(newQuoteTarget); _RState_ = uint32(newRState); emit RChange(newRState); } _setReserve(_BASE_TOKEN_.balanceOf(address(this)), quoteBalance); emit DODOSwap( address(_QUOTE_TOKEN_), address(_BASE_TOKEN_), quoteInput, receiveBaseAmount, msg.sender, to ); } function flashLoan( uint256 baseAmount, uint256 quoteAmount, address assetTo, bytes calldata data ) external preventReentrant { _transferBaseOut(assetTo, baseAmount); _transferQuoteOut(assetTo, quoteAmount); if (data.length > 0) IDODOCallee(assetTo).DPPFlashLoanCall(msg.sender, baseAmount, quoteAmount, data); uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); // no input -> pure loss require( baseBalance >= _BASE_RESERVE_ || quoteBalance >= _QUOTE_RESERVE_, "FLASH_LOAN_FAILED" ); // sell quote case // quote input + base output if (baseBalance < _BASE_RESERVE_) { uint256 quoteInput = quoteBalance.sub(uint256(_QUOTE_RESERVE_)); ( uint256 receiveBaseAmount, uint256 mtFee, PMMPricing.RState newRState, uint256 newQuoteTarget ) = querySellQuote(tx.origin, quoteInput); // revert if quoteBalance<quoteReserve require(uint256(_BASE_RESERVE_).sub(baseBalance) <= receiveBaseAmount, "FLASH_LOAN_FAILED"); _transferBaseOut(_MAINTAINER_, mtFee); if (_RState_ != uint32(newRState)) { require(newQuoteTarget <= uint112(-1),"OVERFLOW"); _QUOTE_TARGET_ = uint112(newQuoteTarget); _RState_ = uint32(newRState); emit RChange(newRState); } emit DODOSwap( address(_QUOTE_TOKEN_), address(_BASE_TOKEN_), quoteInput, receiveBaseAmount, msg.sender, assetTo ); } // sell base case // base input + quote output if (quoteBalance < _QUOTE_RESERVE_) { uint256 baseInput = baseBalance.sub(uint256(_BASE_RESERVE_)); ( uint256 receiveQuoteAmount, uint256 mtFee, PMMPricing.RState newRState, uint256 newBaseTarget ) = querySellBase(tx.origin, baseInput); // revert if baseBalance<baseReserve require(uint256(_QUOTE_RESERVE_).sub(quoteBalance) <= receiveQuoteAmount, "FLASH_LOAN_FAILED"); _transferQuoteOut(_MAINTAINER_, mtFee); if (_RState_ != uint32(newRState)) { require(newBaseTarget <= uint112(-1),"OVERFLOW"); _BASE_TARGET_ = uint112(newBaseTarget); _RState_ = uint32(newRState); emit RChange(newRState); } emit DODOSwap( address(_BASE_TOKEN_), address(_QUOTE_TOKEN_), baseInput, receiveQuoteAmount, msg.sender, assetTo ); } _sync(); emit DODOFlashLoan(msg.sender, assetTo, baseAmount, quoteAmount); } // ============ Query Functions ============ function querySellBase(address trader, uint256 payBaseAmount) public view returns ( uint256 receiveQuoteAmount, uint256 mtFee, PMMPricing.RState newRState, uint256 newBaseTarget ) { PMMPricing.PMMState memory state = getPMMState(); (receiveQuoteAmount, newRState) = PMMPricing.sellBaseToken(state, payBaseAmount); uint256 lpFeeRate = _LP_FEE_RATE_; uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader); mtFee = DecimalMath.mulFloor(receiveQuoteAmount, mtFeeRate); receiveQuoteAmount = receiveQuoteAmount .sub(DecimalMath.mulFloor(receiveQuoteAmount, lpFeeRate)) .sub(mtFee); newBaseTarget = state.B0; } function querySellQuote(address trader, uint256 payQuoteAmount) public view returns ( uint256 receiveBaseAmount, uint256 mtFee, PMMPricing.RState newRState, uint256 newQuoteTarget ) { PMMPricing.PMMState memory state = getPMMState(); (receiveBaseAmount, newRState) = PMMPricing.sellQuoteToken(state, payQuoteAmount); uint256 lpFeeRate = _LP_FEE_RATE_; uint256 mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(trader); mtFee = DecimalMath.mulFloor(receiveBaseAmount, mtFeeRate); receiveBaseAmount = receiveBaseAmount .sub(DecimalMath.mulFloor(receiveBaseAmount, lpFeeRate)) .sub(mtFee); newQuoteTarget = state.Q0; } } // File: contracts/DODOPrivatePool/impl/DPP.sol /** * @title DODO PrivatePool * @author DODO Breeder * * @notice DODOPrivatePool initialization */ contract DPP is DPPTrader { function init( address owner, address maintainer, address baseTokenAddress, address quoteTokenAddress, uint256 lpFeeRate, address mtFeeRateModel, uint256 k, uint256 i, bool isOpenTWAP ) external { initOwner(owner); require(baseTokenAddress != quoteTokenAddress, "BASE_QUOTE_CAN_NOT_BE_SAME"); _BASE_TOKEN_ = IERC20(baseTokenAddress); _QUOTE_TOKEN_ = IERC20(quoteTokenAddress); _MAINTAINER_ = maintainer; _MT_FEE_RATE_MODEL_ = IFeeRateModel(mtFeeRateModel); require(lpFeeRate <= 1e18, "LP_FEE_RATE_OUT_OF_RANGE"); require(k <= 1e18, "K_OUT_OF_RANGE"); require(i > 0 && i <= 1e36, "I_OUT_OF_RANGE"); _LP_FEE_RATE_ = uint64(lpFeeRate); _K_ = uint64(k); _I_ = uint128(i); _IS_OPEN_TWAP_ = isOpenTWAP; if(isOpenTWAP) _BLOCK_TIMESTAMP_LAST_ = uint32(block.timestamp % 2**32); _resetTargetAndReserve(); } // ============ Version Control ============ function version() virtual external pure returns (string memory) { return "DPP 1.0.0"; } } // File: contracts/DODOPrivatePool/impl/DPPAdvanced.sol /** * @title DODO PrivatePool * @author DODO Breeder * * @notice Advanced DODOPrivatePool */ contract DPPAdvanced is DPP { function tuneParameters( uint256 newLpFeeRate, uint256 newI, uint256 newK, uint256 minBaseReserve, uint256 minQuoteReserve ) public preventReentrant onlyOwner returns (bool) { require( _BASE_RESERVE_ >= minBaseReserve && _QUOTE_RESERVE_ >= minQuoteReserve, "RESERVE_AMOUNT_IS_NOT_ENOUGH" ); require(newLpFeeRate <= 1e18, "LP_FEE_RATE_OUT_OF_RANGE"); require(newK <= 1e18, "K_OUT_OF_RANGE"); require(newI > 0 && newI <= 1e36, "I_OUT_OF_RANGE"); _LP_FEE_RATE_ = uint64(newLpFeeRate); _K_ = uint64(newK); _I_ = uint128(newI); emit LpFeeRateChange(newLpFeeRate); return true; } function tunePrice( uint256 newI, uint256 minBaseReserve, uint256 minQuoteReserve ) public preventReentrant onlyOwner returns (bool) { require( _BASE_RESERVE_ >= minBaseReserve && _QUOTE_RESERVE_ >= minQuoteReserve, "RESERVE_AMOUNT_IS_NOT_ENOUGH" ); require(newI > 0 && newI <= 1e36, "I_OUT_OF_RANGE"); _I_ = uint128(newI); return true; } // ============ Version Control ============ function version() override external pure returns (string memory) { return "DPP Advanced 1.0.0"; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"address","name":"assetTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quoteAmount","type":"uint256"}],"name":"DODOFlashLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromToken","type":"address"},{"indexed":false,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"DODOSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLpFeeRate","type":"uint256"}],"name":"LpFeeRateChange","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PMMPricing.RState","name":"newRState","type":"uint8"}],"name":"RChange","type":"event"},{"inputs":[],"name":"_BASE_PRICE_CUMULATIVE_LAST_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_RESERVE_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_TARGET_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BASE_TOKEN_","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BLOCK_TIMESTAMP_LAST_","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_IS_OPEN_TWAP_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_I_","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_K_","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_LP_FEE_RATE_","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAINTAINER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MT_FEE_RATE_MODEL_","outputs":[{"internalType":"contract IFeeRateModel","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":"_QUOTE_RESERVE_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_TARGET_","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QUOTE_TOKEN_","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_RState_","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"address","name":"assetTo","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseInput","outputs":[{"internalType":"uint256","name":"input","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMidPrice","outputs":[{"internalType":"uint256","name":"midPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPMMState","outputs":[{"components":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"B","type":"uint256"},{"internalType":"uint256","name":"Q","type":"uint256"},{"internalType":"uint256","name":"B0","type":"uint256"},{"internalType":"uint256","name":"Q0","type":"uint256"},{"internalType":"enum PMMPricing.RState","name":"R","type":"uint8"}],"internalType":"struct PMMPricing.PMMState","name":"state","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPMMStateForCall","outputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"B","type":"uint256"},{"internalType":"uint256","name":"Q","type":"uint256"},{"internalType":"uint256","name":"B0","type":"uint256"},{"internalType":"uint256","name":"Q0","type":"uint256"},{"internalType":"uint256","name":"R","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getQuoteInput","outputs":[{"internalType":"uint256","name":"input","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserFeeRate","outputs":[{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"mtFeeRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultReserve","outputs":[{"internalType":"uint256","name":"baseReserve","type":"uint256"},{"internalType":"uint256","name":"quoteReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"maintainer","type":"address"},{"internalType":"address","name":"baseTokenAddress","type":"address"},{"internalType":"address","name":"quoteTokenAddress","type":"address"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"address","name":"mtFeeRateModel","type":"address"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"payBaseAmount","type":"uint256"}],"name":"querySellBase","outputs":[{"internalType":"uint256","name":"receiveQuoteAmount","type":"uint256"},{"internalType":"uint256","name":"mtFee","type":"uint256"},{"internalType":"enum PMMPricing.RState","name":"newRState","type":"uint8"},{"internalType":"uint256","name":"newBaseTarget","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"payQuoteAmount","type":"uint256"}],"name":"querySellQuote","outputs":[{"internalType":"uint256","name":"receiveBaseAmount","type":"uint256"},{"internalType":"uint256","name":"mtFee","type":"uint256"},{"internalType":"enum PMMPricing.RState","name":"newRState","type":"uint8"},{"internalType":"uint256","name":"newQuoteTarget","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratioSync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"assetTo","type":"address"},{"internalType":"uint256","name":"newLpFeeRate","type":"uint256"},{"internalType":"uint256","name":"newI","type":"uint256"},{"internalType":"uint256","name":"newK","type":"uint256"},{"internalType":"uint256","name":"baseOutAmount","type":"uint256"},{"internalType":"uint256","name":"quoteOutAmount","type":"uint256"},{"internalType":"uint256","name":"minBaseReserve","type":"uint256"},{"internalType":"uint256","name":"minQuoteReserve","type":"uint256"}],"name":"reset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"retrieve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellBase","outputs":[{"internalType":"uint256","name":"receiveQuoteAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellQuote","outputs":[{"internalType":"uint256","name":"receiveBaseAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLpFeeRate","type":"uint256"},{"internalType":"uint256","name":"newI","type":"uint256"},{"internalType":"uint256","name":"newK","type":"uint256"},{"internalType":"uint256","name":"minBaseReserve","type":"uint256"},{"internalType":"uint256","name":"minQuoteReserve","type":"uint256"}],"name":"tuneParameters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newI","type":"uint256"},{"internalType":"uint256","name":"minBaseReserve","type":"uint256"},{"internalType":"uint256","name":"minQuoteReserve","type":"uint256"}],"name":"tunePrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040526001805460ff60b01b1916905534801561001d57600080fd5b50613c4c8061002d6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80638456db151161013b578063d4b97046116100b8578063f2fde38b1161007c578063f2fde38b14610467578063f6b06e701461047a578063f811d69214610482578063fd1ed7e914610497578063fe24cb7f146104b25761023d565b8063d4b9704614610434578063dd93f59a1461043c578063e539ef491461044f578063ec2fd46d14610457578063ee27c6891461045f5761023d565b8063bbf5ce78116100ff578063bbf5ce78146103f6578063bd6015b4146103fe578063bf357dae14610411578063c57a5d0314610419578063d0a494e4146104215761023d565b80638456db151461039c578063880a4d87146103a45780638ff3928c146103b9578063a382d1b9146103cc578063ab44a7a3146103e15761023d565b806344096609116101c957806366410a211161018d57806366410a211461034157806371f9100c1461036457806377f586571461036c57806379a04876146103815780637d721504146103945761023d565b806344096609146102f45780634a248d2a146103075780634e71e0c81461030f57806354fd4d501461031757806365f6fcbb1461032c5761023d565b806328c4e24c1161021057806328c4e24c146102a85780632df6cb48146102bb57806336223ce9146102c35780633b20884a146102d95780634322ec83146102ec5761023d565b806301a3c30b146102425780630d0092971461025757806310d764601461026a57806316048bc414610293575b600080fd5b610255610250366004613355565b6104ba565b005b61025561026536600461333a565b61068a565b61027d610278366004613583565b6106ea565b60405161028a91906136e0565b60405180910390f35b61029b610815565b60405161028a9190613604565b6102556102b63660046133f5565b610824565b61027d610901565b6102cb610911565b60405161028a929190613af0565b61027d6102e73660046135ae565b61092c565b61029b610b1e565b6102cb61030236600461333a565b610b2d565b61029b610bc9565b610255610bd8565b61031f610c66565b60405161028a91906136ff565b610334610c93565b60405161028a9190613ae7565b61035461034f366004613435565b610d3a565b60405161028a9493929190613afe565b610334610e36565b610374610e7f565b60405161028a9190613abf565b61035461038f366004613435565b610e95565b610374610f84565b61029b610f93565b6103ac610fa2565b60405161028a9190613b57565b61027d6103c736600461345f565b610fb5565b6103d46111c5565b60405161028a9190613a66565b6103e9611269565b60405161028a9190613b68565b610374611280565b61033461040c36600461333a565b611296565b6103ac611550565b610255611563565b61025561042f3660046134f0565b611835565b61029b611e23565b61033461044a36600461333a565b611e32565b6103746120d7565b6103e96120e6565b6103346120f6565b61025561047536600461333a565b612108565b61029b61218d565b61048a61219c565b60405161028a9190613ad3565b61049f6121b2565b60405161028a9796959493929190613b27565b610334612215565b6104c38961068a565b856001600160a01b0316876001600160a01b031614156104fe5760405162461bcd60e51b81526004016104f5906137f7565b60405180910390fd5b600380546001600160a01b03808a166001600160a01b03199283161790925560048054898416908316179055600280548b84169083161790556008805492871692909116919091179055670de0b6b3a76400008511156105705760405162461bcd60e51b81526004016104f590613937565b670de0b6b3a76400008311156105985760405162461bcd60e51b81526004016104f59061390f565b6000821180156105b657506a0c097ce7bc90715b34b9f160241b8211155b6105d25760405162461bcd60e51b81526004016104f5906137ac565b6008805467ffffffffffffffff60a01b1916600160a01b67ffffffffffffffff88811691909102919091179091556009805467ffffffffffffffff191691851691909117600160401b600160c01b031916600160401b6001600160801b038516021790556001805460ff60b01b1916600160b01b83158015919091029190911790915561067757600580546001600160e01b03164263ffffffff16600160e01b021790555b61067f61221b565b505050505050505050565b600154600160a01b900460ff16156106b45760405162461bcd60e51b81526004016104f5906138ae565b6001805460ff60a01b1916600160a01b179055600080546001600160a01b039092166001600160a01b0319909216919091179055565b600154600090600160a81b900460ff16156107175760405162461bcd60e51b81526004016104f5906137d4565b6001805460ff60a81b1916600160a81b179055600054336001600160a01b03909116146107565760405162461bcd60e51b81526004016104f590613990565b6005546001600160701b031683118015906107835750600554600160701b90046001600160701b03168211155b61079f5760405162461bcd60e51b81526004016104f5906138d8565b6000841180156107bd57506a0c097ce7bc90715b34b9f160241b8411155b6107d95760405162461bcd60e51b81526004016104f5906137ac565b50600980546001600160801b038516600160401b02600160401b600160c01b0319909116179055600180805460ff60a81b191690559392505050565b6000546001600160a01b031681565b600154600160a81b900460ff161561084e5760405162461bcd60e51b81526004016104f5906137d4565b6001805460ff60a81b1916600160a81b179055600054336001600160a01b039091161461088d5760405162461bcd60e51b81526004016104f590613990565b6003546001600160a01b038381169116148015906108b957506004546001600160a01b03838116911614155b6108d55760405162461bcd60e51b81526004016104f590613a20565b6108ef6001600160a01b038316848363ffffffff6123ce16565b50506001805460ff60a81b1916905550565b600154600160b01b900460ff1681565b6005546001600160701b0380821692600160701b9092041690565b600154600090600160a81b900460ff16156109595760405162461bcd60e51b81526004016104f5906137d4565b6001805460ff60a81b1916600160a81b179055600054336001600160a01b03909116146109985760405162461bcd60e51b81526004016104f590613990565b6005546001600160701b031683118015906109c55750600554600160701b90046001600160701b03168211155b6109e15760405162461bcd60e51b81526004016104f5906138d8565b670de0b6b3a7640000861115610a095760405162461bcd60e51b81526004016104f590613937565b670de0b6b3a7640000841115610a315760405162461bcd60e51b81526004016104f59061390f565b600085118015610a4f57506a0c097ce7bc90715b34b9f160241b8511155b610a6b5760405162461bcd60e51b81526004016104f5906137ac565b6008805467ffffffffffffffff60a01b1916600160a01b67ffffffffffffffff89811691909102919091179091556009805467ffffffffffffffff191691861691909117600160401b600160c01b031916600160401b6001600160801b038816021790556040517f9950d5a2f2c7264863d40100bf993f0cdbc4711806caba6284d07e80fd50087990610aff908890613ae7565b60405180910390a150506001805460ff60a81b19168155949350505050565b6002546001600160a01b031681565b600854604051638198edbf60e01b815267ffffffffffffffff600160a01b830416916000916001600160a01b0390911690638198edbf90610b72908690600401613604565b60206040518083038186803b158015610b8a57600080fd5b505afa158015610b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc291906134d8565b9050915091565b6003546001600160a01b031681565b6001546001600160a01b03163314610c025760405162461bcd60e51b81526004016104f59061375d565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b604080518082019091526012815271044505020416476616e63656420312e302e360741b60208201525b90565b6005546003546040516370a0823160e01b8152600092610d35926001600160701b03909116916001600160a01b03909116906370a0823190610cd9903090600401613604565b60206040518083038186803b158015610cf157600080fd5b505afa158015610d05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2991906134d8565b9063ffffffff61242916565b905090565b600080600080610d486132dc565b610d506111c5565b9050610d5c8187612456565b600854604051638198edbf60e01b815292975090945067ffffffffffffffff600160a01b820416916000916001600160a01b031690638198edbf90610da5908c90600401613604565b60206040518083038186803b158015610dbd57600080fd5b505afa158015610dd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df591906134d8565b9050610e01878261255c565b9550610e2186610d29610e148a8661255c565b8a9063ffffffff61242916565b96508260a00151935050505092959194509250565b600554600480546040516370a0823160e01b8152600093610d3593600160701b9091046001600160701b0316926001600160a01b0316916370a0823191610cd991309101613604565b600654600160701b90046001600160701b031681565b600080600080610ea36132dc565b610eab6111c5565b9050610eb78187612586565b600854604051638198edbf60e01b815292975090945067ffffffffffffffff600160a01b820416916000916001600160a01b031690638198edbf90610f00908c90600401613604565b60206040518083038186803b158015610f1857600080fd5b505afa158015610f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5091906134d8565b9050610f5c878261255c565b9550610f6f86610d29610e148a8661255c565b96508260800151935050505092959194509250565b6005546001600160701b031681565b6001546001600160a01b031681565b600554600160e01b900463ffffffff1681565b600154600090600160a81b900460ff1615610fe25760405162461bcd60e51b81526004016104f5906137d4565b6001805460ff60a81b1916600160a81b179055600054336001600160a01b03909116146110215760405162461bcd60e51b81526004016104f590613990565b6005546001600160701b0316831180159061104e5750600554600160701b90046001600160701b03168211155b61106a5760405162461bcd60e51b81526004016104f5906138d8565b670de0b6b3a76400008811156110925760405162461bcd60e51b81526004016104f590613937565b670de0b6b3a76400008611156110ba5760405162461bcd60e51b81526004016104f59061390f565b6000871180156110d857506a0c097ce7bc90715b34b9f160241b8711155b6110f45760405162461bcd60e51b81526004016104f5906137ac565b6008805467ffffffffffffffff60a01b1916600160a01b67ffffffffffffffff8b811691909102919091179091556009805467ffffffffffffffff191691881691909117600160401b600160c01b031916600160401b6001600160801b038a16021790556111628986612687565b61116c89856126aa565b61117461221b565b7f9950d5a2f2c7264863d40100bf993f0cdbc4711806caba6284d07e80fd500879886040516111a39190613ae7565b60405180910390a150506001805460ff60a81b19168155979650505050505050565b6111cd6132dc565b600954600160401b81046001600160801b0316825267ffffffffffffffff1660208201526005546001600160701b038082166040840152600160701b918290048116606084015260065480821660808501529182041660a0830152600160e01b900463ffffffff16600281111561124057fe5b8160c00190600281111561125057fe5b9081600281111561125d57fe5b905250610c90816126cd565b600854600160a01b900467ffffffffffffffff1681565b600554600160701b90046001600160701b031681565b600154600090600160a81b900460ff16156112c35760405162461bcd60e51b81526004016104f5906137d4565b6001805460ff60a81b1916600160a81b1790556003546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611307903090600401613604565b60206040518083038186803b15801561131f57600080fd5b505afa158015611333573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135791906134d8565b60055490915060009061137a9083906001600160701b031663ffffffff61242916565b9050600080600061138b3285610e95565b92985090945090925090506113a087876126aa565b6002546113b6906001600160a01b0316846126aa565b8060028111156113c257fe5b600654600160e01b900463ffffffff90811691161461146f576001600160701b038211156114025760405162461bcd60e51b81526004016104f59061396e565b600680546001600160701b0319166001600160701b03841617905580600281111561142957fe5b6006601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020613bd78339815191528160405161146691906136eb565b60405180910390a15b600480546040516370a0823160e01b81526114f79288926001600160a01b0316916370a08231916114a291309101613604565b60206040518083038186803b1580156114ba57600080fd5b505afa1580156114ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f291906134d8565b612777565b600354600454604051600080516020613bf783398151915292611530926001600160a01b039182169291169088908b9033908e9061368d565b60405180910390a150506001805460ff60a81b1916905550919392505050565b600654600160e01b900463ffffffff1681565b600154600160a81b900460ff161561158d5760405162461bcd60e51b81526004016104f5906137d4565b6001805460ff60a81b1916600160a81b179055600054336001600160a01b03909116146115cc5760405162461bcd60e51b81526004016104f590613990565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a08231906115fd903090600401613604565b60206040518083038186803b15801561161557600080fd5b505afa158015611629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164d91906134d8565b600480546040516370a0823160e01b81529293506000926001600160a01b03909116916370a082319161168291309101613604565b60206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d291906134d8565b90506001600160701b0382118015906116f257506001600160701b038111155b61170e5760405162461bcd60e51b81526004016104f59061396e565b6005546001600160701b0316821461178357600554600654611753916001600160701b039081169161174791168563ffffffff61280416565b9063ffffffff61284516565b600680546001600160701b03199081166001600160701b0393841617909155600580549091169184169190911790555b600554600160701b90046001600160701b0316811461180a576005546006546117cd916001600160701b03600160701b91829004811692611747929004168463ffffffff61280416565b600680546001600160701b03928316600160701b908102600160701b600160e01b0319928316179092556005805493851690920292169190911790555b600154600160b01b900460ff16156118245761182461286f565b50506001805460ff60a81b19169055565b600154600160a81b900460ff161561185f5760405162461bcd60e51b81526004016104f5906137d4565b6001805460ff60a81b1916600160a81b17905561187c8386612687565b61188683856126aa565b80156118f357604051637ed1f1dd60e01b81526001600160a01b03841690637ed1f1dd906118c09033908990899088908890600401613641565b600060405180830381600087803b1580156118da57600080fd5b505af11580156118ee573d6000803e3d6000fd5b505050505b6003546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611924903090600401613604565b60206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197491906134d8565b600480546040516370a0823160e01b81529293506000926001600160a01b03909116916370a08231916119a991309101613604565b60206040518083038186803b1580156119c157600080fd5b505afa1580156119d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f991906134d8565b6005549091506001600160701b031682101580611a285750600554600160701b90046001600160701b03168110155b611a445760405162461bcd60e51b81526004016104f590613732565b6005546001600160701b0316821015611c0757600554600090611a78908390600160701b90046001600160701b0316612429565b9050600080600080611a8a3286610d3a565b600554939750919550935091508490611ab2906001600160701b03168963ffffffff61242916565b1115611ad05760405162461bcd60e51b81526004016104f590613732565b600254611ae6906001600160a01b031684612687565b816002811115611af257fe5b600654600160e01b900463ffffffff908116911614611ba8576001600160701b03811115611b325760405162461bcd60e51b81526004016104f59061396e565b60068054600160701b600160e01b031916600160701b6001600160701b03841602179055816002811115611b6257fe5b6006601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020613bd783398151915282604051611b9f91906136eb565b60405180910390a15b600080516020613bf7833981519152600460009054906101000a90046001600160a01b0316600360009054906101000a90046001600160a01b03168787338f604051611bf99695949392919061368d565b60405180910390a150505050505b600554600160701b90046001600160701b0316811015611dc857600554600090611c419084906001600160701b031663ffffffff61242916565b9050600080600080611c533286610e95565b600554939750919550935091508490611c7c90600160701b90046001600160701b031688612429565b1115611c9a5760405162461bcd60e51b81526004016104f590613732565b600254611cb0906001600160a01b0316846126aa565b816002811115611cbc57fe5b600654600160e01b900463ffffffff908116911614611d69576001600160701b03811115611cfc5760405162461bcd60e51b81526004016104f59061396e565b600680546001600160701b0319166001600160701b038316179055816002811115611d2357fe5b6006601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020613bd783398151915282604051611d6091906136eb565b60405180910390a15b600080516020613bf7833981519152600360009054906101000a90046001600160a01b0316600460009054906101000a90046001600160a01b03168787338f604051611dba9695949392919061368d565b60405180910390a150505050505b611dd0612904565b7f0b82e93068db15abd9fbb2682c65462ea8a0a10582dce93a5664818e296f54eb33868989604051611e059493929190613618565b60405180910390a150506001805460ff60a81b191690555050505050565b6004546001600160a01b031681565b600154600090600160a81b900460ff1615611e5f5760405162461bcd60e51b81526004016104f5906137d4565b6001805460ff60a81b1916600160a81b179055600480546040516370a0823160e01b81526000926001600160a01b03909216916370a0823191611ea491309101613604565b60206040518083038186803b158015611ebc57600080fd5b505afa158015611ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef491906134d8565b600554909150600090611f18908390600160701b90046001600160701b0316612429565b90506000806000611f293285610d3a565b9298509094509092509050611f3e8787612687565b600254611f54906001600160a01b031684612687565b806002811115611f6057fe5b600654600160e01b900463ffffffff908116911614612016576001600160701b03821115611fa05760405162461bcd60e51b81526004016104f59061396e565b60068054600160701b600160e01b031916600160701b6001600160701b03851602179055806002811115611fd057fe5b6006601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020613bd78339815191528160405161200d91906136eb565b60405180910390a15b6003546040516370a0823160e01b815261209e916001600160a01b0316906370a0823190612048903090600401613604565b60206040518083038186803b15801561206057600080fd5b505afa158015612074573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209891906134d8565b86612777565b600454600354604051600080516020613bf783398151915292611530926001600160a01b039182169291169088908b9033908e9061368d565b6006546001600160701b031681565b60095467ffffffffffffffff1681565b6000610d356121036111c5565b612acc565b6000546001600160a01b031633146121325760405162461bcd60e51b81526004016104f590613990565b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031681565b600954600160401b90046001600160801b031681565b60008060008060008060006121c56132dc565b6121cd6111c5565b905080600001519750806020015196508060400151955080606001519450806080015193508060a0015192508060c00151600281111561220957fe5b91505090919293949596565b60075481565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a082319061224c903090600401613604565b60206040518083038186803b15801561226457600080fd5b505afa158015612278573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229c91906134d8565b600480546040516370a0823160e01b81529293506000926001600160a01b03909116916370a08231916122d191309101613604565b60206040518083038186803b1580156122e957600080fd5b505afa1580156122fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232191906134d8565b90506001600160701b03821180159061234157506001600160701b038111155b61235d5760405162461bcd60e51b81526004016104f59061396e565b600580546001600160701b03838116600160701b02600160701b600160e01b03199186166001600160701b031993841681178316821790945560068054909316909317169091176001600160e01b0316905560015460ff600160b01b90910416156123ca576123ca61286f565b5050565b6124248363a9059cbb60e01b84846040516024016123ed9291906136c7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bc3565b505050565b60008282111561244b5760405162461bcd60e51b81526004016104f59061388b565b508082035b92915050565b600080808460c00151600281111561246a57fe5b14156124855761247a8484612c80565b915060019050612555565b60018460c00151600281111561249757fe5b14156124a75761247a8484612ca7565b60006124c485606001518660a0015161242990919063ffffffff16565b905060006124e38660800151876040015161242990919063ffffffff16565b90508185101561250e576124f78686612cc4565b93506002925080841115612509578093505b612552565b818514156125225780935060009250612552565b61254b61253e87612539888663ffffffff61242916565b612c80565b829063ffffffff612cff16565b9350600192505b50505b9250929050565b6000670de0b6b3a7640000612577848463ffffffff61280416565b8161257e57fe5b049392505050565b600080808460c00151600281111561259a57fe5b14156125b5576125aa8484612d24565b915060029050612555565b60018460c0015160028111156125c757fe5b14156126725760006125ea8560400151866080015161242990919063ffffffff16565b905060006126098660a00151876060015161242990919063ffffffff16565b9050818510156126345761261d8686612d43565b9350600192508084111561262f578093505b61266b565b81851415612648578093506000925061266b565b61266461253e8761265f888663ffffffff61242916565b612d24565b9350600292505b5050612555565b61267c8484612d75565b946002945092505050565b80156123ca576003546123ca906001600160a01b0316838363ffffffff6123ce16565b80156123ca576004546123ca906001600160a01b0316838363ffffffff6123ce16565b60028160c0015160028111156126df57fe5b141561271e5761271481606001516127088360800151846040015161242990919063ffffffff16565b83516020850151612d94565b60a0820152612774565b60018160c00151600281111561273057fe5b14156127745761276e81604001516127598360a00151846060015161242990919063ffffffff16565b835161276490612eb8565b8460200151612d94565b60808201525b50565b6001600160701b03821180159061279557506001600160701b038111155b6127b15760405162461bcd60e51b81526004016104f59061396e565b600580546001600160701b03838116600160701b02600160701b600160e01b03199186166001600160701b0319909316929092171617905560015460ff600160b01b90910416156123ca576123ca61286f565b60008261281357506000612450565b8282028284828161282057fe5b041461283e5760405162461bcd60e51b81526004016104f590613a43565b9392505050565b60008082116128665760405162461bcd60e51b81526004016104f590613863565b81838161257e57fe5b60055463ffffffff42811691600160e01b900481168203908116158015906128a157506005546001600160701b031615155b80156128be5750600554600160701b90046001600160701b031615155b156128de578063ffffffff166128d26120f6565b60078054919092020190555b506005805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612935903090600401613604565b60206040518083038186803b15801561294d57600080fd5b505afa158015612961573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298591906134d8565b600480546040516370a0823160e01b81529293506000926001600160a01b03909116916370a08231916129ba91309101613604565b60206040518083038186803b1580156129d257600080fd5b505afa1580156129e6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0a91906134d8565b90506001600160701b038211801590612a2a57506001600160701b038111155b612a465760405162461bcd60e51b81526004016104f59061396e565b6005546001600160701b03168214612a7457600580546001600160701b0319166001600160701b0384161790555b600554600160701b90046001600160701b03168114612ab25760058054600160701b600160e01b031916600160701b6001600160701b038416021790555b600154600160b01b900460ff16156123ca576123ca61286f565b600060028260c001516002811115612ae057fe5b1415612b6b57606082015160a0830151600091612b1691612b0c9190611747908063ffffffff61280416565b8460600151612ed8565b9050612b53612b2984602001518361255c565b6020850151612b4790670de0b6b3a76400009063ffffffff61242916565b9063ffffffff612cff16565b9050612b63836000015182612ed8565b915050612bbe565b60408201516080830151600091612b9b91612b919190611747908063ffffffff61280416565b8460400151612ed8565b9050612bae612b2984602001518361255c565b9050612b6383600001518261255c565b919050565b60006060836001600160a01b031683604051612bdf91906135e8565b6000604051808303816000865af19150503d8060008114612c1c576040519150601f19603f3d011682016040523d82523d6000602084013e612c21565b606091505b509150915081612c435760405162461bcd60e51b81526004016104f59061382e565b805115612c7a5780806020019051810190612c5e91906134bc565b612c7a5760405162461bcd60e51b81526004016104f5906139d6565b50505050565b600061283e8360800151846080015184612c9d8760000151612eb8565b8760200151612ef6565b600061283e8360800151846040015184612c9d8760000151612eb8565b600061283e8360a00151612ce5848660600151612cff90919063ffffffff16565b60608601518651612cf590612eb8565b8760200151613176565b60008282018381101561283e5760405162461bcd60e51b81526004016104f5906139b3565b600061283e8360a001518460a001518486600001518760200151612ef6565b600061283e8360800151612d64848660400151612cff90919063ffffffff16565b604086015186516020880151613176565b600061283e8360a0015184606001518486600001518760200151612ef6565b600084612da357506000612eb0565b81612dc957612dc2612db5848661255c565b869063ffffffff612cff16565b9050612eb0565b600080612ddf600485028663ffffffff61280416565b905080612df657670de0b6b3a76400009150612e74565b858187830281612e0257fe5b041415612e3c57612e35612e306a0c097ce7bc90715b34b9f160241b612b47848a028b63ffffffff61284516565b61324e565b9150612e74565b612e71612e306a0c097ce7bc90715b34b9f160241b612b4789612e65868d63ffffffff61284516565b9063ffffffff61280416565b91505b6000612e9e670de0b6b3a7640000612b47612e95868363ffffffff61242916565b88600202612ed8565b9050612eaa888261255c565b93505050505b949350505050565b60006124506a0c097ce7bc90715b34b9f160241b8363ffffffff61284516565b600061283e8261174785670de0b6b3a764000063ffffffff61280416565b6000808611612f175760405162461bcd60e51b81526004016104f590613784565b83612f245750600061316d565b81612f515784612f34848661255c565b11612f4857612f43838561255c565b612f4a565b845b905061316d565b670de0b6b3a764000082141561301157600080612f74858763ffffffff61280416565b905080612f845760009150612fdd565b868188830281612f9057fe5b041415612fc057612fb9612faa898063ffffffff61280416565b8289029063ffffffff61284516565b9150612fdd565b612fda8861174787612e6583838c8e63ffffffff61280416565b91505b613008612ff883670de0b6b3a764000063ffffffff612cff16565b611747898563ffffffff61280416565b9250505061316d565b600061303e613026858763ffffffff61280416565b612b4789612e658a611747898463ffffffff61280416565b9050600061305e87612e65670de0b6b3a76400008763ffffffff61242916565b905060008282106130745750819003600061307a565b50810360015b61309282670de0b6b3a764000063ffffffff61284516565b915060006130c96130b66004612e65670de0b6b3a76400008a63ffffffff61242916565b6130c48c612e658a8f61255c565b61255c565b90506130e2612e3082612b47868063ffffffff61280416565b905060006131036002612e65670de0b6b3a76400008a63ffffffff61242916565b9050600083156131245761311d838663ffffffff61242916565b9050613137565b613134858463ffffffff612cff16565b90505b60006131438284613285565b90508b81111561315d57600097505050505050505061316d565b8b03965061316d95505050505050565b95945050505050565b60008086116131975760405162461bcd60e51b81526004016104f590613784565b60006131b96131ac878763ffffffff61242916565b859063ffffffff61280416565b9050826131e0576131d881670de0b6b3a764000063ffffffff61284516565b91505061316d565b60006131ff6131f9886117478b8063ffffffff61280416565b87612ed8565b9050600061320d858361255c565b90506132416a0c097ce7bc90715b34b9f160241b61174785612e6585612b47670de0b6b3a76400008c63ffffffff61242916565b9998505050505050505050565b80600160028204015b8181101561327f5780915060028182858161326e57fe5b04018161327757fe5b049050613257565b50919050565b600061283e826132a385670de0b6b3a764000063ffffffff61280416565b9063ffffffff6132af16565b6000806132bc8484612845565b9050828102840380156132d457506001019050612450565b509050612450565b6040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000600281111561331e57fe5b905290565b80356001600160a01b038116811461245057600080fd5b60006020828403121561334b578081fd5b61283e8383613323565b60008060008060008060008060006101208a8c031215613373578485fd5b893561337e81613bb3565b985060208a013561338e81613bb3565b975060408a013561339e81613bb3565b965060608a01356133ae81613bb3565b955060808a0135945060a08a01356133c581613bb3565b935060c08a0135925060e08a013591506101008a01356133e481613bc8565b809150509295985092959850929598565b600080600060608486031215613409578283fd5b833561341481613bb3565b9250602084013561342481613bb3565b929592945050506040919091013590565b60008060408385031215613447578182fd5b6134518484613323565b946020939093013593505050565b600080600080600080600080610100898b03121561347b578384fd5b883561348681613bb3565b9a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e00135945092505050565b6000602082840312156134cd578081fd5b815161283e81613bc8565b6000602082840312156134e9578081fd5b5051919050565b600080600080600060808688031215613507578081fd5b853594506020860135935061351f8760408801613323565b9250606086013567ffffffffffffffff8082111561353b578283fd5b81880189601f82011261354c578384fd5b803592508183111561355c578384fd5b89602084830101111561356d578384fd5b6020810194505050809150509295509295909350565b600080600060608486031215613597578283fd5b505081359360208301359350604090920135919050565b600080600080600060a086880312156135c5578081fd5b505083359560208501359550604085013594606081013594506080013592509050565b600082516135fa818460208701613b7d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b600060018060a01b038716825285602083015284604083015260806060830152826080830152828460a084013781830160a090810191909152601f909201601f19160101949350505050565b6001600160a01b0396871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60208101600383106136f957fe5b91905290565b600060208252825180602084015261371e816040850160208701613b7d565b601f01601f19169190910160400192915050565b60208082526011908201527011931054d217d313d05397d19052531151607a1b604082015260600190565b6020808252600d908201526c494e56414c49445f434c41494d60981b604082015260600190565b6020808252600e908201526d5441524745545f49535f5a45524f60901b604082015260600190565b6020808252600e908201526d495f4f55545f4f465f52414e474560901b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252601a908201527f424153455f51554f54455f43414e5f4e4f545f42455f53414d45000000000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b60208082526010908201526f1113d113d7d25392551250531256915160821b604082015260600190565b6020808252601c908201527f524553455256455f414d4f554e545f49535f4e4f545f454e4f55474800000000604082015260600190565b6020808252600e908201526d4b5f4f55545f4f465f52414e474560901b604082015260600190565b60208082526018908201527f4c505f4645455f524154455f4f55545f4f465f52414e47450000000000000000604082015260600190565b6020808252600890820152674f564552464c4f5760c01b604082015260600190565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600990820152681554d157d49154d15560ba1b604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c0830151613ab281613ba9565b8060c08401525092915050565b6001600160701b0391909116815260200190565b6001600160801b0391909116815260200190565b90815260200190565b918252602082015260400190565b8481526020810184905260808101613b1584613ba9565b60408201939093526060015292915050565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b63ffffffff91909116815260200190565b67ffffffffffffffff91909116815260200190565b60005b83811015613b98578181015183820152602001613b80565b83811115612c7a5750506000910152565b6003811061277457fe5b6001600160a01b038116811461277457600080fd5b801515811461277457600080fdfedf176ad18be4f9f32efaa32f06e9d1175476504739a745f1399a6d3fa4b75917c2c0245e056d5fb095f04cd6373bc770802ebd1e6c918eb78fdef843cdb37b0fa2646970667358221220eafdaeef0bf2fa931b1569937b8fe3c60eb4b746b68f4c833dd51449c5a41ccf64736f6c63430006090033
Deployed ByteCode Sourcemap
42846:1414:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41463:1049;;;;;;;;;:::i;:::-;;965:127;;;;;;;;;:::i;43637:446::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;332:22;;;:::i;:::-;;;;;;;;33199:286;;;;;;;;;:::i;22158:34::-;;;:::i;28283:181::-;;;:::i;:::-;;;;;;;;;42883:744;;;;;;;;;:::i;22250:27::-;;;:::i;28472:234::-;;;;;;;;;:::i;22286:26::-;;;:::i;1271:228::-;;;:::i;44145:112::-;;;:::i;:::-;;;;;;;;28760:152;;;:::i;:::-;;;;;;;;40465:797;;;;;;;;;:::i;:::-;;;;;;;;;;;28920:155;;;:::i;22508:29::-;;;:::i;:::-;;;;;;;;39660:797;;;;;;;;;:::i;22355:29::-;;;:::i;361:26::-;;;:::i;22428:36::-;;;:::i;:::-;;;;;;;;31840:965;;;;;;;;;:::i;22876:367::-;;;:::i;:::-;;;;;;;;22738:27;;;:::i;:::-;;;;;;;;22391:30;;;:::i;34109:1149::-;;;;;;;;;:::i;22544:22::-;;;:::i;31045:787::-;;;:::i;36460:3140::-;;;;;;;;;:::i;22319:27::-;;;:::i;35266:1186::-;;;;;;;;;:::i;22473:28::-;;;:::i;22772:17::-;;;:::i;23762:125::-;;;:::i;1100:163::-;;;;;;;;;:::i;22685:40::-;;;:::i;22796:18::-;;;:::i;:::-;;;;;;;;23251:503;;;:::i;:::-;;;;;;;;;;;;;;22575:43;;;:::i;41463:1049::-;41755:16;41765:5;41755:9;:16::i;:::-;41812:17;-1:-1:-1;;;;;41792:37:0;:16;-1:-1:-1;;;;;41792:37:0;;;41784:76;;;;-1:-1:-1;;;41784:76:0;;;;;;;;;;;;;;;;;41871:12;:39;;-1:-1:-1;;;;;41871:39:0;;;-1:-1:-1;;;;;;41871:39:0;;;;;;;41921:13;:41;;;;;;;;;;;41975:12;:25;;;;;;;;;;;42011:19;:51;;;;;;;;;;;;;;;42104:4;42091:17;;;42083:54;;;;-1:-1:-1;;;42083:54:0;;;;;;;;;42161:4;42156:1;:9;;42148:36;;;;-1:-1:-1;;;42148:36:0;;;;;;;;;42207:1;42203;:5;:18;;;;;-1:-1:-1;;;42212:1:0;:9;;42203:18;42195:45;;;;-1:-1:-1;;;42195:45:0;;;;;;;;;42251:13;:33;;-1:-1:-1;;;;42251:33:0;-1:-1:-1;;;42251:33:0;;;;;;;;;;;;;;;42295:3;:15;;-1:-1:-1;;42295:15:0;;;;;;;;-1:-1:-1;;;;;;;;42321:16:0;-1:-1:-1;;;;;;;;42321:16:0;;;;;;-1:-1:-1;42350:27:0;;-1:-1:-1;;;;42350:27:0;-1:-1:-1;;;42350:27:0;;;;;;;;;;;;;;;42388:71;;42403:22;:56;;-1:-1:-1;;;;;42403:56:0;42435:15;:23;;-1:-1:-1;;;42403:56:0;;;;42388:71;42480:24;:22;:24::i;:::-;41463:1049;;;;;;;;;:::o;965:127::-;754:13;;-1:-1:-1;;;754:13:0;;;;753:14;745:43;;;;-1:-1:-1;;;745:43:0;;;;;;;;;1051:4:::1;1035:20:::0;;-1:-1:-1;;;;1035:20:0::1;-1:-1:-1::0;;;1035:20:0::1;::::0;;;1066:18;;-1:-1:-1;;;;;1066:18:0;;::::1;-1:-1:-1::0;;;;;;1066:18:0;;::::1;::::0;;;::::1;::::0;;965:127::o;43637:446::-;7658:9;;43796:4;;-1:-1:-1;;;7658:9:0;;;;7657:10;7649:32;;;;-1:-1:-1;;;7649:32:0;;;;;;;;;7704:4;7692:16;;-1:-1:-1;;;;7692:16:0;-1:-1:-1;;;7692:16:0;;;;870:7;856:10:::1;-1:-1:-1::0;;;;;870:7:0;;::::1;856:21;848:43;;;;-1:-1:-1::0;;;848:43:0::1;;;;;;;;;43835:14:::2;::::0;-1:-1:-1;;;;;43835:14:0::2;:32:::0;-1:-1:-1;43835:32:0;::::2;::::0;:70:::2;;-1:-1:-1::0;43871:15:0::2;::::0;-1:-1:-1;;;43871:15:0;::::2;-1:-1:-1::0;;;;;43871:15:0::2;-1:-1:-1::0;;43871:34:0::2;43835:70;43813:148;;;;-1:-1:-1::0;;;43813:148:0::2;;;;;;;;;43987:1;43980:4;:8;:24;;;;;-1:-1:-1::0;;;43992:4:0::2;:12;;43980:24;43972:51;;;;-1:-1:-1::0;;;43972:51:0::2;;;;;;;;;-1:-1:-1::0;44034:3:0::2;:19:::0;;-1:-1:-1;;;;;44034:19:0;::::2;-1:-1:-1::0;;;44034:19:0::2;-1:-1:-1::0;;;;;;;;44034:19:0;;::::2;;::::0;;-1:-1:-1;7731:9:0;:17;;-1:-1:-1;;;;7731:17:0;;;43637:446;;-1:-1:-1;;;43637:446:0:o;332:22::-;;;-1:-1:-1;;;;;332:22:0;;:::o;33199:286::-;7658:9;;-1:-1:-1;;;7658:9:0;;;;7657:10;7649:32;;;;-1:-1:-1;;;7649:32:0;;;;;;;;;7704:4;7692:16;;-1:-1:-1;;;;7692:16:0;-1:-1:-1;;;7692:16:0;;;;870:7;856:10:::1;-1:-1:-1::0;;;;;870:7:0;;::::1;856:21;848:43;;;;-1:-1:-1::0;;;848:43:0::1;;;;;;;;;33366:12:::2;::::0;-1:-1:-1;;;;;33349:30:0;;::::2;33366:12:::0;::::2;33349:30;::::0;::::2;::::0;:65:::2;;-1:-1:-1::0;33400:13:0::2;::::0;-1:-1:-1;;;;;33383:31:0;;::::2;33400:13:::0;::::2;33383:31;;33349:65;33341:87;;;;-1:-1:-1::0;;;33341:87:0::2;;;;;;;;;33439:38;-1:-1:-1::0;;;;;33439:26:0;::::2;33466:2:::0;33470:6;33439:38:::2;:26;:38;:::i;:::-;-1:-1:-1::0;;7731:9:0;:17;;-1:-1:-1;;;;7731:17:0;;;-1:-1:-1;33199:286:0:o;22158:34::-;;;-1:-1:-1;;;22158:34:0;;;;;:::o;28283:181::-;28401:14;;-1:-1:-1;;;;;28401:14:0;;;;-1:-1:-1;;;28441:15:0;;;;;28283:181::o;42883:744::-;7658:9;;43101:4;;-1:-1:-1;;;7658:9:0;;;;7657:10;7649:32;;;;-1:-1:-1;;;7649:32:0;;;;;;;;;7704:4;7692:16;;-1:-1:-1;;;;7692:16:0;-1:-1:-1;;;7692:16:0;;;;870:7;856:10:::1;-1:-1:-1::0;;;;;870:7:0;;::::1;856:21;848:43;;;;-1:-1:-1::0;;;848:43:0::1;;;;;;;;;43140:14:::2;::::0;-1:-1:-1;;;;;43140:14:0::2;:32:::0;-1:-1:-1;43140:32:0;::::2;::::0;:70:::2;;-1:-1:-1::0;43176:15:0::2;::::0;-1:-1:-1;;;43176:15:0;::::2;-1:-1:-1::0;;;;;43176:15:0::2;-1:-1:-1::0;;43176:34:0::2;43140:70;43118:148;;;;-1:-1:-1::0;;;43118:148:0::2;;;;;;;;;43301:4;43285:12;:20;;43277:57;;;;-1:-1:-1::0;;;43277:57:0::2;;;;;;;;;43361:4;43353;:12;;43345:39;;;;-1:-1:-1::0;;;43345:39:0::2;;;;;;;;;43410:1;43403:4;:8;:24;;;;;-1:-1:-1::0;;;43415:4:0::2;:12;;43403:24;43395:51;;;;-1:-1:-1::0;;;43395:51:0::2;;;;;;;;;43457:13;:36:::0;;-1:-1:-1;;;;43457:36:0::2;-1:-1:-1::0;;;43457:36:0::2;::::0;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;;43504:3:::2;:18:::0;;-1:-1:-1;;43504:18:0::2;::::0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;;;;43533:19:0::2;-1:-1:-1::0;;;;;;;;43533:19:0;::::2;;;::::0;;43568:29:::2;::::0;::::2;::::0;::::2;::::0;43457:36;;43568:29:::2;;;;;;;;;;-1:-1:-1::0;;43615:4:0::2;7731:17:::0;;-1:-1:-1;;;;7731:17:0;;;43615:4;42883:744;-1:-1:-1;;;;42883:744:0:o;22250:27::-;;;-1:-1:-1;;;;;22250:27:0;;:::o;28472:234::-;28626:13;;28662:36;;-1:-1:-1;;;28662:36:0;;28626:13;-1:-1:-1;;;28626:13:0;;;;28560:17;;-1:-1:-1;;;;;28662:19:0;;;;:30;;:36;;28693:4;;28662:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28650:48;;28472:234;;;:::o;22286:26::-;;;-1:-1:-1;;;;;22286:26:0;;:::o;1271:228::-;1337:11;;-1:-1:-1;;;;;1337:11:0;1323:10;:25;1315:51;;;;-1:-1:-1;;;1315:51:0;;;;;;;;;1412:11;;;1403:7;;1382:42;;-1:-1:-1;;;;;1412:11:0;;;;1403:7;;;;1382:42;;;1445:11;;;;1435:21;;-1:-1:-1;;;;;;1435:21:0;;;-1:-1:-1;;;;;1445:11:0;;1435:21;;;;1467:24;;;1271:228::o;44145:112::-;44222:27;;;;;;;;;;;;-1:-1:-1;;;44222:27:0;;;;44145:112;;:::o;28760:152::-;28888:14;;28838:12;;:37;;-1:-1:-1;;;28838:37:0;;28805:13;;28838:66;;-1:-1:-1;;;;;28888:14:0;;;;-1:-1:-1;;;;;28838:12:0;;;;:22;;:37;;28869:4;;28838:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:41;:66;:41;:66;:::i;:::-;28831:73;;28760:152;:::o;40465:797::-;40591:25;40631:13;40659:27;40701:22;40751:32;;:::i;:::-;40786:13;:11;:13::i;:::-;40751:48;;40843;40869:5;40876:14;40843:25;:48::i;:::-;40924:13;;40968:38;;-1:-1:-1;;;40968:38:0;;40810:81;;-1:-1:-1;40810:81:0;;-1:-1:-1;40924:13:0;-1:-1:-1;;;40924:13:0;;;;40904:17;;-1:-1:-1;;;;;40968:19:0;;:30;;:38;;40999:6;;40968:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40948:58;;41025:50;41046:17;41065:9;41025:20;:50::i;:::-;41017:58;;41106:112;41212:5;41106:87;41142:50;41163:17;41182:9;41142:20;:50::i;:::-;41106:17;;:87;:35;:87;:::i;:112::-;41086:132;;41246:5;:8;;;41229:25;;40465:797;;;;;;;;;;:::o;28920:155::-;29050:15;;28999:13;;;:38;;-1:-1:-1;;;28999:38:0;;28966:13;;28999:68;;-1:-1:-1;;;29050:15:0;;;-1:-1:-1;;;;;29050:15:0;;-1:-1:-1;;;;;28999:13:0;;:23;;:38;;29031:4;;28999:38;;;22508:29;;;-1:-1:-1;;;22508:29:0;;-1:-1:-1;;;;;22508:29:0;;:::o;39660:797::-;39784:26;39825:13;39853:27;39895:21;39944:32;;:::i;:::-;39979:13;:11;:13::i;:::-;39944:48;;40037:46;40062:5;40069:13;40037:24;:46::i;:::-;40116:13;;40160:38;;-1:-1:-1;;;40160:38:0;;40003:80;;-1:-1:-1;40003:80:0;;-1:-1:-1;40116:13:0;-1:-1:-1;;;40116:13:0;;;;40096:17;;-1:-1:-1;;;;;40160:19:0;;:30;;:38;;40191:6;;40160:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40140:58;;40217:51;40238:18;40258:9;40217:20;:51::i;:::-;40209:59;;40300:114;40408:5;40300:89;40337:51;40358:18;40378:9;40337:20;:51::i;40300:114::-;40279:135;;40441:5;:8;;;40425:24;;39660:797;;;;;;;;;;:::o;22355:29::-;;;-1:-1:-1;;;;;22355:29:0;;:::o;361:26::-;;;-1:-1:-1;;;;;361:26:0;;:::o;22428:36::-;;;-1:-1:-1;;;22428:36:0;;;;;:::o;31840:965::-;7658:9;;32140:4;;-1:-1:-1;;;7658:9:0;;;;7657:10;7649:32;;;;-1:-1:-1;;;7649:32:0;;;;;;;;;7704:4;7692:16;;-1:-1:-1;;;;7692:16:0;-1:-1:-1;;;7692:16:0;;;;870:7;856:10:::1;-1:-1:-1::0;;;;;870:7:0;;::::1;856:21;848:43;;;;-1:-1:-1::0;;;848:43:0::1;;;;;;;;;32179:14:::2;::::0;-1:-1:-1;;;;;32179:14:0::2;:32:::0;-1:-1:-1;32179:32:0;::::2;::::0;:70:::2;;-1:-1:-1::0;32215:15:0::2;::::0;-1:-1:-1;;;32215:15:0;::::2;-1:-1:-1::0;;;;;32215:15:0::2;-1:-1:-1::0;;32215:34:0::2;32179:70;32157:148;;;;-1:-1:-1::0;;;32157:148:0::2;;;;;;;;;32340:4;32324:12;:20;;32316:57;;;;-1:-1:-1::0;;;32316:57:0::2;;;;;;;;;32400:4;32392;:12;;32384:39;;;;-1:-1:-1::0;;;32384:39:0::2;;;;;;;;;32449:1;32442:4;:8;:24;;;;;-1:-1:-1::0;;;32454:4:0::2;:12;;32442:24;32434:51;;;;-1:-1:-1::0;;;32434:51:0::2;;;;;;;;;32496:13;:36:::0;;-1:-1:-1;;;;32496:36:0::2;-1:-1:-1::0;;;32496:36:0::2;::::0;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;;32543:3:::2;:18:::0;;-1:-1:-1;;32543:18:0::2;::::0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;;;;32572:19:0::2;-1:-1:-1::0;;;;;;;;32572:19:0;::::2;;;::::0;;32602:40:::2;32619:7:::0;32628:13;32602:16:::2;:40::i;:::-;32653:42;32671:7;32680:14;32653:17;:42::i;:::-;32706:24;:22;:24::i;:::-;32746:29;32762:12;32746:29;;;;;;;;;;;;;;;-1:-1:-1::0;;32793:4:0::2;7731:17:::0;;-1:-1:-1;;;;7731:17:0;;;32793:4;31840:965;-1:-1:-1;;;;;;;31840:965:0:o;22876:367::-;22920:32;;:::i;:::-;22975:3;;-1:-1:-1;;;22975:3:0;;-1:-1:-1;;;;;22975:3:0;22965:13;;22999:3;;22989:7;;;:13;23023:14;;-1:-1:-1;;;;;23023:14:0;;;23013:7;;;:24;-1:-1:-1;;;23058:15:0;;;;;;23048:7;;;:25;23095:13;;;;;23084:8;;;:24;23130:14;;;;23119:8;;;:25;-1:-1:-1;;;23183:8:0;;;;23165:27;;;;;;;;23155:5;:7;;:37;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23203:32:0;23229:5;23203:25;:32::i;22738:27::-;;;-1:-1:-1;;;22738:27:0;;;;;:::o;22391:30::-;;;-1:-1:-1;;;22391:30:0;;-1:-1:-1;;;;;22391:30:0;;:::o;34109:1149::-;7658:9;;34201:26;;-1:-1:-1;;;7658:9:0;;;;7657:10;7649:32;;;;-1:-1:-1;;;7649:32:0;;;;;;;;;7704:4;7692:16;;-1:-1:-1;;;;7692:16:0;-1:-1:-1;;;7692:16:0;;;34267:12:::1;::::0;:37:::1;::::0;-1:-1:-1;;;34267:37:0;;7692:16;;-1:-1:-1;;;;;34267:12:0::1;::::0;:22:::1;::::0;:37:::1;::::0;34298:4:::1;::::0;34267:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34359:14;::::0;34245:59;;-1:-1:-1;34315:17:0::1;::::0;34335:40:::1;::::0;34245:59;;-1:-1:-1;;;;;34359:14:0::1;34335:40;:15;:40;:::i;:::-;34315:60;;34386:13;34410:21:::0;34442:27:::1;34536:35;34550:9;34561;34536:13;:35::i;:::-;34480:91:::0;;-1:-1:-1;34480:91:0;;-1:-1:-1;34480:91:0;;-1:-1:-1;34480:91:0;-1:-1:-1;34584:41:0::1;34602:2:::0;34480:91;34584:17:::1;:41::i;:::-;34654:12;::::0;34636:38:::1;::::0;-1:-1:-1;;;;;34654:12:0::1;34668:5:::0;34636:17:::1;:38::i;:::-;34744:9;34737:17;;;;;;;;34725:8;::::0;-1:-1:-1;;;34725:8:0;::::1;:29;:8:::0;;::::1;:29:::0;::::1;;34721:244;;-1:-1:-1::0;;;;;34779:28:0;::::1;;34771:48;;;;-1:-1:-1::0;;;34771:48:0::1;;;;;;;;;34834:13;:38:::0;;-1:-1:-1;;;;;;34834:38:0::1;-1:-1:-1::0;;;;;34834:38:0;::::1;;::::0;;34905:9;34898:17:::1;::::0;::::1;;;;;;34887:8;;:28;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;34943:9:0::1;34935:18;;;;;;;;;;;;;;;34721:244;35002:13;::::0;;:38:::1;::::0;-1:-1:-1;;;35002:38:0;;34977:64:::1;::::0;34989:11;;-1:-1:-1;;;;;35002:13:0::1;::::0;:23:::1;::::0;:38:::1;::::0;35034:4:::1;::::0;35002:38:::1;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34977:11;:64::i;:::-;35090:12;::::0;35126:13:::1;::::0;35059:191:::1;::::0;-1:-1:-1;;;;;;;;;;;35059:191:0;::::1;::::0;-1:-1:-1;;;;;35090:12:0;;::::1;::::0;35126:13;::::1;::::0;35155:9;;35179:18;;35212:10:::1;::::0;35237:2;;35059:191:::1;;;;;;;;;;-1:-1:-1::0;;7731:9:0;:17;;-1:-1:-1;;;;7731:17:0;;;-1:-1:-1;34109:1149:0;;;-1:-1:-1;;;34109:1149:0:o;22544:22::-;;;-1:-1:-1;;;22544:22:0;;;;;:::o;31045:787::-;7658:9;;-1:-1:-1;;;7658:9:0;;;;7657:10;7649:32;;;;-1:-1:-1;;;7649:32:0;;;;;;;;;7704:4;7692:16;;-1:-1:-1;;;;7692:16:0;-1:-1:-1;;;7692:16:0;;;;870:7;856:10:::1;-1:-1:-1::0;;;;;870:7:0;;::::1;856:21;848:43;;;;-1:-1:-1::0;;;848:43:0::1;;;;;;;;;31135:12:::2;::::0;:37:::2;::::0;-1:-1:-1;;;31135:37:0;;31113:19:::2;::::0;-1:-1:-1;;;;;31135:12:0::2;::::0;:22:::2;::::0;:37:::2;::::0;31166:4:::2;::::0;31135:37:::2;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31206:13;::::0;;:38:::2;::::0;-1:-1:-1;;;31206:38:0;;31113:59;;-1:-1:-1;31183:20:0::2;::::0;-1:-1:-1;;;;;31206:13:0;;::::2;::::0;:23:::2;::::0;:38:::2;::::0;31238:4:::2;::::0;31206:38:::2;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31183:61:::0;-1:-1:-1;;;;;;31265:26:0;::::2;::::0;::::2;::::0;:57:::2;;-1:-1:-1::0;;;;;;31295:27:0;::::2;;31265:57;31257:78;;;;-1:-1:-1::0;;;31257:78:0::2;;;;;;;;;31367:14;::::0;-1:-1:-1;;;;;31367:14:0::2;31352:29:::0;::::2;31348:207;;31474:14;::::0;31430:13:::2;::::0;31422:68:::2;::::0;-1:-1:-1;;;;;31474:14:0;;::::2;::::0;31422:39:::2;::::0;31430:13:::2;31449:11:::0;31422:39:::2;:26;:39;:::i;:::-;:43:::0;:68:::2;:43;:68;:::i;:::-;31398:13;:93:::0;;-1:-1:-1;;;;;;31398:93:0;;::::2;-1:-1:-1::0;;;;;31398:93:0;;::::2;;::::0;;;31506:14:::2;:37:::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;31348:207:::2;31585:15;::::0;-1:-1:-1;;;31585:15:0;::::2;-1:-1:-1::0;;;;;31585:15:0::2;31569:31:::0;::::2;31565:215;;31696:15;::::0;31650:14:::2;::::0;31642:71:::2;::::0;-1:-1:-1;;;;;;;;31696:15:0;;;::::2;::::0;::::2;::::0;31642:41:::2;::::0;31650:14;::::2;;31670:12:::0;31642:41:::2;:27;:41;:::i;:71::-;31617:14;:97:::0;;-1:-1:-1;;;;;31617:97:0;;::::2;-1:-1:-1::0;;;31617:97:0;;::::2;-1:-1:-1::0;;;;;;;;31617:97:0;;::::2;;::::0;;;31729:15:::2;:39:::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;::::0;;31565:215:::2;31795:14;::::0;-1:-1:-1;;;31795:14:0;::::2;;;31792:32;;;31811:13;:11;:13::i;:::-;-1:-1:-1::0;;7731:9:0;:17;;-1:-1:-1;;;;7731:17:0;;;31045:787::o;36460:3140::-;7658:9;;-1:-1:-1;;;7658:9:0;;;;7657:10;7649:32;;;;-1:-1:-1;;;7649:32:0;;;;;;;;;7704:4;7692:16;;-1:-1:-1;;;;7692:16:0;-1:-1:-1;;;7692:16:0;;;36638:37:::1;36655:7:::0;36664:10;36638:16:::1;:37::i;:::-;36686:39;36704:7;36713:11;36686:17;:39::i;:::-;36742:15:::0;;36738:114:::1;;36772:80;::::0;-1:-1:-1;;;36772:80:0;;-1:-1:-1;;;;;36772:37:0;::::1;::::0;::::1;::::0;:80:::1;::::0;36810:10:::1;::::0;36822;;36834:11;;36847:4;;;;36772:80:::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36738:114;36887:12;::::0;:37:::1;::::0;-1:-1:-1;;;36887:37:0;;36865:19:::1;::::0;-1:-1:-1;;;;;36887:12:0::1;::::0;:22:::1;::::0;:37:::1;::::0;36918:4:::1;::::0;36887:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36958:13;::::0;;:38:::1;::::0;-1:-1:-1;;;36958:38:0;;36865:59;;-1:-1:-1;36935:20:0::1;::::0;-1:-1:-1;;;;;36958:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;36990:4:::1;::::0;36958:38:::1;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37080:14;::::0;36935:61;;-1:-1:-1;;;;;;37080:14:0::1;37065:29:::0;::::1;;::::0;:64:::1;;-1:-1:-1::0;37114:15:0::1;::::0;-1:-1:-1;;;37114:15:0;::::1;-1:-1:-1::0;;;;;37114:15:0::1;37098:31:::0;::::1;;37065:64;37043:131;;;;-1:-1:-1::0;;;37043:131:0::1;;;;;;;;;37271:14;::::0;-1:-1:-1;;;;;37271:14:0::1;37257:28:::0;::::1;37253:1081;;;37348:15;::::0;37302:18:::1;::::0;37323:42:::1;::::0;:12;;-1:-1:-1;;;37348:15:0;::::1;-1:-1:-1::0;;;;;37348:15:0::1;37323:16;:42::i;:::-;37302:63;;37399:25;37443:13:::0;37475:27:::1;37521:22:::0;37561:37:::1;37576:9;37587:10;37561:14;:37::i;:::-;37668:14;::::0;37380:218;;-1:-1:-1;37380:218:0;;-1:-1:-1;37380:218:0;-1:-1:-1;37380:218:0;-1:-1:-1;37380:218:0;;37660:40:::1;::::0;-1:-1:-1;;;;;37668:14:0::1;37688:11:::0;37660:40:::1;:27;:40;:::i;:::-;:61;;37652:91;;;;-1:-1:-1::0;;;37652:91:0::1;;;;;;;;;37777:12;::::0;37760:37:::1;::::0;-1:-1:-1;;;;;37777:12:0::1;37791:5:::0;37760:16:::1;:37::i;:::-;37835:9;37828:17;;;;;;;;37816:8;::::0;-1:-1:-1;;;37816:8:0;::::1;:29;:8:::0;;::::1;:29:::0;::::1;;37812:267;;-1:-1:-1::0;;;;;37874:29:0;::::1;;37866:49;;;;-1:-1:-1::0;;;37866:49:0::1;;;;;;;;;37934:14;:40:::0;;-1:-1:-1;;;;;;;;37934:40:0::1;-1:-1:-1::0;;;;;;;;37934:40:0;::::1;;;::::0;;38011:9;38004:17:::1;::::0;::::1;;;;;;37993:8;;:28;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;38053:9:0::1;38045:18;;;;;;;;;;;;;;;37812:267;-1:-1:-1::0;;;;;;;;;;;38133:13:0::1;;;;;;;;;-1:-1:-1::0;;;;;38133:13:0::1;38174:12;;;;;;;;;-1:-1:-1::0;;;;;38174:12:0::1;38206:10;38235:17;38271:10;38300:7;38098:224;;;;;;;;;;;;;;;;;;;;37253:1081;;;;;;38430:15;::::0;-1:-1:-1;;;38430:15:0;::::1;-1:-1:-1::0;;;;;38430:15:0::1;38415:30:::0;::::1;38411:1077;;;38506:14;::::0;38462:17:::1;::::0;38482:40:::1;::::0;:11;;-1:-1:-1;;;;;38506:14:0::1;38482:40;:15;:40;:::i;:::-;38462:60;;38556:26;38601:13:::0;38633:27:::1;38679:21:::0;38718:35:::1;38732:9;38743;38718:13;:35::i;:::-;38821:15;::::0;38537:216;;-1:-1:-1;38537:216:0;;-1:-1:-1;38537:216:0;-1:-1:-1;38537:216:0;-1:-1:-1;38537:216:0;;38813:42:::1;::::0;-1:-1:-1;;;38821:15:0;::::1;-1:-1:-1::0;;;;;38821:15:0::1;38842:12:::0;38813:28:::1;:42::i;:::-;:64;;38805:94;;;;-1:-1:-1::0;;;38805:94:0::1;;;;;;;;;38934:12;::::0;38916:38:::1;::::0;-1:-1:-1;;;;;38934:12:0::1;38948:5:::0;38916:17:::1;:38::i;:::-;38992:9;38985:17;;;;;;;;38973:8;::::0;-1:-1:-1;;;38973:8:0;::::1;:29;:8:::0;;::::1;:29:::0;::::1;;38969:264;;-1:-1:-1::0;;;;;39031:28:0;::::1;;39023:48;;;;-1:-1:-1::0;;;39023:48:0::1;;;;;;;;;39090:13;:38:::0;;-1:-1:-1;;;;;;39090:38:0::1;-1:-1:-1::0;;;;;39090:38:0;::::1;;::::0;;39165:9;39158:17:::1;::::0;::::1;;;;;;39147:8;;:28;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;39207:9:0::1;39199:18;;;;;;;;;;;;;;;38969:264;-1:-1:-1::0;;;;;;;;;;;39287:12:0::1;;;;;;;;;-1:-1:-1::0;;;;;39287:12:0::1;39327:13;;;;;;;;;-1:-1:-1::0;;;;;39327:13:0::1;39360:9;39388:18;39425:10;39454:7;39252:224;;;;;;;;;;;;;;;;;;;;38411:1077;;;;;;39500:7;:5;:7::i;:::-;39533:59;39547:10;39559:7;39568:10;39580:11;39533:59;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;7731:9:0;:17;;-1:-1:-1;;;;7731:17:0;;;-1:-1:-1;;;;;36460:3140:0:o;22319:27::-;;;-1:-1:-1;;;;;22319:27:0;;:::o;35266:1186::-;7658:9;;35359:25;;-1:-1:-1;;;7658:9:0;;;;7657:10;7649:32;;;;-1:-1:-1;;;7649:32:0;;;;;;;;;7704:4;7692:16;;-1:-1:-1;;;;7692:16:0;-1:-1:-1;;;7692:16:0;;;35425:13:::1;::::0;;:38:::1;::::0;-1:-1:-1;;;35425:38:0;;7692:16;;-1:-1:-1;;;;;35425:13:0;;::::1;::::0;:23:::1;::::0;:38:::1;::::0;35457:4:::1;::::0;35425:38:::1;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35520:15;::::0;35402:61;;-1:-1:-1;35474:18:0::1;::::0;35495:42:::1;::::0;35402:61;;-1:-1:-1;;;35520:15:0;::::1;-1:-1:-1::0;;;;;35520:15:0::1;35495:16;:42::i;:::-;35474:63;;35548:13;35572:22:::0;35605:27:::1;35699:74;35728:9;35752:10;35699:14;:74::i;:::-;35643:130:::0;;-1:-1:-1;35643:130:0;;-1:-1:-1;35643:130:0;;-1:-1:-1;35643:130:0;-1:-1:-1;35786:39:0::1;35803:2:::0;35643:130;35786:16:::1;:39::i;:::-;35853:12;::::0;35836:37:::1;::::0;-1:-1:-1;;;;;35853:12:0::1;35867:5:::0;35836:16:::1;:37::i;:::-;35935:9;35928:17;;;;;;;;35916:8;::::0;-1:-1:-1;;;35916:8:0;::::1;:29;:8:::0;;::::1;:29:::0;::::1;;35912:247;;-1:-1:-1::0;;;;;35970:29:0;::::1;;35962:49;;;;-1:-1:-1::0;;;35962:49:0::1;;;;;;;;;36026:14;:40:::0;;-1:-1:-1;;;;;;;;36026:40:0::1;-1:-1:-1::0;;;;;;;;36026:40:0;::::1;;;::::0;;36099:9;36092:17:::1;::::0;::::1;;;;;;36081:8;;:28;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;36137:9:0::1;36129:18;;;;;;;;;;;;;;;35912:247;36183:12;::::0;:37:::1;::::0;-1:-1:-1;;;36183:37:0;;36171:64:::1;::::0;-1:-1:-1;;;;;36183:12:0::1;::::0;:22:::1;::::0;:37:::1;::::0;36214:4:::1;::::0;36183:37:::1;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36222:12;36171:11;:64::i;:::-;36284:13;::::0;36321:12:::1;::::0;36253:191:::1;::::0;-1:-1:-1;;;;;;;;;;;36253:191:0;::::1;::::0;-1:-1:-1;;;;;36284:13:0;;::::1;::::0;36321:12;::::1;::::0;36349:10;;36374:17;;36406:10:::1;::::0;36431:2;;36253:191:::1;;22473:28:::0;;;-1:-1:-1;;;;;22473:28:0;;:::o;22772:17::-;;;;;;:::o;23762:125::-;23806:16;23842:37;23865:13;:11;:13::i;:::-;23842:22;:37::i;1100:163::-;870:7;;-1:-1:-1;;;;;870:7:0;856:10;:21;848:43;;;;-1:-1:-1;;;848:43:0;;;;;;;;;1204:7:::1;::::0;;1178:44:::1;::::0;-1:-1:-1;;;;;1178:44:0;;::::1;::::0;1204:7;::::1;::::0;1178:44:::1;::::0;::::1;1233:11;:22:::0;;-1:-1:-1;;;;;;1233:22:0::1;-1:-1:-1::0;;;;;1233:22:0;;;::::1;::::0;;;::::1;::::0;;1100:163::o;22685:40::-;;;-1:-1:-1;;;;;22685:40:0;;:::o;22796:18::-;;;-1:-1:-1;;;22796:18:0;;-1:-1:-1;;;;;22796:18:0;;:::o;23251:503::-;23348:9;23372;23396;23420;23444:10;23469;23494:9;23531:32;;:::i;:::-;23566:13;:11;:13::i;:::-;23531:48;;23594:5;:7;;;23590:11;;23616:5;:7;;;23612:11;;23638:5;:7;;;23634:11;;23660:5;:7;;;23656:11;;23683:5;:8;;;23678:13;;23707:5;:8;;;23702:13;;23738:5;:7;;;23730:16;;;;;;;;23726:20;;23251:503;;;;;;;;:::o;22575:43::-;;;;:::o;30453:584::-;30529:12;;:37;;-1:-1:-1;;;30529:37:0;;30507:19;;-1:-1:-1;;;;;30529:12:0;;:22;;:37;;30560:4;;30529:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30600:13;;;:38;;-1:-1:-1;;;30600:38:0;;30507:59;;-1:-1:-1;30577:20:0;;-1:-1:-1;;;;;30600:13:0;;;;:23;;:38;;30632:4;;30600:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30577:61;-1:-1:-1;;;;;;30659:26:0;;;;;:57;;-1:-1:-1;;;;;;30689:27:0;;;30659:57;30651:78;;;;-1:-1:-1;;;30651:78:0;;;;;;;;;30750:14;:37;;-1:-1:-1;;;;;30798:39:0;;;-1:-1:-1;;;30798:39:0;-1:-1:-1;;;;;;;;30750:37:0;;;-1:-1:-1;;;;;;30750:37:0;;;;;30798:39;;;;;;;30848:13;:36;;;;;;;;30895:38;;;;-1:-1:-1;;;;;30944:40:0;;;-1:-1:-1;31000:14:0;;-1:-1:-1;;;31000:14:0;;;;30997:32;;;31016:13;:11;:13::i;:::-;30453:584;;:::o;25344:211::-;25461:86;25481:5;25511:23;;;25536:2;25540:5;25488:58;;;;;;;;;;;;;;-1:-1:-1;;25488:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;25488:58:0;-1:-1:-1;;;;;;25488:58:0;;;;;;;;;;25461:19;:86::i;:::-;25344:211;;;:::o;5551:137::-;5609:7;5642:1;5637;:6;;5629:28;;;;-1:-1:-1;;;5629:28:0;;;;;;;;;-1:-1:-1;5675:5:0;;;5551:137;;;;;:::o;16371:1389::-;16492:25;;;16552:5;:7;;;:21;;;;;;;;;16548:1205;;;16610:42;16630:5;16637:14;16610:19;:42::i;:::-;16590:62;;16674:16;16667:23;;16548:1205;;;16723:16;16712:5;:7;;;:27;;;;;;;;;16708:1045;;;16776:44;16798:5;16805:14;16776:21;:44::i;16708:1045::-;16891:25;16919:21;16932:5;:7;;;16919:5;:8;;;:12;;:21;;;;:::i;:::-;16891:49;;16955:28;16986:21;16998:5;:8;;;16986:5;:7;;;:11;;:21;;;;:::i;:::-;16955:52;;17043:17;17026:14;:34;17022:720;;;17101:44;17123:5;17130:14;17101:21;:44::i;:::-;17081:64;;17171:16;17164:23;;17230:20;17210:17;:40;17206:129;;;17295:20;17275:40;;17206:129;17022:720;;;17378:17;17360:14;:35;17356:386;;;17436:20;17416:40;;17482:10;17475:17;;17356:386;;;17553:131;17600:65;17620:5;17627:37;:14;17646:17;17627:37;:18;:37;:::i;:::-;17600:19;:65::i;:::-;17553:20;;:131;:24;:131;:::i;:::-;17533:151;;17710:16;17703:23;;17356:386;16708:1045;;;16371:1389;;;;;:::o;6400:127::-;6468:7;6512:6;6495:13;:6;6506:1;6495:13;:10;:13;:::i;:::-;:24;;;;;;;6400:127;-1:-1:-1;;;6400:127:0:o;14314:2049::-;14433:26;;;14494:5;:7;;;:21;;;;;;;;;14490:1866;;;14615:40;14634:5;14641:13;14615:18;:40::i;:::-;14594:61;;14677:16;14670:23;;14490:1866;;;14726:16;14715:5;:7;;;:27;;;;;;;;;14711:1645;;;14759:24;14786:21;14799:5;:7;;;14786:5;:8;;;:12;;:21;;;;:::i;:::-;14759:48;;14822:29;14854:21;14866:5;:8;;;14854:5;:7;;;:11;;:21;;;;:::i;:::-;14822:53;;15003:16;14987:13;:32;14983:1156;;;15114:42;15135:5;15142:13;15114:20;:42::i;:::-;15093:63;;15182:16;15175:23;;15242:21;15221:18;:42;15217:402;;;15578:21;15557:42;;15217:402;14983:1156;;;15661:16;15644:13;:33;15640:499;;;15773:21;15752:42;;15820:10;15813:17;;15640:499;;;15952:129;16000:62;16019:5;16026:35;:13;16044:16;16026:35;:17;:35;:::i;:::-;16000:18;:62::i;15952:129::-;15931:150;;16107:16;16100:23;;15640:499;14711:1645;;;;;16264:42;16285:5;16292:13;16264:20;:42::i;:::-;16243:63;16328:16;;-1:-1:-1;14314:2049:0;-1:-1:-1;;;14314:2049:0:o;32859:161::-;32937:10;;32933:80;;32964:12;;:37;;-1:-1:-1;;;;;32964:12:0;32990:2;32994:6;32964:37;:25;:37;:::i;33028:163::-;33107:10;;33103:81;;33134:13;;:38;;-1:-1:-1;;;;;33134:13:0;33161:2;33165:6;33134:38;:26;:38;:::i;20753:604::-;20840:16;20829:5;:7;;;:27;;;;;;;;;20825:525;;;20884:174;20944:5;:7;;;20970:21;20982:5;:8;;;20970:5;:7;;;:11;;:21;;;;:::i;:::-;21010:7;;21036;;;;20884:41;:174::i;:::-;20873:8;;;:185;20825:525;;;21091:16;21080:5;:7;;;:27;;;;;;;;;21076:274;;;21135:203;21195:5;:7;;;21221:21;21233:5;:8;;;21221:5;:7;;;:11;;:21;;;;:::i;:::-;21289:7;;21261:36;;:27;:36::i;:::-;21316:5;:7;;;21135:41;:203::i;:::-;21124:8;;;:214;21076:274;20753:604;:::o;29580:313::-;-1:-1:-1;;;;;29672:26:0;;;;;:57;;-1:-1:-1;;;;;;29702:27:0;;;29672:57;29664:78;;;;-1:-1:-1;;;29664:78:0;;;;;;;;;29753:14;:37;;-1:-1:-1;;;;;29801:39:0;;;-1:-1:-1;;;29801:39:0;-1:-1:-1;;;;;;;;29753:37:0;;;-1:-1:-1;;;;;;29753:37:0;;;;;;;29801:39;;;;29753:37;29856:14;;-1:-1:-1;;;29856:14:0;;;;29853:32;;;29872:13;:11;:13::i;4872:226::-;4930:7;4954:6;4950:47;;-1:-1:-1;4984:1:0;4977:8;;4950:47;5021:5;;;5025:1;5021;:5;:1;5045:5;;;;;:10;5037:32;;;;-1:-1:-1;;;5037:32:0;;;;;;;;;5089:1;4872:226;-1:-1:-1;;;4872:226:0:o;5106:141::-;5164:7;5196:1;5192;:5;5184:32;;;;-1:-1:-1;;;5184:32:0;;;;;;;;;5238:1;5234;:5;;;;29134:391;29281:22;;29208:23;:15;:23;;;-1:-1:-1;;;29281:22:0;;;;29264:39;;;29318:15;;;;;;:38;;-1:-1:-1;29337:14:0;;-1:-1:-1;;;;;29337:14:0;:19;;29318:38;:62;;;;-1:-1:-1;29360:15:0;;-1:-1:-1;;;29360:15:0;;-1:-1:-1;;;;;29360:15:0;:20;;29318:62;29314:154;;;29445:11;29429:27;;:13;:11;:13::i;:::-;29397:28;:59;;29429:27;;;;29397:59;;;29314:154;-1:-1:-1;29478:22:0;:39;;;;;;-1:-1:-1;;;29478:39:0;-1:-1:-1;;;;;29478:39:0;;;;;;;;;29134:391::o;29901:544::-;29960:12;;:37;;-1:-1:-1;;;29960:37:0;;29938:19;;-1:-1:-1;;;;;29960:12:0;;:22;;:37;;29991:4;;29960:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30031:13;;;:38;;-1:-1:-1;;;30031:38:0;;29938:59;;-1:-1:-1;30008:20:0;;-1:-1:-1;;;;;30031:13:0;;;;:23;;:38;;30063:4;;30031:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30008:61;-1:-1:-1;;;;;;30098:26:0;;;;;:57;;-1:-1:-1;;;;;;30128:27:0;;;30098:57;30090:78;;;;-1:-1:-1;;;30090:78:0;;;;;;;;;30200:14;;-1:-1:-1;;;;;30200:14:0;30185:29;;30181:99;;30231:14;:37;;-1:-1:-1;;;;;;30231:37:0;-1:-1:-1;;;;;30231:37:0;;;;;30181:99;30310:15;;-1:-1:-1;;;30310:15:0;;-1:-1:-1;;;;;30310:15:0;30294:31;;30290:103;;30342:15;:39;;-1:-1:-1;;;;;;;;30342:39:0;-1:-1:-1;;;;;;;;30342:39:0;;;;;;30290:103;30408:14;;-1:-1:-1;;;30408:14:0;;;;30405:32;;;30424:13;:11;:13::i;21365:621::-;21432:7;21467:16;21456:5;:7;;;:27;;;;;;;;;21452:527;;;21560:7;;;;21546:8;;;;21500:9;;21512:66;;21533:35;;21560:7;21533:22;;21546:8;21533:22;:12;:22;:::i;:35::-;21570:5;:7;;;21512:20;:66::i;:::-;21500:78;;21597:66;21630:32;21651:5;:7;;;21660:1;21630:20;:32::i;:::-;21617:7;;;;21597:28;;6339:6;;21597:28;:19;:28;:::i;:::-;:32;:66;:32;:66;:::i;:::-;21593:70;;21685:32;21706:5;:7;;;21715:1;21685:20;:32::i;:::-;21678:39;;;;;21452:527;21810:7;;;;21796:8;;;;21750:9;;21762:66;;21783:35;;21810:7;21783:22;;21796:8;21783:22;:12;:22;:::i;:35::-;21820:5;:7;;;21762:20;:66::i;:::-;21750:78;;21847:66;21880:32;21901:5;:7;;;21910:1;21880:20;:32::i;21847:66::-;21843:70;;21935:32;21956:5;:7;;;21965:1;21935:20;:32::i;21452:527::-;21365:621;;;:::o;26917:1046::-;27577:12;27591:23;27626:5;-1:-1:-1;;;;;27618:19:0;27638:4;27618:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27576:67;;;;27662:7;27654:52;;;;-1:-1:-1;;;27654:52:0;;;;;;;;;27723:17;;:21;27719:237;;27878:10;27867:30;;;;;;;;;;;;;;27859:85;;;;-1:-1:-1;;;27859:85:0;;;;;;;;;26917:1046;;;;:::o;18394:446::-;18534:7;18609:223;18668:5;:8;;;18695:5;:8;;;18722:14;18755:36;18783:5;:7;;;18755:27;:36::i;:::-;18810:5;:7;;;18609:40;:223::i;20245:447::-;20387:7;20462:222;20521:5;:8;;;20548:5;:7;;;20574:14;20607:36;20635:5;:7;;;20607:27;:36::i;18896:446::-;19038:7;19113:221;19158:5;:8;;;19185:27;19197:14;19185:5;:7;;;:11;;:27;;;;:::i;:::-;19231:7;;;;19285;;19257:36;;:27;:36::i;:::-;19312:5;:7;;;19113:26;:221::i;5696:161::-;5754:7;5786:5;;;5810:6;;;;5802:28;;;;-1:-1:-1;;;5802:28:0;;;;;;;;17816:570;17954:7;18185:193;18244:5;:8;;;18271:5;:8;;;18298:13;18330:5;:7;;;18356:5;:7;;;18185:40;:193::i;19822:415::-;19962:7;20038:191;20083:5;:8;;;20110:26;20122:13;20110:5;:7;;;:11;;:26;;;;:::i;:::-;20155:7;;;;20181;;20207;;;;20038:26;:191::i;19350:416::-;19490:7;19566:192;19625:5;:8;;;19652:5;:7;;;19678:13;19710:5;:7;;;19736:5;:7;;;19566:40;:192::i;9253:1111::-;9410:7;9434;9430:48;;-1:-1:-1;9465:1:0;9458:8;;9430:48;9492:6;9488:84;;9522:38;9529:30;9550:1;9553:5;9529:20;:30::i;:::-;9522:2;;:38;:6;:38;:::i;:::-;9515:45;;;;9488:84;9783:12;;9819:14;9820:1;:5;;9831:1;9819:14;:11;:14;:::i;:::-;9806:27;-1:-1:-1;9848:7:0;9844:273;;6339:6;9872:22;;9844:273;;;9937:5;9931:2;9922:5;9917:2;:10;9916:17;;;;;;:26;9912:205;;;9966:49;:42;-1:-1:-1;;;9966:20:0;9967:10;;;9983:2;9966:20;:16;:20;:::i;:42::-;:47;:49::i;:::-;9959:56;;9912:205;;;10055:50;:43;-1:-1:-1;;;10055:21:0;10070:5;10055:10;:2;10062;10055:10;:6;:10;:::i;:::-;:14;:21;:14;:21;:::i;:50::-;10048:57;;9912:205;10127:15;10158:75;6339:6;10158:54;10179:25;:4;6339:6;10179:25;:8;:25;:::i;:::-;10206:1;10210;10206:5;10158:20;:54::i;:75::-;10127:106;;10323:33;10344:2;10348:7;10323:20;:33::i;:::-;10316:40;;;;;9253:1111;;;;;;;:::o;6949:126::-;7013:7;7040:27;-1:-1:-1;;;7060:6:0;7040:27;:19;:27;:::i;6674:128::-;6742:7;6769:25;6792:1;6769:18;:6;6780;6769:18;:10;:18;:::i;11218:2627::-;11395:7;11428:1;11423:2;:6;11415:33;;;;-1:-1:-1;;;11415:33:0;;;;;;;;;11463:10;11459:51;;-1:-1:-1;11497:1:0;11490:8;;11459:51;11526:6;11522:119;;11589:2;11556:30;11577:1;11580:5;11556:20;:30::i;:::-;:35;:73;;11599:30;11620:1;11623:5;11599:20;:30::i;:::-;11556:73;;;11594:2;11556:73;11549:80;;;;11522:119;6339:6;11657:1;:20;11653:713;;;11964:12;;12008;:1;12014:5;12008:12;:5;:12;:::i;:::-;11991:29;-1:-1:-1;12039:11:0;12035:255;;12078:1;12071:8;;12035:255;;;12131:2;12121:6;12115:2;12106:6;:11;12105:22;;;;;;:28;12101:189;;;12161:29;12179:10;12186:2;;12179:10;:6;:10;:::i;:::-;12162:11;;;;12161:29;:17;:29;:::i;:::-;12154:36;;12101:189;;;12238:36;12271:2;12238:28;12264:1;12238:21;12271:2;12238:28;:5;12248:2;12238:13;:9;:13;:::i;:36::-;12231:43;;12101:189;12311:43;12328:25;:4;6339:6;12328:25;:8;:25;:::i;:::-;12311:12;:2;12318:4;12311:12;:6;:12;:::i;:43::-;12304:50;;;;;;11653:713;12690:13;12706:43;12736:12;:1;12742:5;12736:12;:5;:12;:::i;:::-;12706:25;12728:2;12706:17;12720:2;12706:9;:1;12728:2;12706:9;:5;:9;:::i;:43::-;12690:59;-1:-1:-1;12781:12:0;12796:30;12823:2;12796:22;6339:6;12816:1;12796:22;:19;:22;:::i;:30::-;12781:45;;12850:9;12882:5;12874:4;:13;12870:170;;-1:-1:-1;12911:12:0;;;12945:5;12870:170;;;-1:-1:-1;12990:12:0;;13024:4;12870:170;13057:25;:4;6339:6;13057:25;:8;:25;:::i;:::-;13050:32;-1:-1:-1;13122:18:0;13156:137;13195:29;13222:1;13195:22;6339:6;13215:1;13195:22;:19;:22;:::i;:29::-;13243:35;13275:2;13243:27;13264:1;13267:2;13243:20;:27::i;:35::-;13156:20;:137::i;:::-;13122:171;-1:-1:-1;13332:37:0;:30;13122:171;13332:14;13341:4;;13332:14;:8;:14;:::i;:37::-;13319:50;-1:-1:-1;13430:19:0;13452:29;13479:1;13452:22;6339:6;13472:1;13452:22;:19;:22;:::i;:29::-;13430:51;;13502:17;13534:4;13530:134;;;13567:20;:10;13582:4;13567:20;:14;:20;:::i;:::-;13555:32;;13530:134;;;13632:20;:4;13641:10;13632:20;:8;:20;:::i;:::-;13620:32;;13530:134;13676:10;13689:43;13709:9;13720:11;13689:19;:43::i;:::-;13676:56;;13752:2;13747;:7;13743:95;;;13778:1;13771:8;;;;;;;;;;;13743:95;13819:7;;;-1:-1:-1;13812:14:0;;-1:-1:-1;;;;;;13812:14:0;11218:2627;;;;;;;;:::o;8333:612::-;8493:7;8526:1;8521:2;:6;8513:33;;;;-1:-1:-1;;;8513:33:0;;;;;;;;;8557:18;8578:17;8584:10;:2;8591;8584:10;:6;:10;:::i;:::-;8578:1;;:17;:5;:17;:::i;:::-;8557:38;-1:-1:-1;8621:6:0;8617:77;;8651:31;:10;6339:6;8651:31;:14;:31;:::i;:::-;8644:38;;;;;8617:77;8704:16;8723:44;8744:18;8759:2;8744:10;8751:2;;8744:10;:6;:10;:::i;:18::-;8764:2;8723:20;:44::i;:::-;8704:63;;8778:15;8796:33;8817:1;8820:8;8796:20;:33::i;:::-;8778:51;-1:-1:-1;8864:73:0;-1:-1:-1;;;8864:51:0;8904:10;8864:35;8778:51;8864:22;6339:6;8884:1;8864:22;:19;:22;:::i;:73::-;8857:80;8333:612;-1:-1:-1;;;;;;;;;8333:612:0:o;5865:205::-;5947:1;5955;5951;5947:5;;:9;5983:80;5994:1;5990;:5;5983:80;;;6016:1;6012:5;;6050:1;6045;6041;6037;:5;;;;;;:9;6036:15;;;;;;6032:19;;5983:80;;;5865:205;;;;:::o;6810:131::-;6877:7;6904:29;6931:1;6904:18;:6;6915;6904:18;:10;:18;:::i;:::-;:26;:29;:26;:29;:::i;5255:288::-;5317:7;5337:16;5356:9;5360:1;5363;5356:3;:9::i;:::-;5337:28;-1:-1:-1;5400:12:0;;;5396:16;;5427:13;;5423:113;;-1:-1:-1;5475:1:0;5464:12;;-1:-1:-1;5457:19:0;;5423:113;-1:-1:-1;5516:8:0;-1:-1:-1;5509:15:0;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;34276:54;;36428:35;;36418:2;;36477:1;;36467:12;1044:241;;1148:2;1136:9;1127:7;1123:23;1119:32;1116:2;;;-1:-1;;1154:12;1116:2;1216:53;1261:7;1237:22;1216:53;;1292:1241;;;;;;;;;;1529:3;1517:9;1508:7;1504:23;1500:33;1497:2;;;-1:-1;;1536:12;1497:2;85:6;72:20;97:33;124:5;97:33;;;1588:63;-1:-1;1688:2;1727:22;;72:20;97:33;72:20;97:33;;;1696:63;-1:-1;1796:2;1835:22;;72:20;97:33;72:20;97:33;;;1804:63;-1:-1;1904:2;1943:22;;72:20;97:33;72:20;97:33;;;1912:63;-1:-1;2012:3;2052:22;;833:20;;-1:-1;2121:3;2161:22;;72:20;97:33;72:20;97:33;;;2130:63;-1:-1;2230:3;2270:22;;833:20;;-1:-1;2339:3;2379:22;;833:20;;-1:-1;2448:3;2485:22;;206:20;231:30;206:20;231:30;;;2457:60;;;;1491:1042;;;;;;;;;;;;2540:491;;;;2678:2;2666:9;2657:7;2653:23;2649:32;2646:2;;;-1:-1;;2684:12;2646:2;85:6;72:20;97:33;124:5;97:33;;;2736:63;-1:-1;2836:2;2875:22;;72:20;97:33;72:20;97:33;;;2640:391;;2844:63;;-1:-1;;;2944:2;2983:22;;;;833:20;;2640:391;3038:366;;;3159:2;3147:9;3138:7;3134:23;3130:32;3127:2;;;-1:-1;;3165:12;3127:2;3227:53;3272:7;3248:22;3227:53;;;3217:63;3317:2;3356:22;;;;833:20;;-1:-1;;;3121:283;3411:1121;;;;;;;;;3634:3;3622:9;3613:7;3609:23;3605:33;3602:2;;;-1:-1;;3641:12;3602:2;85:6;72:20;97:33;124:5;97:33;;;3693:63;3793:2;3832:22;;833:20;;-1:-1;3901:2;3940:22;;833:20;;4009:2;4048:22;;833:20;;-1:-1;4117:3;4157:22;;833:20;;-1:-1;4226:3;4266:22;;833:20;;-1:-1;4335:3;4375:22;;833:20;;-1:-1;4444:3;4484:22;833:20;;-1:-1;3596:936;-1:-1;;;3596:936;4539:257;;4651:2;4639:9;4630:7;4626:23;4622:32;4619:2;;;-1:-1;;4657:12;4619:2;354:6;348:13;366:30;390:5;366:30;;4803:263;;4918:2;4906:9;4897:7;4893:23;4889:32;4886:2;;;-1:-1;;4924:12;4886:2;-1:-1;981:13;;4880:186;-1:-1;4880:186;5073:741;;;;;;5247:3;5235:9;5226:7;5222:23;5218:33;5215:2;;;-1:-1;;5254:12;5215:2;846:6;833:20;5306:63;;5406:2;5449:9;5445:22;833:20;5414:63;;5532:53;5577:7;5514:2;5557:9;5553:22;5532:53;;;5522:63;;5650:2;5639:9;5635:18;5622:32;5674:18;;5666:6;5663:30;5660:2;;;-1:-1;;5696:12;5660:2;5781:6;5770:9;5766:22;536:3;529:4;521:6;517:17;513:27;503:2;;-1:-1;;544:12;503:2;587:6;574:20;564:30;;5674:18;606:6;603:30;600:2;;;-1:-1;;636:12;600:2;731:3;5406:2;711:17;672:6;697:32;;694:41;691:2;;;-1:-1;;738:12;691:2;5406;672:6;668:17;5724:74;;;;;;;;5209:605;;;;;;;;;5821:491;;;;5959:2;5947:9;5938:7;5934:23;5930:32;5927:2;;;-1:-1;;5965:12;5927:2;-1:-1;;833:20;;;6117:2;6156:22;;833:20;;-1:-1;6225:2;6264:22;;;833:20;;5921:391;-1:-1;5921:391;6319:743;;;;;;6491:3;6479:9;6470:7;6466:23;6462:33;6459:2;;;-1:-1;;6498:12;6459:2;-1:-1;;833:20;;;6650:2;6689:22;;833:20;;-1:-1;6758:2;6797:22;;833:20;;6866:2;6905:22;;833:20;;-1:-1;6974:3;7014:22;833:20;;-1:-1;6453:609;-1:-1;6453:609;17351:271;;7937:5;32987:12;8048:52;8093:6;8088:3;8081:4;8074:5;8070:16;8048:52;;;8112:16;;;;;17485:137;-1:-1;;17485:137;17629:222;-1:-1;;;;;34276:54;;;;7289:37;;17756:2;17741:18;;17727:124;17858:572;-1:-1;;;;;34276:54;;;7148:58;;34276:54;;;;18250:2;18235:18;;7289:37;18333:2;18318:18;;16948:37;18416:2;18401:18;;16948:37;;;;18077:3;18062:19;;18048:382;18437:676;;34287:42;;;;;33733:5;34276:54;7155:3;7148:58;16978:5;18857:2;18846:9;18842:18;16948:37;16978:5;18940:2;18929:9;18925:18;16948:37;18684:3;18977:2;18966:9;18962:18;18955:48;33272:6;18684:3;18673:9;18669:19;33260;35806:6;35801:3;33300:14;18673:9;33300:14;35783:30;35844:16;;;33300:14;35844:16;;;35837:27;;;;36239:7;36223:14;;;-1:-1;;36219:28;7724:39;;;18655:458;-1:-1;;;;18655:458;19120:796;-1:-1;;;;;34276:54;;;7289:37;;34276:54;;;19560:2;19545:18;;7289:37;19643:2;19628:18;;16948:37;;;;19726:2;19711:18;;16948:37;;;;34276:54;;19817:3;19802:19;;7148:58;34276:54;;;34287:42;19886:19;;7289:37;19395:3;19380:19;;19366:550;19923:333;-1:-1;;;;;34276:54;;;;7289:37;;20242:2;20227:18;;16948:37;20078:2;20063:18;;20049:207;20263:210;33817:13;;33810:21;7403:34;;20384:2;20369:18;;20355:118;21008:240;21144:2;21129:18;;36340:1;36330:12;;36320:2;;36346:9;36320:2;8546:59;;;21115:133;;21255:310;;21402:2;21423:17;21416:47;8913:5;32987:12;33272:6;21402:2;21391:9;21387:18;33260:19;9007:52;9052:6;33300:14;21391:9;33300:14;21402:2;9033:5;9029:16;9007:52;;;36239:7;36223:14;-1:-1;;36219:28;9071:39;;;;33300:14;9071:39;;21373:192;-1:-1;;21373:192;21572:416;21772:2;21786:47;;;9347:2;21757:18;;;33260:19;-1:-1;;;33300:14;;;9363:40;9422:12;;;21743:245;21995:416;22195:2;22209:47;;;9673:2;22180:18;;;33260:19;-1:-1;;;33300:14;;;9689:36;9744:12;;;22166:245;22418:416;22618:2;22632:47;;;9995:2;22603:18;;;33260:19;-1:-1;;;33300:14;;;10011:37;10067:12;;;22589:245;22841:416;23041:2;23055:47;;;10318:2;23026:18;;;33260:19;-1:-1;;;33300:14;;;10334:37;10390:12;;;23012:245;23264:416;23464:2;23478:47;;;10641:1;23449:18;;;33260:19;-1:-1;;;33300:14;;;10656:32;10707:12;;;23435:245;23687:416;23887:2;23901:47;;;10958:2;23872:18;;;33260:19;10994:28;33300:14;;;10974:49;11042:12;;;23858:245;24110:416;24310:2;24324:47;;;24295:18;;;33260:19;11329:34;33300:14;;;11309:55;11383:12;;;24281:245;24533:416;24733:2;24747:47;;;11634:2;24718:18;;;33260:19;-1:-1;;;33300:14;;;11650:37;11706:12;;;24704:245;24956:416;25156:2;25170:47;;;11957:1;25141:18;;;33260:19;-1:-1;;;33300:14;;;11972:32;12023:12;;;25127:245;25379:416;25579:2;25593:47;;;12274:2;25564:18;;;33260:19;-1:-1;;;33300:14;;;12290:39;12348:12;;;25550:245;25802:416;26002:2;26016:47;;;12599:2;25987:18;;;33260:19;12635:30;33300:14;;;12615:51;12685:12;;;25973:245;26225:416;26425:2;26439:47;;;12936:2;26410:18;;;33260:19;-1:-1;;;33300:14;;;12952:37;13008:12;;;26396:245;26648:416;26848:2;26862:47;;;13259:2;26833:18;;;33260:19;13295:26;33300:14;;;13275:47;13341:12;;;26819:245;27071:416;27271:2;27285:47;;;13592:1;27256:18;;;33260:19;-1:-1;;;33300:14;;;13607:31;13657:12;;;27242:245;27494:416;27694:2;27708:47;;;13908:1;27679:18;;;33260:19;-1:-1;;;33300:14;;;13923:32;13974:12;;;27665:245;27917:416;28117:2;28131:47;;;14225:1;28102:18;;;33260:19;-1:-1;;;33300:14;;;14240:32;14291:12;;;28088:245;28340:416;28540:2;28554:47;;;14542:2;28525:18;;;33260:19;14578:34;33300:14;;;14558:55;-1:-1;;;14633:12;;;14626:34;14679:12;;;28511:245;28763:416;28963:2;28977:47;;;14930:1;28948:18;;;33260:19;-1:-1;;;33300:14;;;14945:32;14996:12;;;28934:245;29186:416;29386:2;29400:47;;;15247:1;29371:18;;;33260:19;-1:-1;;;33300:14;;;15262:32;15313:12;;;29357:245;29609:327;;29788:3;29777:9;29773:19;29765:27;;15616:16;15610:23;16955:3;16948:37;15778:4;15771:5;15767:16;15761:23;15778:4;15842:3;15838:14;16948:37;15929:4;15922:5;15918:16;15912:23;15929:4;15993:3;15989:14;16948:37;16080:4;16073:5;16069:16;16063:23;16080:4;16144:3;16140:14;16948:37;16232:4;16225:5;16221:16;16215:23;16232:4;16296:3;16292:14;16948:37;16384:4;16377:5;16373:16;16367:23;16384:4;16448:3;16444:14;16948:37;16535:4;16528:5;16524:16;16518:23;33922:44;33960:5;33922:44;;;35434:35;16535:4;16608:3;16604:14;8546:59;;29759:177;;;;;29943:222;-1:-1;;;;;34040:42;;;;16718:37;;30070:2;30055:18;;30041:124;30172:222;-1:-1;;;;;34156:46;;;;16838:37;;30299:2;30284:18;;30270:124;30401:222;16948:37;;;30528:2;30513:18;;30499:124;30630:333;16948:37;;;30949:2;30934:18;;16948:37;30785:2;30770:18;;30756:207;30970:574;16948:37;;;31355:2;31340:18;;16948:37;;;31190:3;31175:19;;33922:44;33960:5;33922:44;;;31447:2;31432:18;;8546:59;;;;31530:2;31515:18;16948:37;31161:383;;-1:-1;;31161:383;31551:892;16948:37;;;32011:2;31996:18;;16948:37;;;;32094:2;32079:18;;16948:37;;;;32177:2;32162:18;;16948:37;;;;32260:3;32245:19;;16948:37;32344:3;32329:19;;16948:37;32428:3;32413:19;;16948:37;31846:3;31831:19;;31817:626;32450:218;34493:10;34482:22;;;;17186:36;;32575:2;32560:18;;32546:122;32675:218;34588:18;34577:30;;;;17303:36;;32800:2;32785:18;;32771:122;35879:268;35944:1;35951:101;35965:6;35962:1;35959:13;35951:101;;;36032:11;;;36026:18;36013:11;;;36006:39;35987:2;35980:10;35951:101;;;36067:6;36064:1;36061:13;36058:2;;;-1:-1;;35944:1;36114:16;;36107:27;35928:219;36260:102;36340:1;36333:5;36330:12;36320:2;;36346:9;36369:117;-1:-1;;;;;34276:54;;36428:35;;36418:2;;36477:1;;36467:12;36493:111;36574:5;33817:13;33810:21;36552:5;36549:32;36539:2;;36595:1;;36585:12
Swarm Source
ipfs://eafdaeef0bf2fa931b1569937b8fe3c60eb4b746b68f4c833dd51449c5a41ccf
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.