ETH Price: $2,614.48 (+0.60%)

Contract

0x06364f10B501e868329afBc005b3492902d6C763
 
Transaction Hash
Method
Block
From
To
Exchange204533602024-08-04 6:21:2375 days ago1722752483IN
Curve.fi: PAX Swap
0 ETH0.000395521
Exchange_underly...196567322024-04-14 22:24:23186 days ago1713133463IN
Curve.fi: PAX Swap
0 ETH0.0046110911.58769627
Exchange_underly...196566232024-04-14 22:02:35186 days ago1713132155IN
Curve.fi: PAX Swap
0 ETH0.004337710.90067864
Exchange_underly...196505412024-04-14 1:35:47187 days ago1713058547IN
Curve.fi: PAX Swap
0 ETH0.0053486613.441215
Exchange_underly...196505132024-04-14 1:30:11187 days ago1713058211IN
Curve.fi: PAX Swap
0 ETH0.0052065413.08406226
Add_liquidity184098992023-10-23 2:07:11361 days ago1698026831IN
Curve.fi: PAX Swap
0 ETH0.003904668.18414161
Add_liquidity184098982023-10-23 2:06:59361 days ago1698026819IN
Curve.fi: PAX Swap
0 ETH0.00401038.40557669
Exchange184098632023-10-23 1:59:59361 days ago1698026399IN
Curve.fi: PAX Swap
0 ETH0.003639829.12749899
Exchange184097622023-10-23 1:39:35361 days ago1698025175IN
Curve.fi: PAX Swap
0 ETH0.003767499.44764243
Exchange_underly...170947692023-04-21 12:28:47546 days ago1682080127IN
Curve.fi: PAX Swap
0 ETH0.0217480634
Exchange_underly...164378282023-01-19 2:20:11638 days ago1674094811IN
Curve.fi: PAX Swap
0 ETH0.0077997718.65297249
Exchange_underly...159301252022-11-09 4:35:35709 days ago1667968535IN
Curve.fi: PAX Swap
0 ETH0.0120010521.00400373
Exchange_underly...158496562022-10-28 22:50:59720 days ago1666997459IN
Curve.fi: PAX Swap
0 ETH0.0074171513.0959095
Exchange_underly...155988912022-09-23 21:59:47755 days ago1663970387IN
Curve.fi: PAX Swap
0 ETH0.00552329.96596989
Exchange_underly...155988642022-09-23 21:54:23755 days ago1663970063IN
Curve.fi: PAX Swap
0 ETH0.0060359110.89111032
Exchange_underly...155180332022-09-12 1:05:33767 days ago1662944733IN
Curve.fi: PAX Swap
0 ETH0.0058828710.3878198
Exchange_underly...154858722022-09-06 19:16:54772 days ago1662491814IN
Curve.fi: PAX Swap
0 ETH0.0076064513.5160225
Exchange_underly...154858582022-09-06 19:14:48772 days ago1662491688IN
Curve.fi: PAX Swap
0 ETH0.0107982219.18753372
Exchange_underly...154858492022-09-06 19:12:19772 days ago1662491539IN
Curve.fi: PAX Swap
0 ETH0.0108562119.29056981
Exchange_underly...154858302022-09-06 19:08:59772 days ago1662491339IN
Curve.fi: PAX Swap
0 ETH0.0155588526.83315011
Exchange_underly...154802822022-09-05 21:57:44773 days ago1662415064IN
Curve.fi: PAX Swap
0 ETH0.0058040710.09275936
Exchange_underly...154643852022-09-03 8:48:39776 days ago1662194919IN
Curve.fi: PAX Swap
0 ETH0.004756038.58072103
Exchange_underly...154641532022-09-03 7:53:48776 days ago1662191628IN
Curve.fi: PAX Swap
0 ETH0.004424557.86255548
Exchange_underly...154591442022-09-02 12:24:24777 days ago1662121464IN
Curve.fi: PAX Swap
0 ETH0.0059825710.34218761
Exchange_underly...154590212022-09-02 11:54:29777 days ago1662119669IN
Curve.fi: PAX Swap
0 ETH0.004741048.22980543
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.1.0b17

Optimization Enabled:
N/A

Other Settings:
None license

Contract Source Code (Vyper language format)

# (c) Curve.Fi, 2020


# External Contracts
contract ERC20m:
    def totalSupply() -> uint256: constant
    def allowance(_owner: address, _spender: address) -> uint256: constant
    def transfer(_to: address, _value: uint256) -> bool: modifying
    def transferFrom(_from: address, _to: address, _value: uint256) -> bool: modifying
    def approve(_spender: address, _value: uint256) -> bool: modifying
    def mint(_to: address, _value: uint256): modifying
    def burn(_value: uint256): modifying
    def burnFrom(_to: address, _value: uint256): modifying
    def name() -> string[64]: constant
    def symbol() -> string[32]: constant
    def decimals() -> uint256: constant
    def balanceOf(arg0: address) -> uint256: constant
    def set_minter(_minter: address): modifying



# External Contracts
contract yERC20:
    def totalSupply() -> uint256: constant
    def allowance(_owner: address, _spender: address) -> uint256: constant
    def transfer(_to: address, _value: uint256) -> bool: modifying
    def transferFrom(_from: address, _to: address, _value: uint256) -> bool: modifying
    def approve(_spender: address, _value: uint256) -> bool: modifying
    def name() -> string[64]: constant
    def symbol() -> string[32]: constant
    def decimals() -> uint256: constant
    def balanceOf(arg0: address) -> uint256: constant
    def deposit(depositAmount: uint256): modifying
    def withdraw(withdrawTokens: uint256): modifying
    def getPricePerFullShare() -> uint256: constant


from vyper.interfaces import ERC20


# Tether transfer-only ABI
contract USDT:
    def transfer(_to: address, _value: uint256): modifying
    def transferFrom(_from: address, _to: address, _value: uint256): modifying


# This can (and needs to) be changed at compile time
N_COINS: constant(int128) = 4  # <- change

ZERO256: constant(uint256) = 0  # This hack is really bad XXX
ZEROS: constant(uint256[N_COINS]) = [ZERO256, ZERO256, ZERO256, ZERO256]  # <- change

USE_LENDING: constant(bool[N_COINS]) = [True, True, True, False]

# Flag "ERC20s" which don't return from transfer() and transferFrom()
TETHERED: constant(bool[N_COINS]) = [False, False, True, False]

FEE_DENOMINATOR: constant(uint256) = 10 ** 10
LENDING_PRECISION: constant(uint256) = 10 ** 18
PRECISION: constant(uint256) = 10 ** 18  # The precision to convert to
PRECISION_MUL: constant(uint256[N_COINS]) = [convert(1, uint256), convert(1000000000000, uint256), convert(1000000000000, uint256), convert(1, uint256)]
# PRECISION_MUL: constant(uint256[N_COINS]) = [
#     PRECISION / convert(PRECISION, uint256),  # DAI
#     PRECISION / convert(10 ** 6, uint256),   # USDC
#     PRECISION / convert(10 ** 6, uint256)]   # USDT


admin_actions_delay: constant(uint256) = 3 * 86400
min_ramp_time: constant(uint256) = 86400

# Events
TokenExchange: event({buyer: indexed(address), sold_id: int128, tokens_sold: uint256, bought_id: int128, tokens_bought: uint256})
TokenExchangeUnderlying: event({buyer: indexed(address), sold_id: int128, tokens_sold: uint256, bought_id: int128, tokens_bought: uint256})
AddLiquidity: event({provider: indexed(address), token_amounts: uint256[N_COINS], fees: uint256[N_COINS], invariant: uint256, token_supply: uint256})
RemoveLiquidity: event({provider: indexed(address), token_amounts: uint256[N_COINS], fees: uint256[N_COINS], token_supply: uint256})
RemoveLiquidityImbalance: event({provider: indexed(address), token_amounts: uint256[N_COINS], fees: uint256[N_COINS], invariant: uint256, token_supply: uint256})
CommitNewAdmin: event({deadline: indexed(timestamp), admin: indexed(address)})
NewAdmin: event({admin: indexed(address)})

CommitNewFee: event({deadline: indexed(timestamp), fee: uint256, admin_fee: uint256})
NewFee: event({fee: uint256, admin_fee: uint256})
RampA: event({old_A: uint256, new_A: uint256, initial_time: timestamp, future_time: timestamp})
StopRampA: event({A: uint256, t: timestamp})

coins: public(address[N_COINS])
underlying_coins: public(address[N_COINS])
balances: public(uint256[N_COINS])
fee: public(uint256)  # fee * 1e10
admin_fee: public(uint256)  # admin_fee * 1e10

max_admin_fee: constant(uint256) = 5 * 10 ** 9
max_fee: constant(uint256) = 5 * 10 ** 9
max_A: constant(uint256) = 10 ** 6
max_A_change: constant(uint256) = 10

owner: public(address)
token: ERC20m

initial_A: public(uint256)
future_A: public(uint256)
initial_A_time: public(timestamp)
future_A_time: public(timestamp)

admin_actions_deadline: public(timestamp)
transfer_ownership_deadline: public(timestamp)
future_fee: public(uint256)
future_admin_fee: public(uint256)
future_owner: public(address)

kill_deadline: timestamp
kill_deadline_dt: constant(uint256) = 2 * 30 * 86400
is_killed: bool


@public
def __init__(_coins: address[N_COINS], _underlying_coins: address[N_COINS],
             _pool_token: address,
             _A: uint256, _fee: uint256):
    """
    _coins: Addresses of ERC20 conracts of coins (y-tokens) involved
    _underlying_coins: Addresses of plain coins (ERC20)
    _pool_token: Address of the token representing LP share
    _A: Amplification coefficient multiplied by n * (n - 1)
    _fee: Fee to charge for exchanges
    """
    for i in range(N_COINS):
        assert _coins[i] != ZERO_ADDRESS
        assert _underlying_coins[i] != ZERO_ADDRESS
        self.balances[i] = 0
    self.coins = _coins
    self.underlying_coins = _underlying_coins
    self.initial_A = _A
    self.future_A = _A
    self.initial_A_time = 0
    self.future_A_time = 0
    self.fee = _fee
    self.admin_fee = 0
    self.owner = msg.sender
    self.kill_deadline = block.timestamp + kill_deadline_dt
    self.is_killed = False
    self.token = ERC20m(_pool_token)


@constant
@private
def _A() -> uint256:
    """
    Handle ramping A up or down
    """
    t1: timestamp = self.future_A_time
    A1: uint256 = self.future_A

    if block.timestamp < t1:
        A0: uint256 = self.initial_A
        t0: timestamp = self.initial_A_time
        # Expressions in uint256 cannot have negative numbers, thus "if"
        if A1 > A0:
            return A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0)
        else:
            return A0 - (A0 - A1) * (block.timestamp - t0) / (t1 - t0)

    else:  # when t1 == 0 or block.timestamp >= t1
        return A1


@constant
@public
def A() -> uint256:
    return self._A()


@private
@constant
def _rates() -> uint256[N_COINS]:
    # exchangeRateStored * (1 + supplyRatePerBlock * (getBlockNumber - accrualBlockNumber) / 1e18)
    result: uint256[N_COINS] = PRECISION_MUL
    use_lending: bool[N_COINS] = USE_LENDING
    for i in range(N_COINS):
        rate: uint256 = LENDING_PRECISION  # Used with no lending
        if use_lending[i]:
            rate = yERC20(self.coins[i]).getPricePerFullShare()
        result[i] *= rate
    return result


@private
@constant
def _xp(rates: uint256[N_COINS]) -> uint256[N_COINS]:
    result: uint256[N_COINS] = rates
    for i in range(N_COINS):
        result[i] = result[i] * self.balances[i] / PRECISION
    return result


@private
@constant
def _xp_mem(rates: uint256[N_COINS], _balances: uint256[N_COINS]) -> uint256[N_COINS]:
    result: uint256[N_COINS] = rates
    for i in range(N_COINS):
        result[i] = result[i] * _balances[i] / PRECISION
    return result


@private
@constant
def get_D(xp: uint256[N_COINS], amp: uint256) -> uint256:
    S: uint256 = 0
    for _x in xp:
        S += _x
    if S == 0:
        return 0

    Dprev: uint256 = 0
    D: uint256 = S
    Ann: uint256 = amp * N_COINS
    for _i in range(255):
        D_P: uint256 = D
        for _x in xp:
            D_P = D_P * D / (_x * N_COINS)  # If division by 0, this will be borked: only withdrawal will work. And that is good
        Dprev = D
        D = (Ann * S + D_P * N_COINS) * D / ((Ann - 1) * D + (N_COINS + 1) * D_P)
        # Equality with the precision of 1
        if D > Dprev:
            if D - Dprev <= 1:
                break
        else:
            if Dprev - D <= 1:
                break
    return D


@private
@constant
def get_D_mem(rates: uint256[N_COINS], _balances: uint256[N_COINS], amp: uint256) -> uint256:
    return self.get_D(self._xp_mem(rates, _balances), amp)


@public
@constant
def get_virtual_price() -> uint256:
    """
    Returns portfolio virtual price (for calculating profit)
    scaled up by 1e18
    """
    D: uint256 = self.get_D(self._xp(self._rates()), self._A())
    # D is in the units similar to DAI (e.g. converted to precision 1e18)
    # When balanced, D = n * x_u - total virtual value of the portfolio
    token_supply: uint256 = self.token.totalSupply()
    return D * PRECISION / token_supply


@public
@constant
def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256:
    """
    Simplified method to calculate addition or reduction in token supply at
    deposit or withdrawal without taking fees into account (but looking at
    slippage).
    Needed to prevent front-running, not for precise calculations!
    """
    _balances: uint256[N_COINS] = self.balances
    rates: uint256[N_COINS] = self._rates()
    amp: uint256 = self._A()
    D0: uint256 = self.get_D_mem(rates, _balances, amp)
    for i in range(N_COINS):
        if deposit:
            _balances[i] += amounts[i]
        else:
            _balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(rates, _balances, amp)
    token_amount: uint256 = self.token.totalSupply()
    diff: uint256 = 0
    if deposit:
        diff = D1 - D0
    else:
        diff = D0 - D1
    return diff * token_amount / D0


@public
@nonreentrant('lock')
def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256):
    # Amounts is amounts of c-tokens
    assert not self.is_killed

    tethered: bool[N_COINS] = TETHERED
    use_lending: bool[N_COINS] = USE_LENDING
    fees: uint256[N_COINS] = ZEROS
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee
    amp: uint256 = self._A()

    token_supply: uint256 = self.token.totalSupply()
    rates: uint256[N_COINS] = self._rates()
    # Initial invariant
    D0: uint256 = 0
    old_balances: uint256[N_COINS] = self.balances
    if token_supply > 0:
        D0 = self.get_D_mem(rates, old_balances, amp)
    new_balances: uint256[N_COINS] = old_balances

    for i in range(N_COINS):
        if token_supply == 0:
            assert amounts[i] > 0
        # balances store amounts of c-tokens
        new_balances[i] = old_balances[i] + amounts[i]

    # Invariant after change
    D1: uint256 = self.get_D_mem(rates, new_balances, amp)
    assert D1 > D0

    # We need to recalculate the invariant accounting for fees
    # to calculate fair user's share
    D2: uint256 = D1
    if token_supply > 0:
        # Only account for fees if we are not the first to deposit
        for i in range(N_COINS):
            ideal_balance: uint256 = D1 * old_balances[i] / D0
            difference: uint256 = 0
            if ideal_balance > new_balances[i]:
                difference = ideal_balance - new_balances[i]
            else:
                difference = new_balances[i] - ideal_balance
            fees[i] = _fee * difference / FEE_DENOMINATOR
            self.balances[i] = new_balances[i] - (fees[i] * _admin_fee / FEE_DENOMINATOR)
            new_balances[i] -= fees[i]
        D2 = self.get_D_mem(rates, new_balances, amp)
    else:
        self.balances = new_balances

    # Calculate, how much pool tokens to mint
    mint_amount: uint256 = 0
    if token_supply == 0:
        mint_amount = D1  # Take the dust if there was any
    else:
        mint_amount = token_supply * (D2 - D0) / D0

    assert mint_amount >= min_mint_amount, "Slippage screwed you"

    # Take coins from the sender
    for i in range(N_COINS):
        if amounts[i] > 0:
            if tethered[i] and not use_lending[i]:
                USDT(self.coins[i]).transferFrom(msg.sender, self, amounts[i])
            else:
                assert_modifiable(
                    yERC20(self.coins[i]).transferFrom(msg.sender, self, amounts[i]))

    # Mint pool tokens
    self.token.mint(msg.sender, mint_amount)

    log.AddLiquidity(msg.sender, amounts, fees, D1, token_supply + mint_amount)


@private
@constant
def get_y(i: int128, j: int128, x: uint256, _xp: uint256[N_COINS]) -> uint256:
    # x in the input is converted to the same price/precision

    assert (i != j) and (i >= 0) and (j >= 0) and (i < N_COINS) and (j < N_COINS)

    amp: uint256 = self._A()
    D: uint256 = self.get_D(_xp, amp)
    c: uint256 = D
    S_: uint256 = 0
    Ann: uint256 = amp * N_COINS

    _x: uint256 = 0
    for _i in range(N_COINS):
        if _i == i:
            _x = x
        elif _i != j:
            _x = _xp[_i]
        else:
            continue
        S_ += _x
        c = c * D / (_x * N_COINS)
    c = c * D / (Ann * N_COINS)
    b: uint256 = S_ + D / Ann  # - D
    y_prev: uint256 = 0
    y: uint256 = D
    for _i in range(255):
        y_prev = y
        y = (y*y + c) / (2 * y + b - D)
        # Equality with the precision of 1
        if y > y_prev:
            if y - y_prev <= 1:
                break
        else:
            if y_prev - y <= 1:
                break
    return y


@public
@constant
def get_dy(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in c-units
    rates: uint256[N_COINS] = self._rates()
    xp: uint256[N_COINS] = self._xp(rates)

    x: uint256 = xp[i] + (dx * rates[i] / PRECISION)
    y: uint256 = self.get_y(i, j, x, xp)
    dy: uint256 = (xp[j] - y - 1) * PRECISION / rates[j]
    _fee: uint256 = self.fee * dy / FEE_DENOMINATOR
    return dy - _fee


@public
@constant
def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in underlying units
    rates: uint256[N_COINS] = self._rates()
    xp: uint256[N_COINS] = self._xp(rates)
    precisions: uint256[N_COINS] = PRECISION_MUL

    x: uint256 = xp[i] + dx * precisions[i]
    y: uint256 = self.get_y(i, j, x, xp)
    dy: uint256 = (xp[j] - y - 1) / precisions[j]
    _fee: uint256 = self.fee * dy / FEE_DENOMINATOR
    return dy - _fee


@private
def _exchange(i: int128, j: int128, dx: uint256, rates: uint256[N_COINS]) -> uint256:
    assert not self.is_killed
    # dx and dy are in c-tokens

    xp: uint256[N_COINS] = self._xp(rates)

    x: uint256 = xp[i] + dx * rates[i] / PRECISION
    y: uint256 = self.get_y(i, j, x, xp)
    dy: uint256 = xp[j] - y
    dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR
    dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR
    self.balances[i] = x * PRECISION / rates[i]
    self.balances[j] = (y + (dy_fee - dy_admin_fee)) * PRECISION / rates[j]

    _dy: uint256 = (dy - dy_fee) * PRECISION / rates[j]

    return _dy


@public
@nonreentrant('lock')
def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256):
    rates: uint256[N_COINS] = self._rates()
    dy: uint256 = self._exchange(i, j, dx, rates)
    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"
    tethered: bool[N_COINS] = TETHERED
    use_lending: bool[N_COINS] = USE_LENDING

    if tethered[i] and not use_lending[i]:
        USDT(self.coins[i]).transferFrom(msg.sender, self, dx)
    else:
        assert_modifiable(yERC20(self.coins[i]).transferFrom(msg.sender, self, dx))

    if tethered[j] and not use_lending[j]:
        USDT(self.coins[j]).transfer(msg.sender, dy)
    else:
        assert_modifiable(yERC20(self.coins[j]).transfer(msg.sender, dy))

    log.TokenExchange(msg.sender, i, dx, j, dy)


@public
@nonreentrant('lock')
def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256):
    rates: uint256[N_COINS] = self._rates()
    precisions: uint256[N_COINS] = PRECISION_MUL
    rate_i: uint256 = rates[i] / precisions[i]
    rate_j: uint256 = rates[j] / precisions[j]
    dx_: uint256 = dx * PRECISION / rate_i

    dy_: uint256 = self._exchange(i, j, dx_, rates)
    dy: uint256 = dy_ * rate_j / PRECISION
    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"
    use_lending: bool[N_COINS] = USE_LENDING
    tethered: bool[N_COINS] = TETHERED

    if tethered[i]:
        USDT(self.underlying_coins[i]).transferFrom(msg.sender, self, dx)
    else:
        assert_modifiable(ERC20(self.underlying_coins[i])\
            .transferFrom(msg.sender, self, dx))

    if use_lending[i]:
        ERC20(self.underlying_coins[i]).approve(self.coins[i], dx)
        yERC20(self.coins[i]).deposit(dx)
    if use_lending[j]:
        yERC20(self.coins[j]).withdraw(dy_)
        # y-tokens calculate imprecisely - use all available
        dy = ERC20(self.underlying_coins[j]).balanceOf(self)
        assert dy >= min_dy, "Exchange resulted in fewer coins than expected"

    if tethered[j]:
        USDT(self.underlying_coins[j]).transfer(msg.sender, dy)
    else:
        assert_modifiable(ERC20(self.underlying_coins[j])\
            .transfer(msg.sender, dy))

    log.TokenExchangeUnderlying(msg.sender, i, dx, j, dy)


@public
@nonreentrant('lock')
def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]):
    total_supply: uint256 = self.token.totalSupply()
    amounts: uint256[N_COINS] = ZEROS
    fees: uint256[N_COINS] = ZEROS
    tethered: bool[N_COINS] = TETHERED
    use_lending: bool[N_COINS] = USE_LENDING

    for i in range(N_COINS):
        value: uint256 = self.balances[i] * _amount / total_supply
        assert value >= min_amounts[i], "Withdrawal resulted in fewer coins than expected"
        self.balances[i] -= value
        amounts[i] = value
        if tethered[i] and not use_lending[i]:
            USDT(self.coins[i]).transfer(msg.sender, value)
        else:
            assert_modifiable(yERC20(self.coins[i]).transfer(
                msg.sender, value))

    self.token.burnFrom(msg.sender, _amount)  # Will raise if not enough

    log.RemoveLiquidity(msg.sender, amounts, fees, total_supply - _amount)


@public
@nonreentrant('lock')
def remove_liquidity_imbalance(amounts: uint256[N_COINS], max_burn_amount: uint256):
    assert not self.is_killed
    tethered: bool[N_COINS] = TETHERED
    use_lending: bool[N_COINS] = USE_LENDING

    token_supply: uint256 = self.token.totalSupply()
    assert token_supply > 0
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee
    rates: uint256[N_COINS] = self._rates()
    amp: uint256 = self._A()

    old_balances: uint256[N_COINS] = self.balances
    new_balances: uint256[N_COINS] = old_balances
    D0: uint256 = self.get_D_mem(rates, old_balances, amp)
    for i in range(N_COINS):
        new_balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(rates, new_balances, amp)
    fees: uint256[N_COINS] = ZEROS
    for i in range(N_COINS):
        ideal_balance: uint256 = D1 * old_balances[i] / D0
        difference: uint256 = 0
        if ideal_balance > new_balances[i]:
            difference = ideal_balance - new_balances[i]
        else:
            difference = new_balances[i] - ideal_balance
        fees[i] = _fee * difference / FEE_DENOMINATOR
        self.balances[i] = new_balances[i] - (fees[i] * _admin_fee / FEE_DENOMINATOR)
        new_balances[i] -= fees[i]
    D2: uint256 = self.get_D_mem(rates, new_balances, amp)

    token_amount: uint256 = (D0 - D2) * token_supply / D0 + 1
    assert token_amount <= max_burn_amount, "Slippage screwed you"

    for i in range(N_COINS):
        if amounts[i] > 0:
            if tethered[i] and not use_lending[i]:
                USDT(self.coins[i]).transfer(msg.sender, amounts[i])
            else:
                assert_modifiable(yERC20(self.coins[i]).transfer(msg.sender, amounts[i]))
    self.token.burnFrom(msg.sender, token_amount)  # Will raise if not enough

    log.RemoveLiquidityImbalance(msg.sender, amounts, fees, D1, token_supply - token_amount)


### Admin functions ###
@public
def ramp_A(_future_A: uint256, _future_time: timestamp):
    assert msg.sender == self.owner
    assert block.timestamp >= self.initial_A_time + min_ramp_time
    assert _future_time >= block.timestamp + min_ramp_time

    _initial_A: uint256 = self._A()
    assert (_future_A > 0) and (_future_A < max_A)
    assert ((_future_A >= _initial_A) and (_future_A <= _initial_A * max_A_change)) or\
           ((_future_A < _initial_A) and (_future_A * max_A_change >= _initial_A))
    self.initial_A = _initial_A
    self.future_A = _future_A
    self.initial_A_time = block.timestamp
    self.future_A_time = _future_time

    log.RampA(_initial_A, _future_A, block.timestamp, _future_time)


@public
def stop_ramp_A():
    assert msg.sender == self.owner

    current_A: uint256 = self._A()
    self.initial_A = current_A
    self.future_A = current_A
    self.initial_A_time = block.timestamp
    self.future_A_time = block.timestamp
    # now (block.timestamp < t1) is always False, so we return saved A

    log.StopRampA(current_A, block.timestamp)


@public
def commit_new_fee(new_fee: uint256, new_admin_fee: uint256):
    assert msg.sender == self.owner
    assert self.admin_actions_deadline == 0
    assert new_admin_fee <= max_admin_fee
    assert new_fee <= max_fee

    _deadline: timestamp = block.timestamp + admin_actions_delay
    self.admin_actions_deadline = _deadline
    self.future_fee = new_fee
    self.future_admin_fee = new_admin_fee

    log.CommitNewFee(_deadline, new_fee, new_admin_fee)


@public
def apply_new_fee():
    assert msg.sender == self.owner
    assert self.admin_actions_deadline <= block.timestamp\
        and self.admin_actions_deadline > 0

    self.admin_actions_deadline = 0
    _fee: uint256 = self.future_fee
    _admin_fee: uint256 = self.future_admin_fee
    self.fee = _fee
    self.admin_fee = _admin_fee

    log.NewFee(_fee, _admin_fee)


@public
def revert_new_parameters():
    assert msg.sender == self.owner

    self.admin_actions_deadline = 0


@public
def commit_transfer_ownership(_owner: address):
    assert msg.sender == self.owner
    assert self.transfer_ownership_deadline == 0

    _deadline: timestamp = block.timestamp + admin_actions_delay
    self.transfer_ownership_deadline = _deadline
    self.future_owner = _owner

    log.CommitNewAdmin(_deadline, _owner)


@public
def apply_transfer_ownership():
    assert msg.sender == self.owner
    assert block.timestamp >= self.transfer_ownership_deadline\
        and self.transfer_ownership_deadline > 0

    self.transfer_ownership_deadline = 0
    _owner: address = self.future_owner
    self.owner = _owner

    log.NewAdmin(_owner)


@public
def revert_transfer_ownership():
    assert msg.sender == self.owner

    self.transfer_ownership_deadline = 0


@public
def withdraw_admin_fees():
    assert msg.sender == self.owner
    _precisions: uint256[N_COINS] = PRECISION_MUL
    tethered: bool[N_COINS] = TETHERED
    use_lending: bool[N_COINS] = USE_LENDING

    for i in range(N_COINS):
        c: address = self.coins[i]
        value: uint256 = yERC20(c).balanceOf(self) - self.balances[i]
        if value > 0:
            if tethered[i] and not use_lending[i]:
                USDT(c).transfer(msg.sender, value)
            else:
                assert_modifiable(yERC20(c).transfer(msg.sender, value))


@public
def kill_me():
    assert msg.sender == self.owner
    assert self.kill_deadline > block.timestamp
    self.is_killed = True


@public
def unkill_me():
    assert msg.sender == self.owner
    self.is_killed = False

Contract Security Audit

Contract ABI

[{"name":"TokenExchange","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"TokenExchangeUnderlying","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[4]","name":"token_amounts","indexed":false},{"type":"uint256[4]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[4]","name":"token_amounts","indexed":false},{"type":"uint256[4]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[4]","name":"token_amounts","indexed":false},{"type":"uint256[4]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"type":"uint256","name":"deadline","indexed":true,"unit":"sec"},{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"type":"uint256","name":"deadline","indexed":true,"unit":"sec"},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"type":"uint256","name":"old_A","indexed":false},{"type":"uint256","name":"new_A","indexed":false},{"type":"uint256","name":"initial_time","indexed":false,"unit":"sec"},{"type":"uint256","name":"future_time","indexed":false,"unit":"sec"}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"t","indexed":false,"unit":"sec"}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address[4]","name":"_coins"},{"type":"address[4]","name":"_underlying_coins"},{"type":"address","name":"_pool_token"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"}],"constant":false,"payable":false,"type":"constructor"},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":5227},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":1333259},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"bool","name":"deposit"}],"constant":true,"payable":false,"type":"function","gas":5242977},{"name":"add_liquidity","outputs":[],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"uint256","name":"min_mint_amount"}],"constant":false,"payable":false,"type":"function","gas":8088077},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"constant":true,"payable":false,"type":"function","gas":3048740},{"name":"get_dy_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"constant":true,"payable":false,"type":"function","gas":3048570},{"name":"exchange","outputs":[],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"constant":false,"payable":false,"type":"function","gas":6218629},{"name":"exchange_underlying","outputs":[],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"constant":false,"payable":false,"type":"function","gas":6238369},{"name":"remove_liquidity","outputs":[],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[4]","name":"min_amounts"}],"constant":false,"payable":false,"type":"function","gas":241221},{"name":"remove_liquidity_imbalance","outputs":[],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"uint256","name":"max_burn_amount"}],"constant":false,"payable":false,"type":"function","gas":8087316},{"name":"ramp_A","outputs":[],"inputs":[{"type":"uint256","name":"_future_A"},{"type":"uint256","unit":"sec","name":"_future_time"}],"constant":false,"payable":false,"type":"function","gas":151847},{"name":"stop_ramp_A","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":148607},{"name":"commit_new_fee","outputs":[],"inputs":[{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_admin_fee"}],"constant":false,"payable":false,"type":"function","gas":110431},{"name":"apply_new_fee","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":97130},{"name":"revert_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21865},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"constant":false,"payable":false,"type":"function","gas":74542},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":60598},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21955},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":23538},{"name":"kill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":37908},{"name":"unkill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":22045},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2220},{"name":"underlying_coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2250},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2280},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2111},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2141},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2171},{"name":"initial_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2201},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2231},{"name":"initial_A_time","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2261},{"name":"future_A_time","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2291},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2321},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2351},{"name":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2381},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2411},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2441}]

740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052610160615d6a6101403934156100a257600080fd5b6020615d6a60c03960c05160205181106100bb57600080fd5b5060206020615d6a0160c03960c05160205181106100d857600080fd5b5060206040615d6a0160c03960c05160205181106100f557600080fd5b5060206060615d6a0160c03960c051602051811061011257600080fd5b5060206080615d6a0160c03960c051602051811061012f57600080fd5b50602060a0615d6a0160c03960c051602051811061014c57600080fd5b50602060c0615d6a0160c03960c051602051811061016957600080fd5b50602060e0615d6a0160c03960c051602051811061018657600080fd5b506020610100615d6a0160c03960c05160205181106101a457600080fd5b506102a060006004818352015b60006101406102a051600481106101c757600080fd5b6020020151186101d657600080fd5b60006101c06102a051600481106101ec57600080fd5b6020020151186101fb57600080fd5b60006102a0516004811061020e57600080fd5b600260c052602060c02001555b81516001018083528114156101b1575b5050600060c052602060c020610140805182558060200151600183015580604001516002830155806060015160038301555050600160c052602060c0206101c0805182558060200151600183015580604001516002830155806060015160038301555050610260516007556102605160085560006009556000600a556102805160035560006004553360055542624f1a008181830110156102cb57600080fd5b80820190509050601055600060115561024051600655615d5256600436101561000d57615a66565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610244575b61014052600a54610160526008546101805261016051421015610231576007546101c0526009546101e0526101c05161018051111561018a576101c051610180516101c051808210156100fb57600080fd5b80820390509050426101e0518082101561011457600080fd5b80820390509050808202821582848304141761012f57600080fd5b80905090509050610160516101e0518082101561014b57600080fd5b80820390509050808061015d57600080fd5b82049050905081818301101561017257600080fd5b8082019050905060005260005161014051565061022c565b6101c0516101c05161018051808210156101a357600080fd5b80820390509050426101e051808210156101bc57600080fd5b8082039050905080820282158284830414176101d757600080fd5b80905090509050610160516101e051808210156101f357600080fd5b80820390509050808061020557600080fd5b8204905090508082101561021857600080fd5b808203905090506000526000516101405156505b610242565b610180516000526000516101405156505b005b63f446c1d0600051141561027957341561025d57600080fd5b600658016100a9565b610140526101405160005260206000f350005b60001561041f575b610140526101606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101e0600181526001816020015260018160400152600081606001525061026060006004818352015b670de0b6b3a7640000610280526101e061026051600481106102f457600080fd5b60200201511561039457610260516004811061030f57600080fd5b600060c052602060c02001543b61032557600080fd5b610260516004811061033657600080fd5b600060c052602060c0200154301861034d57600080fd5b602061030060046377c7b8fc6102a0526102bc610260516004811061037157600080fd5b600060c052602060c02001545afa61038857600080fd5b60005061030051610280525b61016061026051600481106103a857600080fd5b6020020180516102805180820282158284830414176103c657600080fd5b809050905090508152505b81516001018083528114156102d3575b50506080610320525b6000610320511115156103fc57610418565b60206103205103610160015160206103205103610320526103ea565b6101405156005b600015610544575b6101c0526101405261016052610180526101a0526101e061014080518252806020015182602001528060400151826040015280606001518260600152505061026060006004818352015b6101e0610260516004811061048557600080fd5b6020020151610260516004811061049b57600080fd5b600260c052602060c020015480820282158284830414176104bb57600080fd5b80905090509050670de0b6b3a764000080806104d657600080fd5b8204905090506101e061026051600481106104f057600080fd5b60200201525b8151600101808352811415610471575b50506080610280525b6000610280511115156105215761053d565b602061028051036101e00151602061028051036102805261050f565b6101c05156005b600015610675575b610240526101405261016052610180526101a0526101c0526101e05261020052610220526102606101408051825280602001518260200152806040015182604001528060600151826060015250506102e060006004818352015b6102606102e051600481106105ba57600080fd5b60200201516101c06102e051600481106105d357600080fd5b602002015180820282158284830414176105ec57600080fd5b80905090509050670de0b6b3a7640000808061060757600080fd5b8204905090506102606102e0516004811061062157600080fd5b60200201525b81516001018083528114156105a6575b50506080610300525b6000610300511115156106525761066e565b6020610300510361026001516020610300510361030052610640565b6102405156005b600015610967575b6101e0526101405261016052610180526101a0526101c05260006102005261024060006004818352015b602061024051026101400151610220526102008051610220518181830110156106cf57600080fd5b808201905090508152505b81516001018083528114156106a7575b50506102005115156107055760006000526000516101e05156505b600061028052610200516102a0526101c0516004808202821582848304141761072d57600080fd5b809050905090506102c0526102e0600060ff818352015b6102a0516103005261034060006004818352015b60206103405102610140015161032052610300516102a051808202821582848304141761078457600080fd5b8090509050905061032051600480820282158284830414176107a557600080fd5b8090509050905080806107b757600080fd5b820490509050610300525b8151600101808352811415610758575b50506102a051610280526102c0516102005180820282158284830414176107f857600080fd5b80905090509050610300516004808202821582848304141761081957600080fd5b8090509050905081818301101561082f57600080fd5b808201905090506102a051808202821582848304141761084e57600080fd5b809050905090506102c05160018082101561086857600080fd5b808203905090506102a051808202821582848304141761088757600080fd5b8090509050905060056103005180820282158284830414176108a857600080fd5b809050905090508181830110156108be57600080fd5b8082019050905080806108d057600080fd5b8204905090506102a052610280516102a05111156109175760016102a05161028051808210156108ff57600080fd5b8082039050905011151561091257610953565b610942565b6001610280516102a0518082101561092e57600080fd5b8082039050905011151561094157610953565b5b5b8151600101808352811415610744575b50506102a0516000526000516101e0515650005b600015610b45575b610260526101405261016052610180526101a0526101c0526101e052610200526102205261024052610140610680525b610680515160206106805101610680526106806106805110156109c15761099f565b63c763592c6106a0526106c0610140610480525b610480515160206104805101610480526104806104805110156109f7576109d5565b6342d3b3c36104a0526104c06101408051825280602001518260200152806040015182604001528060600151826060015250506105406101c08051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e0516104c0516006580161054c565b61060052610620526106405261066052610460610480525b6104805152602061048051036104805261014061048051101515610ab857610a95565b61060080518252806020015182602001528060400151826040015280606001518260600152505061024051610740526107405161072051610700516106e0516106c0516006580161067d565b6107a052610660610680525b6106805152602061068051036106805261014061068051101515610b3357610b10565b6107a051600052600051610260515650005b63bb7b8b806000511415610e27573415610b5e57600080fd5b610140610760525b61076051516020610760510161076052610760610760511015610b8857610b66565b63c763592c610780526107a06101406105a0525b6105a0515160206105a051016105a0526105a06105a0511015610bbe57610b9c565b631db7662b6105c0526105e0610140610500525b61050051516020610500510161050052610500610500511015610bf457610bd2565b60065801610281565b610520526105405261056052610580526104e0610500525b6105005152602061050051036105005261014061050051101515610c3857610c15565b6105208051825280602001518260200152806040015182604001528060600151826060015250506106405161062051610600516105e05160065801610427565b6106a0526106c0526106e052610700526105806105a0525b6105a0515260206105a051036105a0526101406105a051101515610cb357610c90565b6106a0805182528060200151826020015280604001518260400152806060015182606001525050610140610720525b61072051516020610720510161072052610720610720511015610d0457610ce2565b600658016100a9565b61074052610700610720525b6107205152602061072051036107205261014061072051101515610d3c57610d19565b610740516108205261082051610800516107e0516107c0516107a0516006580161067d565b61088052610740610760525b6107605152602061076051036107605261014061076051101515610d9057610d6d565b61088051610140526006543b610da557600080fd5b6006543018610db357600080fd5b602061092060046318160ddd6108c0526108dc6006545afa610dd457600080fd5b600050610920516108a05261014051670de0b6b3a76400008082028215828483041417610e0057600080fd5b809050905090506108a0518080610e1657600080fd5b82049050905060005260206000f350005b63cf701ff7600051141561130c573415610e4057600080fd5b60843560028110610e5057600080fd5b5061014060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101c06101405161016051610180516101a0516101c0516101e051610200516102205160065801610281565b61026052610280526102a0526102c05261022052610200526101e0526101c0526101a052610180526101605261014052610260805182528060200151826020015280604001518260400152806060015182606001525050610140610300525b61030051516020610300510161030052610300610300511015610f4757610f25565b600658016100a9565b610320526102e0610300525b6103005152602061030051036103005261014061030051101515610f7f57610f5c565b610320516102e052610140610360525b61036051516020610360510161036052610360610360511015610fb157610f8f565b63198d58d8610380526103a06101c08051825280602001518260200152806040015182604001528060600151826060015250506104206101408051825280602001518260200152806040015182604001528060600151826060015250506102e0516104a0526104a05161048051610460516104405161042051610400516103e0516103c0516103a0516006580161096f565b61050052610340610360525b61036051526020610360510361036052610140610360511015156110725761104f565b610500516103405261052060006004818352015b608435156110de5761014061052051600481106110a257600080fd5b602002018051600461052051600481106110bb57600080fd5b60200201358181830110156110cf57600080fd5b80820190509050815250611128565b61014061052051600481106110f257600080fd5b6020020180516004610520516004811061110b57600080fd5b60200201358082101561111d57600080fd5b808203905090508152505b5b8151600101808352811415611086575b5050610140610560525b6105605151602061056051016105605261056061056051101561116557611143565b63198d58d8610580526105a06101c08051825280602001518260200152806040015182604001528060600151826060015250506106206101408051825280602001518260200152806040015182604001528060600151826060015250506102e0516106a0526106a05161068051610660516106405161062051610600516105e0516105c0516105a0516006580161096f565b61070052610540610560525b610560515260206105605103610560526101406105605110151561122657611203565b61070051610540526006543b61123b57600080fd5b600654301861124957600080fd5b60206107a060046318160ddd6107405261075c6006545afa61126a57600080fd5b6000506107a0516107205260006107c052608435156112a85761054051610340518082101561129857600080fd5b808203905090506107c0526112c9565b6103405161054051808210156112bd57600080fd5b808203905090506107c0525b6107c0516107205180820282158284830414176112e557600080fd5b809050905090506103405180806112fb57600080fd5b82049050905060005260206000f350005b63029b2f346000511415611f675762ffffff541561132957600080fd5b600162ffffff55341561133b57600080fd5b6011541561134857600080fd5b61014060008152600081602001526001816040015260008160600152506101c060018152600181602001526001816040015260008160600152506102406000815260008160200152600081604001526000816060015250600354600480820282158284830414176113b857600080fd5b80905090509050600c80806113cc57600080fd5b8204905090506102c0526004546102e052610140610320525b61032051516020610320510161032052610320610320511015611407576113e5565b600658016100a9565b61034052610300610320525b610320515260206103205103610320526101406103205110151561143f5761141c565b61034051610300526006543b61145457600080fd5b600654301861146257600080fd5b60206103e060046318160ddd6103805261039c6006545afa61148357600080fd5b6000506103e05161036052610400610140610480525b610480515160206104805101610480526104806104805110156114bb57611499565b60065801610281565b6104a0526104c0526104e05261050052610460610480525b61048051526020610480510361048052610140610480511015156114ff576114dc565b6104a080518252806020015182602001528060400151826040015280606001518260600152505060006105205261054060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506000610360511115611675576101406105c0525b6105c0515160206105c051016105c0526105c06105c05110156115ab57611589565b63198d58d86105e0526106006104008051825280602001518260200152806040015182604001528060600151826060015250506106806105408051825280602001518260200152806040015182604001528060600151826060015250506103005161070052610700516106e0516106c0516106a05161068051610660516106405161062051610600516006580161096f565b610760526105a06105c0525b6105c0515260206105c051036105c0526101406105c05110151561166c57611649565b61076051610520525b61078061054080518252806020015182602001528060400151826040015280606001518260600152505061080060006004818352015b6103605115156116da576000600461080051600481106116ca57600080fd5b6020020135116116d957600080fd5b5b61054061080051600481106116ee57600080fd5b60200201516004610800516004811061170657600080fd5b602002013581818301101561171a57600080fd5b80820190509050610780610800516004811061173557600080fd5b60200201525b81516001018083528114156116ab575b5050610140610840525b6108405151602061084051016108405261084061084051101561177757611755565b63198d58d861086052610880610400805182528060200151826020015280604001518260400152806060015182606001525050610900610780805182528060200151826020015280604001518260400152806060015182606001525050610300516109805261098051610960516109405161092051610900516108e0516108c0516108a051610880516006580161096f565b6109e052610820610840525b610840515260206108405103610840526101406108405110151561183857611815565b6109e0516108205261052051610820511161185257600080fd5b61082051610a00526000610360511115611b9d57610a2060006004818352015b61082051610540610a20516004811061188a57600080fd5b602002015180820282158284830414176118a357600080fd5b809050905090506105205180806118b957600080fd5b820490509050610a40526000610a6052610780610a2051600481106118dd57600080fd5b6020020151610a4051111561192657610a4051610780610a20516004811061190457600080fd5b60200201518082101561191657600080fd5b80820390509050610a605261195c565b610780610a20516004811061193a57600080fd5b6020020151610a40518082101561195057600080fd5b80820390509050610a60525b6102c051610a6051808202821582848304141761197857600080fd5b809050905090506402540be400808061199057600080fd5b820490509050610240610a2051600481106119aa57600080fd5b6020020152610780610a2051600481106119c357600080fd5b6020020151610240610a2051600481106119dc57600080fd5b60200201516102e05180820282158284830414176119f957600080fd5b809050905090506402540be4008080611a1157600080fd5b82049050905080821015611a2457600080fd5b80820390509050610a205160048110611a3c57600080fd5b600260c052602060c0200155610780610a205160048110611a5c57600080fd5b602002018051610240610a205160048110611a7657600080fd5b602002015180821015611a8857600080fd5b808203905090508152505b8151600101808352811415611872575b5050610140610a80525b610a8051516020610a805101610a8052610a20610a80511015611acf57611aad565b63198d58d8610aa052610ac0610400805182528060200151826020015280604001518260400152806060015182606001525050610b4061078080518252806020015182602001528060400151826040015280606001518260600152505061030051610bc052610bc051610ba051610b8051610b6051610b4051610b2051610b0051610ae051610ac0516006580161096f565b610c2052610a00610a80525b610a8051526020610a805103610a8052610140610a8051101515611b9057611b6d565b610c2051610a0052611bcf565b600260c052602060c0206107808051825580602001516001830155806040015160028301558060600151600383015550505b6000610c4052610360511515611bec5761082051610c4052611c41565b61036051610a00516105205180821015611c0557600080fd5b808203905090508082028215828483041417611c2057600080fd5b80905090509050610520518080611c3657600080fd5b820490509050610c40525b6308c379a0610c60526020610c80526014610ca0527f536c697070616765207363726577656420796f75000000000000000000000000610cc052610ca050608435610c40511015611c93576084610c7cfd5b610d0060006004818352015b60006004610d005160048110611cb457600080fd5b60200201351115611e72576101c0610d005160048110611cd357600080fd5b602002015115610140610d005160048110611ced57600080fd5b60200201511615611dae57610d005160048110611d0957600080fd5b600060c052602060c02001543b611d1f57600080fd5b610d005160048110611d3057600080fd5b600060c052602060c02001543018611d4757600080fd5b6000600060646323b872dd610e005233610e205230610e40526004610d005160048110611d7357600080fd5b6020020135610e6052610e1c6000610d005160048110611d9257600080fd5b600060c052602060c02001545af1611da957600080fd5b611e71565b610d005160048110611dbf57600080fd5b600060c052602060c02001543b611dd557600080fd5b610d005160048110611de657600080fd5b600060c052602060c02001543018611dfd57600080fd5b6020610de060646323b872dd610d205233610d405230610d60526004610d005160048110611e2a57600080fd5b6020020135610d8052610d3c6000610d005160048110611e4957600080fd5b600060c052602060c02001545af1611e6057600080fd5b600050610de051611e7057600080fd5b5b5b5b8151600101808352811415611c9f575b50506006543b611e9257600080fd5b6006543018611ea057600080fd5b6000600060446340c10f19610ec05233610ee052610c4051610f0052610edc60006006545af1611ecf57600080fd5b600435610f6052602435610f8052604435610fa052606435610fc05261024051610fe052610260516110005261028051611020526102a05161104052610820516110605261036051610c4051818183011015611f2a57600080fd5b8082019050905061108052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610f60a2600062ffffff55005b6000156123e2575b610220526101405261016052610180526101a0526101c0526101e052610200526000610140511215610160516101405114151660006101605112151660046101405112166004610160511216611fc457600080fd5b6101405161016051610180516101a0516101c0516101e051610200516102205161024051600658016100a9565b610280526102405261022052610200526101e0526101c0526101a05261018052610160526101405261028051610240526101406102c0525b6102c0515160206102c051016102c0526102c06102c051101561204b57612029565b63c763592c6102e0526103006101a0805182528060200151826020015280604001518260400152806060015182606001525050610240516103805261038051610360516103405161032051610300516006580161067d565b6103e0526102a06102c0525b6102c0515260206102c051036102c0526101406102c0511015156120d2576120af565b6103e0516102a0526102a05161040052600061042052610240516004808202821582848304141761210257600080fd5b809050905090506104405260006104605261048060006004818352015b6101405161048051141561213a576101805161046052612170565b6101605161048051181561216a576101a0610480516004811061215c57600080fd5b60200201516104605261216f565b6121ec565b5b61042080516104605181818301101561218857600080fd5b80820190509050815250610400516102a05180820282158284830414176121ae57600080fd5b8090509050905061046051600480820282158284830414176121cf57600080fd5b8090509050905080806121e157600080fd5b820490509050610400525b815160010180835281141561211f575b5050610400516102a051808202821582848304141761221a57600080fd5b80905090509050610440516004808202821582848304141761223b57600080fd5b80905090509050808061224d57600080fd5b82049050905061040052610420516102a05161044051808061226e57600080fd5b82049050905081818301101561228357600080fd5b808201905090506104a05260006104c0526102a0516104e052610500600060ff818352015b6104e0516104c0526104e0516104e05180820282158284830414176122cc57600080fd5b80905090509050610400518181830110156122e657600080fd5b8082019050905060026104e051808202821582848304141761230757600080fd5b809050905090506104a05181818301101561232157600080fd5b808201905090506102a0518082101561233957600080fd5b80820390509050808061234b57600080fd5b8204905090506104e0526104c0516104e05111156123925760016104e0516104c0518082101561237a57600080fd5b8082039050905011151561238d576123ce565b6123bd565b60016104c0516104e051808210156123a957600080fd5b808203905090501115156123bc576123ce565b5b5b81516001018083528114156122a8575b50506104e051600052600051610220515650005b635e0d443f60005114156127cf5734156123fb57600080fd5b6060516004358060405190131561241157600080fd5b809190121561241f57600080fd5b506060516024358060405190131561243657600080fd5b809190121561244457600080fd5b506101406101405161016051610180516101a05160065801610281565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e05110156124d5576124b3565b631db7662b610300526103206101408051825280602001518260200152806040015182604001528060600151826060015250506103805161036051610340516103205160065801610427565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561255c57612539565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606004356004811061259657600080fd5b6020020151604435610140600435600481106125b157600080fd5b602002015180820282158284830414176125ca57600080fd5b80905090509050670de0b6b3a764000080806125e557600080fd5b8204905090508181830110156125fa57600080fd5b80820190509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a051101561262f5761260d565b631e8c3fd36104c0526004356104e0526024356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611f6f565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a0511015156126cc576126a9565b6106005161048052610260602435600481106126e757600080fd5b602002015161048051808210156126fd57600080fd5b8082039050905060018082101561271357600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761273757600080fd5b809050905090506101406024356004811061275157600080fd5b6020020151808061276157600080fd5b8204905090506106205260035461062051808202821582848304141761278657600080fd5b809050905090506402540be400808061279e57600080fd5b820490509050610640526106205161064051808210156127bd57600080fd5b8082039050905060005260206000f350005b6307211ef76000511415612ba35734156127e857600080fd5b606051600435806040519013156127fe57600080fd5b809190121561280c57600080fd5b506060516024358060405190131561282357600080fd5b809190121561283157600080fd5b506101406101405161016051610180516101a05160065801610281565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e05110156128c2576128a0565b631db7662b610300526103206101408051825280602001518260200152806040015182604001528060600151826060015250506103805161036051610340516103205160065801610427565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561294957612926565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506104606001815264e8d4a51000816020015264e8d4a5100081604001526001816060015250610260600435600481106129a857600080fd5b6020020151604435610460600435600481106129c357600080fd5b602002015180820282158284830414176129dc57600080fd5b809050905090508181830110156129f257600080fd5b808201905090506104e052610140610520525b61052051516020610520510161052052610520610520511015612a2757612a05565b631e8c3fd36105405260043561056052602435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611f6f565b61068052610500610520525b6105205152602061052051036105205261014061052051101515612ac457612aa1565b610680516105005261026060243560048110612adf57600080fd5b60200201516105005180821015612af557600080fd5b80820390509050600180821015612b0b57600080fd5b8082039050905061046060243560048110612b2557600080fd5b60200201518080612b3557600080fd5b8204905090506106a0526003546106a0518082028215828483041417612b5a57600080fd5b809050905090506402540be4008080612b7257600080fd5b8204905090506106c0526106a0516106c05180821015612b9157600080fd5b8082039050905060005260206000f350005b600015613048575b610220526101405261016052610180526101a0526101c0526101e0526102005260115415612bd857600080fd5b6102406101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015612c0557612be3565b631db7662b6102e0526103006101a08051825280602001518260200152806040015182604001528060600151826060015250506103605161034051610320516103005160065801610427565b6103c0526103e05261040052610420526102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515612c8c57612c69565b6103c08051825280602001518260200152806040015182604001528060600151826060015250506102406101405160048110612cc757600080fd5b6020020151610180516101a06101405160048110612ce457600080fd5b60200201518082028215828483041417612cfd57600080fd5b80905090509050670de0b6b3a76400008080612d1857600080fd5b820490509050818183011015612d2d57600080fd5b8082019050905061044052610140610480525b61048051516020610480510161048052610480610480511015612d6257612d40565b631e8c3fd36104a052610140516104c052610160516104e052610440516105005261052061024080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c05160065801611f6f565b6105e052610460610480525b6104805152602061048051036104805261014061048051101515612e0157612dde565b6105e051610460526102406101605160048110612e1d57600080fd5b60200201516104605180821015612e3357600080fd5b8082039050905061060052610600516003548082028215828483041417612e5957600080fd5b809050905090506402540be4008080612e7157600080fd5b82049050905061062052610620516004548082028215828483041417612e9657600080fd5b809050905090506402540be4008080612eae57600080fd5b8204905090506106405261044051670de0b6b3a76400008082028215828483041417612ed957600080fd5b809050905090506101a06101405160048110612ef457600080fd5b60200201518080612f0457600080fd5b8204905090506101405160048110612f1b57600080fd5b600260c052602060c020015561046051610620516106405180821015612f4057600080fd5b80820390509050818183011015612f5657600080fd5b80820190509050670de0b6b3a76400008082028215828483041417612f7a57600080fd5b809050905090506101a06101605160048110612f9557600080fd5b60200201518080612fa557600080fd5b8204905090506101605160048110612fbc57600080fd5b600260c052602060c0200155610600516106205180821015612fdd57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761300157600080fd5b809050905090506101a0610160516004811061301c57600080fd5b6020020151808061302c57600080fd5b8204905090506106605261066051600052600051610220515650005b633df0212460005114156135e45762ffffff541561306557600080fd5b600162ffffff55341561307757600080fd5b6060516004358060405190131561308d57600080fd5b809190121561309b57600080fd5b50606051602435806040519013156130b257600080fd5b80919012156130c057600080fd5b506101406101405161016051610180516101a05160065801610281565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051632ce785a36102a0526004356102c0526024356102e0526044356103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051610300516102e0516102c05160065801612bab565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526308c379a061040052602061042052602e610440527f45786368616e676520726573756c74656420696e20666577657220636f696e73610460527f207468616e20657870656374656400000000000000000000000000000000000061048052610440506064356102605110156132645760a461041cfd5b6104c060008152600081602001526001816040015260008160600152506105406001815260018160200152600181604001526000816060015250610540600435600481106132b157600080fd5b6020020151156104c0600435600481106132ca57600080fd5b6020020151161561337357600435600481106132e557600080fd5b600060c052602060c02001543b6132fb57600080fd5b6004356004811061330b57600080fd5b600060c052602060c0200154301861332257600080fd5b6000600060646323b872dd6106a052336106c052306106e052604435610700526106bc60006004356004811061335757600080fd5b600060c052602060c02001545af161336e57600080fd5b61341e565b6004356004811061338357600080fd5b600060c052602060c02001543b61339957600080fd5b600435600481106133a957600080fd5b600060c052602060c020015430186133c057600080fd5b602061068060646323b872dd6105c052336105e0523061060052604435610620526105dc6000600435600481106133f657600080fd5b600060c052602060c02001545af161340d57600080fd5b6000506106805161341d57600080fd5b5b6105406024356004811061343157600080fd5b6020020151156104c06024356004811061344a57600080fd5b602002015116156134ef576024356004811061346557600080fd5b600060c052602060c02001543b61347b57600080fd5b6024356004811061348b57600080fd5b600060c052602060c020015430186134a257600080fd5b60006000604463a9059cbb610820523361084052610260516108605261083c6000602435600481106134d357600080fd5b600060c052602060c02001545af16134ea57600080fd5b613596565b602435600481106134ff57600080fd5b600060c052602060c02001543b61351557600080fd5b6024356004811061352557600080fd5b600060c052602060c0200154301861353c57600080fd5b6020610800604463a9059cbb610760523361078052610260516107a05261077c60006024356004811061356e57600080fd5b600060c052602060c02001545af161358557600080fd5b6000506108005161359557600080fd5b5b6004356108c0526044356108e052602435610900526102605161092052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806108c0a2600062ffffff55005b63a6417ed66000511415613fa25762ffffff541561360157600080fd5b600162ffffff55341561361357600080fd5b6060516004358060405190131561362957600080fd5b809190121561363757600080fd5b506060516024358060405190131561364e57600080fd5b809190121561365c57600080fd5b506101406101405161016051610180516101a05160065801610281565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606001815264e8d4a51000816020015264e8d4a5100081604001526001816060015250610140600435600481106136f857600080fd5b60200201516102606004356004811061371057600080fd5b6020020151808061372057600080fd5b8204905090506102e0526101406024356004811061373d57600080fd5b60200201516102606024356004811061375557600080fd5b6020020151808061376557600080fd5b82049050905061030052604435670de0b6b3a7640000808202821582848304141761378f57600080fd5b809050905090506102e05180806137a557600080fd5b82049050905061032052610140610360525b610360515160206103605101610360526103606103605110156137d9576137b7565b632ce785a3610380526004356103a0526024356103c052610320516103e052610400610140805182528060200151826020015280604001518260400152806060015182606001525050610460516104405161042051610400516103e0516103c0516103a05160065801612bab565b6104c052610340610360525b610360515260206103605103610360526101406103605110151561387657613853565b6104c051610340526103405161030051808202821582848304141761389a57600080fd5b80905090509050670de0b6b3a764000080806138b557600080fd5b8204905090506104e0526308c379a061050052602061052052602e610540527f45786368616e676520726573756c74656420696e20666577657220636f696e73610560527f207468616e20657870656374656400000000000000000000000000000000000061058052610540506064356104e05110156139365760a461051cfd5b6105c0600181526001816020015260018160400152600081606001525061064060008152600081602001526001816040015260008160600152506106406004356004811061398357600080fd5b602002015115613a2b576004356004811061399d57600080fd5b600160c052602060c02001543b6139b357600080fd5b600435600481106139c357600080fd5b600160c052602060c020015430186139da57600080fd5b6000600060646323b872dd6107a052336107c052306107e052604435610800526107bc600060043560048110613a0f57600080fd5b600160c052602060c02001545af1613a2657600080fd5b613ad6565b60043560048110613a3b57600080fd5b600160c052602060c02001543b613a5157600080fd5b60043560048110613a6157600080fd5b600160c052602060c02001543018613a7857600080fd5b602061078060646323b872dd6106c052336106e0523061070052604435610720526106dc600060043560048110613aae57600080fd5b600160c052602060c02001545af1613ac557600080fd5b60005061078051613ad557600080fd5b5b6105c060043560048110613ae957600080fd5b602002015115613c3a5760043560048110613b0357600080fd5b600160c052602060c02001543b613b1957600080fd5b60043560048110613b2957600080fd5b600160c052602060c02001543018613b4057600080fd5b6020610900604463095ea7b36108605260043560048110613b6057600080fd5b600060c052602060c0200154610880526044356108a05261087c600060043560048110613b8c57600080fd5b600160c052602060c02001545af1613ba357600080fd5b6000506109005060043560048110613bba57600080fd5b600060c052602060c02001543b613bd057600080fd5b60043560048110613be057600080fd5b600060c052602060c02001543018613bf757600080fd5b60006000602463b6b55f25610920526044356109405261093c600060043560048110613c2257600080fd5b600060c052602060c02001545af1613c3957600080fd5b5b6105c060243560048110613c4d57600080fd5b602002015115613df65760243560048110613c6757600080fd5b600060c052602060c02001543b613c7d57600080fd5b60243560048110613c8d57600080fd5b600060c052602060c02001543018613ca457600080fd5b600060006024632e1a7d4d6109a052610340516109c0526109bc600060243560048110613cd057600080fd5b600060c052602060c02001545af1613ce757600080fd5b60243560048110613cf757600080fd5b600160c052602060c02001543b613d0d57600080fd5b60243560048110613d1d57600080fd5b600160c052602060c02001543018613d3457600080fd5b6020610aa060246370a08231610a205230610a4052610a3c60243560048110613d5c57600080fd5b600160c052602060c02001545afa613d7357600080fd5b600050610aa0516104e0526308c379a0610ac0526020610ae052602e610b00527f45786368616e676520726573756c74656420696e20666577657220636f696e73610b20527f207468616e206578706563746564000000000000000000000000000000000000610b4052610b00506064356104e0511015613df55760a4610adcfd5b5b61064060243560048110613e0957600080fd5b602002015115613ead5760243560048110613e2357600080fd5b600160c052602060c02001543b613e3957600080fd5b60243560048110613e4957600080fd5b600160c052602060c02001543018613e6057600080fd5b60006000604463a9059cbb610c405233610c60526104e051610c8052610c5c600060243560048110613e9157600080fd5b600160c052602060c02001545af1613ea857600080fd5b613f54565b60243560048110613ebd57600080fd5b600160c052602060c02001543b613ed357600080fd5b60243560048110613ee357600080fd5b600160c052602060c02001543018613efa57600080fd5b6020610c20604463a9059cbb610b805233610ba0526104e051610bc052610b9c600060243560048110613f2c57600080fd5b600160c052602060c02001545af1613f4357600080fd5b600050610c2051613f5357600080fd5b5b600435610ce052604435610d0052602435610d20526104e051610d4052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610ce0a2600062ffffff55005b637d49d875600051141561443b5762ffffff5415613fbf57600080fd5b600162ffffff553415613fd157600080fd5b6006543b613fde57600080fd5b6006543018613fec57600080fd5b60206101c060046318160ddd6101605261017c6006545afa61400d57600080fd5b6000506101c051610140526101e0600081526000816020015260008160400152600081606001525061026060008152600081602001526000816040015260008160600152506102e0600081526000816020015260018160400152600081606001525061036060018152600181602001526001816040015260008160600152506103e060006004818352015b6103e051600481106140a957600080fd5b600260c052602060c020015460043580820282158284830414176140cc57600080fd5b809050905090506101405180806140e257600080fd5b820490509050610400526308c379a0610420526020610440526030610460527f5769746864726177616c20726573756c74656420696e20666577657220636f69610480527f6e73207468616e206578706563746564000000000000000000000000000000006104a0526104605060246103e0516004811061416257600080fd5b60200201356104005110156141785760a461043cfd5b6103e0516004811061418957600080fd5b600260c052602060c02001805461040051808210156141a757600080fd5b80820390509050815550610400516101e06103e051600481106141c957600080fd5b60200201526103606103e051600481106141e257600080fd5b6020020151156102e06103e051600481106141fc57600080fd5b602002015116156142a4576103e0516004811061421857600080fd5b600060c052602060c02001543b61422e57600080fd5b6103e0516004811061423f57600080fd5b600060c052602060c0200154301861425657600080fd5b60006000604463a9059cbb6105a052336105c052610400516105e0526105bc60006103e0516004811061428857600080fd5b600060c052602060c02001545af161429f57600080fd5b61434e565b6103e051600481106142b557600080fd5b600060c052602060c02001543b6142cb57600080fd5b6103e051600481106142dc57600080fd5b600060c052602060c020015430186142f357600080fd5b6020610580604463a9059cbb6104e052336105005261040051610520526104fc60006103e0516004811061432657600080fd5b600060c052602060c02001545af161433d57600080fd5b6000506105805161434d57600080fd5b5b5b8151600101808352811415614098575b50506006543b61436e57600080fd5b600654301861437c57600080fd5b6000600060446379cc67906106405233610660526004356106805261065c60006006545af16143aa57600080fd5b6101e0516106e052610200516107005261022051610720526102405161074052610260516107605261028051610780526102a0516107a0526102c0516107c05261014051600435808210156143fe57600080fd5b808203905090506107e052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d6101206106e0a2600062ffffff55005b6318a7bd766000511415614fde5762ffffff541561445857600080fd5b600162ffffff55341561446a57600080fd5b6011541561447757600080fd5b61014060008152600081602001526001816040015260008160600152506101c060018152600181602001526001816040015260008160600152506006543b6144be57600080fd5b60065430186144cc57600080fd5b60206102c060046318160ddd6102605261027c6006545afa6144ed57600080fd5b6000506102c051610240526000610240511161450857600080fd5b6003546004808202821582848304141761452157600080fd5b80905090509050600c808061453557600080fd5b8204905090506102e052600454610300526103206101406103a0525b6103a0515160206103a051016103a0526103a06103a051101561457357614551565b60065801610281565b6103c0526103e05261040052610420526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156145b757614594565b6103c0805182528060200151826020015280604001518260400152806060015182606001525050610140610460525b61046051516020610460510161046052610460610460511015614608576145e6565b600658016100a9565b61048052610440610460525b61046051526020610460510361046052610140610460511015156146405761461d565b61048051610440526104a060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506105206104a08051825280602001518260200152806040015182604001528060600151826060015250506101406105c0525b6105c0515160206105c051016105c0526105c06105c05110156146e5576146c3565b63198d58d86105e0526106006103208051825280602001518260200152806040015182604001528060600151826060015250506106806104a08051825280602001518260200152806040015182604001528060600151826060015250506104405161070052610700516106e0516106c0516106a05161068051610660516106405161062051610600516006580161096f565b610760526105a06105c0525b6105c0515260206105c051036105c0526101406105c0511015156147a657614783565b610760516105a05261078060006004818352015b61052061078051600481106147ce57600080fd5b602002018051600461078051600481106147e757600080fd5b6020020135808210156147f957600080fd5b808203905090508152505b81516001018083528114156147ba575b50506101406107c0525b6107c0515160206107c051016107c0526107c06107c05110156148405761481e565b63198d58d86107e0526108006103208051825280602001518260200152806040015182604001528060600151826060015250506108806105208051825280602001518260200152806040015182604001528060600151826060015250506104405161090052610900516108e0516108c0516108a05161088051610860516108405161082051610800516006580161096f565b610960526107a06107c0525b6107c0515260206107c051036107c0526101406107c051101515614901576148de565b610960516107a0526109806000815260008160200152600081604001526000816060015250610a0060006004818352015b6107a0516104a0610a00516004811061494a57600080fd5b6020020151808202821582848304141761496357600080fd5b809050905090506105a051808061497957600080fd5b820490509050610a20526000610a4052610520610a00516004811061499d57600080fd5b6020020151610a205111156149e657610a2051610520610a0051600481106149c457600080fd5b6020020151808210156149d657600080fd5b80820390509050610a4052614a1c565b610520610a0051600481106149fa57600080fd5b6020020151610a205180821015614a1057600080fd5b80820390509050610a40525b6102e051610a40518082028215828483041417614a3857600080fd5b809050905090506402540be4008080614a5057600080fd5b820490509050610980610a005160048110614a6a57600080fd5b6020020152610520610a005160048110614a8357600080fd5b6020020151610980610a005160048110614a9c57600080fd5b6020020151610300518082028215828483041417614ab957600080fd5b809050905090506402540be4008080614ad157600080fd5b82049050905080821015614ae457600080fd5b80820390509050610a005160048110614afc57600080fd5b600260c052602060c0200155610520610a005160048110614b1c57600080fd5b602002018051610980610a005160048110614b3657600080fd5b602002015180821015614b4857600080fd5b808203905090508152505b8151600101808352811415614932575b5050610140610a80525b610a8051516020610a805101610a8052610a80610a80511015614b8f57614b6d565b63198d58d8610aa052610ac0610320805182528060200151826020015280604001518260400152806060015182606001525050610b4061052080518252806020015182602001528060400151826040015280606001518260600152505061044051610bc052610bc051610ba051610b8051610b6051610b4051610b2051610b0051610ae051610ac0516006580161096f565b610c2052610a60610a80525b610a8051526020610a805103610a8052610140610a8051101515614c5057614c2d565b610c2051610a60526105a051610a605180821015614c6d57600080fd5b80820390509050610240518082028215828483041417614c8c57600080fd5b809050905090506105a0518080614ca257600080fd5b8204905090506001818183011015614cb957600080fd5b80820190509050610c40526308c379a0610c60526020610c80526014610ca0527f536c697070616765207363726577656420796f75000000000000000000000000610cc052610ca050608435610c40511115614d16576084610c7cfd5b610d0060006004818352015b60006004610d005160048110614d3757600080fd5b60200201351115614eeb576101c0610d005160048110614d5657600080fd5b602002015115610140610d005160048110614d7057600080fd5b60200201511615614e2c57610d005160048110614d8c57600080fd5b600060c052602060c02001543b614da257600080fd5b610d005160048110614db357600080fd5b600060c052602060c02001543018614dca57600080fd5b60006000604463a9059cbb610de05233610e00526004610d005160048110614df157600080fd5b6020020135610e2052610dfc6000610d005160048110614e1057600080fd5b600060c052602060c02001545af1614e2757600080fd5b614eea565b610d005160048110614e3d57600080fd5b600060c052602060c02001543b614e5357600080fd5b610d005160048110614e6457600080fd5b600060c052602060c02001543018614e7b57600080fd5b6020610dc0604463a9059cbb610d205233610d40526004610d005160048110614ea357600080fd5b6020020135610d6052610d3c6000610d005160048110614ec257600080fd5b600060c052602060c02001545af1614ed957600080fd5b600050610dc051614ee957600080fd5b5b5b5b8151600101808352811415614d22575b50506006543b614f0b57600080fd5b6006543018614f1957600080fd5b6000600060446379cc6790610e805233610ea052610c4051610ec052610e9c60006006545af1614f4857600080fd5b600435610f2052602435610f4052604435610f6052606435610f805261098051610fa0526109a051610fc0526109c051610fe0526109e051611000526107a0516110205261024051610c405180821015614fa157600080fd5b8082039050905061104052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610f20a2600062ffffff55005b633c157e646000511415615150573415614ff757600080fd5b600554331461500557600080fd5b6009546201518081818301101561501b57600080fd5b8082019050905042101561502e57600080fd5b426201518081818301101561504257600080fd5b80820190509050602435101561505757600080fd5b61014051600658016100a9565b61018052610140526101805161014052620f4240600435106000600435111661508c57600080fd5b61014051600435600a80820282158284830414176150a957600080fd5b80905090509050101561014051600435101661014051600a80820282158284830414176150d557600080fd5b80905090509050600435111561014051600435101516176150f557600080fd5b6101405160075560043560085542600955602435600a55610140516101a0526004356101c052426101e052602435610200527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c25460806101a0a1005b63551a658860005114156151e057341561516957600080fd5b600554331461517757600080fd5b61014051600658016100a9565b6101805261014052610180516101405261014051600755610140516008554260095542600a55610140516101a052426101c0527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc20193860406101a0a1005b635b5a146760005114156152a95734156151f957600080fd5b600554331461520757600080fd5b600b541561521457600080fd5b64012a05f200602435111561522857600080fd5b64012a05f200600435111561523c57600080fd5b426203f48081818301101561525057600080fd5b808201905090506101405261014051600b55600435600d55602435600e556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9760005114156153405734156152c257600080fd5b60055433146152d057600080fd5b6000600b541142600b541115166152e657600080fd5b6000600b55600d5461014052600e546101605261014051600355610160516004556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb600051141561536e57341561535957600080fd5b600554331461536757600080fd5b6000600b55005b636b441a40600051141561540f57341561538757600080fd5b600435602051811061539857600080fd5b5060055433146153a757600080fd5b600c54156153b457600080fd5b426203f4808181830110156153c857600080fd5b808201905090506101405261014051600c55600435600f55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae600051141561548b57341561542857600080fd5b600554331461543657600080fd5b6000600c5411600c544210151661544c57600080fd5b6000600c55600f546101405261014051600555610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19360005114156154b95734156154a457600080fd5b60055433146154b257600080fd5b6000600c55005b6330c5408560005114156156f85734156154d257600080fd5b60055433146154e057600080fd5b6101406001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101c0600081526000816020015260018160400152600081606001525061024060018152600181602001526001816040015260008160600152506102c060006004818352015b6102c0516004811061555c57600080fd5b600060c052602060c02001546102e0526102e0513b61557a57600080fd5b6102e051301861558957600080fd5b60206103a060246370a0823161032052306103405261033c6102e0515afa6155b057600080fd5b6000506103a0516102c051600481106155c857600080fd5b600260c052602060c0200154808210156155e157600080fd5b808203905090506103005260006103005111156156e3576102406102c0516004811061560c57600080fd5b6020020151156101c06102c0516004811061562657600080fd5b60200201511615615683576102e0513b61563f57600080fd5b6102e051301861564e57600080fd5b60006000604463a9059cbb61048052336104a052610300516104c05261049c60006102e0515af161567e57600080fd5b6156e2565b6102e0513b61569157600080fd5b6102e05130186156a057600080fd5b6020610460604463a9059cbb6103c052336103e05261030051610400526103dc60006102e0515af16156d157600080fd5b600050610460516156e157600080fd5b5b5b5b815160010180835281141561554b575b5050005b63e3698853600051141561573457341561571157600080fd5b600554331461571f57600080fd5b426010541161572d57600080fd5b6001601155005b633046f972600051141561576257341561574d57600080fd5b600554331461575b57600080fd5b6000601155005b6323746eb860005114156157c757341561577b57600080fd5b6060516004358060405190131561579157600080fd5b809190121561579f57600080fd5b50600435600481106157b057600080fd5b600060c052602060c020015460005260206000f350005b63b739953e600051141561582c5734156157e057600080fd5b606051600435806040519013156157f657600080fd5b809190121561580457600080fd5b506004356004811061581557600080fd5b600160c052602060c020015460005260206000f350005b63065a80d8600051141561589157341561584557600080fd5b6060516004358060405190131561585b57600080fd5b809190121561586957600080fd5b506004356004811061587a57600080fd5b600260c052602060c020015460005260206000f350005b63ddca3f4360005114156158b85734156158aa57600080fd5b60035460005260206000f350005b63fee3f7f960005114156158df5734156158d157600080fd5b60045460005260206000f350005b638da5cb5b60005114156159065734156158f857600080fd5b60055460005260206000f350005b635409491a600051141561592d57341561591f57600080fd5b60075460005260206000f350005b63b4b577ad600051141561595457341561594657600080fd5b60085460005260206000f350005b632081066c600051141561597b57341561596d57600080fd5b60095460005260206000f350005b631405228860005114156159a257341561599457600080fd5b600a5460005260206000f350005b63405e28f860005114156159c95734156159bb57600080fd5b600b5460005260206000f350005b63e0a0b58660005114156159f05734156159e257600080fd5b600c5460005260206000f350005b6358680d0b6000511415615a17573415615a0957600080fd5b600d5460005260206000f350005b63e38244626000511415615a3e573415615a3057600080fd5b600e5460005260206000f350005b631ec0cdc16000511415615a65573415615a5757600080fd5b600f5460005260206000f350005b5b60006000fd5b6102e6615d52036102e66000396102e6615d52036000f300000000000000000000000099d1fa417f94dcd62bfe781a1213c092a47041bc0000000000000000000000009777d7e2b60bb01759d0e2f8be2095df444cb07e0000000000000000000000001be5d71f2da660bfdee8012ddc58d024448a0a590000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e10000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e1000000000000000000000000d905e2eaebe188fc92179b6350807d8bd91db0d800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000003d0900

Deployed Bytecode

0x600436101561000d57615a66565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610244575b61014052600a54610160526008546101805261016051421015610231576007546101c0526009546101e0526101c05161018051111561018a576101c051610180516101c051808210156100fb57600080fd5b80820390509050426101e0518082101561011457600080fd5b80820390509050808202821582848304141761012f57600080fd5b80905090509050610160516101e0518082101561014b57600080fd5b80820390509050808061015d57600080fd5b82049050905081818301101561017257600080fd5b8082019050905060005260005161014051565061022c565b6101c0516101c05161018051808210156101a357600080fd5b80820390509050426101e051808210156101bc57600080fd5b8082039050905080820282158284830414176101d757600080fd5b80905090509050610160516101e051808210156101f357600080fd5b80820390509050808061020557600080fd5b8204905090508082101561021857600080fd5b808203905090506000526000516101405156505b610242565b610180516000526000516101405156505b005b63f446c1d0600051141561027957341561025d57600080fd5b600658016100a9565b610140526101405160005260206000f350005b60001561041f575b610140526101606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101e0600181526001816020015260018160400152600081606001525061026060006004818352015b670de0b6b3a7640000610280526101e061026051600481106102f457600080fd5b60200201511561039457610260516004811061030f57600080fd5b600060c052602060c02001543b61032557600080fd5b610260516004811061033657600080fd5b600060c052602060c0200154301861034d57600080fd5b602061030060046377c7b8fc6102a0526102bc610260516004811061037157600080fd5b600060c052602060c02001545afa61038857600080fd5b60005061030051610280525b61016061026051600481106103a857600080fd5b6020020180516102805180820282158284830414176103c657600080fd5b809050905090508152505b81516001018083528114156102d3575b50506080610320525b6000610320511115156103fc57610418565b60206103205103610160015160206103205103610320526103ea565b6101405156005b600015610544575b6101c0526101405261016052610180526101a0526101e061014080518252806020015182602001528060400151826040015280606001518260600152505061026060006004818352015b6101e0610260516004811061048557600080fd5b6020020151610260516004811061049b57600080fd5b600260c052602060c020015480820282158284830414176104bb57600080fd5b80905090509050670de0b6b3a764000080806104d657600080fd5b8204905090506101e061026051600481106104f057600080fd5b60200201525b8151600101808352811415610471575b50506080610280525b6000610280511115156105215761053d565b602061028051036101e00151602061028051036102805261050f565b6101c05156005b600015610675575b610240526101405261016052610180526101a0526101c0526101e05261020052610220526102606101408051825280602001518260200152806040015182604001528060600151826060015250506102e060006004818352015b6102606102e051600481106105ba57600080fd5b60200201516101c06102e051600481106105d357600080fd5b602002015180820282158284830414176105ec57600080fd5b80905090509050670de0b6b3a7640000808061060757600080fd5b8204905090506102606102e0516004811061062157600080fd5b60200201525b81516001018083528114156105a6575b50506080610300525b6000610300511115156106525761066e565b6020610300510361026001516020610300510361030052610640565b6102405156005b600015610967575b6101e0526101405261016052610180526101a0526101c05260006102005261024060006004818352015b602061024051026101400151610220526102008051610220518181830110156106cf57600080fd5b808201905090508152505b81516001018083528114156106a7575b50506102005115156107055760006000526000516101e05156505b600061028052610200516102a0526101c0516004808202821582848304141761072d57600080fd5b809050905090506102c0526102e0600060ff818352015b6102a0516103005261034060006004818352015b60206103405102610140015161032052610300516102a051808202821582848304141761078457600080fd5b8090509050905061032051600480820282158284830414176107a557600080fd5b8090509050905080806107b757600080fd5b820490509050610300525b8151600101808352811415610758575b50506102a051610280526102c0516102005180820282158284830414176107f857600080fd5b80905090509050610300516004808202821582848304141761081957600080fd5b8090509050905081818301101561082f57600080fd5b808201905090506102a051808202821582848304141761084e57600080fd5b809050905090506102c05160018082101561086857600080fd5b808203905090506102a051808202821582848304141761088757600080fd5b8090509050905060056103005180820282158284830414176108a857600080fd5b809050905090508181830110156108be57600080fd5b8082019050905080806108d057600080fd5b8204905090506102a052610280516102a05111156109175760016102a05161028051808210156108ff57600080fd5b8082039050905011151561091257610953565b610942565b6001610280516102a0518082101561092e57600080fd5b8082039050905011151561094157610953565b5b5b8151600101808352811415610744575b50506102a0516000526000516101e0515650005b600015610b45575b610260526101405261016052610180526101a0526101c0526101e052610200526102205261024052610140610680525b610680515160206106805101610680526106806106805110156109c15761099f565b63c763592c6106a0526106c0610140610480525b610480515160206104805101610480526104806104805110156109f7576109d5565b6342d3b3c36104a0526104c06101408051825280602001518260200152806040015182604001528060600151826060015250506105406101c08051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e0516104c0516006580161054c565b61060052610620526106405261066052610460610480525b6104805152602061048051036104805261014061048051101515610ab857610a95565b61060080518252806020015182602001528060400151826040015280606001518260600152505061024051610740526107405161072051610700516106e0516106c0516006580161067d565b6107a052610660610680525b6106805152602061068051036106805261014061068051101515610b3357610b10565b6107a051600052600051610260515650005b63bb7b8b806000511415610e27573415610b5e57600080fd5b610140610760525b61076051516020610760510161076052610760610760511015610b8857610b66565b63c763592c610780526107a06101406105a0525b6105a0515160206105a051016105a0526105a06105a0511015610bbe57610b9c565b631db7662b6105c0526105e0610140610500525b61050051516020610500510161050052610500610500511015610bf457610bd2565b60065801610281565b610520526105405261056052610580526104e0610500525b6105005152602061050051036105005261014061050051101515610c3857610c15565b6105208051825280602001518260200152806040015182604001528060600151826060015250506106405161062051610600516105e05160065801610427565b6106a0526106c0526106e052610700526105806105a0525b6105a0515260206105a051036105a0526101406105a051101515610cb357610c90565b6106a0805182528060200151826020015280604001518260400152806060015182606001525050610140610720525b61072051516020610720510161072052610720610720511015610d0457610ce2565b600658016100a9565b61074052610700610720525b6107205152602061072051036107205261014061072051101515610d3c57610d19565b610740516108205261082051610800516107e0516107c0516107a0516006580161067d565b61088052610740610760525b6107605152602061076051036107605261014061076051101515610d9057610d6d565b61088051610140526006543b610da557600080fd5b6006543018610db357600080fd5b602061092060046318160ddd6108c0526108dc6006545afa610dd457600080fd5b600050610920516108a05261014051670de0b6b3a76400008082028215828483041417610e0057600080fd5b809050905090506108a0518080610e1657600080fd5b82049050905060005260206000f350005b63cf701ff7600051141561130c573415610e4057600080fd5b60843560028110610e5057600080fd5b5061014060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101c06101405161016051610180516101a0516101c0516101e051610200516102205160065801610281565b61026052610280526102a0526102c05261022052610200526101e0526101c0526101a052610180526101605261014052610260805182528060200151826020015280604001518260400152806060015182606001525050610140610300525b61030051516020610300510161030052610300610300511015610f4757610f25565b600658016100a9565b610320526102e0610300525b6103005152602061030051036103005261014061030051101515610f7f57610f5c565b610320516102e052610140610360525b61036051516020610360510161036052610360610360511015610fb157610f8f565b63198d58d8610380526103a06101c08051825280602001518260200152806040015182604001528060600151826060015250506104206101408051825280602001518260200152806040015182604001528060600151826060015250506102e0516104a0526104a05161048051610460516104405161042051610400516103e0516103c0516103a0516006580161096f565b61050052610340610360525b61036051526020610360510361036052610140610360511015156110725761104f565b610500516103405261052060006004818352015b608435156110de5761014061052051600481106110a257600080fd5b602002018051600461052051600481106110bb57600080fd5b60200201358181830110156110cf57600080fd5b80820190509050815250611128565b61014061052051600481106110f257600080fd5b6020020180516004610520516004811061110b57600080fd5b60200201358082101561111d57600080fd5b808203905090508152505b5b8151600101808352811415611086575b5050610140610560525b6105605151602061056051016105605261056061056051101561116557611143565b63198d58d8610580526105a06101c08051825280602001518260200152806040015182604001528060600151826060015250506106206101408051825280602001518260200152806040015182604001528060600151826060015250506102e0516106a0526106a05161068051610660516106405161062051610600516105e0516105c0516105a0516006580161096f565b61070052610540610560525b610560515260206105605103610560526101406105605110151561122657611203565b61070051610540526006543b61123b57600080fd5b600654301861124957600080fd5b60206107a060046318160ddd6107405261075c6006545afa61126a57600080fd5b6000506107a0516107205260006107c052608435156112a85761054051610340518082101561129857600080fd5b808203905090506107c0526112c9565b6103405161054051808210156112bd57600080fd5b808203905090506107c0525b6107c0516107205180820282158284830414176112e557600080fd5b809050905090506103405180806112fb57600080fd5b82049050905060005260206000f350005b63029b2f346000511415611f675762ffffff541561132957600080fd5b600162ffffff55341561133b57600080fd5b6011541561134857600080fd5b61014060008152600081602001526001816040015260008160600152506101c060018152600181602001526001816040015260008160600152506102406000815260008160200152600081604001526000816060015250600354600480820282158284830414176113b857600080fd5b80905090509050600c80806113cc57600080fd5b8204905090506102c0526004546102e052610140610320525b61032051516020610320510161032052610320610320511015611407576113e5565b600658016100a9565b61034052610300610320525b610320515260206103205103610320526101406103205110151561143f5761141c565b61034051610300526006543b61145457600080fd5b600654301861146257600080fd5b60206103e060046318160ddd6103805261039c6006545afa61148357600080fd5b6000506103e05161036052610400610140610480525b610480515160206104805101610480526104806104805110156114bb57611499565b60065801610281565b6104a0526104c0526104e05261050052610460610480525b61048051526020610480510361048052610140610480511015156114ff576114dc565b6104a080518252806020015182602001528060400151826040015280606001518260600152505060006105205261054060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506000610360511115611675576101406105c0525b6105c0515160206105c051016105c0526105c06105c05110156115ab57611589565b63198d58d86105e0526106006104008051825280602001518260200152806040015182604001528060600151826060015250506106806105408051825280602001518260200152806040015182604001528060600151826060015250506103005161070052610700516106e0516106c0516106a05161068051610660516106405161062051610600516006580161096f565b610760526105a06105c0525b6105c0515260206105c051036105c0526101406105c05110151561166c57611649565b61076051610520525b61078061054080518252806020015182602001528060400151826040015280606001518260600152505061080060006004818352015b6103605115156116da576000600461080051600481106116ca57600080fd5b6020020135116116d957600080fd5b5b61054061080051600481106116ee57600080fd5b60200201516004610800516004811061170657600080fd5b602002013581818301101561171a57600080fd5b80820190509050610780610800516004811061173557600080fd5b60200201525b81516001018083528114156116ab575b5050610140610840525b6108405151602061084051016108405261084061084051101561177757611755565b63198d58d861086052610880610400805182528060200151826020015280604001518260400152806060015182606001525050610900610780805182528060200151826020015280604001518260400152806060015182606001525050610300516109805261098051610960516109405161092051610900516108e0516108c0516108a051610880516006580161096f565b6109e052610820610840525b610840515260206108405103610840526101406108405110151561183857611815565b6109e0516108205261052051610820511161185257600080fd5b61082051610a00526000610360511115611b9d57610a2060006004818352015b61082051610540610a20516004811061188a57600080fd5b602002015180820282158284830414176118a357600080fd5b809050905090506105205180806118b957600080fd5b820490509050610a40526000610a6052610780610a2051600481106118dd57600080fd5b6020020151610a4051111561192657610a4051610780610a20516004811061190457600080fd5b60200201518082101561191657600080fd5b80820390509050610a605261195c565b610780610a20516004811061193a57600080fd5b6020020151610a40518082101561195057600080fd5b80820390509050610a60525b6102c051610a6051808202821582848304141761197857600080fd5b809050905090506402540be400808061199057600080fd5b820490509050610240610a2051600481106119aa57600080fd5b6020020152610780610a2051600481106119c357600080fd5b6020020151610240610a2051600481106119dc57600080fd5b60200201516102e05180820282158284830414176119f957600080fd5b809050905090506402540be4008080611a1157600080fd5b82049050905080821015611a2457600080fd5b80820390509050610a205160048110611a3c57600080fd5b600260c052602060c0200155610780610a205160048110611a5c57600080fd5b602002018051610240610a205160048110611a7657600080fd5b602002015180821015611a8857600080fd5b808203905090508152505b8151600101808352811415611872575b5050610140610a80525b610a8051516020610a805101610a8052610a20610a80511015611acf57611aad565b63198d58d8610aa052610ac0610400805182528060200151826020015280604001518260400152806060015182606001525050610b4061078080518252806020015182602001528060400151826040015280606001518260600152505061030051610bc052610bc051610ba051610b8051610b6051610b4051610b2051610b0051610ae051610ac0516006580161096f565b610c2052610a00610a80525b610a8051526020610a805103610a8052610140610a8051101515611b9057611b6d565b610c2051610a0052611bcf565b600260c052602060c0206107808051825580602001516001830155806040015160028301558060600151600383015550505b6000610c4052610360511515611bec5761082051610c4052611c41565b61036051610a00516105205180821015611c0557600080fd5b808203905090508082028215828483041417611c2057600080fd5b80905090509050610520518080611c3657600080fd5b820490509050610c40525b6308c379a0610c60526020610c80526014610ca0527f536c697070616765207363726577656420796f75000000000000000000000000610cc052610ca050608435610c40511015611c93576084610c7cfd5b610d0060006004818352015b60006004610d005160048110611cb457600080fd5b60200201351115611e72576101c0610d005160048110611cd357600080fd5b602002015115610140610d005160048110611ced57600080fd5b60200201511615611dae57610d005160048110611d0957600080fd5b600060c052602060c02001543b611d1f57600080fd5b610d005160048110611d3057600080fd5b600060c052602060c02001543018611d4757600080fd5b6000600060646323b872dd610e005233610e205230610e40526004610d005160048110611d7357600080fd5b6020020135610e6052610e1c6000610d005160048110611d9257600080fd5b600060c052602060c02001545af1611da957600080fd5b611e71565b610d005160048110611dbf57600080fd5b600060c052602060c02001543b611dd557600080fd5b610d005160048110611de657600080fd5b600060c052602060c02001543018611dfd57600080fd5b6020610de060646323b872dd610d205233610d405230610d60526004610d005160048110611e2a57600080fd5b6020020135610d8052610d3c6000610d005160048110611e4957600080fd5b600060c052602060c02001545af1611e6057600080fd5b600050610de051611e7057600080fd5b5b5b5b8151600101808352811415611c9f575b50506006543b611e9257600080fd5b6006543018611ea057600080fd5b6000600060446340c10f19610ec05233610ee052610c4051610f0052610edc60006006545af1611ecf57600080fd5b600435610f6052602435610f8052604435610fa052606435610fc05261024051610fe052610260516110005261028051611020526102a05161104052610820516110605261036051610c4051818183011015611f2a57600080fd5b8082019050905061108052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610f60a2600062ffffff55005b6000156123e2575b610220526101405261016052610180526101a0526101c0526101e052610200526000610140511215610160516101405114151660006101605112151660046101405112166004610160511216611fc457600080fd5b6101405161016051610180516101a0516101c0516101e051610200516102205161024051600658016100a9565b610280526102405261022052610200526101e0526101c0526101a05261018052610160526101405261028051610240526101406102c0525b6102c0515160206102c051016102c0526102c06102c051101561204b57612029565b63c763592c6102e0526103006101a0805182528060200151826020015280604001518260400152806060015182606001525050610240516103805261038051610360516103405161032051610300516006580161067d565b6103e0526102a06102c0525b6102c0515260206102c051036102c0526101406102c0511015156120d2576120af565b6103e0516102a0526102a05161040052600061042052610240516004808202821582848304141761210257600080fd5b809050905090506104405260006104605261048060006004818352015b6101405161048051141561213a576101805161046052612170565b6101605161048051181561216a576101a0610480516004811061215c57600080fd5b60200201516104605261216f565b6121ec565b5b61042080516104605181818301101561218857600080fd5b80820190509050815250610400516102a05180820282158284830414176121ae57600080fd5b8090509050905061046051600480820282158284830414176121cf57600080fd5b8090509050905080806121e157600080fd5b820490509050610400525b815160010180835281141561211f575b5050610400516102a051808202821582848304141761221a57600080fd5b80905090509050610440516004808202821582848304141761223b57600080fd5b80905090509050808061224d57600080fd5b82049050905061040052610420516102a05161044051808061226e57600080fd5b82049050905081818301101561228357600080fd5b808201905090506104a05260006104c0526102a0516104e052610500600060ff818352015b6104e0516104c0526104e0516104e05180820282158284830414176122cc57600080fd5b80905090509050610400518181830110156122e657600080fd5b8082019050905060026104e051808202821582848304141761230757600080fd5b809050905090506104a05181818301101561232157600080fd5b808201905090506102a0518082101561233957600080fd5b80820390509050808061234b57600080fd5b8204905090506104e0526104c0516104e05111156123925760016104e0516104c0518082101561237a57600080fd5b8082039050905011151561238d576123ce565b6123bd565b60016104c0516104e051808210156123a957600080fd5b808203905090501115156123bc576123ce565b5b5b81516001018083528114156122a8575b50506104e051600052600051610220515650005b635e0d443f60005114156127cf5734156123fb57600080fd5b6060516004358060405190131561241157600080fd5b809190121561241f57600080fd5b506060516024358060405190131561243657600080fd5b809190121561244457600080fd5b506101406101405161016051610180516101a05160065801610281565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e05110156124d5576124b3565b631db7662b610300526103206101408051825280602001518260200152806040015182604001528060600151826060015250506103805161036051610340516103205160065801610427565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561255c57612539565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606004356004811061259657600080fd5b6020020151604435610140600435600481106125b157600080fd5b602002015180820282158284830414176125ca57600080fd5b80905090509050670de0b6b3a764000080806125e557600080fd5b8204905090508181830110156125fa57600080fd5b80820190509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a051101561262f5761260d565b631e8c3fd36104c0526004356104e0526024356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611f6f565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a0511015156126cc576126a9565b6106005161048052610260602435600481106126e757600080fd5b602002015161048051808210156126fd57600080fd5b8082039050905060018082101561271357600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761273757600080fd5b809050905090506101406024356004811061275157600080fd5b6020020151808061276157600080fd5b8204905090506106205260035461062051808202821582848304141761278657600080fd5b809050905090506402540be400808061279e57600080fd5b820490509050610640526106205161064051808210156127bd57600080fd5b8082039050905060005260206000f350005b6307211ef76000511415612ba35734156127e857600080fd5b606051600435806040519013156127fe57600080fd5b809190121561280c57600080fd5b506060516024358060405190131561282357600080fd5b809190121561283157600080fd5b506101406101405161016051610180516101a05160065801610281565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e05110156128c2576128a0565b631db7662b610300526103206101408051825280602001518260200152806040015182604001528060600151826060015250506103805161036051610340516103205160065801610427565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561294957612926565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506104606001815264e8d4a51000816020015264e8d4a5100081604001526001816060015250610260600435600481106129a857600080fd5b6020020151604435610460600435600481106129c357600080fd5b602002015180820282158284830414176129dc57600080fd5b809050905090508181830110156129f257600080fd5b808201905090506104e052610140610520525b61052051516020610520510161052052610520610520511015612a2757612a05565b631e8c3fd36105405260043561056052602435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611f6f565b61068052610500610520525b6105205152602061052051036105205261014061052051101515612ac457612aa1565b610680516105005261026060243560048110612adf57600080fd5b60200201516105005180821015612af557600080fd5b80820390509050600180821015612b0b57600080fd5b8082039050905061046060243560048110612b2557600080fd5b60200201518080612b3557600080fd5b8204905090506106a0526003546106a0518082028215828483041417612b5a57600080fd5b809050905090506402540be4008080612b7257600080fd5b8204905090506106c0526106a0516106c05180821015612b9157600080fd5b8082039050905060005260206000f350005b600015613048575b610220526101405261016052610180526101a0526101c0526101e0526102005260115415612bd857600080fd5b6102406101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015612c0557612be3565b631db7662b6102e0526103006101a08051825280602001518260200152806040015182604001528060600151826060015250506103605161034051610320516103005160065801610427565b6103c0526103e05261040052610420526102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515612c8c57612c69565b6103c08051825280602001518260200152806040015182604001528060600151826060015250506102406101405160048110612cc757600080fd5b6020020151610180516101a06101405160048110612ce457600080fd5b60200201518082028215828483041417612cfd57600080fd5b80905090509050670de0b6b3a76400008080612d1857600080fd5b820490509050818183011015612d2d57600080fd5b8082019050905061044052610140610480525b61048051516020610480510161048052610480610480511015612d6257612d40565b631e8c3fd36104a052610140516104c052610160516104e052610440516105005261052061024080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c05160065801611f6f565b6105e052610460610480525b6104805152602061048051036104805261014061048051101515612e0157612dde565b6105e051610460526102406101605160048110612e1d57600080fd5b60200201516104605180821015612e3357600080fd5b8082039050905061060052610600516003548082028215828483041417612e5957600080fd5b809050905090506402540be4008080612e7157600080fd5b82049050905061062052610620516004548082028215828483041417612e9657600080fd5b809050905090506402540be4008080612eae57600080fd5b8204905090506106405261044051670de0b6b3a76400008082028215828483041417612ed957600080fd5b809050905090506101a06101405160048110612ef457600080fd5b60200201518080612f0457600080fd5b8204905090506101405160048110612f1b57600080fd5b600260c052602060c020015561046051610620516106405180821015612f4057600080fd5b80820390509050818183011015612f5657600080fd5b80820190509050670de0b6b3a76400008082028215828483041417612f7a57600080fd5b809050905090506101a06101605160048110612f9557600080fd5b60200201518080612fa557600080fd5b8204905090506101605160048110612fbc57600080fd5b600260c052602060c0200155610600516106205180821015612fdd57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761300157600080fd5b809050905090506101a0610160516004811061301c57600080fd5b6020020151808061302c57600080fd5b8204905090506106605261066051600052600051610220515650005b633df0212460005114156135e45762ffffff541561306557600080fd5b600162ffffff55341561307757600080fd5b6060516004358060405190131561308d57600080fd5b809190121561309b57600080fd5b50606051602435806040519013156130b257600080fd5b80919012156130c057600080fd5b506101406101405161016051610180516101a05160065801610281565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051632ce785a36102a0526004356102c0526024356102e0526044356103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051610300516102e0516102c05160065801612bab565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526308c379a061040052602061042052602e610440527f45786368616e676520726573756c74656420696e20666577657220636f696e73610460527f207468616e20657870656374656400000000000000000000000000000000000061048052610440506064356102605110156132645760a461041cfd5b6104c060008152600081602001526001816040015260008160600152506105406001815260018160200152600181604001526000816060015250610540600435600481106132b157600080fd5b6020020151156104c0600435600481106132ca57600080fd5b6020020151161561337357600435600481106132e557600080fd5b600060c052602060c02001543b6132fb57600080fd5b6004356004811061330b57600080fd5b600060c052602060c0200154301861332257600080fd5b6000600060646323b872dd6106a052336106c052306106e052604435610700526106bc60006004356004811061335757600080fd5b600060c052602060c02001545af161336e57600080fd5b61341e565b6004356004811061338357600080fd5b600060c052602060c02001543b61339957600080fd5b600435600481106133a957600080fd5b600060c052602060c020015430186133c057600080fd5b602061068060646323b872dd6105c052336105e0523061060052604435610620526105dc6000600435600481106133f657600080fd5b600060c052602060c02001545af161340d57600080fd5b6000506106805161341d57600080fd5b5b6105406024356004811061343157600080fd5b6020020151156104c06024356004811061344a57600080fd5b602002015116156134ef576024356004811061346557600080fd5b600060c052602060c02001543b61347b57600080fd5b6024356004811061348b57600080fd5b600060c052602060c020015430186134a257600080fd5b60006000604463a9059cbb610820523361084052610260516108605261083c6000602435600481106134d357600080fd5b600060c052602060c02001545af16134ea57600080fd5b613596565b602435600481106134ff57600080fd5b600060c052602060c02001543b61351557600080fd5b6024356004811061352557600080fd5b600060c052602060c0200154301861353c57600080fd5b6020610800604463a9059cbb610760523361078052610260516107a05261077c60006024356004811061356e57600080fd5b600060c052602060c02001545af161358557600080fd5b6000506108005161359557600080fd5b5b6004356108c0526044356108e052602435610900526102605161092052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806108c0a2600062ffffff55005b63a6417ed66000511415613fa25762ffffff541561360157600080fd5b600162ffffff55341561361357600080fd5b6060516004358060405190131561362957600080fd5b809190121561363757600080fd5b506060516024358060405190131561364e57600080fd5b809190121561365c57600080fd5b506101406101405161016051610180516101a05160065801610281565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606001815264e8d4a51000816020015264e8d4a5100081604001526001816060015250610140600435600481106136f857600080fd5b60200201516102606004356004811061371057600080fd5b6020020151808061372057600080fd5b8204905090506102e0526101406024356004811061373d57600080fd5b60200201516102606024356004811061375557600080fd5b6020020151808061376557600080fd5b82049050905061030052604435670de0b6b3a7640000808202821582848304141761378f57600080fd5b809050905090506102e05180806137a557600080fd5b82049050905061032052610140610360525b610360515160206103605101610360526103606103605110156137d9576137b7565b632ce785a3610380526004356103a0526024356103c052610320516103e052610400610140805182528060200151826020015280604001518260400152806060015182606001525050610460516104405161042051610400516103e0516103c0516103a05160065801612bab565b6104c052610340610360525b610360515260206103605103610360526101406103605110151561387657613853565b6104c051610340526103405161030051808202821582848304141761389a57600080fd5b80905090509050670de0b6b3a764000080806138b557600080fd5b8204905090506104e0526308c379a061050052602061052052602e610540527f45786368616e676520726573756c74656420696e20666577657220636f696e73610560527f207468616e20657870656374656400000000000000000000000000000000000061058052610540506064356104e05110156139365760a461051cfd5b6105c0600181526001816020015260018160400152600081606001525061064060008152600081602001526001816040015260008160600152506106406004356004811061398357600080fd5b602002015115613a2b576004356004811061399d57600080fd5b600160c052602060c02001543b6139b357600080fd5b600435600481106139c357600080fd5b600160c052602060c020015430186139da57600080fd5b6000600060646323b872dd6107a052336107c052306107e052604435610800526107bc600060043560048110613a0f57600080fd5b600160c052602060c02001545af1613a2657600080fd5b613ad6565b60043560048110613a3b57600080fd5b600160c052602060c02001543b613a5157600080fd5b60043560048110613a6157600080fd5b600160c052602060c02001543018613a7857600080fd5b602061078060646323b872dd6106c052336106e0523061070052604435610720526106dc600060043560048110613aae57600080fd5b600160c052602060c02001545af1613ac557600080fd5b60005061078051613ad557600080fd5b5b6105c060043560048110613ae957600080fd5b602002015115613c3a5760043560048110613b0357600080fd5b600160c052602060c02001543b613b1957600080fd5b60043560048110613b2957600080fd5b600160c052602060c02001543018613b4057600080fd5b6020610900604463095ea7b36108605260043560048110613b6057600080fd5b600060c052602060c0200154610880526044356108a05261087c600060043560048110613b8c57600080fd5b600160c052602060c02001545af1613ba357600080fd5b6000506109005060043560048110613bba57600080fd5b600060c052602060c02001543b613bd057600080fd5b60043560048110613be057600080fd5b600060c052602060c02001543018613bf757600080fd5b60006000602463b6b55f25610920526044356109405261093c600060043560048110613c2257600080fd5b600060c052602060c02001545af1613c3957600080fd5b5b6105c060243560048110613c4d57600080fd5b602002015115613df65760243560048110613c6757600080fd5b600060c052602060c02001543b613c7d57600080fd5b60243560048110613c8d57600080fd5b600060c052602060c02001543018613ca457600080fd5b600060006024632e1a7d4d6109a052610340516109c0526109bc600060243560048110613cd057600080fd5b600060c052602060c02001545af1613ce757600080fd5b60243560048110613cf757600080fd5b600160c052602060c02001543b613d0d57600080fd5b60243560048110613d1d57600080fd5b600160c052602060c02001543018613d3457600080fd5b6020610aa060246370a08231610a205230610a4052610a3c60243560048110613d5c57600080fd5b600160c052602060c02001545afa613d7357600080fd5b600050610aa0516104e0526308c379a0610ac0526020610ae052602e610b00527f45786368616e676520726573756c74656420696e20666577657220636f696e73610b20527f207468616e206578706563746564000000000000000000000000000000000000610b4052610b00506064356104e0511015613df55760a4610adcfd5b5b61064060243560048110613e0957600080fd5b602002015115613ead5760243560048110613e2357600080fd5b600160c052602060c02001543b613e3957600080fd5b60243560048110613e4957600080fd5b600160c052602060c02001543018613e6057600080fd5b60006000604463a9059cbb610c405233610c60526104e051610c8052610c5c600060243560048110613e9157600080fd5b600160c052602060c02001545af1613ea857600080fd5b613f54565b60243560048110613ebd57600080fd5b600160c052602060c02001543b613ed357600080fd5b60243560048110613ee357600080fd5b600160c052602060c02001543018613efa57600080fd5b6020610c20604463a9059cbb610b805233610ba0526104e051610bc052610b9c600060243560048110613f2c57600080fd5b600160c052602060c02001545af1613f4357600080fd5b600050610c2051613f5357600080fd5b5b600435610ce052604435610d0052602435610d20526104e051610d4052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610ce0a2600062ffffff55005b637d49d875600051141561443b5762ffffff5415613fbf57600080fd5b600162ffffff553415613fd157600080fd5b6006543b613fde57600080fd5b6006543018613fec57600080fd5b60206101c060046318160ddd6101605261017c6006545afa61400d57600080fd5b6000506101c051610140526101e0600081526000816020015260008160400152600081606001525061026060008152600081602001526000816040015260008160600152506102e0600081526000816020015260018160400152600081606001525061036060018152600181602001526001816040015260008160600152506103e060006004818352015b6103e051600481106140a957600080fd5b600260c052602060c020015460043580820282158284830414176140cc57600080fd5b809050905090506101405180806140e257600080fd5b820490509050610400526308c379a0610420526020610440526030610460527f5769746864726177616c20726573756c74656420696e20666577657220636f69610480527f6e73207468616e206578706563746564000000000000000000000000000000006104a0526104605060246103e0516004811061416257600080fd5b60200201356104005110156141785760a461043cfd5b6103e0516004811061418957600080fd5b600260c052602060c02001805461040051808210156141a757600080fd5b80820390509050815550610400516101e06103e051600481106141c957600080fd5b60200201526103606103e051600481106141e257600080fd5b6020020151156102e06103e051600481106141fc57600080fd5b602002015116156142a4576103e0516004811061421857600080fd5b600060c052602060c02001543b61422e57600080fd5b6103e0516004811061423f57600080fd5b600060c052602060c0200154301861425657600080fd5b60006000604463a9059cbb6105a052336105c052610400516105e0526105bc60006103e0516004811061428857600080fd5b600060c052602060c02001545af161429f57600080fd5b61434e565b6103e051600481106142b557600080fd5b600060c052602060c02001543b6142cb57600080fd5b6103e051600481106142dc57600080fd5b600060c052602060c020015430186142f357600080fd5b6020610580604463a9059cbb6104e052336105005261040051610520526104fc60006103e0516004811061432657600080fd5b600060c052602060c02001545af161433d57600080fd5b6000506105805161434d57600080fd5b5b5b8151600101808352811415614098575b50506006543b61436e57600080fd5b600654301861437c57600080fd5b6000600060446379cc67906106405233610660526004356106805261065c60006006545af16143aa57600080fd5b6101e0516106e052610200516107005261022051610720526102405161074052610260516107605261028051610780526102a0516107a0526102c0516107c05261014051600435808210156143fe57600080fd5b808203905090506107e052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d6101206106e0a2600062ffffff55005b6318a7bd766000511415614fde5762ffffff541561445857600080fd5b600162ffffff55341561446a57600080fd5b6011541561447757600080fd5b61014060008152600081602001526001816040015260008160600152506101c060018152600181602001526001816040015260008160600152506006543b6144be57600080fd5b60065430186144cc57600080fd5b60206102c060046318160ddd6102605261027c6006545afa6144ed57600080fd5b6000506102c051610240526000610240511161450857600080fd5b6003546004808202821582848304141761452157600080fd5b80905090509050600c808061453557600080fd5b8204905090506102e052600454610300526103206101406103a0525b6103a0515160206103a051016103a0526103a06103a051101561457357614551565b60065801610281565b6103c0526103e05261040052610420526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156145b757614594565b6103c0805182528060200151826020015280604001518260400152806060015182606001525050610140610460525b61046051516020610460510161046052610460610460511015614608576145e6565b600658016100a9565b61048052610440610460525b61046051526020610460510361046052610140610460511015156146405761461d565b61048051610440526104a060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506105206104a08051825280602001518260200152806040015182604001528060600151826060015250506101406105c0525b6105c0515160206105c051016105c0526105c06105c05110156146e5576146c3565b63198d58d86105e0526106006103208051825280602001518260200152806040015182604001528060600151826060015250506106806104a08051825280602001518260200152806040015182604001528060600151826060015250506104405161070052610700516106e0516106c0516106a05161068051610660516106405161062051610600516006580161096f565b610760526105a06105c0525b6105c0515260206105c051036105c0526101406105c0511015156147a657614783565b610760516105a05261078060006004818352015b61052061078051600481106147ce57600080fd5b602002018051600461078051600481106147e757600080fd5b6020020135808210156147f957600080fd5b808203905090508152505b81516001018083528114156147ba575b50506101406107c0525b6107c0515160206107c051016107c0526107c06107c05110156148405761481e565b63198d58d86107e0526108006103208051825280602001518260200152806040015182604001528060600151826060015250506108806105208051825280602001518260200152806040015182604001528060600151826060015250506104405161090052610900516108e0516108c0516108a05161088051610860516108405161082051610800516006580161096f565b610960526107a06107c0525b6107c0515260206107c051036107c0526101406107c051101515614901576148de565b610960516107a0526109806000815260008160200152600081604001526000816060015250610a0060006004818352015b6107a0516104a0610a00516004811061494a57600080fd5b6020020151808202821582848304141761496357600080fd5b809050905090506105a051808061497957600080fd5b820490509050610a20526000610a4052610520610a00516004811061499d57600080fd5b6020020151610a205111156149e657610a2051610520610a0051600481106149c457600080fd5b6020020151808210156149d657600080fd5b80820390509050610a4052614a1c565b610520610a0051600481106149fa57600080fd5b6020020151610a205180821015614a1057600080fd5b80820390509050610a40525b6102e051610a40518082028215828483041417614a3857600080fd5b809050905090506402540be4008080614a5057600080fd5b820490509050610980610a005160048110614a6a57600080fd5b6020020152610520610a005160048110614a8357600080fd5b6020020151610980610a005160048110614a9c57600080fd5b6020020151610300518082028215828483041417614ab957600080fd5b809050905090506402540be4008080614ad157600080fd5b82049050905080821015614ae457600080fd5b80820390509050610a005160048110614afc57600080fd5b600260c052602060c0200155610520610a005160048110614b1c57600080fd5b602002018051610980610a005160048110614b3657600080fd5b602002015180821015614b4857600080fd5b808203905090508152505b8151600101808352811415614932575b5050610140610a80525b610a8051516020610a805101610a8052610a80610a80511015614b8f57614b6d565b63198d58d8610aa052610ac0610320805182528060200151826020015280604001518260400152806060015182606001525050610b4061052080518252806020015182602001528060400151826040015280606001518260600152505061044051610bc052610bc051610ba051610b8051610b6051610b4051610b2051610b0051610ae051610ac0516006580161096f565b610c2052610a60610a80525b610a8051526020610a805103610a8052610140610a8051101515614c5057614c2d565b610c2051610a60526105a051610a605180821015614c6d57600080fd5b80820390509050610240518082028215828483041417614c8c57600080fd5b809050905090506105a0518080614ca257600080fd5b8204905090506001818183011015614cb957600080fd5b80820190509050610c40526308c379a0610c60526020610c80526014610ca0527f536c697070616765207363726577656420796f75000000000000000000000000610cc052610ca050608435610c40511115614d16576084610c7cfd5b610d0060006004818352015b60006004610d005160048110614d3757600080fd5b60200201351115614eeb576101c0610d005160048110614d5657600080fd5b602002015115610140610d005160048110614d7057600080fd5b60200201511615614e2c57610d005160048110614d8c57600080fd5b600060c052602060c02001543b614da257600080fd5b610d005160048110614db357600080fd5b600060c052602060c02001543018614dca57600080fd5b60006000604463a9059cbb610de05233610e00526004610d005160048110614df157600080fd5b6020020135610e2052610dfc6000610d005160048110614e1057600080fd5b600060c052602060c02001545af1614e2757600080fd5b614eea565b610d005160048110614e3d57600080fd5b600060c052602060c02001543b614e5357600080fd5b610d005160048110614e6457600080fd5b600060c052602060c02001543018614e7b57600080fd5b6020610dc0604463a9059cbb610d205233610d40526004610d005160048110614ea357600080fd5b6020020135610d6052610d3c6000610d005160048110614ec257600080fd5b600060c052602060c02001545af1614ed957600080fd5b600050610dc051614ee957600080fd5b5b5b5b8151600101808352811415614d22575b50506006543b614f0b57600080fd5b6006543018614f1957600080fd5b6000600060446379cc6790610e805233610ea052610c4051610ec052610e9c60006006545af1614f4857600080fd5b600435610f2052602435610f4052604435610f6052606435610f805261098051610fa0526109a051610fc0526109c051610fe0526109e051611000526107a0516110205261024051610c405180821015614fa157600080fd5b8082039050905061104052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610f20a2600062ffffff55005b633c157e646000511415615150573415614ff757600080fd5b600554331461500557600080fd5b6009546201518081818301101561501b57600080fd5b8082019050905042101561502e57600080fd5b426201518081818301101561504257600080fd5b80820190509050602435101561505757600080fd5b61014051600658016100a9565b61018052610140526101805161014052620f4240600435106000600435111661508c57600080fd5b61014051600435600a80820282158284830414176150a957600080fd5b80905090509050101561014051600435101661014051600a80820282158284830414176150d557600080fd5b80905090509050600435111561014051600435101516176150f557600080fd5b6101405160075560043560085542600955602435600a55610140516101a0526004356101c052426101e052602435610200527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c25460806101a0a1005b63551a658860005114156151e057341561516957600080fd5b600554331461517757600080fd5b61014051600658016100a9565b6101805261014052610180516101405261014051600755610140516008554260095542600a55610140516101a052426101c0527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc20193860406101a0a1005b635b5a146760005114156152a95734156151f957600080fd5b600554331461520757600080fd5b600b541561521457600080fd5b64012a05f200602435111561522857600080fd5b64012a05f200600435111561523c57600080fd5b426203f48081818301101561525057600080fd5b808201905090506101405261014051600b55600435600d55602435600e556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9760005114156153405734156152c257600080fd5b60055433146152d057600080fd5b6000600b541142600b541115166152e657600080fd5b6000600b55600d5461014052600e546101605261014051600355610160516004556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb600051141561536e57341561535957600080fd5b600554331461536757600080fd5b6000600b55005b636b441a40600051141561540f57341561538757600080fd5b600435602051811061539857600080fd5b5060055433146153a757600080fd5b600c54156153b457600080fd5b426203f4808181830110156153c857600080fd5b808201905090506101405261014051600c55600435600f55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae600051141561548b57341561542857600080fd5b600554331461543657600080fd5b6000600c5411600c544210151661544c57600080fd5b6000600c55600f546101405261014051600555610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19360005114156154b95734156154a457600080fd5b60055433146154b257600080fd5b6000600c55005b6330c5408560005114156156f85734156154d257600080fd5b60055433146154e057600080fd5b6101406001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101c0600081526000816020015260018160400152600081606001525061024060018152600181602001526001816040015260008160600152506102c060006004818352015b6102c0516004811061555c57600080fd5b600060c052602060c02001546102e0526102e0513b61557a57600080fd5b6102e051301861558957600080fd5b60206103a060246370a0823161032052306103405261033c6102e0515afa6155b057600080fd5b6000506103a0516102c051600481106155c857600080fd5b600260c052602060c0200154808210156155e157600080fd5b808203905090506103005260006103005111156156e3576102406102c0516004811061560c57600080fd5b6020020151156101c06102c0516004811061562657600080fd5b60200201511615615683576102e0513b61563f57600080fd5b6102e051301861564e57600080fd5b60006000604463a9059cbb61048052336104a052610300516104c05261049c60006102e0515af161567e57600080fd5b6156e2565b6102e0513b61569157600080fd5b6102e05130186156a057600080fd5b6020610460604463a9059cbb6103c052336103e05261030051610400526103dc60006102e0515af16156d157600080fd5b600050610460516156e157600080fd5b5b5b5b815160010180835281141561554b575b5050005b63e3698853600051141561573457341561571157600080fd5b600554331461571f57600080fd5b426010541161572d57600080fd5b6001601155005b633046f972600051141561576257341561574d57600080fd5b600554331461575b57600080fd5b6000601155005b6323746eb860005114156157c757341561577b57600080fd5b6060516004358060405190131561579157600080fd5b809190121561579f57600080fd5b50600435600481106157b057600080fd5b600060c052602060c020015460005260206000f350005b63b739953e600051141561582c5734156157e057600080fd5b606051600435806040519013156157f657600080fd5b809190121561580457600080fd5b506004356004811061581557600080fd5b600160c052602060c020015460005260206000f350005b63065a80d8600051141561589157341561584557600080fd5b6060516004358060405190131561585b57600080fd5b809190121561586957600080fd5b506004356004811061587a57600080fd5b600260c052602060c020015460005260206000f350005b63ddca3f4360005114156158b85734156158aa57600080fd5b60035460005260206000f350005b63fee3f7f960005114156158df5734156158d157600080fd5b60045460005260206000f350005b638da5cb5b60005114156159065734156158f857600080fd5b60055460005260206000f350005b635409491a600051141561592d57341561591f57600080fd5b60075460005260206000f350005b63b4b577ad600051141561595457341561594657600080fd5b60085460005260206000f350005b632081066c600051141561597b57341561596d57600080fd5b60095460005260206000f350005b631405228860005114156159a257341561599457600080fd5b600a5460005260206000f350005b63405e28f860005114156159c95734156159bb57600080fd5b600b5460005260206000f350005b63e0a0b58660005114156159f05734156159e257600080fd5b600c5460005260206000f350005b6358680d0b6000511415615a17573415615a0957600080fd5b600d5460005260206000f350005b63e38244626000511415615a3e573415615a3057600080fd5b600e5460005260206000f350005b631ec0cdc16000511415615a65573415615a5757600080fd5b600f5460005260206000f350005b5b60006000fd

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000099d1fa417f94dcd62bfe781a1213c092a47041bc0000000000000000000000009777d7e2b60bb01759d0e2f8be2095df444cb07e0000000000000000000000001be5d71f2da660bfdee8012ddc58d024448a0a590000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e10000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e1000000000000000000000000d905e2eaebe188fc92179b6350807d8bd91db0d800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000003d0900

-----Decoded View---------------
Arg [0] : _coins (address[4]): 0x99d1Fa417f94dcD62BfE781a1213c092a47041Bc,0x9777d7E2b60bB01759D0E2f8be2095df444cb07E,0x1bE5d71F2dA660BFdee8012dDc58D024448A0A59,0x8E870D67F660D95d5be530380D0eC0bd388289E1
Arg [1] : _underlying_coins (address[4]): 0x6B175474E89094C44Da98b954EedeAC495271d0F,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7,0x8E870D67F660D95d5be530380D0eC0bd388289E1
Arg [2] : _pool_token (address): 0xD905e2eaeBe188fc92179b6350807D8bd91Db0D8
Arg [3] : _A (uint256): 200
Arg [4] : _fee (uint256): 4000000

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000099d1fa417f94dcd62bfe781a1213c092a47041bc
Arg [1] : 0000000000000000000000009777d7e2b60bb01759d0e2f8be2095df444cb07e
Arg [2] : 0000000000000000000000001be5d71f2da660bfdee8012ddc58d024448a0a59
Arg [3] : 0000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e1
Arg [4] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [5] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [6] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [7] : 0000000000000000000000008e870d67f660d95d5be530380d0ec0bd388289e1
Arg [8] : 000000000000000000000000d905e2eaebe188fc92179b6350807d8bd91db0d8
Arg [9] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [10] : 00000000000000000000000000000000000000000000000000000000003d0900


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Curve.fi's PAX swap address.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.