Polygon Sponsored slots available. Book your slot here!
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 91 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim_admin_fees | 44166382 | 633 days ago | IN | 0 POL | 0.00838876 | ||||
Claim_admin_fees | 43901336 | 640 days ago | IN | 0 POL | 0.01290579 | ||||
Claim_admin_fees | 43634483 | 647 days ago | IN | 0 POL | 0.00822817 | ||||
Claim_admin_fees | 43365262 | 654 days ago | IN | 0 POL | 0.01105214 | ||||
Claim_admin_fees | 41979153 | 689 days ago | IN | 0 POL | 0.01540859 | ||||
Claim_admin_fees | 41707532 | 696 days ago | IN | 0 POL | 0.01201838 | ||||
Claim_admin_fees | 41443040 | 703 days ago | IN | 0 POL | 0.01023139 | ||||
Claim_admin_fees | 41170229 | 710 days ago | IN | 0 POL | 0.00717777 | ||||
Claim_admin_fees | 41169876 | 710 days ago | IN | 0 POL | 0.00811761 | ||||
Claim_admin_fees | 40897505 | 717 days ago | IN | 0 POL | 0.00652131 | ||||
Claim_admin_fees | 40636490 | 724 days ago | IN | 0 POL | 0.00823787 | ||||
Claim_admin_fees | 40636206 | 724 days ago | IN | 0 POL | 0.00670402 | ||||
Claim_admin_fees | 40372936 | 731 days ago | IN | 0 POL | 0.00913439 | ||||
Claim_admin_fees | 40107222 | 738 days ago | IN | 0 POL | 0.00985184 | ||||
Claim_admin_fees | 39841087 | 745 days ago | IN | 0 POL | 0.00772411 | ||||
Claim_admin_fees | 39586293 | 752 days ago | IN | 0 POL | 0.00922389 | ||||
Claim_admin_fees | 39319437 | 759 days ago | IN | 0 POL | 0.012974 | ||||
Claim_admin_fees | 39056065 | 766 days ago | IN | 0 POL | 0.01695287 | ||||
Claim_admin_fees | 38782493 | 773 days ago | IN | 0 POL | 0.00455284 | ||||
Claim_admin_fees | 38508190 | 780 days ago | IN | 0 POL | 0.00356911 | ||||
Claim_admin_fees | 38230037 | 787 days ago | IN | 0 POL | 0.00331858 | ||||
Claim_admin_fees | 37942272 | 794 days ago | IN | 0 POL | 0.00423273 | ||||
Claim_admin_fees | 37659858 | 801 days ago | IN | 0 POL | 0.00431738 | ||||
Claim_admin_fees | 37378240 | 808 days ago | IN | 0 POL | 0.00305543 | ||||
Claim_admin_fees | 37097448 | 815 days ago | IN | 0 POL | 0.00516564 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.12
Contract Source Code (Vyper language format)
# @version 0.2.12 # (c) Curve.Fi, 2021 # Pool for am3Crv(USD)/BTC/ETH or similar from vyper.interfaces import ERC20 interface CurveToken: def totalSupply() -> uint256: view def mint(_to: address, _value: uint256) -> bool: nonpayable def mint_relative(_to: address, frac: uint256) -> uint256: nonpayable def burnFrom(_to: address, _value: uint256) -> bool: nonpayable interface Math: def geometric_mean(unsorted_x: uint256[N_COINS]) -> uint256: view def reduction_coefficient(x: uint256[N_COINS], fee_gamma: uint256) -> uint256: view def newton_D(ANN: uint256, gamma: uint256, x_unsorted: uint256[N_COINS]) -> uint256: view def newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: uint256) -> uint256: view def halfpow(power: uint256, precision: uint256) -> uint256: view def sqrt_int(x: uint256) -> uint256: view interface Views: def get_dy(i: uint256, j: uint256, dx: uint256) -> uint256: view def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256: view # Events event TokenExchange: buyer: indexed(address) sold_id: uint256 tokens_sold: uint256 bought_id: uint256 tokens_bought: uint256 event AddLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] fee: uint256 token_supply: uint256 event RemoveLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] token_supply: uint256 event RemoveLiquidityOne: provider: indexed(address) token_amount: uint256 coin_index: uint256 coin_amount: uint256 event CommitNewAdmin: deadline: indexed(uint256) admin: indexed(address) event NewAdmin: admin: indexed(address) event CommitNewParameters: deadline: indexed(uint256) admin_fee: uint256 mid_fee: uint256 out_fee: uint256 fee_gamma: uint256 price_threshold: uint256 adjustment_step: uint256 ma_half_time: uint256 event NewParameters: admin_fee: uint256 mid_fee: uint256 out_fee: uint256 fee_gamma: uint256 price_threshold: uint256 adjustment_step: uint256 ma_half_time: uint256 event RampAgamma: initial_A: uint256 future_A: uint256 initial_time: uint256 future_time: uint256 event StopRampA: current_A: uint256 current_gamma: uint256 time: uint256 event ClaimAdminFee: admin: indexed(address) tokens: uint256 N_COINS: constant(int128) = 3 # <- change FEE_DENOMINATOR: constant(uint256) = 10 ** 10 PRECISION: constant(uint256) = 10 ** 18 # The precision to convert to A_MULTIPLIER: constant(uint256) = 100 # These addresses are replaced by the deployer math: constant(address) = 0x1689aCD208d817B32eEAcCcE8121278c5766F530 token: constant(address) = 0x8096ac61db23291252574D49f036f0f9ed8ab390 views: constant(address) = 0x3c0EbfF09d6bB028EeD1Dd29669c2E3bf98C9D7f coins: constant(address[N_COINS]) = [ 0xE7a24EF0C5e95Ffb0f6684b813A78F2a3AD7D171, # am3crv 0x5c2ed810328349100A66B82b78a1791B101C9D61, # amWBTC 0x28424507fefb6f7f8E9D3860F56504E4e5f5f390, # amWETH ] price_scale_packed: uint256 # Internal price scale price_oracle_packed: uint256 # Price target given by MA last_prices_packed: uint256 last_prices_timestamp: public(uint256) initial_A_gamma: public(uint256) future_A_gamma: public(uint256) initial_A_gamma_time: public(uint256) future_A_gamma_time: public(uint256) price_threshold: public(uint256) future_price_threshoold: public(uint256) fee_gamma: public(uint256) future_fee_gamma: public(uint256) adjustment_step: public(uint256) future_adjustment_step: public(uint256) ma_half_time: public(uint256) future_ma_half_time: public(uint256) mid_fee: public(uint256) out_fee: public(uint256) admin_fee: public(uint256) future_mid_fee: public(uint256) future_out_fee: public(uint256) future_admin_fee: public(uint256) balances: public(uint256[N_COINS]) D: public(uint256) owner: public(address) future_owner: public(address) xcp_profit: public(uint256) xcp_profit_a: public(uint256) # Full profit at last claim of admin fees virtual_price: public(uint256) # Cached (fast to read) virtual price also used internally is_killed: public(bool) kill_deadline: public(uint256) transfer_ownership_deadline: public(uint256) admin_actions_deadline: public(uint256) reward_receiver: public(address) admin_fee_receiver: public(address) KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400 ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400 MIN_RAMP_TIME: constant(uint256) = 86400 MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9 MIN_FEE: constant(uint256) = 5 * 10 ** 5 # 0.5 bps MAX_FEE: constant(uint256) = 5 * 10 ** 9 MAX_A: constant(uint256) = 10000 * A_MULTIPLIER MAX_A_CHANGE: constant(uint256) = 10 MIN_GAMMA: constant(uint256) = 10**10 MAX_GAMMA: constant(uint256) = 10**16 NOISE_FEE: constant(uint256) = 10**5 # 0.1 bps PRICE_SIZE: constant(int128) = 256 / (N_COINS-1) PRICE_MASK: constant(uint256) = 2**PRICE_SIZE - 1 # This must be changed for different N_COINS # For example: # N_COINS = 3 -> 1 (10**18 -> 10**18) # N_COINS = 4 -> 10**8 (10**18 -> 10**10) # PRICE_PRECISION_MUL: constant(uint256) = 1 PRECISIONS: constant(uint256[N_COINS]) = [ 1, # am3crv 10**10, # WBTC 1, # WETH ] # Matic extras. Not needed on Ethereum! MATIC_REWARDS: constant(address) = 0x357D51124f59836DeD84c8a1730D72B749d8BC23 WMATIC: constant(address) = 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270 @external def __init__( owner: address, A: uint256, gamma: uint256, mid_fee: uint256, out_fee: uint256, price_threshold: uint256, fee_gamma: uint256, adjustment_step: uint256, admin_fee: uint256, ma_half_time: uint256, initial_prices: uint256[N_COINS-1] ): self.owner = owner # Pack A and gamma: # shifted A + gamma A_gamma: uint256 = shift(A * A_MULTIPLIER, 128) A_gamma = bitwise_or(A_gamma, gamma) self.initial_A_gamma = A_gamma self.future_A_gamma = A_gamma self.mid_fee = mid_fee self.out_fee = out_fee self.price_threshold = price_threshold self.fee_gamma = fee_gamma self.adjustment_step = adjustment_step self.admin_fee = admin_fee # Packing prices packed_prices: uint256 = 0 for k in range(N_COINS-1): packed_prices = shift(packed_prices, PRICE_SIZE) p: uint256 = initial_prices[N_COINS-2 - k] # / PRICE_PRECISION_MUL assert p < PRICE_MASK packed_prices = bitwise_or(p, packed_prices) self.price_scale_packed = packed_prices self.price_oracle_packed = packed_prices self.last_prices_packed = packed_prices self.last_prices_timestamp = block.timestamp self.ma_half_time = ma_half_time self.xcp_profit_a = 10**18 self.kill_deadline = block.timestamp + KILL_DEADLINE_DT self.admin_fee_receiver = msg.sender @internal @view def _packed_view(k: uint256, p: uint256) -> uint256: assert k < N_COINS-1 return bitwise_and( shift(p, -PRICE_SIZE * convert(k, int128)), PRICE_MASK ) # * PRICE_PRECISION_MUL @external @view def price_oracle(k: uint256) -> uint256: return self._packed_view(k, self.price_oracle_packed) @external @view def price_scale(k: uint256) -> uint256: return self._packed_view(k, self.price_scale_packed) @external @view def last_prices(k: uint256) -> uint256: return self._packed_view(k, self.last_prices_packed) @external @view def token() -> address: return token @external @view def coins(i: uint256) -> address: _coins: address[N_COINS] = coins return _coins[i] @internal @view def xp() -> uint256[N_COINS]: result: uint256[N_COINS] = self.balances packed_prices: uint256 = self.price_scale_packed precisions: uint256[N_COINS] = PRECISIONS result[0] *= precisions[0] for i in range(1, N_COINS): p: uint256 = bitwise_and(packed_prices, PRICE_MASK) * precisions[i] # * PRICE_PRECISION_MUL result[i] = result[i] * p / PRECISION packed_prices = shift(packed_prices, -PRICE_SIZE) return result @view @internal def _A_gamma() -> (uint256, uint256): t1: uint256 = self.future_A_gamma_time A_gamma_1: uint256 = self.future_A_gamma gamma1: uint256 = bitwise_and(A_gamma_1, 2**128-1) A1: uint256 = shift(A_gamma_1, -128) if block.timestamp < t1: # handle ramping up and down of A A_gamma_0: uint256 = self.initial_A_gamma t0: uint256 = self.initial_A_gamma_time # Less readable but more compact way of writing and converting to uint256 # gamma0: uint256 = bitwise_and(A_gamma_0, 2**128-1) # A0: uint256 = shift(A_gamma_0, -128) # A1 = A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0) # gamma1 = gamma0 + (gamma1 - gamma0) * (block.timestamp - t0) / (t1 - t0) t1 -= t0 t0 = block.timestamp - t0 A1 = (shift(A_gamma_0, -128) * (t1 - t0) + A1 * t0) / t1 gamma1 = (bitwise_and(A_gamma_0, 2**128-1) * (t1 - t0) + gamma1 * t0) / t1 return A1, gamma1 @view @external def A() -> uint256: return self._A_gamma()[0] / A_MULTIPLIER @view @external def gamma() -> uint256: return self._A_gamma()[1] @view @external def A_precise() -> uint256: return self._A_gamma()[0] @internal @view def _fee(xp: uint256[N_COINS]) -> uint256: f: uint256 = Math(math).reduction_coefficient(xp, self.fee_gamma) return (self.mid_fee * f + self.out_fee * (10**18 - f)) / 10**18 @external @view def fee() -> uint256: return self._fee(self.xp()) @external @view def fee_calc(xp: uint256[N_COINS]) -> uint256: return self._fee(xp) @internal @view def get_xcp(D: uint256) -> uint256: x: uint256[N_COINS] = empty(uint256[N_COINS]) x[0] = D / N_COINS packed_prices: uint256 = self.price_scale_packed # No precisions here because we don't switch to "real" units for i in range(1, N_COINS): x[i] = D * 10**18 / (N_COINS * bitwise_and(packed_prices, PRICE_MASK)) # ... * PRICE_PRECISION_MUL) packed_prices = shift(packed_prices, -PRICE_SIZE) return Math(math).geometric_mean(x) @external @view def get_virtual_price() -> uint256: return 10**18 * self.get_xcp(self.D) / CurveToken(token).totalSupply() @internal def _claim_admin_fees(): receiver: address = self.admin_fee_receiver xcp_profit: uint256 = self.xcp_profit vprice: uint256 = self.virtual_price fees: uint256 = (xcp_profit - self.xcp_profit_a) * self.admin_fee / (2 * 10**10) if fees > 0: # Would be nice to recalc D, but we have no bytespace left frac: uint256 = vprice * 10**18 / (vprice - fees) - 10**18 claimed: uint256 = CurveToken(token).mint_relative(receiver, frac) total_supply: uint256 = CurveToken(token).totalSupply() # Gulp here _coins: address[N_COINS] = coins for i in range(N_COINS): self.balances[i] = ERC20(_coins[i]).balanceOf(self) # Recalculate D b/c we gulped A: uint256 = 0 gamma: uint256 = 0 A, gamma = self._A_gamma() xp: uint256[N_COINS] = self.xp() D: uint256 = Math(math).newton_D(A, gamma, xp) new_vprice: uint256 = 10**18 * self.get_xcp(D) / total_supply self.virtual_price = new_vprice xcp_profit = new_vprice + xcp_profit - vprice self.xcp_profit_a = xcp_profit self.xcp_profit = xcp_profit log ClaimAdminFee(receiver, claimed) # push wMatic rewards into the reward receiver receiver = self.reward_receiver if receiver != ZERO_ADDRESS: response: Bytes[32] = raw_call( MATIC_REWARDS, concat( method_id("claimRewards(address[],uint256,address)"), convert(32 * 3, bytes32), convert(MAX_UINT256, bytes32), convert(self, bytes32), convert(2, bytes32), convert(coins[1], bytes32), convert(coins[2], bytes32), ), max_outsize=32 ) # can do if amount > 0, but here we try to save space rather than anything else # assert might be needed for some tokens - removed one to save bytespace ERC20(WMATIC).transfer(receiver, convert(response, uint256)) @internal def tweak_price(A: uint256, gamma: uint256, _xp: uint256[N_COINS], i: uint256, p_i: uint256, new_D: uint256 = 0): # Update MA if needed price_oracle: uint256[N_COINS-1] = empty(uint256[N_COINS-1]) packed_prices: uint256 = self.price_oracle_packed for k in range(N_COINS-1): price_oracle[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL packed_prices = shift(packed_prices, -PRICE_SIZE) last_prices_timestamp: uint256 = self.last_prices_timestamp last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1]) packed_prices = self.last_prices_packed for k in range(N_COINS-1): last_prices[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL packed_prices = shift(packed_prices, -PRICE_SIZE) if last_prices_timestamp < block.timestamp: # MA update required ma_half_time: uint256 = self.ma_half_time alpha: uint256 = Math(math).halfpow((block.timestamp - last_prices_timestamp) * 10**18 / ma_half_time, 10**10) packed_prices = 0 for k in range(N_COINS-1): price_oracle[k] = (last_prices[k] * (10**18 - alpha) + price_oracle[k] * alpha) / 10**18 for k in range(N_COINS-1): packed_prices = shift(packed_prices, PRICE_SIZE) p: uint256 = price_oracle[N_COINS-2 - k] # / PRICE_PRECISION_MUL assert p < PRICE_MASK packed_prices = bitwise_or(p, packed_prices) self.price_oracle_packed = packed_prices self.last_prices_timestamp = block.timestamp D_unadjusted: uint256 = new_D # Withdrawal methods know new D already if new_D == 0: # We will need this a few times (35k gas) D_unadjusted = Math(math).newton_D(A, gamma, _xp) packed_prices = self.price_scale_packed price_scale: uint256[N_COINS-1] = empty(uint256[N_COINS-1]) for k in range(N_COINS-1): price_scale[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL packed_prices = shift(packed_prices, -PRICE_SIZE) if p_i > 0: # Save the last price if i > 0: last_prices[i-1] = p_i else: # If 0th price changed - change all prices instead for k in range(N_COINS-1): last_prices[k] = last_prices[k] * 10**18 / p_i else: # calculate real prices # it would cost 70k gas for a 3-token pool. Sad. How do we do better? __xp: uint256[N_COINS] = _xp dx_price: uint256 = __xp[0] / 10**6 __xp[0] += dx_price for k in range(N_COINS-1): last_prices[k] = price_scale[k] * dx_price / (_xp[k+1] - Math(math).newton_y(A, gamma, __xp, D_unadjusted, k+1)) packed_prices = 0 for k in range(N_COINS-1): packed_prices = shift(packed_prices, PRICE_SIZE) p: uint256 = last_prices[N_COINS-2 - k] # / PRICE_PRECISION_MUL assert p < PRICE_MASK packed_prices = bitwise_or(p, packed_prices) self.last_prices_packed = packed_prices norm: uint256 = 0 total_supply: uint256 = CurveToken(token).totalSupply() old_xcp_profit: uint256 = self.xcp_profit old_virtual_price: uint256 = self.virtual_price for k in range(N_COINS-1): ratio: uint256 = price_oracle[k] * 10**18 / price_scale[k] if ratio > 10**18: ratio -= 10**18 else: ratio = 10**18 - ratio norm += ratio**2 # Update profit numbers without price adjustment first xp: uint256[N_COINS] = empty(uint256[N_COINS]) xp[0] = D_unadjusted / N_COINS for k in range(N_COINS-1): xp[k+1] = D_unadjusted * 10**18 / (N_COINS * price_scale[k]) xcp_profit: uint256 = 10**18 virtual_price: uint256 = 10**18 if old_virtual_price > 0: xcp: uint256 = Math(math).geometric_mean(xp) virtual_price = 10**18 * xcp / total_supply xcp_profit = old_xcp_profit * virtual_price / old_virtual_price if virtual_price < old_virtual_price: raise "Loss" self.xcp_profit = xcp_profit # self.price_threshold must be > self.adjustment_step # should we pause for a bit if profit wasn't enough to not spend this gas every time? if norm > self.price_threshold ** 2 and old_virtual_price > 0: norm = Math(math).sqrt_int(norm / 10**18) # Need to convert to 1e18 units! adjustment_step: uint256 = self.adjustment_step p_new: uint256[N_COINS-1] = empty(uint256[N_COINS-1]) for k in range(N_COINS-1): p_new[k] = (price_scale[k] * (norm - adjustment_step) + adjustment_step * price_oracle[k]) / norm # Calculate balances*prices xp = _xp for k in range(N_COINS-1): xp[k+1] = _xp[k+1] * p_new[k] / price_scale[k] # Calculate "extended constant product" invariant xCP and virtual price D: uint256 = Math(math).newton_D(A, gamma, xp) xp[0] = D / N_COINS for k in range(N_COINS-1): xp[k+1] = D * 10**18 / (N_COINS * p_new[k]) # We reuse old_virtual_price here but it's not old anymore old_virtual_price = 10**18 * Math(math).geometric_mean(xp) / total_supply # Proceed if we've got enough profit if (old_virtual_price > 10**18) and (2 * (old_virtual_price - 10**18) > xcp_profit - 10**18): packed_prices = 0 for k in range(N_COINS-1): packed_prices = shift(packed_prices, PRICE_SIZE) p: uint256 = p_new[N_COINS-2 - k] # / PRICE_PRECISION_MUL assert p < PRICE_MASK packed_prices = bitwise_or(p, packed_prices) self.price_scale_packed = packed_prices self.D = D self.virtual_price = old_virtual_price # XXX Remove for non-Matic self._claim_admin_fees() return # else - make a delay? # If we are here, the price_scale adjustment did not happen # Still need to update the profit counter and D self.D = D_unadjusted self.virtual_price = virtual_price # XXX Remove for non-Matic self._claim_admin_fees() @external @nonreentrant('lock') def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256): assert not self.is_killed # dev: the pool is killed assert i != j and i < N_COINS and j < N_COINS # dev: coin index out of range assert dx > 0 # dev: do not exchange 0 coins A: uint256 = 0 gamma: uint256 = 0 A, gamma = self._A_gamma() _coins: address[N_COINS] = coins # assert might be needed for some tokens - removed one to save bytespace ERC20(_coins[i]).transferFrom(msg.sender, self, dx) price_scale: uint256[N_COINS-1] = empty(uint256[N_COINS-1]) if True: # scope to clear packed_prices packed_prices: uint256 = self.price_scale_packed for k in range(N_COINS-1): price_scale[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL packed_prices = shift(packed_prices, -PRICE_SIZE) xp: uint256[N_COINS] = self.balances y: uint256 = xp[j] xp[i] += dx self.balances[i] = xp[i] precisions: uint256[N_COINS] = PRECISIONS xp[0] *= precisions[0] for k in range(1, N_COINS): xp[k] = xp[k] * price_scale[k-1] * precisions[k] / PRECISION dy: uint256 = xp[j] - Math(math).newton_y(A, gamma, xp, self.D, j) # Not defining new "y" here to have less variables / make subsequent calls cheaper xp[j] -= dy dy -= 1 if j > 0: dy = dy * PRECISION / price_scale[j-1] dy /= precisions[j] dy -= self._fee(xp) * dy / 10**10 assert dy >= min_dy, "Slippage" y -= dy self.balances[j] = y # assert might be needed for some tokens - removed one to save bytespace ERC20(_coins[j]).transfer(msg.sender, dy) xp[j] = y * precisions[j] if j > 0: xp[j] = xp[j] * price_scale[j-1] / PRECISION # Calculate price p: uint256 = 0 ix: uint256 = j if dx > 10**5 and dy > 10**5: if i != 0 and j != 0: p = bitwise_and( shift(self.last_prices_packed, -PRICE_SIZE * convert(i-1, int128)), PRICE_MASK ) * (dx * precisions[i]) / (dy * precisions[j]) # * PRICE_PRECISION_MUL elif i == 0: p = (dx * precisions[i]) * 10**18 / (dy * precisions[j]) else: # j == 0 p = (dy * precisions[j]) * 10**18 / (dx * precisions[i]) ix = i self.tweak_price(A, gamma, xp, ix, p) log TokenExchange(msg.sender, i, dx, j, dy) @external @view def get_dy(i: uint256, j: uint256, dx: uint256) -> uint256: return Views(views).get_dy(i, j, dx) @view @internal def _calc_token_fee(amounts: uint256[N_COINS], xp: uint256[N_COINS]) -> uint256: # fee = sum(amounts_i - avg(amounts)) * fee' / sum(amounts) fee: uint256 = self._fee(xp) * N_COINS / (4 * (N_COINS-1)) S: uint256 = 0 for _x in amounts: S += _x avg: uint256 = S / N_COINS Sdiff: uint256 = 0 for _x in amounts: if _x > avg: Sdiff += _x - avg else: Sdiff += avg - _x return fee * Sdiff / S + NOISE_FEE @external @view def calc_token_fee(amounts: uint256[N_COINS], xp: uint256[N_COINS]) -> uint256: return self._calc_token_fee(amounts, xp) @external @nonreentrant('lock') def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256): assert not self.is_killed # dev: the pool is killed A: uint256 = 0 gamma: uint256 = 0 A, gamma = self._A_gamma() _coins: address[N_COINS] = coins xp: uint256[N_COINS] = self.balances amountsp: uint256[N_COINS] = amounts xx: uint256[N_COINS] = empty(uint256[N_COINS]) if True: # Scope to avoid having extra variables in memory later n_coins_added: uint256 = 0 for i in range(N_COINS): if amounts[i] > 0: # assert might be needed for some tokens - removed one to save bytespace ERC20(_coins[i]).transferFrom(msg.sender, self, amounts[i]) n_coins_added += 1 assert n_coins_added > 0 # dev: no coins to add for i in range(N_COINS): bal: uint256 = xp[i] + amounts[i] xp[i] = bal self.balances[i] = bal xx = xp precisions: uint256[N_COINS] = PRECISIONS packed_prices: uint256 = self.price_scale_packed xp[0] *= precisions[0] for i in range(1, N_COINS): price_scale: uint256 = bitwise_and(packed_prices, PRICE_MASK) * precisions[i] # * PRICE_PRECISION_MUL xp[i] = xp[i] * price_scale / PRECISION amountsp[i] = amountsp[i] * price_scale / PRECISION packed_prices = shift(packed_prices, -PRICE_SIZE) D: uint256 = Math(math).newton_D(A, gamma, xp) token_supply: uint256 = CurveToken(token).totalSupply() old_D: uint256 = self.D d_token: uint256 = 0 if old_D > 0: d_token = token_supply * D / old_D - token_supply else: d_token = self.get_xcp(D) # making initial virtual price equal to 1 assert d_token > 0 # dev: nothing minted d_token_fee: uint256 = 0 if old_D > 0: d_token_fee = self._calc_token_fee(amountsp, xp) * d_token / 10**10 + 1 d_token -= d_token_fee token_supply += d_token CurveToken(token).mint(msg.sender, d_token) # Calculate price # p_i * (dx_i - dtoken / token_supply * xx_i) = sum{k!=i}(p_k * (dtoken / token_supply * xx_k - dx_k)) # Only ix is nonzero p: uint256 = 0 ix: uint256 = 0 if d_token > 10**5: n_zeros: uint256 = 0 for i in range(N_COINS): if amounts[i] == 0: n_zeros += 1 else: ix = i if n_zeros == N_COINS-1: S: uint256 = 0 last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1]) packed_prices: uint256 = self.last_prices_packed precisions: uint256[N_COINS] = PRECISIONS for k in range(N_COINS-1): last_prices[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL packed_prices = shift(packed_prices, -PRICE_SIZE) for i in range(N_COINS): if i != ix: if i == 0: S += xx[0] * precisions[0] else: S += xx[i] * last_prices[i-1] * precisions[i] / PRECISION S = S * d_token / token_supply p = S * PRECISION / (amounts[ix] * precisions[ix] - d_token * xx[ix] * precisions[ix] / token_supply) self.tweak_price(A, gamma, xp, ix, p, D) else: self.D = D self.virtual_price = 10**18 self.xcp_profit = 10**18 assert CurveToken(token).mint(msg.sender, d_token) assert d_token >= min_mint_amount, "Slippage" log AddLiquidity(msg.sender, amounts, d_token_fee, token_supply) @external @nonreentrant('lock') def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]): """ This withdrawal method is very safe, does no complex math """ _coins: address[N_COINS] = coins total_supply: uint256 = CurveToken(token).totalSupply() assert CurveToken(token).burnFrom(msg.sender, _amount) balances: uint256[N_COINS] = self.balances amount: uint256 = _amount - 1 # Make rounding errors favoring other LPs a tiny bit for i in range(N_COINS): d_balance: uint256 = balances[i] * amount / total_supply assert d_balance >= min_amounts[i] self.balances[i] = balances[i] - d_balance balances[i] = d_balance # now it's the amounts going out # assert might be needed for some tokens - removed one to save bytespace ERC20(_coins[i]).transfer(msg.sender, d_balance) D: uint256 = self.D self.D = D - D * amount / total_supply log RemoveLiquidity(msg.sender, balances, total_supply - _amount) @view @external def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256: return Views(views).calc_token_amount(amounts, deposit) @internal @view def _calc_withdraw_one_coin(A: uint256, gamma: uint256, token_amount: uint256, i: uint256, calc_price: bool) -> (uint256, uint256, uint256, uint256[N_COINS]): D: uint256 = self.D D0: uint256 = D token_supply: uint256 = CurveToken(token).totalSupply() assert token_amount <= token_supply # dev: token amount more than supply assert i < N_COINS # dev: coin out of range xx: uint256[N_COINS] = self.balances xp: uint256[N_COINS] = PRECISIONS price_scale_i: uint256 = PRECISION * xp[0] if True: # To remove oacked_prices from memory packed_prices: uint256 = self.price_scale_packed xp[0] *= xx[0] for k in range(1, N_COINS): p: uint256 = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL if i == k: price_scale_i = p * xp[i] xp[k] = xp[k] * xx[k] * p / PRECISION packed_prices = shift(packed_prices, -PRICE_SIZE) # Charge the fee on D, not on y, e.g. reducing invariant LESS than charging the user fee: uint256 = self._fee(xp) dD: uint256 = token_amount * D / token_supply D -= (dD - (fee * dD / (2 * 10**10) + 1)) y: uint256 = Math(math).newton_y(A, gamma, xp, D, i) dy: uint256 = (xp[i] - y) * PRECISION / price_scale_i xp[i] = y # Price calc p: uint256 = 0 if calc_price and dy > 10**5 and token_amount > 10**5: # p_i = dD / D0 * sum'(p_k * x_k) / (dy - dD / D0 * y0) S: uint256 = 0 precisions: uint256[N_COINS] = PRECISIONS last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1]) packed_prices: uint256 = self.last_prices_packed for k in range(N_COINS-1): last_prices[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL packed_prices = shift(packed_prices, -PRICE_SIZE) for k in range(N_COINS): if k != i: if k == 0: S += xx[0] * precisions[0] else: S += xx[k] * last_prices[k-1] * precisions[k] / PRECISION S = S * dD / D0 p = S * PRECISION / (dy * precisions[i] - dD * xx[i] * precisions[i] / D0) return dy, p, D, xp @view @external def calc_withdraw_one_coin(token_amount: uint256, i: uint256) -> uint256: A: uint256 = 0 gamma: uint256 = 0 A, gamma = self._A_gamma() return self._calc_withdraw_one_coin(A, gamma, token_amount, i, False)[0] @external @nonreentrant('lock') def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256): assert not self.is_killed # dev: the pool is killed A: uint256 = 0 gamma: uint256 = 0 A, gamma = self._A_gamma() dy: uint256 = 0 D: uint256 = 0 p: uint256 = 0 xp: uint256[N_COINS] = empty(uint256[N_COINS]) dy, p, D, xp = self._calc_withdraw_one_coin(A, gamma, token_amount, i, True) assert dy >= min_amount, "Slippage" self.balances[i] -= dy assert CurveToken(token).burnFrom(msg.sender, token_amount) if True: # Remove _coins from the scope _coins: address[N_COINS] = coins # assert might be needed for some tokens - removed one to save bytespace ERC20(_coins[i]).transfer(msg.sender, dy) self.tweak_price(A, gamma, xp, i, p, D) log RemoveLiquidityOne(msg.sender, token_amount, i, dy) @external @nonreentrant('lock') def claim_admin_fees(): self._claim_admin_fees() # Admin parameters @external def ramp_A_gamma(future_A: uint256, future_gamma: uint256, future_time: uint256): assert msg.sender == self.owner # dev: only owner assert block.timestamp > self.initial_A_gamma_time + (MIN_RAMP_TIME-1) assert future_time > block.timestamp + (MIN_RAMP_TIME-1) # dev: insufficient time initial_A: uint256 = 0 initial_gamma: uint256 = 0 initial_A, initial_gamma = self._A_gamma() initial_A_gamma: uint256 = shift(initial_A, 128) initial_A_gamma = bitwise_or(initial_A_gamma, initial_gamma) future_A_p: uint256 = future_A * A_MULTIPLIER assert future_A > 0 and future_A < MAX_A assert future_gamma > MIN_GAMMA-1 and future_gamma < MAX_GAMMA+1 if future_A_p < initial_A: assert future_A_p * MAX_A_CHANGE >= initial_A else: assert future_A_p <= initial_A * MAX_A_CHANGE self.initial_A_gamma = initial_A_gamma self.initial_A_gamma_time = block.timestamp future_A_gamma: uint256 = shift(future_A_p, 128) future_A_gamma = bitwise_or(future_A_gamma, future_gamma) self.future_A_gamma_time = future_time self.future_A_gamma = future_A_gamma log RampAgamma(initial_A, future_A_p, block.timestamp, future_time) @external def stop_ramp_A_gamma(): assert msg.sender == self.owner # dev: only owner current_A: uint256 = 0 current_gamma: uint256 = 0 current_A, current_gamma = self._A_gamma() current_A_gamma: uint256 = shift(current_A, 128) current_A_gamma = bitwise_or(current_A_gamma, current_gamma) self.initial_A_gamma = current_A_gamma self.future_A_gamma = current_A_gamma self.initial_A_gamma_time = block.timestamp self.future_A_gamma_time = block.timestamp # now (block.timestamp < t1) is always False, so we return saved A log StopRampA(current_A, current_gamma, block.timestamp) @external def commit_new_parameters( _new_mid_fee: uint256, _new_out_fee: uint256, _new_admin_fee: uint256, _new_fee_gamma: uint256, _new_price_threshold: uint256, _new_adjustment_step: uint256, _new_ma_half_time: uint256, ): assert msg.sender == self.owner # dev: only owner assert self.admin_actions_deadline == 0 # dev: active action new_mid_fee: uint256 = _new_mid_fee new_out_fee: uint256 = _new_out_fee new_admin_fee: uint256 = _new_admin_fee new_fee_gamma: uint256 = _new_fee_gamma new_price_threshold: uint256 = _new_price_threshold new_adjustment_step: uint256 = _new_adjustment_step new_ma_half_time: uint256 = _new_ma_half_time # Fees if new_out_fee != MAX_UINT256: assert new_out_fee < MAX_FEE+1 and new_out_fee > MIN_FEE-1 # dev: fee is out of range else: new_out_fee = self.out_fee if new_mid_fee == MAX_UINT256: new_mid_fee = self.mid_fee assert new_mid_fee <= new_out_fee # dev: mid-fee is too high if new_admin_fee != MAX_UINT256: assert new_admin_fee < MAX_ADMIN_FEE+1 # dev: admin fee exceeds maximum else: new_admin_fee = self.admin_fee # AMM parameters if new_fee_gamma != MAX_UINT256: assert new_fee_gamma > 0 and new_fee_gamma < 2**100 # dev: fee_gamma out of range [1 .. 2**100] else: new_fee_gamma = self.fee_gamma if new_price_threshold != MAX_UINT256: assert new_price_threshold > new_mid_fee # dev: price threshold should be higher than the fee else: new_price_threshold = self.price_threshold if new_adjustment_step == MAX_UINT256: new_adjustment_step = self.adjustment_step assert new_adjustment_step <= new_price_threshold # dev: adjustment step should be smaller than price threshold # MA if new_ma_half_time != MAX_UINT256: assert new_ma_half_time > 0 and new_ma_half_time < 7*86400 # dev: MA time should be shorter than 1 week else: new_ma_half_time = self.ma_half_time _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY self.admin_actions_deadline = _deadline self.future_admin_fee = new_admin_fee self.future_mid_fee = new_mid_fee self.future_out_fee = new_out_fee self.future_fee_gamma = new_fee_gamma self.future_price_threshoold = new_price_threshold self.future_adjustment_step = new_adjustment_step self.future_ma_half_time = new_ma_half_time log CommitNewParameters(_deadline, new_admin_fee, new_mid_fee, new_out_fee, new_fee_gamma, new_price_threshold, new_adjustment_step, new_ma_half_time) @external @nonreentrant('lock') def apply_new_parameters(): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.admin_actions_deadline # dev: insufficient time assert self.admin_actions_deadline != 0 # dev: no active action self.admin_actions_deadline = 0 admin_fee: uint256 = self.future_admin_fee if self.admin_fee != admin_fee: self._claim_admin_fees() self.admin_fee = admin_fee mid_fee: uint256 = self.future_mid_fee self.mid_fee = mid_fee out_fee: uint256 = self.future_out_fee self.out_fee = out_fee fee_gamma: uint256 = self.future_fee_gamma self.fee_gamma = fee_gamma price_threshold: uint256 = self.future_price_threshoold self.price_threshold = price_threshold adjustment_step: uint256 = self.future_adjustment_step self.adjustment_step = adjustment_step ma_half_time: uint256 = self.future_ma_half_time self.ma_half_time = ma_half_time log NewParameters(admin_fee, mid_fee, out_fee, fee_gamma, price_threshold, adjustment_step, ma_half_time) @external def revert_new_parameters(): assert msg.sender == self.owner # dev: only owner self.admin_actions_deadline = 0 @external def commit_transfer_ownership(_owner: address): assert msg.sender == self.owner # dev: only owner assert self.transfer_ownership_deadline == 0 # dev: active transfer _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY self.transfer_ownership_deadline = _deadline self.future_owner = _owner log CommitNewAdmin(_deadline, _owner) @external def apply_transfer_ownership(): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.transfer_ownership_deadline # dev: insufficient time assert self.transfer_ownership_deadline != 0 # dev: no active transfer self.transfer_ownership_deadline = 0 _owner: address = self.future_owner self.owner = _owner log NewAdmin(_owner) @external def revert_transfer_ownership(): assert msg.sender == self.owner # dev: only owner self.transfer_ownership_deadline = 0 @external def kill_me(): assert msg.sender == self.owner # dev: only owner assert self.kill_deadline > block.timestamp # dev: deadline has passed self.is_killed = True @external def unkill_me(): assert msg.sender == self.owner # dev: only owner self.is_killed = False @external def set_reward_receiver(_reward_receiver: address): assert msg.sender == self.owner # dev: only owner self.reward_receiver = _reward_receiver @external def set_admin_fee_receiver(_admin_fee_receiver: address): assert msg.sender == self.owner # dev: only owner self.admin_fee_receiver = _admin_fee_receiver
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"name":"TokenExchange","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"uint256","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"uint256","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[3]","indexed":false},{"name":"fee","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[3]","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amount","type":"uint256","indexed":false},{"name":"coin_index","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewParameters","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"price_threshold","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewParameters","inputs":[{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"price_threshold","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampAgamma","inputs":[{"name":"initial_A","type":"uint256","indexed":false},{"name":"future_A","type":"uint256","indexed":false},{"name":"initial_time","type":"uint256","indexed":false},{"name":"future_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"name":"current_A","type":"uint256","indexed":false},{"name":"current_gamma","type":"uint256","indexed":false},{"name":"time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ClaimAdminFee","inputs":[{"name":"admin","type":"address","indexed":true},{"name":"tokens","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"owner","type":"address"},{"name":"A","type":"uint256"},{"name":"gamma","type":"uint256"},{"name":"mid_fee","type":"uint256"},{"name":"out_fee","type":"uint256"},{"name":"price_threshold","type":"uint256"},{"name":"fee_gamma","type":"uint256"},{"name":"adjustment_step","type":"uint256"},{"name":"admin_fee","type":"uint256"},{"name":"ma_half_time","type":"uint256"},{"name":"initial_prices","type":"uint256[2]"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"price_oracle","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3290},{"stateMutability":"view","type":"function","name":"price_scale","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3320},{"stateMutability":"view","type":"function","name":"last_prices","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3350},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":378},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":492},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":847},{"stateMutability":"view","type":"function","name":"gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":12394},{"stateMutability":"view","type":"function","name":"A_precise","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":839},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":21660},{"stateMutability":"view","type":"function","name":"fee_calc","inputs":[{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":11066},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":11552},{"stateMutability":"nonpayable","type":"function","name":"exchange","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[],"gas":1815071},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3062},{"stateMutability":"view","type":"function","name":"calc_token_fee","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":26612},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[],"gas":1885454},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[3]"}],"outputs":[],"gas":226141},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":3369},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":13849},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"},{"name":"min_amount","type":"uint256"}],"outputs":[],"gas":1800368},{"stateMutability":"nonpayable","type":"function","name":"claim_admin_fees","inputs":[],"outputs":[],"gas":370118},{"stateMutability":"nonpayable","type":"function","name":"ramp_A_gamma","inputs":[{"name":"future_A","type":"uint256"},{"name":"future_gamma","type":"uint256"},{"name":"future_time","type":"uint256"}],"outputs":[],"gas":161781},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A_gamma","inputs":[],"outputs":[],"gas":157691},{"stateMutability":"nonpayable","type":"function","name":"commit_new_parameters","inputs":[{"name":"_new_mid_fee","type":"uint256"},{"name":"_new_out_fee","type":"uint256"},{"name":"_new_admin_fee","type":"uint256"},{"name":"_new_fee_gamma","type":"uint256"},{"name":"_new_price_threshold","type":"uint256"},{"name":"_new_adjustment_step","type":"uint256"},{"name":"_new_ma_half_time","type":"uint256"}],"outputs":[],"gas":306209},{"stateMutability":"nonpayable","type":"function","name":"apply_new_parameters","inputs":[],"outputs":[],"gas":663748},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":23162},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":77200},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":65877},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23252},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40475},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23312},{"stateMutability":"nonpayable","type":"function","name":"set_reward_receiver","inputs":[{"name":"_reward_receiver","type":"address"}],"outputs":[],"gas":38445},{"stateMutability":"nonpayable","type":"function","name":"set_admin_fee_receiver","inputs":[{"name":"_admin_fee_receiver","type":"address"}],"outputs":[],"gas":38475},{"stateMutability":"view","type":"function","name":"last_prices_timestamp","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3348},{"stateMutability":"view","type":"function","name":"initial_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3378},{"stateMutability":"view","type":"function","name":"future_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3408},{"stateMutability":"view","type":"function","name":"initial_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"future_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3468},{"stateMutability":"view","type":"function","name":"price_threshold","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3498},{"stateMutability":"view","type":"function","name":"future_price_threshoold","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3528},{"stateMutability":"view","type":"function","name":"fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3558},{"stateMutability":"view","type":"function","name":"future_fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3588},{"stateMutability":"view","type":"function","name":"adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"future_adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3648},{"stateMutability":"view","type":"function","name":"ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3678},{"stateMutability":"view","type":"function","name":"future_ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3708},{"stateMutability":"view","type":"function","name":"mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3738},{"stateMutability":"view","type":"function","name":"out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3768},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3798},{"stateMutability":"view","type":"function","name":"future_mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3828},{"stateMutability":"view","type":"function","name":"future_out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3858},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3888},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":4027},{"stateMutability":"view","type":"function","name":"D","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3948},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3978},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4008},{"stateMutability":"view","type":"function","name":"xcp_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4038},{"stateMutability":"view","type":"function","name":"xcp_profit_a","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4068},{"stateMutability":"view","type":"function","name":"virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4098},{"stateMutability":"view","type":"function","name":"is_killed","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":4128},{"stateMutability":"view","type":"function","name":"kill_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4158},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4188},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4218},{"stateMutability":"view","type":"function","name":"reward_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4248},{"stateMutability":"view","type":"function","name":"admin_fee_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4278}]
Contract Creation Code
6f7fffffffffffffffffffffffffffffff60405261018061611761014039602061611760c03960c05160a01c1561003557600080fd5b61014051601855610160516064808202821582848304141761005657600080fd5b8090509050905060801b6102c052610180516102c051176102c0526102c0516004556102c0516005556101a0516010556101c0516011556101e05160085561020051600a5561022051600c556102405160125560006102e05261030060006002818352015b6102e05160801b6102e052610280600161030051808210156100dc57600080fd5b80820390509050600281106100f057600080fd5b6020020151610320526fffffffffffffffffffffffffffffffff610320511061011857600080fd5b6102e05161032051176102e0525b81516001018083528114156100bb575b50506102e0516000556102e0516001556102e0516002554260035561026051600e55670de0b6b3a7640000601b5542624f1a0081818301101561017857600080fd5b80820190509050601e55336022556160ff56600436101561000d576134fe565b600035601c526f7fffffffffffffffffffffffffffffff604052600051341561003557600080fd5b6368727653811415610071576004356101405260015461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63a3f7cdd58114156100ad576004356101405260005461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63591890178114156100e9576004356101405260025461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63fc0c546a81141561011357738096ac61db23291252574d49f036f0f9ed8ab39060005260206000f35b63c661065781141561018b5773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161014052735c2ed810328349100a66b82b78a1791b101c9d61610160527328424507fefb6f7f8e9d3860f56504e4e5f5f390610180526101406004356003811061017d57600080fd5b602002015160005260206000f35b63f446c1d08114156101de5760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160648082049050905060005260206000f35b63b137392981141561022b5760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101806020015160005260206000f35b6376a2f0f08114156102755760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160005260206000f35b63ddca3f4381141561032057600658016135b5565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e051610240526102405161022051610200516006580161394f565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e562581141561036d576004803561014052806020013561016052806040013561018052506101805161016051610140516006580161394f565b6101e0526101e05160005260206000f35b63bb7b8b8081141561041a57670de0b6b3a7640000601754610140526101405160065801613a5c565b6101a0526101a05180820282158284830414176103b257600080fd5b80905090509050602061022060046318160ddd6101c0526101dc738096ac61db23291252574d49f036f0f9ed8ab3905afa6103ec57600080fd5b601f3d116103f957600080fd5b60005061022051808061040b57600080fd5b82049050905060005260206000f35b635b41b908811415611060576023541561043357600080fd5b6001602355601d541561044557600080fd5b602435600435181561046f57600360043510156104675760036024351061046a565b60005b610472565b60005b61047b57600080fd5b60006044351161048a57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161018052735c2ed810328349100a66b82b78a1791b101c9d616101a0527328424507fefb6f7f8e9d3860f56504e4e5f5f3906101c05260206102a060646323b872dd6101e05233610200523061022052604435610240526101fc60006101806004356003811061056957600080fd5b60200201515af161057957600080fd5b601f3d1161058657600080fd5b6000506102a0506040366101e0376001156105fc576000546102205261024060006002818352015b6fffffffffffffffffffffffffffffffff61022051166101e061024051600281106105d857600080fd5b60200201526102205160801c610220525b81516001018083528114156105ae575b50505b60168060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c020015461026052506102206024356003811061064257600080fd5b6020020151610280526102206004356003811061065e57600080fd5b60200201805160443581818301101561067657600080fd5b808201905090508152506102206004356003811061069357600080fd5b6020020151600435600381106106a857600080fd5b601660c052602060c020015560016102a0526402540be4006102c05260016102e05261022080516102a05180820282158284830414176106e757600080fd5b8090509050905081525061030060016002818352015b610220610300516003811061071157600080fd5b60200201516101e06103005160018082101561072c57600080fd5b808203905090506002811061074057600080fd5b6020020151808202821582848304141761075957600080fd5b809050905090506102a0610300516003811061077457600080fd5b6020020151808202821582848304141761078d57600080fd5b80905090509050670de0b6b3a76400008082049050905061022061030051600381106107b857600080fd5b60200201525b81516001018083528114156106fd575b5050610220602435600381106107e357600080fd5b6020020151602061046060e46336bc885561032052610140516103405261016051610360526102205161038052610240516103a052610260516103c0526017546103e0526024356104005261033c731689acd208d817b32eeaccce8121278c5766f5305afa61085157600080fd5b601f3d1161085e57600080fd5b600050610460518082101561087257600080fd5b80820390509050610300526102206024356003811061089057600080fd5b60200201805161030051808210156108a757600080fd5b8082039050905081525061030080516001808210156108c557600080fd5b80820390509050815250600060243511156109465761030051670de0b6b3a764000080820282158284830414176108fb57600080fd5b809050905090506101e060243560018082101561091757600080fd5b808203905090506002811061092b57600080fd5b6020020151808061093b57600080fd5b820490509050610300525b61030080516102a06024356003811061095e57600080fd5b6020020151808061096e57600080fd5b82049050905081525061030080516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516102205161032052610240516103405261026051610360526103605161034051610320516006580161394f565b6103c052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c051610300518082028215828483041417610a4157600080fd5b809050905090506402540be4008082049050905080821015610a6257600080fd5b808203905090508152506064356103005110151515610ac0576308c379a0610320526020610340526008610360527f536c6970706167650000000000000000000000000000000000000000000000006103805261036050606461033cfd5b61028080516103005180821015610ad657600080fd5b808203905090508152506102805160243560038110610af457600080fd5b601660c052602060c020015560206103c0604463a9059cbb610320523361034052610300516103605261033c600061018060243560038110610b3557600080fd5b60200201515af1610b4557600080fd5b601f3d11610b5257600080fd5b6000506103c050610280516102a060243560038110610b7057600080fd5b60200201518082028215828483041417610b8957600080fd5b8090509050905061022060243560038110610ba357600080fd5b602002015260006024351115610c3d5761022060243560038110610bc657600080fd5b60200201516101e0602435600180821015610be057600080fd5b8082039050905060028110610bf457600080fd5b60200201518082028215828483041417610c0d57600080fd5b80905090509050670de0b6b3a76400008082049050905061022060243560038110610c3757600080fd5b60200201525b60006103205260243561034052620186a06044351115610c6557620186a06103005111610c68565b60005b15610f2c5760006004351815610c845760006024351415610c87565b60005b15610dca576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610cd057600080fd5b80820390509050604051811115610ce657600080fd5b80820280806000811215610cf657195b607f1c15610d0357600080fd5b9050905090506000811215610d1f57600254816000031c610d25565b600254811b5b9050166044356102a060043560038110610d3e57600080fd5b60200201518082028215828483041417610d5757600080fd5b809050905090508082028215828483041417610d7257600080fd5b80905090509050610300516102a060243560038110610d9057600080fd5b60200201518082028215828483041417610da957600080fd5b809050905090508080610dbb57600080fd5b82049050905061032052610f2c565b6004351515610e7e576044356102a060043560038110610de957600080fd5b60200201518082028215828483041417610e0257600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610e2657600080fd5b80905090509050610300516102a060243560038110610e4457600080fd5b60200201518082028215828483041417610e5d57600080fd5b809050905090508080610e6f57600080fd5b82049050905061032052610f2c565b610300516102a060243560038110610e9557600080fd5b60200201518082028215828483041417610eae57600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610ed257600080fd5b809050905090506044356102a060043560038110610eef57600080fd5b60200201518082028215828483041417610f0857600080fd5b809050905090508080610f1a57600080fd5b82049050905061032052600435610340525b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161014051610360526101605161038052610220516103a052610240516103c052610260516103e0526103405161040052610320516104205261042051610400516103e0516103c0516103a0516103805161036051600658016142ff565b6103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561036052604435610380526024356103a052610300516103c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610360a26000602355005b63556d6e9f8114156110c4576020610200606463556d6e9f61014052606060046101603761015c733c0ebff09d6bb028eed1dd29669c2e3bf98c9d7f5afa6110a757600080fd5b601f3d116110b457600080fd5b6000506102005160005260206000f35b63cde699fa81141561113857600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a051610180516101605161014051600658016154c4565b610240526102405160005260206000f35b634515cef3811415611ea8576023541561115157600080fd5b6001602355601d541561116357600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161018052735c2ed810328349100a66b82b78a1791b101c9d616101a0527328424507fefb6f7f8e9d3860f56504e4e5f5f3906101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506004803561024052806020013561026052806040013561028052506060366102a03760011561158c5760006103005261032060006003818352015b60006004610320516003811061128c57600080fd5b6020020135111561132b57602061040060646323b872dd6103405233610360523061038052600461032051600381106112c457600080fd5b60200201356103a05261035c600061018061032051600381106112e657600080fd5b60200201515af16112f657600080fd5b601f3d1161130357600080fd5b600050610400506103008051600181818301101561132057600080fd5b808201905090508152505b8151600101808352811415611277575b50506000610300511161134d57600080fd5b61032060006003818352015b6101e0610320516003811061136d57600080fd5b60200201516004610320516003811061138557600080fd5b602002013581818301101561139957600080fd5b8082019050905061034052610340516101e061032051600381106113bc57600080fd5b60200201526103405161032051600381106113d657600080fd5b601660c052602060c02001555b8151600101808352811415611359575b50506101e0516102a052610200516102c052610220516102e0526001610320526402540be40061034052600161036052600054610380526101e0805161032051808202821582848304141761144757600080fd5b809050905090508152506103a060016002818352015b6fffffffffffffffffffffffffffffffff61038051166103206103a0516003811061148757600080fd5b602002015180820282158284830414176114a057600080fd5b809050905090506103c0526101e06103a051600381106114bf57600080fd5b60200201516103c05180820282158284830414176114dc57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e06103a0516003811061150757600080fd5b60200201526102406103a0516003811061152057600080fd5b60200201516103c051808202821582848304141761153d57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406103a0516003811061156857600080fd5b60200201526103805160801c610380525b815160010180835281141561145d575b50505b602061042060a463c7fab70861032052610140516103405261016051610360526101e05161038052610200516103a052610220516103c05261033c731689acd208d817b32eeaccce8121278c5766f5305afa6115e757600080fd5b601f3d116115f457600080fd5b600050610420516103005260206103a060046318160ddd6103405261035c738096ac61db23291252574d49f036f0f9ed8ab3905afa61163257600080fd5b601f3d1161163f57600080fd5b6000506103a051610320526017546103405260006103605260006103405111156116bc576103205161030051808202821582848304141761167f57600080fd5b8090509050905061034051808061169557600080fd5b82049050905061032051808210156116ac57600080fd5b808203905090506103605261176e565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161030051610380526103805160065801613a5c565b6103e052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610360525b6000610360511161177e57600080fd5b6000610380526000610340511115611d8f576101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156117ba57611798565b610240516103c052610260516103e05261028051610400526101e0516104205261020051610440526102205161046052610460516104405161042051610400516103e0516103c051600658016154c4565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a05110151561183a57611817565b6104c05161036051808202821582848304141761185657600080fd5b809050905090506402540be40080820490509050600181818301101561187b57600080fd5b80820190509050610380526103608051610380518082101561189c57600080fd5b808203905090508152506103208051610360518181830110156118be57600080fd5b80820190509050815250602061044060446340c10f196103a052336103c052610360516103e0526103bc6000738096ac61db23291252574d49f036f0f9ed8ab3905af161190a57600080fd5b601f3d1161191757600080fd5b600050610440506040366103a037620186a0610360511115611cc95760006103e05261040060006003818352015b6004610400516003811061195857600080fd5b60200201351515611988576103e08051600181818301101561197957600080fd5b80820190509050815250611991565b610400516103c0525b8151600101808352811415611945575b505060026103e0511415611cc95760603661040037600254610460526001610480526402540be4006104a05260016104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff61046051166104206104e05160028110611a0957600080fd5b60200201526104605160801c610460525b81516001018083528114156119df575b50506104e060006003818352015b6103c0516104e0511815611b5c576104e0511515611a965761040080516102a051610480518082028215828483041417611a7157600080fd5b80905090509050818183011015611a8757600080fd5b80820190509050815250611b5c565b61040080516102a06104e05160038110611aaf57600080fd5b60200201516104206104e051600180821015611aca57600080fd5b8082039050905060028110611ade57600080fd5b60200201518082028215828483041417611af757600080fd5b809050905090506104806104e05160038110611b1257600080fd5b60200201518082028215828483041417611b2b57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611b5157600080fd5b808201905090508152505b8151600101808352811415611a38575b505061040051610360518082028215828483041417611b8a57600080fd5b80905090509050610320518080611ba057600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417611bcb57600080fd5b8090509050905060046103c05160038110611be557600080fd5b60200201356104806103c05160038110611bfe57600080fd5b60200201518082028215828483041417611c1757600080fd5b80905090509050610360516102a06103c05160038110611c3657600080fd5b60200201518082028215828483041417611c4f57600080fd5b809050905090506104806103c05160038110611c6a57600080fd5b60200201518082028215828483041417611c8357600080fd5b80905090509050610320518080611c9957600080fd5b82049050905080821015611cac57600080fd5b808203905090508080611cbe57600080fd5b8204905090506103a0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611cf357611cd1565b610140516104005261016051610420526101e05161044052610200516104605261022051610480526103c0516104a0526103a0516104c052610300516104e0526104e0516104c0516104a051610480516104605161044051610420516104005160065801614335565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611d8757611d64565b600050611e0d565b61030051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061044060446340c10f196103a052336103c052610360516103e0526103bc6000738096ac61db23291252574d49f036f0f9ed8ab3905af1611df057600080fd5b601f3d11611dfd57600080fd5b60005061044051611e0d57600080fd5b6064356103605110151515611e61576308c379a06103a05260206103c05260086103e0527f536c697070616765000000000000000000000000000000000000000000000000610400526103e05060646103bcfd5b606060046103a03761038051610400526103205161042052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103a0a26000602355005b63ecb586a58114156122265760235415611ec157600080fd5b600160235573e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161014052735c2ed810328349100a66b82b78a1791b101c9d61610160527328424507fefb6f7f8e9d3860f56504e4e5f5f39061018052602061022060046318160ddd6101c0526101dc738096ac61db23291252574d49f036f0f9ed8ab3905afa611f4457600080fd5b601f3d11611f5157600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc6000738096ac61db23291252574d49f036f0f9ed8ab3905af1611f9d57600080fd5b601f3d11611faa57600080fd5b60005061026051611fba57600080fd5b60168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c02001546102005250600435600180821015611fff57600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061202a57600080fd5b602002015161022051808202821582848304141761204757600080fd5b809050905090506101a051808061205d57600080fd5b820490509050610260526024610240516003811061207a57600080fd5b602002013561026051101561208e57600080fd5b6101c061024051600381106120a257600080fd5b602002015161026051808210156120b857600080fd5b8082039050905061024051600381106120d057600080fd5b601660c052602060c0200155610260516101c061024051600381106120f457600080fd5b60200201526020610320604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061212f57600080fd5b60200201515af161213f57600080fd5b601f3d1161214c57600080fd5b600050610320505b8151600101808352811415612016575b505060175461024052610240516102405161022051808202821582848304141761218d57600080fd5b809050905090506101a05180806121a357600080fd5b820490509050808210156121b657600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a051600435808210156121ec57600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156122b45760643560011c1561224257600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c733c0ebff09d6bb028eed1dd29669c2e3bf98c9d7f5afa61229757600080fd5b601f3d116122a457600080fd5b6000506102205160005260206000f35b634fb08c5e8114156123ef5760403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525061014051610160516101405161018052610160516101a052604060046101c037600061020052610200516101e0516101c0516101a0516101805160065801615701565b61026052610280526102a0526102c0526102e05261030052610160526101405261026080808080516103205250506020810190508080805161034052505060208101905080808051610360525050602081019050808080808051610380525050602081019050808080516103a0525050602081019050808080516103c0525050505050506103205160005260206000f35b63f1dc3cc981141561282c576023541561240857600080fd5b6001602355601d541561241a57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525060c036610180376101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101605161026052604060046102803760016102c0526102c0516102a05161028051610260516102405160065801615701565b610320526103405261036052610380526103a0526103c05261022052610200526101e0526101c0526101a05261018052610160526101405261032080808080516103e052505060208101905080808051610400525050602081019050808080516104205250506020810190508080808080516104405250506020810190508080805161046052505060208101905080808051610480525050505050506103e080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612600576308c379a0610240526020610260526008610280527f536c6970706167650000000000000000000000000000000000000000000000006102a05261028050606461025cfd5b6024356003811061261057600080fd5b601660c052602060c020018054610180518082101561262e57600080fd5b8082039050905081555060206102e060446379cc67906102405233610260526004356102805261025c6000738096ac61db23291252574d49f036f0f9ed8ab3905af161267957600080fd5b601f3d1161268657600080fd5b6000506102e05161269657600080fd5b6001156127425773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161024052735c2ed810328349100a66b82b78a1791b101c9d61610260527328424507fefb6f7f8e9d3860f56504e4e5f5f390610280526020610340604463a9059cbb6102a052336102c052610180516102e0526102bc60006102406024356003811061271d57600080fd5b60200201515af161272d57600080fd5b601f3d1161273a57600080fd5b600050610340505b6101405161016051610180516101a0516101c0516101e0516102005161022051610140516102405261016051610260526101e05161028052610200516102a052610220516102c0526024356102e0526101c051610300526101a0516103205261032051610300516102e0516102c0516102a05161028051610260516102405160065801614335565b61022052610200526101e0526101c0526101a05261018052610160526101405260005060406004610240376101805161028052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06060610240a26000602355005b63c93f49e881141561285d576023541561284557600080fd5b600160235560065801613b9d565b6000506000602355005b635e248072811415612a9557601854331461287757600080fd5b6006546201517f81818301101561288d57600080fd5b80820190509050421161289f57600080fd5b426201517f8181830110156128b357600080fd5b80820190509050604435116128c757600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b61018052610160516101805117610180526004356064808202821582848304141761295357600080fd5b809050905090506101a0526000600435111561297657620f424060043510612979565b60005b61298257600080fd5b6402540be3ff60243511156129a257662386f26fc10001602435106129a5565b60005b6129ae57600080fd5b610140516101a05110156129f157610140516101a051600a80820282158284830414176129da57600080fd5b8090509050905010156129ec57600080fd5b612a21565b61014051600a8082028215828483041417612a0b57600080fd5b809050905090506101a0511115612a2157600080fd5b61018051600455426006556101a05160801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e0526101a051610200524261022052604435610240527f7dce008c7221b9d42f26174f7435e50f9cc8f502c57019724c090b546415a02960806101e0a1005b63244c7c2e811415612b76576018543314612aaf57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415612eab576018543314612b9057600080fd5b60205415612b9d57600080fd5b60e06004610140377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610160511815612bff5764012a05f201610160511015612bee576207a11f6101605111612bf1565b60005b612bfa57600080fd5b612c07565b601154610160525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610140511415612c3a57601054610140525b61016051610140511115612c4d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610180511815612c91576402540be4016101805110612c8c57600080fd5b612c99565b601254610180525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0511815612cf95760006101a0511115612ce8576c100000000000000000000000006101a05110612ceb565b60005b612cf457600080fd5b612d01565b600a546101a0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c0511815612d4357610140516101c05111612d3e57600080fd5b612d4b565b6008546101c0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e0511415612d7e57600c546101e0525b6101c0516101e0511115612d9157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610200511815612de7576000610200511115612dd65762093a806102005110612dd9565b60005b612de257600080fd5b612def565b600e54610200525b426203f480818183011015612e0357600080fd5b8082019050905061022052610220516020556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd811415612fe45760235415612ec457600080fd5b60016023556018543314612ed757600080fd5b602054421015612ee657600080fd5b600060205418612ef557600080fd5b600060205560155461014052610140516012541815612f2a576101405160065801613b9d565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb811415613005576018543314612ffe57600080fd5b6000602055005b636b441a408114156130975760043560a01c1561302157600080fd5b601854331461302f57600080fd5b601f541561303c57600080fd5b426203f48081818301101561305057600080fd5b808201905090506101405261014051601f55600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561310e5760185433146130b157600080fd5b601f544210156130c057600080fd5b6000601f54186130cf57600080fd5b6000601f556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561312f57601854331461312857600080fd5b6000601f55005b63e369885381141561315e57601854331461314957600080fd5b42601e541161315757600080fd5b6001601d55005b633046f97281141561317f57601854331461317857600080fd5b6000601d55005b63c51b88618114156131b15760043560a01c1561319b57600080fd5b60185433146131a957600080fd5b600435602155005b637242e5248114156131e35760043560a01c156131cd57600080fd5b60185433146131db57600080fd5b600435602255005b636112c7478114156131fb5760035460005260206000f35b63204fe3d58114156132135760045460005260206000f35b63f30cfad581141561322b5760055460005260206000f35b63e89876ff8114156132435760065460005260206000f35b63f9ed959781141561325b5760075460005260206000f35b6303b736e08114156132735760085460005260206000f35b6373fb971181141561328b5760095460005260206000f35b6372d4f0e28114156132a357600a5460005260206000f35b63d7c3dcbe8114156132bb57600b5460005260206000f35b63083812e58114156132d357600c5460005260206000f35b634ea12c7d8114156132eb57600d5460005260206000f35b63662b627481141561330357600e5460005260206000f35b630c5e23d481141561331b57600f5460005260206000f35b6392526c0c8114156133335760105460005260206000f35b63ee8de67581141561334b5760115460005260206000f35b63fee3f7f98114156133635760125460005260206000f35b637cf9aedc81141561337b5760135460005260206000f35b637d1b060c8114156133935760145460005260206000f35b63e38244628114156133ab5760155460005260206000f35b634903b0d18114156133dc57600435600381106133c757600080fd5b601660c052602060c020015460005260206000f35b630f529ba28114156133f45760175460005260206000f35b638da5cb5b81141561340c5760185460005260206000f35b631ec0cdc18114156134245760195460005260206000f35b637ba1a74d81141561343c57601a5460005260206000f35b630b7b594b81141561345457601b5460005260206000f35b630c46b72a81141561346c57601c5460005260206000f35b639c868ac081141561348457601d5460005260206000f35b632a42689681141561349c57601e5460005260206000f35b63e0a0b5868114156134b457601f5460005260206000f35b63405e28f88114156134cc5760205460005260206000f35b63b618ba628114156134e45760215460005260206000f35b636e42e4d28114156134fc5760225460005260206000f35b505b60006000fd5b6101805261014052610160526002610140511061352057600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806101405160405181111561356557600080fd5b8082028080600081121561357557195b607f1c1561358257600080fd5b905090509050600081121561359f5761016051816000031c6135a6565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05260016101e0526402540be4006102005260016102205261016080516101e051808202821582848304141761362657600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e0610240516003811061366657600080fd5b6020020151808202821582848304141761367f57600080fd5b8090509050905061026052610160610240516003811061369e57600080fd5b60200201516102605180820282158284830414176136bb57600080fd5b80905090509050670de0b6b3a76400008082049050905061016061024051600381106136e657600080fd5b60200201526101c05160801c6101c0525b815160010180835281141561363c575b50506060610240525b6000610240511115156137225761373e565b6020610240510361016001516020610240510361024052613710565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613901576004546101e05260065461020052610160805161020051808210156137aa57600080fd5b808203905090508152504261020051808210156137c657600080fd5b80820390509050610200526101e05160801c6101605161020051808210156137ed57600080fd5b80820390509050808202821582848304141761380857600080fd5b809050905090506101c05161020051808202821582848304141761382b57600080fd5b8090509050905081818301101561384157600080fd5b8082019050905061016051808061385757600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e0511661016051610200518082101561388c57600080fd5b8082039050905080820282158284830414176138a757600080fd5b809050905090506101a0516102005180820282158284830414176138ca57600080fd5b809050905090508181830110156138e057600080fd5b808201905090506101605180806138f657600080fd5b8204905090506101a0525b6102206101c05181526101a0518160200152506040610260525b60006102605111151561392d57613949565b602061026051036102200151602061026051036102605261391b565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc731689acd208d817b32eeaccce8121278c5766f5305afa6139b157600080fd5b601f3d116139be57600080fd5b6000506102c0516101c0526010546101c05180820282158284830414176139e457600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613a0857600080fd5b808203905090508082028215828483041417613a2357600080fd5b80905090509050818183011015613a3957600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613ab057600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613ae357600080fd5b809050905090508080613af557600080fd5b8204905090506101806102005160038110613b0f57600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613a8f575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c731689acd208d817b32eeaccce8121278c5766f5305afa613b7d57600080fd5b601f3d11613b8a57600080fd5b6000506102c05160005260005161016051565b6101405260225461016052601a5461018052601c546101a05261018051601b5480821015613bca57600080fd5b808203905090506012548082028215828483041417613be857600080fd5b809050905090506404a817c800808204905090506101c05260006101c05111156140cc576101a051670de0b6b3a76400008082028215828483041417613c2d57600080fd5b809050905090506101a0516101c05180821015613c4957600080fd5b808203905090508080613c5b57600080fd5b820490509050670de0b6b3a764000080821015613c7757600080fd5b808203905090506101e05260206102c06044636962f8456102205261016051610240526101e0516102605261023c6000738096ac61db23291252574d49f036f0f9ed8ab3905af1613cc757600080fd5b601f3d11613cd457600080fd5b6000506102c0516102005260206102a060046318160ddd6102405261025c738096ac61db23291252574d49f036f0f9ed8ab3905afa613d1257600080fd5b601f3d11613d1f57600080fd5b6000506102a0516102205273e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161024052735c2ed810328349100a66b82b78a1791b101c9d61610260527328424507fefb6f7f8e9d3860f56504e4e5f5f390610280526102a060006003818352015b602061034060246370a082316102c052306102e0526102dc6102406102a05160038110613dad57600080fd5b60200201515afa613dbd57600080fd5b601f3d11613dca57600080fd5b600050610340516102a05160038110613de257600080fd5b601660c052602060c02001555b8151600101808352811415613d81575b50506040366102a0376101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015613e3257613e10565b60065801613744565b61030052610320526102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515613e6e57613e4b565b610300808080805161034052505060208101905080808051610360525050505061034080516102a05280602001516102c05250610140610340525b61034051516020610340510161034052610340610340511015613ecb57613ea9565b600658016135b5565b61036052610380526103a052610320610340525b6103405152602061034051036103405261014061034051101515613f0b57613ee8565b61036080516102e05280602001516103005280604001516103205250602061046060a463c7fab708610360526102a051610380526102c0516103a0526102e0516103c052610300516103e052610320516104005261037c731689acd208d817b32eeaccce8121278c5766f5305afa613f8257600080fd5b601f3d11613f8f57600080fd5b6000506104605161034052670de0b6b3a7640000610140610380525b61038051516020610380510161038052610380610380511015613fcd57613fab565b610340516103a0526103a05160065801613a5c565b61040052610360610380525b610380515260206103805103610380526101406103805110151561401157613fee565b61040051808202821582848304141761402957600080fd5b8090509050905061022051808061403f57600080fd5b8204905090506103605261036051601c55610360516101805181818301101561406757600080fd5b808201905090506101a0518082101561407f57600080fd5b808203905090506101805261018051601b5561018051601a556102005161038052610160517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf596020610380a25b6021546101605260006101605118156142f55760006004610240527f3111e7b300000000000000000000000000000000000000000000000000000000610260526102406004806020846102a001018260208501600060045af150508051820191505060606020826102a00101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6020826102a0010152602081019050306020826102a001015260208101905060026020826102a0010152602081019050735c2ed810328349100a66b82b78a1791b101c9d616020826102a00101526020810190507328424507fefb6f7f8e9d3860f56504e4e5f5f3906020826102a0010152602081019050806102a0526102a090508051602001806103c08284600060045af16141fc57600080fd5b505060206105006103c0516103e0600073357d51124f59836ded84c8a1730d72b749d8bc235af161422c57600080fd5b60203d8082111561423d578061423f565b815b905090506104e0526104e08051602001806101e08284600060045af161426457600080fd5b505060206102e0604463a9059cbb6102405261016051610260526101e080602001516000825180602090131561429957600080fd5b80919012156142a757600080fd5b806020036101000a82049050905090506102805261025c6000730d500b1d8e8ef31e21c99d1db9a6444d3adf12705af16142e057600080fd5b601f3d116142ed57600080fd5b6000506102e0505b610140515661432d575b610240526000610220526101405261016052610180526101a0526101c0526101e05261020052600050614361565b600015614361575b610240526101405261016052610180526101a0526101c0526101e0526102005261022052600050614361565b604036610260376001546102a0526102c060006002818352015b6fffffffffffffffffffffffffffffffff6102a051166102606102c051600281106143a557600080fd5b60200201526102a05160801c6102a0525b815160010180835281141561437b575b50506003546102c0526040366102e0376002546102a05261032060006002818352015b6fffffffffffffffffffffffffffffffff6102a051166102e0610320516002811061441357600080fd5b60200201526102a05160801c6102a0525b81516001018083528114156143e9575b5050426102c051101561467957600e54610320526020610400604463571bae3f61036052426102c0518082101561446a57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761448e57600080fd5b809050905090506103205180806144a457600080fd5b820490509050610380526402540be4006103a05261037c731689acd208d817b32eeaccce8121278c5766f5305afa6144db57600080fd5b601f3d116144e857600080fd5b600050610400516103405260006102a05261036060006002818352015b6102e0610360516002811061451957600080fd5b6020020151670de0b6b3a7640000610340518082101561453857600080fd5b80820390509050808202821582848304141761455357600080fd5b80905090509050610260610360516002811061456e57600080fd5b602002015161034051808202821582848304141761458b57600080fd5b809050905090508181830110156145a157600080fd5b80820190509050670de0b6b3a76400008082049050905061026061036051600281106145cc57600080fd5b60200201525b8151600101808352811415614505575b505061036060006002818352015b6102a05160801b6102a0526102606001610360518082101561461157600080fd5b808203905090506002811061462557600080fd5b6020020151610380526fffffffffffffffffffffffffffffffff610380511061464d57600080fd5b6102a05161038051176102a0525b81516001018083528114156145f0575b50506102a051600155426003555b61022051610320526102205115156146ff57602061044060a463c7fab7086103405261014051610360526101605161038052610180516103a0526101a0516103c0526101c0516103e05261035c731689acd208d817b32eeaccce8121278c5766f5305afa6146e657600080fd5b601f3d116146f357600080fd5b60005061044051610320525b6000546102a0526040366103403761038060006002818352015b6fffffffffffffffffffffffffffffffff6102a05116610340610380516002811061474357600080fd5b60200201526102a05160801c6102a0525b8151600101808352811415614719575b505060006102005111156148465760006101e05111156147b657610200516102e06101e05160018082101561479857600080fd5b80820390509050600281106147ac57600080fd5b6020020152614841565b61038060006002818352015b6102e061038051600281106147d657600080fd5b6020020151670de0b6b3a764000080820282158284830414176147f857600080fd5b8090509050905061020051808061480e57600080fd5b8204905090506102e0610380516002811061482857600080fd5b60200201525b81516001018083528114156147c2575b50505b6149f1565b61018051610380526101a0516103a0526101c0516103c05261038051620f4240808204905090506103e05261038080516103e05181818301101561488957600080fd5b8082019050905081525061040060006002818352015b61034061040051600281106148b357600080fd5b60200201516103e05180820282158284830414176148d057600080fd5b809050905090506101806104005160018181830110156148ef57600080fd5b808201905090506003811061490357600080fd5b6020020151602061056060e46336bc8855610420526101405161044052610160516104605261038051610480526103a0516104a0526103c0516104c052610320516104e05261040051600181818301101561495d57600080fd5b808201905090506105005261043c731689acd208d817b32eeaccce8121278c5766f5305afa61498b57600080fd5b601f3d1161499857600080fd5b60005061056051808210156149ac57600080fd5b8082039050905080806149be57600080fd5b8204905090506102e061040051600281106149d857600080fd5b60200201525b815160010180835281141561489f575b50505b60006102a05261038060006002818352015b6102a05160801b6102a0526102e060016103805180821015614a2457600080fd5b8082039050905060028110614a3857600080fd5b60200201516103a0526fffffffffffffffffffffffffffffffff6103a05110614a6057600080fd5b6102a0516103a051176102a0525b8151600101808352811415614a03575b50506102a051600255600061038052602061042060046318160ddd6103c0526103dc738096ac61db23291252574d49f036f0f9ed8ab3905afa614ac057600080fd5b601f3d11614acd57600080fd5b600050610420516103a052601a546103c052601c546103e05261040060006002818352015b6102606104005160028110614b0657600080fd5b6020020151670de0b6b3a76400008082028215828483041417614b2857600080fd5b809050905090506103406104005160028110614b4357600080fd5b60200201518080614b5357600080fd5b82049050905061042052670de0b6b3a7640000610420511115614b9a576104208051670de0b6b3a764000080821015614b8b57600080fd5b80820390509050815250614bc0565b670de0b6b3a76400006104205180821015614bb457600080fd5b80820390509050610420525b61038080517001000000000000000000000000000000006104205110614be557600080fd5b6002610420510a818183011015614bfb57600080fd5b808201905090508152505b8151600101808352811415614af2575b505060603661040037610320516003808204905090506104005261046060006002818352015b61032051670de0b6b3a76400008082028215828483041417614c5d57600080fd5b8090509050905060036103406104605160028110614c7a57600080fd5b60200201518082028215828483041417614c9357600080fd5b809050905090508080614ca557600080fd5b820490509050610400610460516001818183011015614cc357600080fd5b8082019050905060038110614cd757600080fd5b60200201525b8151600101808352811415614c3c575b5050670de0b6b3a764000061046052670de0b6b3a76400006104805260006103e0511115614e48576020610580606463bad1dc266104c052610400516104e052610420516105005261044051610520526104dc731689acd208d817b32eeaccce8121278c5766f5305afa614d6057600080fd5b601f3d11614d6d57600080fd5b600050610580516104a052670de0b6b3a76400006104a0518082028215828483041417614d9957600080fd5b809050905090506103a0518080614daf57600080fd5b820490509050610480526103c051610480518082028215828483041417614dd557600080fd5b809050905090506103e0518080614deb57600080fd5b820490509050610460526103e051610480511015614e48576308c379a06104c05260206104e0526004610500527f4c6f737300000000000000000000000000000000000000000000000000000000610520526105005060646104dcfd5b61046051601a5570010000000000000000000000000000000060085410614e6e57600080fd5b60026008540a610380511115614e8a5760006103e05111614e8d565b60005b1561544f5760206105206024634e60b1416104a05261038051670de0b6b3a7640000808204905090506104c0526104bc731689acd208d817b32eeaccce8121278c5766f5305afa614edd57600080fd5b601f3d11614eea57600080fd5b6000506105205161038052600c546104a0526040366104c03761050060006002818352015b6103406105005160028110614f2357600080fd5b6020020151610380516104a05180821015614f3d57600080fd5b808203905090508082028215828483041417614f5857600080fd5b809050905090506104a0516102606105005160028110614f7757600080fd5b60200201518082028215828483041417614f9057600080fd5b80905090509050818183011015614fa657600080fd5b80820190509050610380518080614fbc57600080fd5b8204905090506104c06105005160028110614fd657600080fd5b60200201525b8151600101808352811415614f0f575b505061018051610400526101a051610420526101c0516104405261050060006002818352015b61018061050051600181818301101561502a57600080fd5b808201905090506003811061503e57600080fd5b60200201516104c0610500516002811061505757600080fd5b6020020151808202821582848304141761507057600080fd5b80905090509050610340610500516002811061508b57600080fd5b6020020151808061509b57600080fd5b8204905090506104006105005160018181830110156150b957600080fd5b80820190509050600381106150cd57600080fd5b60200201525b8151600101808352811415615012575b5050602061062060a463c7fab70861052052610140516105405261016051610560526104005161058052610420516105a052610440516105c05261053c731689acd208d817b32eeaccce8121278c5766f5305afa61514057600080fd5b601f3d1161514d57600080fd5b6000506106205161050052610500516003808204905090506104005261052060006002818352015b61050051670de0b6b3a7640000808202821582848304141761519657600080fd5b8090509050905060036104c061052051600281106151b357600080fd5b602002015180820282158284830414176151cc57600080fd5b8090509050905080806151de57600080fd5b8204905090506104006105205160018181830110156151fc57600080fd5b808201905090506003811061521057600080fd5b60200201525b8151600101808352811415615175575b5050670de0b6b3a764000060206105e0606463bad1dc266105205261040051610540526104205161056052610440516105805261053c731689acd208d817b32eeaccce8121278c5766f5305afa61527c57600080fd5b601f3d1161528957600080fd5b6000506105e05180820282158284830414176152a457600080fd5b809050905090506103a05180806152ba57600080fd5b8204905090506103e052670de0b6b3a76400006103e051111561533c5761046051670de0b6b3a7640000808210156152f157600080fd5b8082039050905060026103e051670de0b6b3a76400008082101561531457600080fd5b80820390509050808202821582848304141761532f57600080fd5b809050905090501161533f565b60005b1561544f5760006102a05261052060006002818352015b6102a05160801b6102a0526104c06001610520518082101561537757600080fd5b808203905090506002811061538b57600080fd5b6020020151610540526fffffffffffffffffffffffffffffffff61054051106153b357600080fd5b6102a05161054051176102a0525b8151600101808352811415615356575b50506102a051600055610500516017556103e051601c55610140610520525b61052051516020610520510161052052610520610520511015615412576153f0565b60065801613b9d565b610500610520525b610520515260206105205103610520526101406105205110151561544657615423565b60005061024051565b6103205160175561048051601c556101406104a0525b6104a0515160206104a051016104a0526104a06104a051101561548757615465565b60065801613b9d565b6104806104a0525b6104a0515260206104a051036104a0526101406104a0511015156154bb57615498565b60005061024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e051610280526102805161026051610240516006580161394f565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516003808202821582848304141761556b57600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b602061028051026101400151610260526102408051610260518181830110156155b957600080fd5b808201905090508152505b8151600101808352811415615591575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156156565761028080516102a051610260518082101561563157600080fd5b8082039050905081818301101561564757600080fd5b80820190509050815250615691565b6102808051610260516102a0518082101561567057600080fd5b8082039050905081818301101561568657600080fd5b808201905090508152505b81516001018083528114156155f9575b5050610220516102805180820282158284830414176156bf57600080fd5b809050905090506102405180806156d557600080fd5b820490509050620186a08181830110156156ee57600080fd5b8082019050905060005260005161020051565b6101e0526101405261016052610180526101a0526101c05260175461020052610200516102205260206102c060046318160ddd6102605261027c738096ac61db23291252574d49f036f0f9ed8ab3905afa61575b57600080fd5b601f3d1161576857600080fd5b6000506102c051610240526102405161018051111561578657600080fd5b60036101a0511061579657600080fd5b60168060c052602060c020546102605260018160c052602060c02001546102805260028160c052602060c02001546102a0525060016102c0526402540be4006102e052600161030052670de0b6b3a76400006102c051808202821582848304141761580057600080fd5b809050905090506103205260011561596557600054610340526102c0805161026051808202821582848304141761583657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a05114156158b157610380516102c06101a0516003811061588c57600080fd5b602002015180820282158284830414176158a557600080fd5b80905090509050610320525b6102c061036051600381106158c557600080fd5b602002015161026061036051600381106158de57600080fd5b602002015180820282158284830414176158f757600080fd5b8090509050905061038051808202821582848304141761591657600080fd5b80905090509050670de0b6b3a7640000808204905090506102c0610360516003811061594157600080fd5b60200201526103405160801c610340525b815160010180835281141561584c575b50505b610140610360525b6103605151602061036051016103605261036061036051101561598f5761596d565b6102c051610380526102e0516103a052610300516103c0526103c0516103a051610380516006580161394f565b61042052610340610360525b61036051526020610360510361036052610140610360511015156159eb576159c8565b610420516103405261018051610200518082028215828483041417615a0f57600080fd5b80905090509050610240518080615a2557600080fd5b8204905090506103605261020080516103605161034051610360518082028215828483041417615a5457600080fd5b809050905090506404a817c800808204905090506001818183011015615a7957600080fd5b8082019050905080821015615a8d57600080fd5b8082039050905080821015615aa157600080fd5b8082039050905081525060206104e060e46336bc88556103a052610140516103c052610160516103e0526102c051610400526102e05161042052610300516104405261020051610460526101a051610480526103bc731689acd208d817b32eeaccce8121278c5766f5305afa615b1657600080fd5b601f3d11615b2357600080fd5b6000506104e051610380526102c06101a05160038110615b4257600080fd5b60200201516103805180821015615b5857600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615b7c57600080fd5b80905090509050610320518080615b9257600080fd5b8204905090506103a052610380516102c06101a05160038110615bb457600080fd5b602002015260006103c0526101c05115615bec57620186a06103a0511115615be457620186a06101805111615be7565b60005b615bef565b60005b15615f005760006103e0526001610400526402540be40061042052600161044052604036610460376002546104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff6104a051166104606104c05160028110615c5457600080fd5b60200201526104a05160801c6104a0525b8151600101808352811415615c2a575b50506104c060006003818352015b6101a0516104c0511815615da7576104c0511515615ce1576103e0805161026051610400518082028215828483041417615cbc57600080fd5b80905090509050818183011015615cd257600080fd5b80820190509050815250615da7565b6103e080516102606104c05160038110615cfa57600080fd5b60200201516104606104c051600180821015615d1557600080fd5b8082039050905060028110615d2957600080fd5b60200201518082028215828483041417615d4257600080fd5b809050905090506104006104c05160038110615d5d57600080fd5b60200201518082028215828483041417615d7657600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615d9c57600080fd5b808201905090508152505b8151600101808352811415615c83575b50506103e051610360518082028215828483041417615dd557600080fd5b80905090509050610220518080615deb57600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417615e1657600080fd5b809050905090506103a0516104006101a05160038110615e3557600080fd5b60200201518082028215828483041417615e4e57600080fd5b80905090509050610360516102606101a05160038110615e6d57600080fd5b60200201518082028215828483041417615e8657600080fd5b809050905090506104006101a05160038110615ea157600080fd5b60200201518082028215828483041417615eba57600080fd5b80905090509050610220518080615ed057600080fd5b82049050905080821015615ee357600080fd5b808203905090508080615ef557600080fd5b8204905090506103c0525b6104a06103a05181526103c0518160200152610200518160400152806060016102c05181526102e0518160200152610300518160400152505060c0610560525b600061056051111515615f5257615f6e565b602061056051036104a001516020610560510361056052615f40565b6101e051565b61018b6160ff0361018b60003961018b6160ff036000f3000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f670000000000000000000000000000000000000000000000000000000000000e3d00000000000000000000000000000000000000000000000000003faa25225fff00000000000000000000000000000000000000000000000000000000003d09000000000000000000000000000000000000000000000000000000000002625a000000000000000000000000000000000000000000000000000009f295cd5f0000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000008043864d56e85dd423f0000000000000000000000000000000000000000000000891df2f32fd9b934f1
Deployed Bytecode
0x600436101561000d576134fe565b600035601c526f7fffffffffffffffffffffffffffffff604052600051341561003557600080fd5b6368727653811415610071576004356101405260015461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63a3f7cdd58114156100ad576004356101405260005461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63591890178114156100e9576004356101405260025461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63fc0c546a81141561011357738096ac61db23291252574d49f036f0f9ed8ab39060005260206000f35b63c661065781141561018b5773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161014052735c2ed810328349100a66b82b78a1791b101c9d61610160527328424507fefb6f7f8e9d3860f56504e4e5f5f390610180526101406004356003811061017d57600080fd5b602002015160005260206000f35b63f446c1d08114156101de5760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160648082049050905060005260206000f35b63b137392981141561022b5760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101806020015160005260206000f35b6376a2f0f08114156102755760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160005260206000f35b63ddca3f4381141561032057600658016135b5565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e051610240526102405161022051610200516006580161394f565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e562581141561036d576004803561014052806020013561016052806040013561018052506101805161016051610140516006580161394f565b6101e0526101e05160005260206000f35b63bb7b8b8081141561041a57670de0b6b3a7640000601754610140526101405160065801613a5c565b6101a0526101a05180820282158284830414176103b257600080fd5b80905090509050602061022060046318160ddd6101c0526101dc738096ac61db23291252574d49f036f0f9ed8ab3905afa6103ec57600080fd5b601f3d116103f957600080fd5b60005061022051808061040b57600080fd5b82049050905060005260206000f35b635b41b908811415611060576023541561043357600080fd5b6001602355601d541561044557600080fd5b602435600435181561046f57600360043510156104675760036024351061046a565b60005b610472565b60005b61047b57600080fd5b60006044351161048a57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161018052735c2ed810328349100a66b82b78a1791b101c9d616101a0527328424507fefb6f7f8e9d3860f56504e4e5f5f3906101c05260206102a060646323b872dd6101e05233610200523061022052604435610240526101fc60006101806004356003811061056957600080fd5b60200201515af161057957600080fd5b601f3d1161058657600080fd5b6000506102a0506040366101e0376001156105fc576000546102205261024060006002818352015b6fffffffffffffffffffffffffffffffff61022051166101e061024051600281106105d857600080fd5b60200201526102205160801c610220525b81516001018083528114156105ae575b50505b60168060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c020015461026052506102206024356003811061064257600080fd5b6020020151610280526102206004356003811061065e57600080fd5b60200201805160443581818301101561067657600080fd5b808201905090508152506102206004356003811061069357600080fd5b6020020151600435600381106106a857600080fd5b601660c052602060c020015560016102a0526402540be4006102c05260016102e05261022080516102a05180820282158284830414176106e757600080fd5b8090509050905081525061030060016002818352015b610220610300516003811061071157600080fd5b60200201516101e06103005160018082101561072c57600080fd5b808203905090506002811061074057600080fd5b6020020151808202821582848304141761075957600080fd5b809050905090506102a0610300516003811061077457600080fd5b6020020151808202821582848304141761078d57600080fd5b80905090509050670de0b6b3a76400008082049050905061022061030051600381106107b857600080fd5b60200201525b81516001018083528114156106fd575b5050610220602435600381106107e357600080fd5b6020020151602061046060e46336bc885561032052610140516103405261016051610360526102205161038052610240516103a052610260516103c0526017546103e0526024356104005261033c731689acd208d817b32eeaccce8121278c5766f5305afa61085157600080fd5b601f3d1161085e57600080fd5b600050610460518082101561087257600080fd5b80820390509050610300526102206024356003811061089057600080fd5b60200201805161030051808210156108a757600080fd5b8082039050905081525061030080516001808210156108c557600080fd5b80820390509050815250600060243511156109465761030051670de0b6b3a764000080820282158284830414176108fb57600080fd5b809050905090506101e060243560018082101561091757600080fd5b808203905090506002811061092b57600080fd5b6020020151808061093b57600080fd5b820490509050610300525b61030080516102a06024356003811061095e57600080fd5b6020020151808061096e57600080fd5b82049050905081525061030080516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516102205161032052610240516103405261026051610360526103605161034051610320516006580161394f565b6103c052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c051610300518082028215828483041417610a4157600080fd5b809050905090506402540be4008082049050905080821015610a6257600080fd5b808203905090508152506064356103005110151515610ac0576308c379a0610320526020610340526008610360527f536c6970706167650000000000000000000000000000000000000000000000006103805261036050606461033cfd5b61028080516103005180821015610ad657600080fd5b808203905090508152506102805160243560038110610af457600080fd5b601660c052602060c020015560206103c0604463a9059cbb610320523361034052610300516103605261033c600061018060243560038110610b3557600080fd5b60200201515af1610b4557600080fd5b601f3d11610b5257600080fd5b6000506103c050610280516102a060243560038110610b7057600080fd5b60200201518082028215828483041417610b8957600080fd5b8090509050905061022060243560038110610ba357600080fd5b602002015260006024351115610c3d5761022060243560038110610bc657600080fd5b60200201516101e0602435600180821015610be057600080fd5b8082039050905060028110610bf457600080fd5b60200201518082028215828483041417610c0d57600080fd5b80905090509050670de0b6b3a76400008082049050905061022060243560038110610c3757600080fd5b60200201525b60006103205260243561034052620186a06044351115610c6557620186a06103005111610c68565b60005b15610f2c5760006004351815610c845760006024351415610c87565b60005b15610dca576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610cd057600080fd5b80820390509050604051811115610ce657600080fd5b80820280806000811215610cf657195b607f1c15610d0357600080fd5b9050905090506000811215610d1f57600254816000031c610d25565b600254811b5b9050166044356102a060043560038110610d3e57600080fd5b60200201518082028215828483041417610d5757600080fd5b809050905090508082028215828483041417610d7257600080fd5b80905090509050610300516102a060243560038110610d9057600080fd5b60200201518082028215828483041417610da957600080fd5b809050905090508080610dbb57600080fd5b82049050905061032052610f2c565b6004351515610e7e576044356102a060043560038110610de957600080fd5b60200201518082028215828483041417610e0257600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610e2657600080fd5b80905090509050610300516102a060243560038110610e4457600080fd5b60200201518082028215828483041417610e5d57600080fd5b809050905090508080610e6f57600080fd5b82049050905061032052610f2c565b610300516102a060243560038110610e9557600080fd5b60200201518082028215828483041417610eae57600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610ed257600080fd5b809050905090506044356102a060043560038110610eef57600080fd5b60200201518082028215828483041417610f0857600080fd5b809050905090508080610f1a57600080fd5b82049050905061032052600435610340525b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161014051610360526101605161038052610220516103a052610240516103c052610260516103e0526103405161040052610320516104205261042051610400516103e0516103c0516103a0516103805161036051600658016142ff565b6103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561036052604435610380526024356103a052610300516103c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610360a26000602355005b63556d6e9f8114156110c4576020610200606463556d6e9f61014052606060046101603761015c733c0ebff09d6bb028eed1dd29669c2e3bf98c9d7f5afa6110a757600080fd5b601f3d116110b457600080fd5b6000506102005160005260206000f35b63cde699fa81141561113857600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a051610180516101605161014051600658016154c4565b610240526102405160005260206000f35b634515cef3811415611ea8576023541561115157600080fd5b6001602355601d541561116357600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161018052735c2ed810328349100a66b82b78a1791b101c9d616101a0527328424507fefb6f7f8e9d3860f56504e4e5f5f3906101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506004803561024052806020013561026052806040013561028052506060366102a03760011561158c5760006103005261032060006003818352015b60006004610320516003811061128c57600080fd5b6020020135111561132b57602061040060646323b872dd6103405233610360523061038052600461032051600381106112c457600080fd5b60200201356103a05261035c600061018061032051600381106112e657600080fd5b60200201515af16112f657600080fd5b601f3d1161130357600080fd5b600050610400506103008051600181818301101561132057600080fd5b808201905090508152505b8151600101808352811415611277575b50506000610300511161134d57600080fd5b61032060006003818352015b6101e0610320516003811061136d57600080fd5b60200201516004610320516003811061138557600080fd5b602002013581818301101561139957600080fd5b8082019050905061034052610340516101e061032051600381106113bc57600080fd5b60200201526103405161032051600381106113d657600080fd5b601660c052602060c02001555b8151600101808352811415611359575b50506101e0516102a052610200516102c052610220516102e0526001610320526402540be40061034052600161036052600054610380526101e0805161032051808202821582848304141761144757600080fd5b809050905090508152506103a060016002818352015b6fffffffffffffffffffffffffffffffff61038051166103206103a0516003811061148757600080fd5b602002015180820282158284830414176114a057600080fd5b809050905090506103c0526101e06103a051600381106114bf57600080fd5b60200201516103c05180820282158284830414176114dc57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e06103a0516003811061150757600080fd5b60200201526102406103a0516003811061152057600080fd5b60200201516103c051808202821582848304141761153d57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406103a0516003811061156857600080fd5b60200201526103805160801c610380525b815160010180835281141561145d575b50505b602061042060a463c7fab70861032052610140516103405261016051610360526101e05161038052610200516103a052610220516103c05261033c731689acd208d817b32eeaccce8121278c5766f5305afa6115e757600080fd5b601f3d116115f457600080fd5b600050610420516103005260206103a060046318160ddd6103405261035c738096ac61db23291252574d49f036f0f9ed8ab3905afa61163257600080fd5b601f3d1161163f57600080fd5b6000506103a051610320526017546103405260006103605260006103405111156116bc576103205161030051808202821582848304141761167f57600080fd5b8090509050905061034051808061169557600080fd5b82049050905061032051808210156116ac57600080fd5b808203905090506103605261176e565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161030051610380526103805160065801613a5c565b6103e052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610360525b6000610360511161177e57600080fd5b6000610380526000610340511115611d8f576101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156117ba57611798565b610240516103c052610260516103e05261028051610400526101e0516104205261020051610440526102205161046052610460516104405161042051610400516103e0516103c051600658016154c4565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a05110151561183a57611817565b6104c05161036051808202821582848304141761185657600080fd5b809050905090506402540be40080820490509050600181818301101561187b57600080fd5b80820190509050610380526103608051610380518082101561189c57600080fd5b808203905090508152506103208051610360518181830110156118be57600080fd5b80820190509050815250602061044060446340c10f196103a052336103c052610360516103e0526103bc6000738096ac61db23291252574d49f036f0f9ed8ab3905af161190a57600080fd5b601f3d1161191757600080fd5b600050610440506040366103a037620186a0610360511115611cc95760006103e05261040060006003818352015b6004610400516003811061195857600080fd5b60200201351515611988576103e08051600181818301101561197957600080fd5b80820190509050815250611991565b610400516103c0525b8151600101808352811415611945575b505060026103e0511415611cc95760603661040037600254610460526001610480526402540be4006104a05260016104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff61046051166104206104e05160028110611a0957600080fd5b60200201526104605160801c610460525b81516001018083528114156119df575b50506104e060006003818352015b6103c0516104e0511815611b5c576104e0511515611a965761040080516102a051610480518082028215828483041417611a7157600080fd5b80905090509050818183011015611a8757600080fd5b80820190509050815250611b5c565b61040080516102a06104e05160038110611aaf57600080fd5b60200201516104206104e051600180821015611aca57600080fd5b8082039050905060028110611ade57600080fd5b60200201518082028215828483041417611af757600080fd5b809050905090506104806104e05160038110611b1257600080fd5b60200201518082028215828483041417611b2b57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611b5157600080fd5b808201905090508152505b8151600101808352811415611a38575b505061040051610360518082028215828483041417611b8a57600080fd5b80905090509050610320518080611ba057600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417611bcb57600080fd5b8090509050905060046103c05160038110611be557600080fd5b60200201356104806103c05160038110611bfe57600080fd5b60200201518082028215828483041417611c1757600080fd5b80905090509050610360516102a06103c05160038110611c3657600080fd5b60200201518082028215828483041417611c4f57600080fd5b809050905090506104806103c05160038110611c6a57600080fd5b60200201518082028215828483041417611c8357600080fd5b80905090509050610320518080611c9957600080fd5b82049050905080821015611cac57600080fd5b808203905090508080611cbe57600080fd5b8204905090506103a0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611cf357611cd1565b610140516104005261016051610420526101e05161044052610200516104605261022051610480526103c0516104a0526103a0516104c052610300516104e0526104e0516104c0516104a051610480516104605161044051610420516104005160065801614335565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611d8757611d64565b600050611e0d565b61030051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061044060446340c10f196103a052336103c052610360516103e0526103bc6000738096ac61db23291252574d49f036f0f9ed8ab3905af1611df057600080fd5b601f3d11611dfd57600080fd5b60005061044051611e0d57600080fd5b6064356103605110151515611e61576308c379a06103a05260206103c05260086103e0527f536c697070616765000000000000000000000000000000000000000000000000610400526103e05060646103bcfd5b606060046103a03761038051610400526103205161042052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103a0a26000602355005b63ecb586a58114156122265760235415611ec157600080fd5b600160235573e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161014052735c2ed810328349100a66b82b78a1791b101c9d61610160527328424507fefb6f7f8e9d3860f56504e4e5f5f39061018052602061022060046318160ddd6101c0526101dc738096ac61db23291252574d49f036f0f9ed8ab3905afa611f4457600080fd5b601f3d11611f5157600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc6000738096ac61db23291252574d49f036f0f9ed8ab3905af1611f9d57600080fd5b601f3d11611faa57600080fd5b60005061026051611fba57600080fd5b60168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c02001546102005250600435600180821015611fff57600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061202a57600080fd5b602002015161022051808202821582848304141761204757600080fd5b809050905090506101a051808061205d57600080fd5b820490509050610260526024610240516003811061207a57600080fd5b602002013561026051101561208e57600080fd5b6101c061024051600381106120a257600080fd5b602002015161026051808210156120b857600080fd5b8082039050905061024051600381106120d057600080fd5b601660c052602060c0200155610260516101c061024051600381106120f457600080fd5b60200201526020610320604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061212f57600080fd5b60200201515af161213f57600080fd5b601f3d1161214c57600080fd5b600050610320505b8151600101808352811415612016575b505060175461024052610240516102405161022051808202821582848304141761218d57600080fd5b809050905090506101a05180806121a357600080fd5b820490509050808210156121b657600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a051600435808210156121ec57600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156122b45760643560011c1561224257600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c733c0ebff09d6bb028eed1dd29669c2e3bf98c9d7f5afa61229757600080fd5b601f3d116122a457600080fd5b6000506102205160005260206000f35b634fb08c5e8114156123ef5760403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525061014051610160516101405161018052610160516101a052604060046101c037600061020052610200516101e0516101c0516101a0516101805160065801615701565b61026052610280526102a0526102c0526102e05261030052610160526101405261026080808080516103205250506020810190508080805161034052505060208101905080808051610360525050602081019050808080808051610380525050602081019050808080516103a0525050602081019050808080516103c0525050505050506103205160005260206000f35b63f1dc3cc981141561282c576023541561240857600080fd5b6001602355601d541561241a57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525060c036610180376101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101605161026052604060046102803760016102c0526102c0516102a05161028051610260516102405160065801615701565b610320526103405261036052610380526103a0526103c05261022052610200526101e0526101c0526101a05261018052610160526101405261032080808080516103e052505060208101905080808051610400525050602081019050808080516104205250506020810190508080808080516104405250506020810190508080805161046052505060208101905080808051610480525050505050506103e080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612600576308c379a0610240526020610260526008610280527f536c6970706167650000000000000000000000000000000000000000000000006102a05261028050606461025cfd5b6024356003811061261057600080fd5b601660c052602060c020018054610180518082101561262e57600080fd5b8082039050905081555060206102e060446379cc67906102405233610260526004356102805261025c6000738096ac61db23291252574d49f036f0f9ed8ab3905af161267957600080fd5b601f3d1161268657600080fd5b6000506102e05161269657600080fd5b6001156127425773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161024052735c2ed810328349100a66b82b78a1791b101c9d61610260527328424507fefb6f7f8e9d3860f56504e4e5f5f390610280526020610340604463a9059cbb6102a052336102c052610180516102e0526102bc60006102406024356003811061271d57600080fd5b60200201515af161272d57600080fd5b601f3d1161273a57600080fd5b600050610340505b6101405161016051610180516101a0516101c0516101e0516102005161022051610140516102405261016051610260526101e05161028052610200516102a052610220516102c0526024356102e0526101c051610300526101a0516103205261032051610300516102e0516102c0516102a05161028051610260516102405160065801614335565b61022052610200526101e0526101c0526101a05261018052610160526101405260005060406004610240376101805161028052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06060610240a26000602355005b63c93f49e881141561285d576023541561284557600080fd5b600160235560065801613b9d565b6000506000602355005b635e248072811415612a9557601854331461287757600080fd5b6006546201517f81818301101561288d57600080fd5b80820190509050421161289f57600080fd5b426201517f8181830110156128b357600080fd5b80820190509050604435116128c757600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b61018052610160516101805117610180526004356064808202821582848304141761295357600080fd5b809050905090506101a0526000600435111561297657620f424060043510612979565b60005b61298257600080fd5b6402540be3ff60243511156129a257662386f26fc10001602435106129a5565b60005b6129ae57600080fd5b610140516101a05110156129f157610140516101a051600a80820282158284830414176129da57600080fd5b8090509050905010156129ec57600080fd5b612a21565b61014051600a8082028215828483041417612a0b57600080fd5b809050905090506101a0511115612a2157600080fd5b61018051600455426006556101a05160801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e0526101a051610200524261022052604435610240527f7dce008c7221b9d42f26174f7435e50f9cc8f502c57019724c090b546415a02960806101e0a1005b63244c7c2e811415612b76576018543314612aaf57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415612eab576018543314612b9057600080fd5b60205415612b9d57600080fd5b60e06004610140377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610160511815612bff5764012a05f201610160511015612bee576207a11f6101605111612bf1565b60005b612bfa57600080fd5b612c07565b601154610160525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610140511415612c3a57601054610140525b61016051610140511115612c4d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610180511815612c91576402540be4016101805110612c8c57600080fd5b612c99565b601254610180525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0511815612cf95760006101a0511115612ce8576c100000000000000000000000006101a05110612ceb565b60005b612cf457600080fd5b612d01565b600a546101a0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c0511815612d4357610140516101c05111612d3e57600080fd5b612d4b565b6008546101c0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e0511415612d7e57600c546101e0525b6101c0516101e0511115612d9157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610200511815612de7576000610200511115612dd65762093a806102005110612dd9565b60005b612de257600080fd5b612def565b600e54610200525b426203f480818183011015612e0357600080fd5b8082019050905061022052610220516020556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd811415612fe45760235415612ec457600080fd5b60016023556018543314612ed757600080fd5b602054421015612ee657600080fd5b600060205418612ef557600080fd5b600060205560155461014052610140516012541815612f2a576101405160065801613b9d565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb811415613005576018543314612ffe57600080fd5b6000602055005b636b441a408114156130975760043560a01c1561302157600080fd5b601854331461302f57600080fd5b601f541561303c57600080fd5b426203f48081818301101561305057600080fd5b808201905090506101405261014051601f55600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561310e5760185433146130b157600080fd5b601f544210156130c057600080fd5b6000601f54186130cf57600080fd5b6000601f556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561312f57601854331461312857600080fd5b6000601f55005b63e369885381141561315e57601854331461314957600080fd5b42601e541161315757600080fd5b6001601d55005b633046f97281141561317f57601854331461317857600080fd5b6000601d55005b63c51b88618114156131b15760043560a01c1561319b57600080fd5b60185433146131a957600080fd5b600435602155005b637242e5248114156131e35760043560a01c156131cd57600080fd5b60185433146131db57600080fd5b600435602255005b636112c7478114156131fb5760035460005260206000f35b63204fe3d58114156132135760045460005260206000f35b63f30cfad581141561322b5760055460005260206000f35b63e89876ff8114156132435760065460005260206000f35b63f9ed959781141561325b5760075460005260206000f35b6303b736e08114156132735760085460005260206000f35b6373fb971181141561328b5760095460005260206000f35b6372d4f0e28114156132a357600a5460005260206000f35b63d7c3dcbe8114156132bb57600b5460005260206000f35b63083812e58114156132d357600c5460005260206000f35b634ea12c7d8114156132eb57600d5460005260206000f35b63662b627481141561330357600e5460005260206000f35b630c5e23d481141561331b57600f5460005260206000f35b6392526c0c8114156133335760105460005260206000f35b63ee8de67581141561334b5760115460005260206000f35b63fee3f7f98114156133635760125460005260206000f35b637cf9aedc81141561337b5760135460005260206000f35b637d1b060c8114156133935760145460005260206000f35b63e38244628114156133ab5760155460005260206000f35b634903b0d18114156133dc57600435600381106133c757600080fd5b601660c052602060c020015460005260206000f35b630f529ba28114156133f45760175460005260206000f35b638da5cb5b81141561340c5760185460005260206000f35b631ec0cdc18114156134245760195460005260206000f35b637ba1a74d81141561343c57601a5460005260206000f35b630b7b594b81141561345457601b5460005260206000f35b630c46b72a81141561346c57601c5460005260206000f35b639c868ac081141561348457601d5460005260206000f35b632a42689681141561349c57601e5460005260206000f35b63e0a0b5868114156134b457601f5460005260206000f35b63405e28f88114156134cc5760205460005260206000f35b63b618ba628114156134e45760215460005260206000f35b636e42e4d28114156134fc5760225460005260206000f35b505b60006000fd5b6101805261014052610160526002610140511061352057600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806101405160405181111561356557600080fd5b8082028080600081121561357557195b607f1c1561358257600080fd5b905090509050600081121561359f5761016051816000031c6135a6565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05260016101e0526402540be4006102005260016102205261016080516101e051808202821582848304141761362657600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e0610240516003811061366657600080fd5b6020020151808202821582848304141761367f57600080fd5b8090509050905061026052610160610240516003811061369e57600080fd5b60200201516102605180820282158284830414176136bb57600080fd5b80905090509050670de0b6b3a76400008082049050905061016061024051600381106136e657600080fd5b60200201526101c05160801c6101c0525b815160010180835281141561363c575b50506060610240525b6000610240511115156137225761373e565b6020610240510361016001516020610240510361024052613710565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613901576004546101e05260065461020052610160805161020051808210156137aa57600080fd5b808203905090508152504261020051808210156137c657600080fd5b80820390509050610200526101e05160801c6101605161020051808210156137ed57600080fd5b80820390509050808202821582848304141761380857600080fd5b809050905090506101c05161020051808202821582848304141761382b57600080fd5b8090509050905081818301101561384157600080fd5b8082019050905061016051808061385757600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e0511661016051610200518082101561388c57600080fd5b8082039050905080820282158284830414176138a757600080fd5b809050905090506101a0516102005180820282158284830414176138ca57600080fd5b809050905090508181830110156138e057600080fd5b808201905090506101605180806138f657600080fd5b8204905090506101a0525b6102206101c05181526101a0518160200152506040610260525b60006102605111151561392d57613949565b602061026051036102200151602061026051036102605261391b565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc731689acd208d817b32eeaccce8121278c5766f5305afa6139b157600080fd5b601f3d116139be57600080fd5b6000506102c0516101c0526010546101c05180820282158284830414176139e457600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613a0857600080fd5b808203905090508082028215828483041417613a2357600080fd5b80905090509050818183011015613a3957600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613ab057600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613ae357600080fd5b809050905090508080613af557600080fd5b8204905090506101806102005160038110613b0f57600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613a8f575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c731689acd208d817b32eeaccce8121278c5766f5305afa613b7d57600080fd5b601f3d11613b8a57600080fd5b6000506102c05160005260005161016051565b6101405260225461016052601a5461018052601c546101a05261018051601b5480821015613bca57600080fd5b808203905090506012548082028215828483041417613be857600080fd5b809050905090506404a817c800808204905090506101c05260006101c05111156140cc576101a051670de0b6b3a76400008082028215828483041417613c2d57600080fd5b809050905090506101a0516101c05180821015613c4957600080fd5b808203905090508080613c5b57600080fd5b820490509050670de0b6b3a764000080821015613c7757600080fd5b808203905090506101e05260206102c06044636962f8456102205261016051610240526101e0516102605261023c6000738096ac61db23291252574d49f036f0f9ed8ab3905af1613cc757600080fd5b601f3d11613cd457600080fd5b6000506102c0516102005260206102a060046318160ddd6102405261025c738096ac61db23291252574d49f036f0f9ed8ab3905afa613d1257600080fd5b601f3d11613d1f57600080fd5b6000506102a0516102205273e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161024052735c2ed810328349100a66b82b78a1791b101c9d61610260527328424507fefb6f7f8e9d3860f56504e4e5f5f390610280526102a060006003818352015b602061034060246370a082316102c052306102e0526102dc6102406102a05160038110613dad57600080fd5b60200201515afa613dbd57600080fd5b601f3d11613dca57600080fd5b600050610340516102a05160038110613de257600080fd5b601660c052602060c02001555b8151600101808352811415613d81575b50506040366102a0376101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015613e3257613e10565b60065801613744565b61030052610320526102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515613e6e57613e4b565b610300808080805161034052505060208101905080808051610360525050505061034080516102a05280602001516102c05250610140610340525b61034051516020610340510161034052610340610340511015613ecb57613ea9565b600658016135b5565b61036052610380526103a052610320610340525b6103405152602061034051036103405261014061034051101515613f0b57613ee8565b61036080516102e05280602001516103005280604001516103205250602061046060a463c7fab708610360526102a051610380526102c0516103a0526102e0516103c052610300516103e052610320516104005261037c731689acd208d817b32eeaccce8121278c5766f5305afa613f8257600080fd5b601f3d11613f8f57600080fd5b6000506104605161034052670de0b6b3a7640000610140610380525b61038051516020610380510161038052610380610380511015613fcd57613fab565b610340516103a0526103a05160065801613a5c565b61040052610360610380525b610380515260206103805103610380526101406103805110151561401157613fee565b61040051808202821582848304141761402957600080fd5b8090509050905061022051808061403f57600080fd5b8204905090506103605261036051601c55610360516101805181818301101561406757600080fd5b808201905090506101a0518082101561407f57600080fd5b808203905090506101805261018051601b5561018051601a556102005161038052610160517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf596020610380a25b6021546101605260006101605118156142f55760006004610240527f3111e7b300000000000000000000000000000000000000000000000000000000610260526102406004806020846102a001018260208501600060045af150508051820191505060606020826102a00101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6020826102a0010152602081019050306020826102a001015260208101905060026020826102a0010152602081019050735c2ed810328349100a66b82b78a1791b101c9d616020826102a00101526020810190507328424507fefb6f7f8e9d3860f56504e4e5f5f3906020826102a0010152602081019050806102a0526102a090508051602001806103c08284600060045af16141fc57600080fd5b505060206105006103c0516103e0600073357d51124f59836ded84c8a1730d72b749d8bc235af161422c57600080fd5b60203d8082111561423d578061423f565b815b905090506104e0526104e08051602001806101e08284600060045af161426457600080fd5b505060206102e0604463a9059cbb6102405261016051610260526101e080602001516000825180602090131561429957600080fd5b80919012156142a757600080fd5b806020036101000a82049050905090506102805261025c6000730d500b1d8e8ef31e21c99d1db9a6444d3adf12705af16142e057600080fd5b601f3d116142ed57600080fd5b6000506102e0505b610140515661432d575b610240526000610220526101405261016052610180526101a0526101c0526101e05261020052600050614361565b600015614361575b610240526101405261016052610180526101a0526101c0526101e0526102005261022052600050614361565b604036610260376001546102a0526102c060006002818352015b6fffffffffffffffffffffffffffffffff6102a051166102606102c051600281106143a557600080fd5b60200201526102a05160801c6102a0525b815160010180835281141561437b575b50506003546102c0526040366102e0376002546102a05261032060006002818352015b6fffffffffffffffffffffffffffffffff6102a051166102e0610320516002811061441357600080fd5b60200201526102a05160801c6102a0525b81516001018083528114156143e9575b5050426102c051101561467957600e54610320526020610400604463571bae3f61036052426102c0518082101561446a57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761448e57600080fd5b809050905090506103205180806144a457600080fd5b820490509050610380526402540be4006103a05261037c731689acd208d817b32eeaccce8121278c5766f5305afa6144db57600080fd5b601f3d116144e857600080fd5b600050610400516103405260006102a05261036060006002818352015b6102e0610360516002811061451957600080fd5b6020020151670de0b6b3a7640000610340518082101561453857600080fd5b80820390509050808202821582848304141761455357600080fd5b80905090509050610260610360516002811061456e57600080fd5b602002015161034051808202821582848304141761458b57600080fd5b809050905090508181830110156145a157600080fd5b80820190509050670de0b6b3a76400008082049050905061026061036051600281106145cc57600080fd5b60200201525b8151600101808352811415614505575b505061036060006002818352015b6102a05160801b6102a0526102606001610360518082101561461157600080fd5b808203905090506002811061462557600080fd5b6020020151610380526fffffffffffffffffffffffffffffffff610380511061464d57600080fd5b6102a05161038051176102a0525b81516001018083528114156145f0575b50506102a051600155426003555b61022051610320526102205115156146ff57602061044060a463c7fab7086103405261014051610360526101605161038052610180516103a0526101a0516103c0526101c0516103e05261035c731689acd208d817b32eeaccce8121278c5766f5305afa6146e657600080fd5b601f3d116146f357600080fd5b60005061044051610320525b6000546102a0526040366103403761038060006002818352015b6fffffffffffffffffffffffffffffffff6102a05116610340610380516002811061474357600080fd5b60200201526102a05160801c6102a0525b8151600101808352811415614719575b505060006102005111156148465760006101e05111156147b657610200516102e06101e05160018082101561479857600080fd5b80820390509050600281106147ac57600080fd5b6020020152614841565b61038060006002818352015b6102e061038051600281106147d657600080fd5b6020020151670de0b6b3a764000080820282158284830414176147f857600080fd5b8090509050905061020051808061480e57600080fd5b8204905090506102e0610380516002811061482857600080fd5b60200201525b81516001018083528114156147c2575b50505b6149f1565b61018051610380526101a0516103a0526101c0516103c05261038051620f4240808204905090506103e05261038080516103e05181818301101561488957600080fd5b8082019050905081525061040060006002818352015b61034061040051600281106148b357600080fd5b60200201516103e05180820282158284830414176148d057600080fd5b809050905090506101806104005160018181830110156148ef57600080fd5b808201905090506003811061490357600080fd5b6020020151602061056060e46336bc8855610420526101405161044052610160516104605261038051610480526103a0516104a0526103c0516104c052610320516104e05261040051600181818301101561495d57600080fd5b808201905090506105005261043c731689acd208d817b32eeaccce8121278c5766f5305afa61498b57600080fd5b601f3d1161499857600080fd5b60005061056051808210156149ac57600080fd5b8082039050905080806149be57600080fd5b8204905090506102e061040051600281106149d857600080fd5b60200201525b815160010180835281141561489f575b50505b60006102a05261038060006002818352015b6102a05160801b6102a0526102e060016103805180821015614a2457600080fd5b8082039050905060028110614a3857600080fd5b60200201516103a0526fffffffffffffffffffffffffffffffff6103a05110614a6057600080fd5b6102a0516103a051176102a0525b8151600101808352811415614a03575b50506102a051600255600061038052602061042060046318160ddd6103c0526103dc738096ac61db23291252574d49f036f0f9ed8ab3905afa614ac057600080fd5b601f3d11614acd57600080fd5b600050610420516103a052601a546103c052601c546103e05261040060006002818352015b6102606104005160028110614b0657600080fd5b6020020151670de0b6b3a76400008082028215828483041417614b2857600080fd5b809050905090506103406104005160028110614b4357600080fd5b60200201518080614b5357600080fd5b82049050905061042052670de0b6b3a7640000610420511115614b9a576104208051670de0b6b3a764000080821015614b8b57600080fd5b80820390509050815250614bc0565b670de0b6b3a76400006104205180821015614bb457600080fd5b80820390509050610420525b61038080517001000000000000000000000000000000006104205110614be557600080fd5b6002610420510a818183011015614bfb57600080fd5b808201905090508152505b8151600101808352811415614af2575b505060603661040037610320516003808204905090506104005261046060006002818352015b61032051670de0b6b3a76400008082028215828483041417614c5d57600080fd5b8090509050905060036103406104605160028110614c7a57600080fd5b60200201518082028215828483041417614c9357600080fd5b809050905090508080614ca557600080fd5b820490509050610400610460516001818183011015614cc357600080fd5b8082019050905060038110614cd757600080fd5b60200201525b8151600101808352811415614c3c575b5050670de0b6b3a764000061046052670de0b6b3a76400006104805260006103e0511115614e48576020610580606463bad1dc266104c052610400516104e052610420516105005261044051610520526104dc731689acd208d817b32eeaccce8121278c5766f5305afa614d6057600080fd5b601f3d11614d6d57600080fd5b600050610580516104a052670de0b6b3a76400006104a0518082028215828483041417614d9957600080fd5b809050905090506103a0518080614daf57600080fd5b820490509050610480526103c051610480518082028215828483041417614dd557600080fd5b809050905090506103e0518080614deb57600080fd5b820490509050610460526103e051610480511015614e48576308c379a06104c05260206104e0526004610500527f4c6f737300000000000000000000000000000000000000000000000000000000610520526105005060646104dcfd5b61046051601a5570010000000000000000000000000000000060085410614e6e57600080fd5b60026008540a610380511115614e8a5760006103e05111614e8d565b60005b1561544f5760206105206024634e60b1416104a05261038051670de0b6b3a7640000808204905090506104c0526104bc731689acd208d817b32eeaccce8121278c5766f5305afa614edd57600080fd5b601f3d11614eea57600080fd5b6000506105205161038052600c546104a0526040366104c03761050060006002818352015b6103406105005160028110614f2357600080fd5b6020020151610380516104a05180821015614f3d57600080fd5b808203905090508082028215828483041417614f5857600080fd5b809050905090506104a0516102606105005160028110614f7757600080fd5b60200201518082028215828483041417614f9057600080fd5b80905090509050818183011015614fa657600080fd5b80820190509050610380518080614fbc57600080fd5b8204905090506104c06105005160028110614fd657600080fd5b60200201525b8151600101808352811415614f0f575b505061018051610400526101a051610420526101c0516104405261050060006002818352015b61018061050051600181818301101561502a57600080fd5b808201905090506003811061503e57600080fd5b60200201516104c0610500516002811061505757600080fd5b6020020151808202821582848304141761507057600080fd5b80905090509050610340610500516002811061508b57600080fd5b6020020151808061509b57600080fd5b8204905090506104006105005160018181830110156150b957600080fd5b80820190509050600381106150cd57600080fd5b60200201525b8151600101808352811415615012575b5050602061062060a463c7fab70861052052610140516105405261016051610560526104005161058052610420516105a052610440516105c05261053c731689acd208d817b32eeaccce8121278c5766f5305afa61514057600080fd5b601f3d1161514d57600080fd5b6000506106205161050052610500516003808204905090506104005261052060006002818352015b61050051670de0b6b3a7640000808202821582848304141761519657600080fd5b8090509050905060036104c061052051600281106151b357600080fd5b602002015180820282158284830414176151cc57600080fd5b8090509050905080806151de57600080fd5b8204905090506104006105205160018181830110156151fc57600080fd5b808201905090506003811061521057600080fd5b60200201525b8151600101808352811415615175575b5050670de0b6b3a764000060206105e0606463bad1dc266105205261040051610540526104205161056052610440516105805261053c731689acd208d817b32eeaccce8121278c5766f5305afa61527c57600080fd5b601f3d1161528957600080fd5b6000506105e05180820282158284830414176152a457600080fd5b809050905090506103a05180806152ba57600080fd5b8204905090506103e052670de0b6b3a76400006103e051111561533c5761046051670de0b6b3a7640000808210156152f157600080fd5b8082039050905060026103e051670de0b6b3a76400008082101561531457600080fd5b80820390509050808202821582848304141761532f57600080fd5b809050905090501161533f565b60005b1561544f5760006102a05261052060006002818352015b6102a05160801b6102a0526104c06001610520518082101561537757600080fd5b808203905090506002811061538b57600080fd5b6020020151610540526fffffffffffffffffffffffffffffffff61054051106153b357600080fd5b6102a05161054051176102a0525b8151600101808352811415615356575b50506102a051600055610500516017556103e051601c55610140610520525b61052051516020610520510161052052610520610520511015615412576153f0565b60065801613b9d565b610500610520525b610520515260206105205103610520526101406105205110151561544657615423565b60005061024051565b6103205160175561048051601c556101406104a0525b6104a0515160206104a051016104a0526104a06104a051101561548757615465565b60065801613b9d565b6104806104a0525b6104a0515260206104a051036104a0526101406104a0511015156154bb57615498565b60005061024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e051610280526102805161026051610240516006580161394f565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516003808202821582848304141761556b57600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b602061028051026101400151610260526102408051610260518181830110156155b957600080fd5b808201905090508152505b8151600101808352811415615591575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156156565761028080516102a051610260518082101561563157600080fd5b8082039050905081818301101561564757600080fd5b80820190509050815250615691565b6102808051610260516102a0518082101561567057600080fd5b8082039050905081818301101561568657600080fd5b808201905090508152505b81516001018083528114156155f9575b5050610220516102805180820282158284830414176156bf57600080fd5b809050905090506102405180806156d557600080fd5b820490509050620186a08181830110156156ee57600080fd5b8082019050905060005260005161020051565b6101e0526101405261016052610180526101a0526101c05260175461020052610200516102205260206102c060046318160ddd6102605261027c738096ac61db23291252574d49f036f0f9ed8ab3905afa61575b57600080fd5b601f3d1161576857600080fd5b6000506102c051610240526102405161018051111561578657600080fd5b60036101a0511061579657600080fd5b60168060c052602060c020546102605260018160c052602060c02001546102805260028160c052602060c02001546102a0525060016102c0526402540be4006102e052600161030052670de0b6b3a76400006102c051808202821582848304141761580057600080fd5b809050905090506103205260011561596557600054610340526102c0805161026051808202821582848304141761583657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a05114156158b157610380516102c06101a0516003811061588c57600080fd5b602002015180820282158284830414176158a557600080fd5b80905090509050610320525b6102c061036051600381106158c557600080fd5b602002015161026061036051600381106158de57600080fd5b602002015180820282158284830414176158f757600080fd5b8090509050905061038051808202821582848304141761591657600080fd5b80905090509050670de0b6b3a7640000808204905090506102c0610360516003811061594157600080fd5b60200201526103405160801c610340525b815160010180835281141561584c575b50505b610140610360525b6103605151602061036051016103605261036061036051101561598f5761596d565b6102c051610380526102e0516103a052610300516103c0526103c0516103a051610380516006580161394f565b61042052610340610360525b61036051526020610360510361036052610140610360511015156159eb576159c8565b610420516103405261018051610200518082028215828483041417615a0f57600080fd5b80905090509050610240518080615a2557600080fd5b8204905090506103605261020080516103605161034051610360518082028215828483041417615a5457600080fd5b809050905090506404a817c800808204905090506001818183011015615a7957600080fd5b8082019050905080821015615a8d57600080fd5b8082039050905080821015615aa157600080fd5b8082039050905081525060206104e060e46336bc88556103a052610140516103c052610160516103e0526102c051610400526102e05161042052610300516104405261020051610460526101a051610480526103bc731689acd208d817b32eeaccce8121278c5766f5305afa615b1657600080fd5b601f3d11615b2357600080fd5b6000506104e051610380526102c06101a05160038110615b4257600080fd5b60200201516103805180821015615b5857600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615b7c57600080fd5b80905090509050610320518080615b9257600080fd5b8204905090506103a052610380516102c06101a05160038110615bb457600080fd5b602002015260006103c0526101c05115615bec57620186a06103a0511115615be457620186a06101805111615be7565b60005b615bef565b60005b15615f005760006103e0526001610400526402540be40061042052600161044052604036610460376002546104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff6104a051166104606104c05160028110615c5457600080fd5b60200201526104a05160801c6104a0525b8151600101808352811415615c2a575b50506104c060006003818352015b6101a0516104c0511815615da7576104c0511515615ce1576103e0805161026051610400518082028215828483041417615cbc57600080fd5b80905090509050818183011015615cd257600080fd5b80820190509050815250615da7565b6103e080516102606104c05160038110615cfa57600080fd5b60200201516104606104c051600180821015615d1557600080fd5b8082039050905060028110615d2957600080fd5b60200201518082028215828483041417615d4257600080fd5b809050905090506104006104c05160038110615d5d57600080fd5b60200201518082028215828483041417615d7657600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615d9c57600080fd5b808201905090508152505b8151600101808352811415615c83575b50506103e051610360518082028215828483041417615dd557600080fd5b80905090509050610220518080615deb57600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417615e1657600080fd5b809050905090506103a0516104006101a05160038110615e3557600080fd5b60200201518082028215828483041417615e4e57600080fd5b80905090509050610360516102606101a05160038110615e6d57600080fd5b60200201518082028215828483041417615e8657600080fd5b809050905090506104006101a05160038110615ea157600080fd5b60200201518082028215828483041417615eba57600080fd5b80905090509050610220518080615ed057600080fd5b82049050905080821015615ee357600080fd5b808203905090508080615ef557600080fd5b8204905090506103c0525b6104a06103a05181526103c0518160200152610200518160400152806060016102c05181526102e0518160200152610300518160400152505060c0610560525b600061056051111515615f5257615f6e565b602061056051036104a001516020610560510361056052615f40565b6101e05156
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f670000000000000000000000000000000000000000000000000000000000000e3d00000000000000000000000000000000000000000000000000003faa25225fff00000000000000000000000000000000000000000000000000000000003d09000000000000000000000000000000000000000000000000000000000002625a000000000000000000000000000000000000000000000000000009f295cd5f0000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000008043864d56e85dd423f0000000000000000000000000000000000000000000000891df2f32fd9b934f1
-----Decoded View---------------
Arg [0] : owner (address): 0xbabe61887f1de2713c6f97e567623453d3C79f67
Arg [1] : A (uint256): 3645
Arg [2] : gamma (uint256): 69999999999999
Arg [3] : mid_fee (uint256): 4000000
Arg [4] : out_fee (uint256): 40000000
Arg [5] : price_threshold (uint256): 2800000000000000
Arg [6] : fee_gamma (uint256): 10000000000000000
Arg [7] : adjustment_step (uint256): 1500000000000000
Arg [8] : admin_fee (uint256): 0
Arg [9] : ma_half_time (uint256): 600
Arg [10] : initial_prices (uint256[2]): 37856782446686463935039,2529361992656514266353
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000e3d
Arg [2] : 00000000000000000000000000000000000000000000000000003faa25225fff
Arg [3] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [4] : 0000000000000000000000000000000000000000000000000000000002625a00
Arg [5] : 0000000000000000000000000000000000000000000000000009f295cd5f0000
Arg [6] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [7] : 0000000000000000000000000000000000000000000000000005543df729c000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [10] : 0000000000000000000000000000000000000000000008043864d56e85dd423f
Arg [11] : 0000000000000000000000000000000000000000000000891df2f32fd9b934f1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.