ETH Price: $3,072.14 (+0.76%)
Gas: 4 Gwei

Contract

0x4571753311E37dDb44faA8Fb78a6dF9a6E3c6C0B
 
Transaction Hash
Method
Block
From
To
Value
Remove_liquidity...202497132024-07-06 19:59:352 days ago1720295975IN
0x45717533...a6E3c6C0B
0 ETH0.001638831.40746318
Remove_liquidity202474702024-07-06 12:29:353 days ago1720268975IN
0x45717533...a6E3c6C0B
0 ETH0.000360582.05442132
Remove_liquidity201469992024-06-22 11:38:3517 days ago1719056315IN
0x45717533...a6E3c6C0B
0 ETH0.000644723.07447262
Remove_liquidity...198970032024-05-18 13:03:3551 days ago1716037415IN
0x45717533...a6E3c6C0B
0 ETH0.003962143.3655888
Remove_liquidity...186974812023-12-02 8:19:47220 days ago1701505187IN
0x45717533...a6E3c6C0B
0 ETH0.0396354833.84584509
Remove_liquidity185221262023-11-07 19:20:11244 days ago1699384811IN
0x45717533...a6E3c6C0B
0 ETH0.0059681928.4519681
Remove_liquidity...175656432023-06-26 19:23:11378 days ago1687807391IN
0x45717533...a6E3c6C0B
0 ETH0.0141800212
Exchange175183112023-06-20 3:43:35385 days ago1687232615IN
0x45717533...a6E3c6C0B
0 ETH0.0148672813.61426429
Remove_liquidity168790752023-03-21 22:48:47475 days ago1679438927IN
0x45717533...a6E3c6C0B
0 ETH0.0033300915.88
Remove_liquidity...168297272023-03-15 0:23:47482 days ago1678839827IN
0x45717533...a6E3c6C0B
0 ETH0.0262296821.44398557
Remove_liquidity167113602023-02-26 8:56:11499 days ago1677401771IN
0x45717533...a6E3c6C0B
0 ETH0.0057781230
Remove_liquidity...166059472023-02-11 13:54:47513 days ago1676123687IN
0x45717533...a6E3c6C0B
0 ETH0.0193648816.1
Remove_liquidity...160888372022-12-01 8:42:59586 days ago1669884179IN
0x45717533...a6E3c6C0B
0 ETH0.011040239.17828971
Remove_liquidity...160231272022-11-22 4:21:11595 days ago1669090871IN
0x45717533...a6E3c6C0B
0 ETH0.010808529.01
Remove_liquidity157738992022-10-18 8:48:11630 days ago1666082891IN
0x45717533...a6E3c6C0B
0 ETH0.0057799230
Remove_liquidity...154428982022-08-30 22:09:37678 days ago1661897377IN
0x45717533...a6E3c6C0B
0 ETH0.0241860420
Remove_liquidity...151585602022-07-17 6:23:39723 days ago1658039019IN
0x45717533...a6E3c6C0B
0 ETH0.008122346.71662373
Remove_liquidity...150673692022-07-03 4:16:00737 days ago1656821760IN
0x45717533...a6E3c6C0B
0 ETH0.011009349
Remove_liquidity148424552022-05-25 14:45:24775 days ago1653489924IN
0x45717533...a6E3c6C0B
0 ETH0.0069202539.49285907
Remove_liquidity...147979852022-05-18 9:12:17783 days ago1652865137IN
0x45717533...a6E3c6C0B
0 ETH0.0241229420
Remove_liquidity143783642022-03-13 12:41:20849 days ago1647175280IN
0x45717533...a6E3c6C0B
0 ETH0.0040274619.2
Exchange143688882022-03-12 1:06:50850 days ago1647047210IN
0x45717533...a6E3c6C0B
0 ETH0.0233675620.98306872
Remove_liquidity...142629462022-02-23 14:39:55866 days ago1645627195IN
0x45717533...a6E3c6C0B
0 ETH0.061669351
Remove_liquidity...142624182022-02-23 12:51:51867 days ago1645620711IN
0x45717533...a6E3c6C0B
0 ETH0.0483656840
Remove_liquidity...141523862022-02-06 12:01:04884 days ago1644148864IN
0x45717533...a6E3c6C0B
0 ETH0.0435291136
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)

# ███████╗███╗   ██╗ ██████╗ ██╗    ██╗███████╗██╗    ██╗ █████╗ ██████╗ 
# ██╔════╝████╗  ██║██╔═══██╗██║    ██║██╔════╝██║    ██║██╔══██╗██╔══██╗
# ███████╗██╔██╗ ██║██║   ██║██║ █╗ ██║███████╗██║ █╗ ██║███████║██████╔╝
# ╚════██║██║╚██╗██║██║   ██║██║███╗██║╚════██║██║███╗██║██╔══██║██╔═══╝ 
# ███████║██║ ╚████║╚██████╔╝╚███╔███╔╝███████║╚███╔███╔╝██║  ██║██║     
# ╚══════╝╚═╝  ╚═══╝ ╚═════╝  ╚══╝╚══╝ ╚══════╝ ╚══╝╚══╝ ╚═╝  ╚═╝╚═╝     
# 
# SnowSwap yVault DAI, USDC, USDT, TUSD Pool
# 
# Forked from Curve.fi       
# 
# WARNING: While Curve contracts are audited, SnowSwap is not. Use at your own risk!
# 
# Do not deposit funds you cannot afford to lose. 



# 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 yvERC20:
    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


# import yvERC20 as yvERC20
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

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

FEE_DENOMINATOR: constant(uint256) = 10 ** 10
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(10 ** 18, uint256),  # DAI
#     PRECISION / convert(10 ** 6, uint256),   # USDC
#     PRECISION / convert(10 ** 6, uint256),   # USDT
#     PRECISION / convert(10 ** 18, uint256)]  # TUSD

admin_actions_delay: constant(uint256) = 3 * 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)})
CommitNewParameters: event({deadline: indexed(timestamp), A: uint256, fee: uint256, admin_fee: uint256})
NewParameters: event({A: uint256, fee: uint256, admin_fee: uint256})

coins: public(address[N_COINS])
underlying_coins: public(address[N_COINS])
balances: public(uint256[N_COINS])
A: public(uint256)  # 2 x amplification coefficient
fee: public(uint256)  # fee * 1e10
admin_fee: public(uint256)  # admin_fee * 1e10
max_admin_fee: constant(uint256) = 5 * 10 ** 9

owner: public(address)
token: ERC20m

admin_actions_deadline: public(timestamp)
transfer_ownership_deadline: public(timestamp)
future_A: public(uint256)
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 contracts 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.A = _A
    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)


@private
@constant
def _stored_rates() -> uint256[N_COINS]:
    result: uint256[N_COINS] = PRECISION_MUL
    for i in range(N_COINS):
        result[i] *= yvERC20(self.coins[i]).getPricePerFullShare()
    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]) -> uint256:
    S: uint256 = 0
    for _x in xp:
        S += _x
    if S == 0:
        return 0

    Dprev: uint256 = 0
    D: uint256 = S
    Ann: uint256 = self.A * N_COINS
    for _i in range(255):
        D_P: uint256 = D
        for _x in xp:
            D_P = D_P * D / (_x * N_COINS + 1)  # +1 is to prevent /0
        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]) -> uint256:
    return self.get_D(self._xp_mem(rates, _balances))


@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._stored_rates()))
    # 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._stored_rates()
    D0: uint256 = self.get_D_mem(rates, _balances)
    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)
    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

    fees: uint256[N_COINS] = ZEROS
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee

    token_supply: uint256 = self.token.totalSupply()
    rates: uint256[N_COINS] = self._stored_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)
    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)
    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)
    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):
        assert_modifiable(
            yvERC20(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)

    D: uint256 = self.get_D(_xp)
    c: uint256 = D
    S_: uint256 = 0
    Ann: uint256 = self.A * 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._stored_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) * PRECISION / rates[j]
    _fee: uint256 = self.fee * dy / FEE_DENOMINATOR
    return dy - _fee


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

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

# TODO: update these to take into account withdrawal fees
@public
@constant
def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in underlying units
    rates: uint256[N_COINS] = self._stored_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) / precisions[j]
    _fee: uint256 = self.fee * dy / FEE_DENOMINATOR
    vault_fee: uint256 = 0

    balance_underlying: uint256 = ERC20(self.underlying_coins[j]).balanceOf(self.coins[j])
    # if withdrawal fee will be incurred, pass fee onto user
    # improved precision based on yVault contract logic
    # r: uint256 = (yvERC20(self.coins[j]).balance * dy_) / yvERC20(self.coins[j]).totalSupply()
    if balance_underlying < dy:
        # integer maths
        vault_fee = (5 * dy) / 1000

    return dy - _fee - vault_fee


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

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


@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._stored_rates()
    dy: uint256 = self._exchange(i, j, dx, rates)
    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"

    assert_modifiable(yvERC20(self.coins[i]).transferFrom(msg.sender, self, dx))

    assert_modifiable(yvERC20(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._stored_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"
    tethered: bool[N_COINS] = TETHERED

    # check that yVault token contract has sufficient balance
    # if it doesn't, we will incur a 0.5% withdrawal fee
    balance_underlying: uint256 = ERC20(self.underlying_coins[j]).balanceOf(self.coins[j])
    # if withdrawal fee will be incurred, pass fee onto user
    if balance_underlying < dy_:
        # integer maths
        dy = (995 * dy) / 1000

    ok: uint256 = 0 #wtf is this? its never used
    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))
    ERC20(self.underlying_coins[i]).approve(self.coins[i], dx)
    yvERC20(self.coins[i]).deposit(dx)
    yvERC20(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

    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
        assert_modifiable(yvERC20(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

    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._stored_rates()

    old_balances: uint256[N_COINS] = self.balances
    new_balances: uint256[N_COINS] = old_balances
    D0: uint256 = self.get_D_mem(rates, old_balances)
    for i in range(N_COINS):
        new_balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(rates, new_balances)
    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)

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

    for i in range(N_COINS):
        assert_modifiable(yvERC20(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 commit_new_parameters(amplification: uint256,
                          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

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

    log.CommitNewParameters(_deadline, amplification, new_fee, new_admin_fee)


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

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

    log.NewParameters(_A, _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

    for i in range(N_COINS):
        c: address = self.coins[i]
        value: uint256 = yvERC20(c).balanceOf(self) - self.balances[i]
        if value > 0:
            assert_modifiable(yvERC20(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":"CommitNewParameters","inputs":[{"type":"uint256","name":"deadline","indexed":true,"unit":"sec"},{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewParameters","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"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":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":1535185},{"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":6067881},{"name":"add_liquidity","outputs":[],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"uint256","name":"min_mint_amount"}],"constant":false,"payable":false,"type":"function","gas":9327083},{"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":3454227},{"name":"get_dx","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"constant":true,"payable":false,"type":"function","gas":3454232},{"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":3459430},{"name":"get_dx_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"constant":true,"payable":false,"type":"function","gas":3454093},{"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":7030208},{"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":7055355},{"name":"remove_liquidity","outputs":[],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[4]","name":"min_amounts"}],"constant":false,"payable":false,"type":"function","gas":240409},{"name":"remove_liquidity_imbalance","outputs":[],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"uint256","name":"max_burn_amount"}],"constant":false,"payable":false,"type":"function","gas":9326310},{"name":"commit_new_parameters","outputs":[],"inputs":[{"type":"uint256","name":"amplification"},{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_admin_fee"}],"constant":false,"payable":false,"type":"function","gas":145867},{"name":"apply_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":133482},{"name":"revert_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21805},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"constant":false,"payable":false,"type":"function","gas":74482},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":60538},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21895},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":22667},{"name":"kill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":37848},{"name":"unkill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21985},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2160},{"name":"underlying_coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2190},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2220},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2051},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2081},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2111},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2141},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2171},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","unit":"sec","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":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2261},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2291},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2321}]

740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526101606159366101403934156100a257600080fd5b602061593660c03960c05160205181106100bb57600080fd5b50602060206159360160c03960c05160205181106100d857600080fd5b50602060406159360160c03960c05160205181106100f557600080fd5b50602060606159360160c03960c051602051811061011257600080fd5b50602060806159360160c03960c051602051811061012f57600080fd5b50602060a06159360160c03960c051602051811061014c57600080fd5b50602060c06159360160c03960c051602051811061016957600080fd5b50602060e06159360160c03960c051602051811061018657600080fd5b5060206101006159360160c03960c05160205181106101a457600080fd5b506102a060006004818352015b60006101406102a051600481106101c757600080fd5b6020020151186101d657600080fd5b60006101c06102a051600481106101ec57600080fd5b6020020151186101fb57600080fd5b60006102a0516004811061020e57600080fd5b600260c052602060c02001555b81516001018083528114156101b1575b5050600060c052602060c020610140805182558060200151600183015580604001516002830155806060015160038301555050600160c052602060c0206101c0805182558060200151600183015580604001516002830155806060015160038301555050610260516003556102805160045560006005553360065542624f1a008181830110156102ba57600080fd5b80820190509050600e556000600f556102405160075561591e56600436101561000d57615643565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526000156101f6575b610140526101606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101e060006004818352015b6101606101e051600481106100f257600080fd5b6020020180516101e0516004811061010957600080fd5b600060c052602060c02001543b61011f57600080fd5b6101e0516004811061013057600080fd5b600060c052602060c0200154301861014757600080fd5b602061026060046377c7b8fc6102005261021c6101e0516004811061016b57600080fd5b600060c052602060c02001545afa61018257600080fd5b60005061026051808202821582848304141761019d57600080fd5b809050905090508152505b81516001018083528114156100de575b50506080610280525b6000610280511115156101d3576101ef565b60206102805103610160015160206102805103610280526101c1565b6101405156005b60001561031b575b6101c0526101405261016052610180526101a0526101e061014080518252806020015182602001528060400151826040015280606001518260600152505061026060006004818352015b6101e0610260516004811061025c57600080fd5b6020020151610260516004811061027257600080fd5b600260c052602060c0200154808202821582848304141761029257600080fd5b80905090509050670de0b6b3a764000080806102ad57600080fd5b8204905090506101e061026051600481106102c757600080fd5b60200201525b8151600101808352811415610248575b50506080610280525b6000610280511115156102f857610314565b602061028051036101e0015160206102805103610280526102e6565b6101c05156005b60001561044c575b610240526101405261016052610180526101a0526101c0526101e05261020052610220526102606101408051825280602001518260200152806040015182604001528060600151826060015250506102e060006004818352015b6102606102e0516004811061039157600080fd5b60200201516101c06102e051600481106103aa57600080fd5b602002015180820282158284830414176103c357600080fd5b80905090509050670de0b6b3a764000080806103de57600080fd5b8204905090506102606102e051600481106103f857600080fd5b60200201525b815160010180835281141561037d575b50506080610300525b60006103005111151561042957610445565b6020610300510361026001516020610300510361030052610417565b6102405156005b600015610751575b6101c0526101405261016052610180526101a05260006101e05261022060006004818352015b602061022051026101400151610200526101e08051610200518181830110156104a257600080fd5b808201905090508152505b815160010180835281141561047a575b50506101e05115156104d85760006000526000516101c05156505b6000610260526101e05161028052600354600480820282158284830414176104ff57600080fd5b809050905090506102a0526102c0600060ff818352015b610280516102e05261032060006004818352015b602061032051026101400151610300526102e05161028051808202821582848304141761055657600080fd5b80905090509050610300516004808202821582848304141761057757600080fd5b80905090509050600181818301101561058f57600080fd5b8082019050905080806105a157600080fd5b8204905090506102e0525b815160010180835281141561052a575b505061028051610260526102a0516101e05180820282158284830414176105e257600080fd5b809050905090506102e0516004808202821582848304141761060357600080fd5b8090509050905081818301101561061957600080fd5b8082019050905061028051808202821582848304141761063857600080fd5b809050905090506102a05160018082101561065257600080fd5b8082039050905061028051808202821582848304141761067157600080fd5b8090509050905060056102e051808202821582848304141761069257600080fd5b809050905090508181830110156106a857600080fd5b8082019050905080806106ba57600080fd5b82049050905061028052610260516102805111156107015760016102805161026051808210156106e957600080fd5b808203905090501115156106fc5761073d565b61072c565b600161026051610280518082101561071857600080fd5b8082039050905011151561072b5761073d565b5b5b8151600101808352811415610516575b5050610280516000526000516101c0515650005b60001561091f575b610240526101405261016052610180526101a0526101c0526101e0526102005261022052610140610660525b610660515160206106605101610660526106606106605110156107a757610785565b6305eb8fa6610680526106a0610140610460525b610460515160206104605101610460526104606104605110156107dd576107bb565b6342d3b3c3610480526104a06101408051825280602001518260200152806040015182604001528060600151826060015250506105206101c080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a05160065801610323565b6105e052610600526106205261064052610440610460525b610460515260206104605103610460526101406104605110151561089e5761087b565b6105e0805182528060200151826020015280604001518260400152806060015182606001525050610700516106e0516106c0516106a05160065801610454565b61076052610640610660525b610660515260206106605103610660526101406106605110151561090d576108ea565b61076051600052600051610240515650005b63bb7b8b806000511415610b9357341561093857600080fd5b6101406106e0525b6106e0515160206106e051016106e0526106e06106e051101561096257610940565b6305eb8fa661070052610720610140610560525b6105605151602061056051016105605261056061056051101561099857610976565b631db7662b610580526105a06101406104c0525b6104c0515160206104c051016104c0526104c06104c05110156109ce576109ac565b600658016100a9565b6104e0526105005261052052610540526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515610a12576109ef565b6104e0805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a051600658016101fe565b61066052610680526106a0526106c052610540610560525b6105605152602061056051036105605261014061056051101515610a8d57610a6a565b6106608051825280602001518260200152806040015182604001528060600151826060015250506107805161076051610740516107205160065801610454565b6107e0526106c06106e0525b6106e0515260206106e051036106e0526101406106e051101515610afc57610ad9565b6107e051610140526007543b610b1157600080fd5b6007543018610b1f57600080fd5b602061088060046318160ddd6108205261083c6007545afa610b4057600080fd5b600050610880516108005261014051670de0b6b3a76400008082028215828483041417610b6c57600080fd5b80905090509050610800518080610b8257600080fd5b82049050905060005260206000f350005b63cf701ff76000511415610ff6573415610bac57600080fd5b60843560028110610bbc57600080fd5b5061014060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101c06101405161016051610180516101a0516101c0516101e0516102005161022051600658016100a9565b61026052610280526102a0526102c05261022052610200526101e0526101c0526101a052610180526101605261014052610260805182528060200151826020015280604001518260400152806060015182606001525050610140610300525b61030051516020610300510161030052610300610300511015610cb357610c91565b631f30ab74610320526103406101c08051825280602001518260200152806040015182604001528060600151826060015250506103c061014080518252806020015182602001528060400151826040015280606001518260600152505061042051610400516103e0516103c0516103a05161038051610360516103405160065801610759565b610480526102e0610300525b6103005152602061030051036103005261014061030051101515610d6857610d45565b610480516102e0526104a060006004818352015b60843515610dd4576101406104a05160048110610d9857600080fd5b60200201805160046104a05160048110610db157600080fd5b6020020135818183011015610dc557600080fd5b80820190509050815250610e1e565b6101406104a05160048110610de857600080fd5b60200201805160046104a05160048110610e0157600080fd5b602002013580821015610e1357600080fd5b808203905090508152505b5b8151600101808352811415610d7c575b50506101406104e0525b6104e0515160206104e051016104e0526104e06104e0511015610e5b57610e39565b631f30ab74610500526105206101c08051825280602001518260200152806040015182604001528060600151826060015250506105a0610140805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a0516105805161056051610540516105205160065801610759565b610660526104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515610f1057610eed565b610660516104c0526007543b610f2557600080fd5b6007543018610f3357600080fd5b602061070060046318160ddd6106a0526106bc6007545afa610f5457600080fd5b600050610700516106805260006107205260843515610f92576104c0516102e05180821015610f8257600080fd5b8082039050905061072052610fb3565b6102e0516104c05180821015610fa757600080fd5b80820390509050610720525b61072051610680518082028215828483041417610fcf57600080fd5b809050905090506102e0518080610fe557600080fd5b82049050905060005260206000f350005b63029b2f346000511415611a785762ffffff541561101357600080fd5b600162ffffff55341561102557600080fd5b600f541561103257600080fd5b61014060008152600081602001526000816040015260008160600152506004546004808202821582848304141761106857600080fd5b80905090509050600c808061107c57600080fd5b8204905090506101c0526005546101e0526007543b61109a57600080fd5b60075430186110a857600080fd5b602061028060046318160ddd6102205261023c6007545afa6110c957600080fd5b60005061028051610200526102a0610140610320525b61032051516020610320510161032052610320610320511015611101576110df565b600658016100a9565b6103405261036052610380526103a052610300610320525b610320515260206103205103610320526101406103205110151561114557611122565b61034080518252806020015182602001528060400151826040015280606001518260600152505060006103c0526103e060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006102005111156112af57610140610460525b610460515160206104605101610460526104606104605110156111f1576111cf565b631f30ab74610480526104a06102a08051825280602001518260200152806040015182604001528060600151826060015250506105206103e080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a05160065801610759565b6105e052610440610460525b61046051526020610460510361046052610140610460511015156112a657611283565b6105e0516103c0525b6106006103e080518252806020015182602001528060400151826040015280606001518260600152505061068060006004818352015b6102005115156113145760006004610680516004811061130457600080fd5b60200201351161131357600080fd5b5b6103e0610680516004811061132857600080fd5b60200201516004610680516004811061134057600080fd5b602002013581818301101561135457600080fd5b80820190509050610600610680516004811061136f57600080fd5b60200201525b81516001018083528114156112e5575b50506101406106c0525b6106c0515160206106c051016106c0526106c06106c05110156113b15761138f565b631f30ab746106e0526107006102a08051825280602001518260200152806040015182604001528060600151826060015250506107806106008051825280602001518260200152806040015182604001528060600151826060015250506107e0516107c0516107a051610780516107605161074051610720516107005160065801610759565b610840526106a06106c0525b6106c0515260206106c051036106c0526101406106c05110151561146657611443565b610840516106a0526103c0516106a0511161148057600080fd5b6106a0516108605260006102005111156117bf5761088060006004818352015b6106a0516103e061088051600481106114b857600080fd5b602002015180820282158284830414176114d157600080fd5b809050905090506103c05180806114e757600080fd5b8204905090506108a05260006108c052610600610880516004811061150b57600080fd5b60200201516108a0511115611554576108a051610600610880516004811061153257600080fd5b60200201518082101561154457600080fd5b808203905090506108c05261158a565b610600610880516004811061156857600080fd5b60200201516108a0518082101561157e57600080fd5b808203905090506108c0525b6101c0516108c05180820282158284830414176115a657600080fd5b809050905090506402540be40080806115be57600080fd5b82049050905061014061088051600481106115d857600080fd5b602002015261060061088051600481106115f157600080fd5b6020020151610140610880516004811061160a57600080fd5b60200201516101e051808202821582848304141761162757600080fd5b809050905090506402540be400808061163f57600080fd5b8204905090508082101561165257600080fd5b80820390509050610880516004811061166a57600080fd5b600260c052602060c0200155610600610880516004811061168a57600080fd5b60200201805161014061088051600481106116a457600080fd5b6020020151808210156116b657600080fd5b808203905090508152505b81516001018083528114156114a0575b50506101406108e0525b6108e0515160206108e051016108e0526108806108e05110156116fd576116db565b631f30ab74610900526109206102a08051825280602001518260200152806040015182604001528060600151826060015250506109a0610600805182528060200151826020015280604001518260400152806060015182606001525050610a00516109e0516109c0516109a0516109805161096051610940516109205160065801610759565b610a60526108606108e0525b6108e0515260206108e051036108e0526101406108e0511015156117b25761178f565b610a6051610860526117f1565b600260c052602060c0206106008051825580602001516001830155806040015160028301558060600151600383015550505b6000610a805261020051151561180e576106a051610a8052611863565b61020051610860516103c0518082101561182757600080fd5b80820390509050808202821582848304141761184257600080fd5b809050905090506103c051808061185857600080fd5b820490509050610a80525b6308c379a0610aa0526020610ac0526014610ae0527f536c697070616765207363726577656420796f75000000000000000000000000610b0052610ae050608435610a805110156118b5576084610abcfd5b610b4060006004818352015b610b4051600481106118d257600080fd5b600060c052602060c02001543b6118e857600080fd5b610b4051600481106118f957600080fd5b600060c052602060c0200154301861191057600080fd5b6020610c2060646323b872dd610b605233610b805230610ba0526004610b40516004811061193d57600080fd5b6020020135610bc052610b7c6000610b40516004811061195c57600080fd5b600060c052602060c02001545af161197357600080fd5b600050610c205161198357600080fd5b5b81516001018083528114156118c1575b50506007543b6119a357600080fd5b60075430186119b157600080fd5b6000600060446340c10f19610c405233610c6052610a8051610c8052610c5c60006007545af16119e057600080fd5b600435610ce052602435610d0052604435610d2052606435610d405261014051610d605261016051610d805261018051610da0526101a051610dc0526106a051610de05261020051610a8051818183011015611a3b57600080fd5b80820190509050610e0052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610ce0a2600062ffffff55005b600015611e7c575b610220526101405261016052610180526101a0526101c0526101e052610200526000610140511215610160516101405114151660006101605112151660046101405112166004610160511216611ad557600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610240516305eb8fa6610280526102a06101a0805182528060200151826020015280604001518260400152806060015182606001525050610300516102e0516102c0516102a05160065801610454565b610360526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103605161024052610240516103805260006103a05260035460048082028215828483041417611b9c57600080fd5b809050905090506103c05260006103e05261040060006004818352015b61014051610400511415611bd457610180516103e052611c0a565b61016051610400511815611c04576101a06104005160048110611bf657600080fd5b60200201516103e052611c09565b611c86565b5b6103a080516103e051818183011015611c2257600080fd5b8082019050905081525061038051610240518082028215828483041417611c4857600080fd5b809050905090506103e05160048082028215828483041417611c6957600080fd5b809050905090508080611c7b57600080fd5b820490509050610380525b8151600101808352811415611bb9575b505061038051610240518082028215828483041417611cb457600080fd5b809050905090506103c05160048082028215828483041417611cd557600080fd5b809050905090508080611ce757600080fd5b820490509050610380526103a051610240516103c0518080611d0857600080fd5b820490509050818183011015611d1d57600080fd5b80820190509050610420526000610440526102405161046052610480600060ff818352015b610460516104405261046051610460518082028215828483041417611d6657600080fd5b8090509050905061038051818183011015611d8057600080fd5b808201905090506002610460518082028215828483041417611da157600080fd5b8090509050905061042051818183011015611dbb57600080fd5b808201905090506102405180821015611dd357600080fd5b808203905090508080611de557600080fd5b8204905090506104605261044051610460511115611e2c576001610460516104405180821015611e1457600080fd5b80820390509050111515611e2757611e68565b611e57565b6001610440516104605180821015611e4357600080fd5b80820390509050111515611e5657611e68565b5b5b8151600101808352811415611d42575b505061046051600052600051610220515650005b635e0d443f6000511415612253573415611e9557600080fd5b60605160043580604051901315611eab57600080fd5b8091901215611eb957600080fd5b5060605160243580604051901315611ed057600080fd5b8091901215611ede57600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015611f6f57611f4d565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016101fe565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515611ff657611fd3565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606004356004811061203057600080fd5b60200201516044356101406004356004811061204b57600080fd5b6020020151808202821582848304141761206457600080fd5b80905090509050670de0b6b3a7640000808061207f57600080fd5b82049050905081818301101561209457600080fd5b80820190509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156120c9576120a7565b631e8c3fd36104c0526004356104e0526024356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611a80565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a05110151561216657612143565b61060051610480526102606024356004811061218157600080fd5b6020020151610480518082101561219757600080fd5b80820390509050670de0b6b3a764000080820282158284830414176121bb57600080fd5b80905090509050610140602435600481106121d557600080fd5b602002015180806121e557600080fd5b8204905090506106205260045461062051808202821582848304141761220a57600080fd5b809050905090506402540be400808061222257600080fd5b8204905090506106405261062051610640518082101561224157600080fd5b8082039050905060005260206000f350005b6367df02ca600051141561262257341561226c57600080fd5b6060516004358060405190131561228257600080fd5b809190121561229057600080fd5b50606051602435806040519013156122a757600080fd5b80919012156122b557600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561234657612324565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016101fe565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156123cd576123aa565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606024356004811061240757600080fd5b60200201516044356402540be400808202821582848304141761242957600080fd5b809050905090506402540be4006004548082101561244657600080fd5b80820390509050808061245857600080fd5b8204905090506101406024356004811061247157600080fd5b6020020151808202821582848304141761248a57600080fd5b80905090509050670de0b6b3a764000080806124a557600080fd5b820490509050808210156124b857600080fd5b80820390509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156124ed576124cb565b631e8c3fd36104c0526024356104e0526004356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611a80565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a05110151561258a57612567565b610600516104805261048051610260600435600481106125a957600080fd5b6020020151808210156125bb57600080fd5b80820390509050670de0b6b3a764000080820282158284830414176125df57600080fd5b80905090509050610140600435600481106125f957600080fd5b6020020151808061260957600080fd5b820490509050610620526106205160005260206000f350005b6307211ef76000511415612af857341561263b57600080fd5b6060516004358060405190131561265157600080fd5b809190121561265f57600080fd5b506060516024358060405190131561267657600080fd5b809190121561268457600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015612715576126f3565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016101fe565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561279c57612779565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506104606001815264e8d4a51000816020015264e8d4a5100081604001526001816060015250610260600435600481106127fb57600080fd5b60200201516044356104606004356004811061281657600080fd5b6020020151808202821582848304141761282f57600080fd5b8090509050905081818301101561284557600080fd5b808201905090506104e052610140610520525b6105205151602061052051016105205261052061052051101561287a57612858565b631e8c3fd36105405260043561056052602435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611a80565b61068052610500610520525b6105205152602061052051036105205261014061052051101515612917576128f4565b61068051610500526102606024356004811061293257600080fd5b6020020151610500518082101561294857600080fd5b808203905090506104606024356004811061296257600080fd5b6020020151808061297257600080fd5b8204905090506106a0526004546106a051808202821582848304141761299757600080fd5b809050905090506402540be40080806129af57600080fd5b8204905090506106c05260006106e052602435600481106129cf57600080fd5b600160c052602060c02001543b6129e557600080fd5b602435600481106129f557600080fd5b600160c052602060c02001543018612a0c57600080fd5b60206107a060246370a082316107205260243560048110612a2c57600080fd5b600060c052602060c02001546107405261073c60243560048110612a4f57600080fd5b600160c052602060c02001545afa612a6657600080fd5b6000506107a051610700526106a051610700511015612ab95760056106a0518082028215828483041417612a9957600080fd5b809050905090506103e88080612aae57600080fd5b8204905090506106e0525b6106a0516106c05180821015612ace57600080fd5b808203905090506106e05180821015612ae657600080fd5b8082039050905060005260206000f350005b630e71d1b96000511415612eae573415612b1157600080fd5b60605160043580604051901315612b2757600080fd5b8091901215612b3557600080fd5b5060605160243580604051901315612b4c57600080fd5b8091901215612b5a57600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015612beb57612bc9565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016101fe565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515612c7257612c4f565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506104606001815264e8d4a51000816020015264e8d4a510008160400152600181606001525061026060243560048110612cd157600080fd5b60200201516044356402540be4008082028215828483041417612cf357600080fd5b809050905090506402540be40060045480821015612d1057600080fd5b808203905090508080612d2257600080fd5b82049050905061046060243560048110612d3b57600080fd5b60200201518082028215828483041417612d5457600080fd5b8090509050905080821015612d6857600080fd5b808203905090506104e052610140610520525b61052051516020610520510161052052610520610520511015612d9d57612d7b565b631e8c3fd36105405260243561056052600435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611a80565b61068052610500610520525b6105205152602061052051036105205261014061052051101515612e3a57612e17565b61068051610500526105005161026060043560048110612e5957600080fd5b602002015180821015612e6b57600080fd5b8082039050905061046060043560048110612e8557600080fd5b60200201518080612e9557600080fd5b8204905090506106a0526106a05160005260206000f350005b600015613353575b610220526101405261016052610180526101a0526101c0526101e05261020052600f5415612ee357600080fd5b6102406101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015612f1057612eee565b631db7662b6102e0526103006101a080518252806020015182602001528060400151826040015280606001518260600152505061036051610340516103205161030051600658016101fe565b6103c0526103e05261040052610420526102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515612f9757612f74565b6103c08051825280602001518260200152806040015182604001528060600151826060015250506102406101405160048110612fd257600080fd5b6020020151610180516101a06101405160048110612fef57600080fd5b6020020151808202821582848304141761300857600080fd5b80905090509050670de0b6b3a7640000808061302357600080fd5b82049050905081818301101561303857600080fd5b8082019050905061044052610140610480525b6104805151602061048051016104805261048061048051101561306d5761304b565b631e8c3fd36104a052610140516104c052610160516104e052610440516105005261052061024080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c05160065801611a80565b6105e052610460610480525b610480515260206104805103610480526101406104805110151561310c576130e9565b6105e05161046052610240610160516004811061312857600080fd5b6020020151610460518082101561313e57600080fd5b808203905090506106005261060051600454808202821582848304141761316457600080fd5b809050905090506402540be400808061317c57600080fd5b820490509050610620526106205160055480820282158284830414176131a157600080fd5b809050905090506402540be40080806131b957600080fd5b8204905090506106405261044051670de0b6b3a764000080820282158284830414176131e457600080fd5b809050905090506101a061014051600481106131ff57600080fd5b6020020151808061320f57600080fd5b820490509050610140516004811061322657600080fd5b600260c052602060c02001556104605161062051610640518082101561324b57600080fd5b8082039050905081818301101561326157600080fd5b80820190509050670de0b6b3a7640000808202821582848304141761328557600080fd5b809050905090506101a061016051600481106132a057600080fd5b602002015180806132b057600080fd5b82049050905061016051600481106132c757600080fd5b600260c052602060c02001556106005161062051808210156132e857600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761330c57600080fd5b809050905090506101a0610160516004811061332757600080fd5b6020020151808061333757600080fd5b8204905090506106605261066051600052600051610220515650005b633df02124600051141561370d5762ffffff541561337057600080fd5b600162ffffff55341561338257600080fd5b6060516004358060405190131561339857600080fd5b80919012156133a657600080fd5b50606051602435806040519013156133bd57600080fd5b80919012156133cb57600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051632ce785a36102a0526004356102c0526024356102e0526044356103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051610300516102e0516102c05160065801612eb6565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526308c379a061040052602061042052602e610440527f45786368616e676520726573756c74656420696e20666577657220636f696e73610460527f207468616e206578706563746564000000000000000000000000000000000000610480526104405060643561026051101561356f5760a461041cfd5b6004356004811061357f57600080fd5b600060c052602060c02001543b61359557600080fd5b600435600481106135a557600080fd5b600060c052602060c020015430186135bc57600080fd5b602061058060646323b872dd6104c052336104e0523061050052604435610520526104dc6000600435600481106135f257600080fd5b600060c052602060c02001545af161360957600080fd5b6000506105805161361957600080fd5b6024356004811061362957600080fd5b600060c052602060c02001543b61363f57600080fd5b6024356004811061364f57600080fd5b600060c052602060c0200154301861366657600080fd5b6020610640604463a9059cbb6105a052336105c052610260516105e0526105bc60006024356004811061369857600080fd5b600060c052602060c02001545af16136af57600080fd5b600050610640516136bf57600080fd5b60043561066052604435610680526024356106a052610260516106c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610660a2600062ffffff55005b63a6417ed660005114156141735762ffffff541561372a57600080fd5b600162ffffff55341561373c57600080fd5b6060516004358060405190131561375257600080fd5b809190121561376057600080fd5b506060516024358060405190131561377757600080fd5b809190121561378557600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101406004356004811061382157600080fd5b60200201516102606004356004811061383957600080fd5b6020020151808061384957600080fd5b8204905090506102e0526101406024356004811061386657600080fd5b60200201516102606024356004811061387e57600080fd5b6020020151808061388e57600080fd5b82049050905061030052604435670de0b6b3a764000080820282158284830414176138b857600080fd5b809050905090506102e05180806138ce57600080fd5b82049050905061032052610140610360525b61036051516020610360510161036052610360610360511015613902576138e0565b632ce785a3610380526004356103a0526024356103c052610320516103e052610400610140805182528060200151826020015280604001518260400152806060015182606001525050610460516104405161042051610400516103e0516103c0516103a05160065801612eb6565b6104c052610340610360525b610360515260206103605103610360526101406103605110151561399f5761397c565b6104c05161034052610340516103005180820282158284830414176139c357600080fd5b80905090509050670de0b6b3a764000080806139de57600080fd5b8204905090506104e0526308c379a061050052602061052052602e610540527f45786368616e676520726573756c74656420696e20666577657220636f696e73610560527f207468616e20657870656374656400000000000000000000000000000000000061058052610540506064356104e0511015613a5f5760a461051cfd5b6105c0600081526000816020015260018160400152600081606001525060243560048110613a8c57600080fd5b600160c052602060c02001543b613aa257600080fd5b60243560048110613ab257600080fd5b600160c052602060c02001543018613ac957600080fd5b60206106e060246370a082316106605260243560048110613ae957600080fd5b600060c052602060c02001546106805261067c60243560048110613b0c57600080fd5b600160c052602060c02001545afa613b2357600080fd5b6000506106e0516106405261034051610640511015613b77576103e36104e0518082028215828483041417613b5757600080fd5b809050905090506103e88080613b6c57600080fd5b8204905090506104e0525b6000610700526105c060043560048110613b9057600080fd5b602002015115613c385760043560048110613baa57600080fd5b600160c052602060c02001543b613bc057600080fd5b60043560048110613bd057600080fd5b600160c052602060c02001543018613be757600080fd5b6000600060646323b872dd61080052336108205230610840526044356108605261081c600060043560048110613c1c57600080fd5b600160c052602060c02001545af1613c3357600080fd5b613ce3565b60043560048110613c4857600080fd5b600160c052602060c02001543b613c5e57600080fd5b60043560048110613c6e57600080fd5b600160c052602060c02001543018613c8557600080fd5b60206107e060646323b872dd61072052336107405230610760526044356107805261073c600060043560048110613cbb57600080fd5b600160c052602060c02001545af1613cd257600080fd5b6000506107e051613ce257600080fd5b5b60043560048110613cf357600080fd5b600160c052602060c02001543b613d0957600080fd5b60043560048110613d1957600080fd5b600160c052602060c02001543018613d3057600080fd5b6020610960604463095ea7b36108c05260043560048110613d5057600080fd5b600060c052602060c02001546108e052604435610900526108dc600060043560048110613d7c57600080fd5b600160c052602060c02001545af1613d9357600080fd5b6000506109605060043560048110613daa57600080fd5b600060c052602060c02001543b613dc057600080fd5b60043560048110613dd057600080fd5b600060c052602060c02001543018613de757600080fd5b60006000602463b6b55f25610980526044356109a05261099c600060043560048110613e1257600080fd5b600060c052602060c02001545af1613e2957600080fd5b60243560048110613e3957600080fd5b600060c052602060c02001543b613e4f57600080fd5b60243560048110613e5f57600080fd5b600060c052602060c02001543018613e7657600080fd5b600060006024632e1a7d4d610a005261034051610a2052610a1c600060243560048110613ea257600080fd5b600060c052602060c02001545af1613eb957600080fd5b60243560048110613ec957600080fd5b600160c052602060c02001543b613edf57600080fd5b60243560048110613eef57600080fd5b600160c052602060c02001543018613f0657600080fd5b6020610b0060246370a08231610a805230610aa052610a9c60243560048110613f2e57600080fd5b600160c052602060c02001545afa613f4557600080fd5b600050610b00516104e0526308c379a0610b20526020610b4052602e610b60527f45786368616e676520726573756c74656420696e20666577657220636f696e73610b80527f207468616e206578706563746564000000000000000000000000000000000000610ba052610b60506064356104e0511015613fc75760a4610b3cfd5b6105c060243560048110613fda57600080fd5b60200201511561407e5760243560048110613ff457600080fd5b600160c052602060c02001543b61400a57600080fd5b6024356004811061401a57600080fd5b600160c052602060c0200154301861403157600080fd5b60006000604463a9059cbb610ca05233610cc0526104e051610ce052610cbc60006024356004811061406257600080fd5b600160c052602060c02001545af161407957600080fd5b614125565b6024356004811061408e57600080fd5b600160c052602060c02001543b6140a457600080fd5b602435600481106140b457600080fd5b600160c052602060c020015430186140cb57600080fd5b6020610c80604463a9059cbb610be05233610c00526104e051610c2052610bfc6000602435600481106140fd57600080fd5b600160c052602060c02001545af161411457600080fd5b600050610c805161412457600080fd5b5b600435610d4052604435610d6052602435610d80526104e051610da052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610d40a2600062ffffff55005b637d49d87560005114156144fb5762ffffff541561419057600080fd5b600162ffffff5534156141a257600080fd5b6007543b6141af57600080fd5b60075430186141bd57600080fd5b60206101c060046318160ddd6101605261017c6007545afa6141de57600080fd5b6000506101c051610140526101e0600081526000816020015260008160400152600081606001525061026060008152600081602001526000816040015260008160600152506102e060006004818352015b6102e0516004811061424057600080fd5b600260c052602060c0200154600435808202821582848304141761426357600080fd5b8090509050905061014051808061427957600080fd5b820490509050610300526308c379a0610320526020610340526030610360527f5769746864726177616c20726573756c74656420696e20666577657220636f69610380527f6e73207468616e206578706563746564000000000000000000000000000000006103a0526103605060246102e051600481106142f957600080fd5b602002013561030051101561430f5760a461033cfd5b6102e0516004811061432057600080fd5b600260c052602060c020018054610300518082101561433e57600080fd5b80820390509050815550610300516101e06102e0516004811061436057600080fd5b60200201526102e0516004811061437657600080fd5b600060c052602060c02001543b61438c57600080fd5b6102e0516004811061439d57600080fd5b600060c052602060c020015430186143b457600080fd5b6020610480604463a9059cbb6103e052336104005261030051610420526103fc60006102e051600481106143e757600080fd5b600060c052602060c02001545af16143fe57600080fd5b6000506104805161440e57600080fd5b5b815160010180835281141561422f575b50506007543b61442e57600080fd5b600754301861443c57600080fd5b6000600060446379cc67906104a052336104c0526004356104e0526104bc60006007545af161446a57600080fd5b6101e0516105405261020051610560526102205161058052610240516105a052610260516105c052610280516105e0526102a051610600526102c0516106205261014051600435808210156144be57600080fd5b8082039050905061064052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d610120610540a2600062ffffff55005b6318a7bd766000511415614ec25762ffffff541561451857600080fd5b600162ffffff55341561452a57600080fd5b600f541561453757600080fd5b6007543b61454457600080fd5b600754301861455257600080fd5b60206101c060046318160ddd6101605261017c6007545afa61457357600080fd5b6000506101c051610140526000610140511161458e57600080fd5b600454600480820282158284830414176145a757600080fd5b80905090509050600c80806145bb57600080fd5b8204905090506101e052600554610200526102206101406102a0525b6102a0515160206102a051016102a0526102a06102a05110156145f9576145d7565b600658016100a9565b6102c0526102e05261030052610320526102806102a0525b6102a0515260206102a051036102a0526101406102a05110151561463d5761461a565b6102c080518252806020015182602001528060400151826040015280606001518260600152505061034060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506103c0610340805182528060200151826020015280604001518260400152806060015182606001525050610140610460525b61046051516020610460510161046052610460610460511015614701576146df565b631f30ab74610480526104a061022080518252806020015182602001528060400151826040015280606001518260600152505061052061034080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a05160065801610759565b6105e052610440610460525b61046051526020610460510361046052610140610460511015156147b657614793565b6105e0516104405261060060006004818352015b6103c061060051600481106147de57600080fd5b602002018051600461060051600481106147f757600080fd5b60200201358082101561480957600080fd5b808203905090508152505b81516001018083528114156147ca575b5050610140610640525b610640515160206106405101610640526106406106405110156148505761482e565b631f30ab74610660526106806102208051825280602001518260200152806040015182604001528060600151826060015250506107006103c0805182528060200151826020015280604001518260400152806060015182606001525050610760516107405161072051610700516106e0516106c0516106a0516106805160065801610759565b6107c052610620610640525b6106405152602061064051036106405261014061064051101515614905576148e2565b6107c051610620526107e0600081526000816020015260008160400152600081606001525061086060006004818352015b61062051610340610860516004811061494e57600080fd5b6020020151808202821582848304141761496757600080fd5b8090509050905061044051808061497d57600080fd5b8204905090506108805260006108a0526103c061086051600481106149a157600080fd5b60200201516108805111156149ea57610880516103c061086051600481106149c857600080fd5b6020020151808210156149da57600080fd5b808203905090506108a052614a20565b6103c061086051600481106149fe57600080fd5b60200201516108805180821015614a1457600080fd5b808203905090506108a0525b6101e0516108a0518082028215828483041417614a3c57600080fd5b809050905090506402540be4008080614a5457600080fd5b8204905090506107e06108605160048110614a6e57600080fd5b60200201526103c06108605160048110614a8757600080fd5b60200201516107e06108605160048110614aa057600080fd5b6020020151610200518082028215828483041417614abd57600080fd5b809050905090506402540be4008080614ad557600080fd5b82049050905080821015614ae857600080fd5b808203905090506108605160048110614b0057600080fd5b600260c052602060c02001556103c06108605160048110614b2057600080fd5b6020020180516107e06108605160048110614b3a57600080fd5b602002015180821015614b4c57600080fd5b808203905090508152505b8151600101808352811415614936575b50506101406108e0525b6108e0515160206108e051016108e0526108e06108e0511015614b9357614b71565b631f30ab74610900526109206102208051825280602001518260200152806040015182604001528060600151826060015250506109a06103c0805182528060200151826020015280604001518260400152806060015182606001525050610a00516109e0516109c0516109a0516109805161096051610940516109205160065801610759565b610a60526108c06108e0525b6108e0515260206108e051036108e0526101406108e051101515614c4857614c25565b610a60516108c052610440516108c05180821015614c6557600080fd5b80820390509050610140518082028215828483041417614c8457600080fd5b80905090509050610440518080614c9a57600080fd5b820490509050610a80526000610a805111614cb457600080fd5b6308c379a0610aa0526020610ac0526014610ae0527f536c697070616765207363726577656420796f75000000000000000000000000610b0052610ae050608435610a80511115614d06576084610abcfd5b610b4060006004818352015b610b405160048110614d2357600080fd5b600060c052602060c02001543b614d3957600080fd5b610b405160048110614d4a57600080fd5b600060c052602060c02001543018614d6157600080fd5b6020610c00604463a9059cbb610b605233610b80526004610b405160048110614d8957600080fd5b6020020135610ba052610b7c6000610b405160048110614da857600080fd5b600060c052602060c02001545af1614dbf57600080fd5b600050610c0051614dcf57600080fd5b5b8151600101808352811415614d12575b50506007543b614def57600080fd5b6007543018614dfd57600080fd5b6000600060446379cc6790610c205233610c4052610a8051610c6052610c3c60006007545af1614e2c57600080fd5b600435610cc052602435610ce052604435610d0052606435610d20526107e051610d405261080051610d605261082051610d805261084051610da05261062051610dc05261014051610a805180821015614e8557600080fd5b80820390509050610de052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610cc0a2600062ffffff55005b63ee11f5b66000511415614f84573415614edb57600080fd5b6006543314614ee957600080fd5b60085415614ef657600080fd5b64012a05f2006044351115614f0a57600080fd5b426203f480818183011015614f1e57600080fd5b808201905090506101405261014051600855600435600a55602435600b55604435600c5560043561016052602435610180526044356101a052610140517f6081daa3b61098baf24d9c69bcd53af932e0635c89c6fd0617534b9ba76a7f736060610160a2005b632a7dd7cd6000511415615031573415614f9d57600080fd5b6006543314614fab57600080fd5b60006008541142600854111516614fc157600080fd5b6000600855600a5461014052600b5461016052600c5461018052610140516003556101605160045561018051600555610140516101a052610160516101c052610180516101e0527f752a27d1853eb7af3ee4ff764f2c4a51619386af721573dd3809e929c39db99e60606101a0a1005b63226840fb600051141561505f57341561504a57600080fd5b600654331461505857600080fd5b6000600855005b636b441a40600051141561510057341561507857600080fd5b600435602051811061508957600080fd5b50600654331461509857600080fd5b600954156150a557600080fd5b426203f4808181830110156150b957600080fd5b808201905090506101405261014051600955600435600d55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae600051141561517c57341561511957600080fd5b600654331461512757600080fd5b6000600954116009544210151661513d57600080fd5b6000600955600d546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19360005114156151aa57341561519557600080fd5b60065433146151a357600080fd5b6000600955005b6330c5408560005114156153235734156151c357600080fd5b60065433146151d157600080fd5b6101406001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101c060006004818352015b6101c0516004811061521357600080fd5b600060c052602060c02001546101e0526101e0513b61523157600080fd5b6101e051301861524057600080fd5b60206102a060246370a0823161022052306102405261023c6101e0515afa61526757600080fd5b6000506102a0516101c0516004811061527f57600080fd5b600260c052602060c02001548082101561529857600080fd5b8082039050905061020052600061020051111561530e576101e0513b6152bd57600080fd5b6101e05130186152cc57600080fd5b6020610360604463a9059cbb6102c052336102e05261020051610300526102dc60006101e0515af16152fd57600080fd5b6000506103605161530d57600080fd5b5b5b8151600101808352811415615202575b5050005b63e3698853600051141561535f57341561533c57600080fd5b600654331461534a57600080fd5b42600e541161535857600080fd5b6001600f55005b633046f972600051141561538d57341561537857600080fd5b600654331461538657600080fd5b6000600f55005b6323746eb860005114156153f25734156153a657600080fd5b606051600435806040519013156153bc57600080fd5b80919012156153ca57600080fd5b50600435600481106153db57600080fd5b600060c052602060c020015460005260206000f350005b63b739953e600051141561545757341561540b57600080fd5b6060516004358060405190131561542157600080fd5b809190121561542f57600080fd5b506004356004811061544057600080fd5b600160c052602060c020015460005260206000f350005b63065a80d860005114156154bc57341561547057600080fd5b6060516004358060405190131561548657600080fd5b809190121561549457600080fd5b50600435600481106154a557600080fd5b600260c052602060c020015460005260206000f350005b63f446c1d060005114156154e35734156154d557600080fd5b60035460005260206000f350005b63ddca3f43600051141561550a5734156154fc57600080fd5b60045460005260206000f350005b63fee3f7f9600051141561553157341561552357600080fd5b60055460005260206000f350005b638da5cb5b600051141561555857341561554a57600080fd5b60065460005260206000f350005b63405e28f8600051141561557f57341561557157600080fd5b60085460005260206000f350005b63e0a0b58660005114156155a657341561559857600080fd5b60095460005260206000f350005b63b4b577ad60005114156155cd5734156155bf57600080fd5b600a5460005260206000f350005b6358680d0b60005114156155f45734156155e657600080fd5b600b5460005260206000f350005b63e3824462600051141561561b57341561560d57600080fd5b600c5460005260206000f350005b631ec0cdc1600051141561564257341561563457600080fd5b600d5460005260206000f350005b5b60006000fd5b6102d561591e036102d56000396102d561591e036000f3000000000000000000000000acd43e627e64355f1861cec6d3a6688b31a6f952000000000000000000000000597ad1e0c13bfe8025993d9e79c69e1c0233522e0000000000000000000000002f08119c6f07c006695e079aafc638b8789faf1800000000000000000000000037d19d1c4e1fa9dc47bd1ea12f742a0887eda74a0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000085d4780b73119b644ae5ecd22b376000000000000000000000000173f8ee61c0fe712cae2a2fc8d5c0ccdda57e6da000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000003d0900

Deployed Bytecode

0x600436101561000d57615643565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526000156101f6575b610140526101606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101e060006004818352015b6101606101e051600481106100f257600080fd5b6020020180516101e0516004811061010957600080fd5b600060c052602060c02001543b61011f57600080fd5b6101e0516004811061013057600080fd5b600060c052602060c0200154301861014757600080fd5b602061026060046377c7b8fc6102005261021c6101e0516004811061016b57600080fd5b600060c052602060c02001545afa61018257600080fd5b60005061026051808202821582848304141761019d57600080fd5b809050905090508152505b81516001018083528114156100de575b50506080610280525b6000610280511115156101d3576101ef565b60206102805103610160015160206102805103610280526101c1565b6101405156005b60001561031b575b6101c0526101405261016052610180526101a0526101e061014080518252806020015182602001528060400151826040015280606001518260600152505061026060006004818352015b6101e0610260516004811061025c57600080fd5b6020020151610260516004811061027257600080fd5b600260c052602060c0200154808202821582848304141761029257600080fd5b80905090509050670de0b6b3a764000080806102ad57600080fd5b8204905090506101e061026051600481106102c757600080fd5b60200201525b8151600101808352811415610248575b50506080610280525b6000610280511115156102f857610314565b602061028051036101e0015160206102805103610280526102e6565b6101c05156005b60001561044c575b610240526101405261016052610180526101a0526101c0526101e05261020052610220526102606101408051825280602001518260200152806040015182604001528060600151826060015250506102e060006004818352015b6102606102e0516004811061039157600080fd5b60200201516101c06102e051600481106103aa57600080fd5b602002015180820282158284830414176103c357600080fd5b80905090509050670de0b6b3a764000080806103de57600080fd5b8204905090506102606102e051600481106103f857600080fd5b60200201525b815160010180835281141561037d575b50506080610300525b60006103005111151561042957610445565b6020610300510361026001516020610300510361030052610417565b6102405156005b600015610751575b6101c0526101405261016052610180526101a05260006101e05261022060006004818352015b602061022051026101400151610200526101e08051610200518181830110156104a257600080fd5b808201905090508152505b815160010180835281141561047a575b50506101e05115156104d85760006000526000516101c05156505b6000610260526101e05161028052600354600480820282158284830414176104ff57600080fd5b809050905090506102a0526102c0600060ff818352015b610280516102e05261032060006004818352015b602061032051026101400151610300526102e05161028051808202821582848304141761055657600080fd5b80905090509050610300516004808202821582848304141761057757600080fd5b80905090509050600181818301101561058f57600080fd5b8082019050905080806105a157600080fd5b8204905090506102e0525b815160010180835281141561052a575b505061028051610260526102a0516101e05180820282158284830414176105e257600080fd5b809050905090506102e0516004808202821582848304141761060357600080fd5b8090509050905081818301101561061957600080fd5b8082019050905061028051808202821582848304141761063857600080fd5b809050905090506102a05160018082101561065257600080fd5b8082039050905061028051808202821582848304141761067157600080fd5b8090509050905060056102e051808202821582848304141761069257600080fd5b809050905090508181830110156106a857600080fd5b8082019050905080806106ba57600080fd5b82049050905061028052610260516102805111156107015760016102805161026051808210156106e957600080fd5b808203905090501115156106fc5761073d565b61072c565b600161026051610280518082101561071857600080fd5b8082039050905011151561072b5761073d565b5b5b8151600101808352811415610516575b5050610280516000526000516101c0515650005b60001561091f575b610240526101405261016052610180526101a0526101c0526101e0526102005261022052610140610660525b610660515160206106605101610660526106606106605110156107a757610785565b6305eb8fa6610680526106a0610140610460525b610460515160206104605101610460526104606104605110156107dd576107bb565b6342d3b3c3610480526104a06101408051825280602001518260200152806040015182604001528060600151826060015250506105206101c080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a05160065801610323565b6105e052610600526106205261064052610440610460525b610460515260206104605103610460526101406104605110151561089e5761087b565b6105e0805182528060200151826020015280604001518260400152806060015182606001525050610700516106e0516106c0516106a05160065801610454565b61076052610640610660525b610660515260206106605103610660526101406106605110151561090d576108ea565b61076051600052600051610240515650005b63bb7b8b806000511415610b9357341561093857600080fd5b6101406106e0525b6106e0515160206106e051016106e0526106e06106e051101561096257610940565b6305eb8fa661070052610720610140610560525b6105605151602061056051016105605261056061056051101561099857610976565b631db7662b610580526105a06101406104c0525b6104c0515160206104c051016104c0526104c06104c05110156109ce576109ac565b600658016100a9565b6104e0526105005261052052610540526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515610a12576109ef565b6104e0805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a051600658016101fe565b61066052610680526106a0526106c052610540610560525b6105605152602061056051036105605261014061056051101515610a8d57610a6a565b6106608051825280602001518260200152806040015182604001528060600151826060015250506107805161076051610740516107205160065801610454565b6107e0526106c06106e0525b6106e0515260206106e051036106e0526101406106e051101515610afc57610ad9565b6107e051610140526007543b610b1157600080fd5b6007543018610b1f57600080fd5b602061088060046318160ddd6108205261083c6007545afa610b4057600080fd5b600050610880516108005261014051670de0b6b3a76400008082028215828483041417610b6c57600080fd5b80905090509050610800518080610b8257600080fd5b82049050905060005260206000f350005b63cf701ff76000511415610ff6573415610bac57600080fd5b60843560028110610bbc57600080fd5b5061014060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101c06101405161016051610180516101a0516101c0516101e0516102005161022051600658016100a9565b61026052610280526102a0526102c05261022052610200526101e0526101c0526101a052610180526101605261014052610260805182528060200151826020015280604001518260400152806060015182606001525050610140610300525b61030051516020610300510161030052610300610300511015610cb357610c91565b631f30ab74610320526103406101c08051825280602001518260200152806040015182604001528060600151826060015250506103c061014080518252806020015182602001528060400151826040015280606001518260600152505061042051610400516103e0516103c0516103a05161038051610360516103405160065801610759565b610480526102e0610300525b6103005152602061030051036103005261014061030051101515610d6857610d45565b610480516102e0526104a060006004818352015b60843515610dd4576101406104a05160048110610d9857600080fd5b60200201805160046104a05160048110610db157600080fd5b6020020135818183011015610dc557600080fd5b80820190509050815250610e1e565b6101406104a05160048110610de857600080fd5b60200201805160046104a05160048110610e0157600080fd5b602002013580821015610e1357600080fd5b808203905090508152505b5b8151600101808352811415610d7c575b50506101406104e0525b6104e0515160206104e051016104e0526104e06104e0511015610e5b57610e39565b631f30ab74610500526105206101c08051825280602001518260200152806040015182604001528060600151826060015250506105a0610140805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a0516105805161056051610540516105205160065801610759565b610660526104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515610f1057610eed565b610660516104c0526007543b610f2557600080fd5b6007543018610f3357600080fd5b602061070060046318160ddd6106a0526106bc6007545afa610f5457600080fd5b600050610700516106805260006107205260843515610f92576104c0516102e05180821015610f8257600080fd5b8082039050905061072052610fb3565b6102e0516104c05180821015610fa757600080fd5b80820390509050610720525b61072051610680518082028215828483041417610fcf57600080fd5b809050905090506102e0518080610fe557600080fd5b82049050905060005260206000f350005b63029b2f346000511415611a785762ffffff541561101357600080fd5b600162ffffff55341561102557600080fd5b600f541561103257600080fd5b61014060008152600081602001526000816040015260008160600152506004546004808202821582848304141761106857600080fd5b80905090509050600c808061107c57600080fd5b8204905090506101c0526005546101e0526007543b61109a57600080fd5b60075430186110a857600080fd5b602061028060046318160ddd6102205261023c6007545afa6110c957600080fd5b60005061028051610200526102a0610140610320525b61032051516020610320510161032052610320610320511015611101576110df565b600658016100a9565b6103405261036052610380526103a052610300610320525b610320515260206103205103610320526101406103205110151561114557611122565b61034080518252806020015182602001528060400151826040015280606001518260600152505060006103c0526103e060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006102005111156112af57610140610460525b610460515160206104605101610460526104606104605110156111f1576111cf565b631f30ab74610480526104a06102a08051825280602001518260200152806040015182604001528060600151826060015250506105206103e080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a05160065801610759565b6105e052610440610460525b61046051526020610460510361046052610140610460511015156112a657611283565b6105e0516103c0525b6106006103e080518252806020015182602001528060400151826040015280606001518260600152505061068060006004818352015b6102005115156113145760006004610680516004811061130457600080fd5b60200201351161131357600080fd5b5b6103e0610680516004811061132857600080fd5b60200201516004610680516004811061134057600080fd5b602002013581818301101561135457600080fd5b80820190509050610600610680516004811061136f57600080fd5b60200201525b81516001018083528114156112e5575b50506101406106c0525b6106c0515160206106c051016106c0526106c06106c05110156113b15761138f565b631f30ab746106e0526107006102a08051825280602001518260200152806040015182604001528060600151826060015250506107806106008051825280602001518260200152806040015182604001528060600151826060015250506107e0516107c0516107a051610780516107605161074051610720516107005160065801610759565b610840526106a06106c0525b6106c0515260206106c051036106c0526101406106c05110151561146657611443565b610840516106a0526103c0516106a0511161148057600080fd5b6106a0516108605260006102005111156117bf5761088060006004818352015b6106a0516103e061088051600481106114b857600080fd5b602002015180820282158284830414176114d157600080fd5b809050905090506103c05180806114e757600080fd5b8204905090506108a05260006108c052610600610880516004811061150b57600080fd5b60200201516108a0511115611554576108a051610600610880516004811061153257600080fd5b60200201518082101561154457600080fd5b808203905090506108c05261158a565b610600610880516004811061156857600080fd5b60200201516108a0518082101561157e57600080fd5b808203905090506108c0525b6101c0516108c05180820282158284830414176115a657600080fd5b809050905090506402540be40080806115be57600080fd5b82049050905061014061088051600481106115d857600080fd5b602002015261060061088051600481106115f157600080fd5b6020020151610140610880516004811061160a57600080fd5b60200201516101e051808202821582848304141761162757600080fd5b809050905090506402540be400808061163f57600080fd5b8204905090508082101561165257600080fd5b80820390509050610880516004811061166a57600080fd5b600260c052602060c0200155610600610880516004811061168a57600080fd5b60200201805161014061088051600481106116a457600080fd5b6020020151808210156116b657600080fd5b808203905090508152505b81516001018083528114156114a0575b50506101406108e0525b6108e0515160206108e051016108e0526108806108e05110156116fd576116db565b631f30ab74610900526109206102a08051825280602001518260200152806040015182604001528060600151826060015250506109a0610600805182528060200151826020015280604001518260400152806060015182606001525050610a00516109e0516109c0516109a0516109805161096051610940516109205160065801610759565b610a60526108606108e0525b6108e0515260206108e051036108e0526101406108e0511015156117b25761178f565b610a6051610860526117f1565b600260c052602060c0206106008051825580602001516001830155806040015160028301558060600151600383015550505b6000610a805261020051151561180e576106a051610a8052611863565b61020051610860516103c0518082101561182757600080fd5b80820390509050808202821582848304141761184257600080fd5b809050905090506103c051808061185857600080fd5b820490509050610a80525b6308c379a0610aa0526020610ac0526014610ae0527f536c697070616765207363726577656420796f75000000000000000000000000610b0052610ae050608435610a805110156118b5576084610abcfd5b610b4060006004818352015b610b4051600481106118d257600080fd5b600060c052602060c02001543b6118e857600080fd5b610b4051600481106118f957600080fd5b600060c052602060c0200154301861191057600080fd5b6020610c2060646323b872dd610b605233610b805230610ba0526004610b40516004811061193d57600080fd5b6020020135610bc052610b7c6000610b40516004811061195c57600080fd5b600060c052602060c02001545af161197357600080fd5b600050610c205161198357600080fd5b5b81516001018083528114156118c1575b50506007543b6119a357600080fd5b60075430186119b157600080fd5b6000600060446340c10f19610c405233610c6052610a8051610c8052610c5c60006007545af16119e057600080fd5b600435610ce052602435610d0052604435610d2052606435610d405261014051610d605261016051610d805261018051610da0526101a051610dc0526106a051610de05261020051610a8051818183011015611a3b57600080fd5b80820190509050610e0052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610ce0a2600062ffffff55005b600015611e7c575b610220526101405261016052610180526101a0526101c0526101e052610200526000610140511215610160516101405114151660006101605112151660046101405112166004610160511216611ad557600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610240516305eb8fa6610280526102a06101a0805182528060200151826020015280604001518260400152806060015182606001525050610300516102e0516102c0516102a05160065801610454565b610360526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103605161024052610240516103805260006103a05260035460048082028215828483041417611b9c57600080fd5b809050905090506103c05260006103e05261040060006004818352015b61014051610400511415611bd457610180516103e052611c0a565b61016051610400511815611c04576101a06104005160048110611bf657600080fd5b60200201516103e052611c09565b611c86565b5b6103a080516103e051818183011015611c2257600080fd5b8082019050905081525061038051610240518082028215828483041417611c4857600080fd5b809050905090506103e05160048082028215828483041417611c6957600080fd5b809050905090508080611c7b57600080fd5b820490509050610380525b8151600101808352811415611bb9575b505061038051610240518082028215828483041417611cb457600080fd5b809050905090506103c05160048082028215828483041417611cd557600080fd5b809050905090508080611ce757600080fd5b820490509050610380526103a051610240516103c0518080611d0857600080fd5b820490509050818183011015611d1d57600080fd5b80820190509050610420526000610440526102405161046052610480600060ff818352015b610460516104405261046051610460518082028215828483041417611d6657600080fd5b8090509050905061038051818183011015611d8057600080fd5b808201905090506002610460518082028215828483041417611da157600080fd5b8090509050905061042051818183011015611dbb57600080fd5b808201905090506102405180821015611dd357600080fd5b808203905090508080611de557600080fd5b8204905090506104605261044051610460511115611e2c576001610460516104405180821015611e1457600080fd5b80820390509050111515611e2757611e68565b611e57565b6001610440516104605180821015611e4357600080fd5b80820390509050111515611e5657611e68565b5b5b8151600101808352811415611d42575b505061046051600052600051610220515650005b635e0d443f6000511415612253573415611e9557600080fd5b60605160043580604051901315611eab57600080fd5b8091901215611eb957600080fd5b5060605160243580604051901315611ed057600080fd5b8091901215611ede57600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015611f6f57611f4d565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016101fe565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515611ff657611fd3565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606004356004811061203057600080fd5b60200201516044356101406004356004811061204b57600080fd5b6020020151808202821582848304141761206457600080fd5b80905090509050670de0b6b3a7640000808061207f57600080fd5b82049050905081818301101561209457600080fd5b80820190509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156120c9576120a7565b631e8c3fd36104c0526004356104e0526024356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611a80565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a05110151561216657612143565b61060051610480526102606024356004811061218157600080fd5b6020020151610480518082101561219757600080fd5b80820390509050670de0b6b3a764000080820282158284830414176121bb57600080fd5b80905090509050610140602435600481106121d557600080fd5b602002015180806121e557600080fd5b8204905090506106205260045461062051808202821582848304141761220a57600080fd5b809050905090506402540be400808061222257600080fd5b8204905090506106405261062051610640518082101561224157600080fd5b8082039050905060005260206000f350005b6367df02ca600051141561262257341561226c57600080fd5b6060516004358060405190131561228257600080fd5b809190121561229057600080fd5b50606051602435806040519013156122a757600080fd5b80919012156122b557600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561234657612324565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016101fe565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156123cd576123aa565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606024356004811061240757600080fd5b60200201516044356402540be400808202821582848304141761242957600080fd5b809050905090506402540be4006004548082101561244657600080fd5b80820390509050808061245857600080fd5b8204905090506101406024356004811061247157600080fd5b6020020151808202821582848304141761248a57600080fd5b80905090509050670de0b6b3a764000080806124a557600080fd5b820490509050808210156124b857600080fd5b80820390509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156124ed576124cb565b631e8c3fd36104c0526024356104e0526004356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611a80565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a05110151561258a57612567565b610600516104805261048051610260600435600481106125a957600080fd5b6020020151808210156125bb57600080fd5b80820390509050670de0b6b3a764000080820282158284830414176125df57600080fd5b80905090509050610140600435600481106125f957600080fd5b6020020151808061260957600080fd5b820490509050610620526106205160005260206000f350005b6307211ef76000511415612af857341561263b57600080fd5b6060516004358060405190131561265157600080fd5b809190121561265f57600080fd5b506060516024358060405190131561267657600080fd5b809190121561268457600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015612715576126f3565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016101fe565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561279c57612779565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506104606001815264e8d4a51000816020015264e8d4a5100081604001526001816060015250610260600435600481106127fb57600080fd5b60200201516044356104606004356004811061281657600080fd5b6020020151808202821582848304141761282f57600080fd5b8090509050905081818301101561284557600080fd5b808201905090506104e052610140610520525b6105205151602061052051016105205261052061052051101561287a57612858565b631e8c3fd36105405260043561056052602435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611a80565b61068052610500610520525b6105205152602061052051036105205261014061052051101515612917576128f4565b61068051610500526102606024356004811061293257600080fd5b6020020151610500518082101561294857600080fd5b808203905090506104606024356004811061296257600080fd5b6020020151808061297257600080fd5b8204905090506106a0526004546106a051808202821582848304141761299757600080fd5b809050905090506402540be40080806129af57600080fd5b8204905090506106c05260006106e052602435600481106129cf57600080fd5b600160c052602060c02001543b6129e557600080fd5b602435600481106129f557600080fd5b600160c052602060c02001543018612a0c57600080fd5b60206107a060246370a082316107205260243560048110612a2c57600080fd5b600060c052602060c02001546107405261073c60243560048110612a4f57600080fd5b600160c052602060c02001545afa612a6657600080fd5b6000506107a051610700526106a051610700511015612ab95760056106a0518082028215828483041417612a9957600080fd5b809050905090506103e88080612aae57600080fd5b8204905090506106e0525b6106a0516106c05180821015612ace57600080fd5b808203905090506106e05180821015612ae657600080fd5b8082039050905060005260206000f350005b630e71d1b96000511415612eae573415612b1157600080fd5b60605160043580604051901315612b2757600080fd5b8091901215612b3557600080fd5b5060605160243580604051901315612b4c57600080fd5b8091901215612b5a57600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015612beb57612bc9565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016101fe565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515612c7257612c4f565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506104606001815264e8d4a51000816020015264e8d4a510008160400152600181606001525061026060243560048110612cd157600080fd5b60200201516044356402540be4008082028215828483041417612cf357600080fd5b809050905090506402540be40060045480821015612d1057600080fd5b808203905090508080612d2257600080fd5b82049050905061046060243560048110612d3b57600080fd5b60200201518082028215828483041417612d5457600080fd5b8090509050905080821015612d6857600080fd5b808203905090506104e052610140610520525b61052051516020610520510161052052610520610520511015612d9d57612d7b565b631e8c3fd36105405260243561056052600435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611a80565b61068052610500610520525b6105205152602061052051036105205261014061052051101515612e3a57612e17565b61068051610500526105005161026060043560048110612e5957600080fd5b602002015180821015612e6b57600080fd5b8082039050905061046060043560048110612e8557600080fd5b60200201518080612e9557600080fd5b8204905090506106a0526106a05160005260206000f350005b600015613353575b610220526101405261016052610180526101a0526101c0526101e05261020052600f5415612ee357600080fd5b6102406101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015612f1057612eee565b631db7662b6102e0526103006101a080518252806020015182602001528060400151826040015280606001518260600152505061036051610340516103205161030051600658016101fe565b6103c0526103e05261040052610420526102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515612f9757612f74565b6103c08051825280602001518260200152806040015182604001528060600151826060015250506102406101405160048110612fd257600080fd5b6020020151610180516101a06101405160048110612fef57600080fd5b6020020151808202821582848304141761300857600080fd5b80905090509050670de0b6b3a7640000808061302357600080fd5b82049050905081818301101561303857600080fd5b8082019050905061044052610140610480525b6104805151602061048051016104805261048061048051101561306d5761304b565b631e8c3fd36104a052610140516104c052610160516104e052610440516105005261052061024080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c05160065801611a80565b6105e052610460610480525b610480515260206104805103610480526101406104805110151561310c576130e9565b6105e05161046052610240610160516004811061312857600080fd5b6020020151610460518082101561313e57600080fd5b808203905090506106005261060051600454808202821582848304141761316457600080fd5b809050905090506402540be400808061317c57600080fd5b820490509050610620526106205160055480820282158284830414176131a157600080fd5b809050905090506402540be40080806131b957600080fd5b8204905090506106405261044051670de0b6b3a764000080820282158284830414176131e457600080fd5b809050905090506101a061014051600481106131ff57600080fd5b6020020151808061320f57600080fd5b820490509050610140516004811061322657600080fd5b600260c052602060c02001556104605161062051610640518082101561324b57600080fd5b8082039050905081818301101561326157600080fd5b80820190509050670de0b6b3a7640000808202821582848304141761328557600080fd5b809050905090506101a061016051600481106132a057600080fd5b602002015180806132b057600080fd5b82049050905061016051600481106132c757600080fd5b600260c052602060c02001556106005161062051808210156132e857600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761330c57600080fd5b809050905090506101a0610160516004811061332757600080fd5b6020020151808061333757600080fd5b8204905090506106605261066051600052600051610220515650005b633df02124600051141561370d5762ffffff541561337057600080fd5b600162ffffff55341561338257600080fd5b6060516004358060405190131561339857600080fd5b80919012156133a657600080fd5b50606051602435806040519013156133bd57600080fd5b80919012156133cb57600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051632ce785a36102a0526004356102c0526024356102e0526044356103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051610300516102e0516102c05160065801612eb6565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526308c379a061040052602061042052602e610440527f45786368616e676520726573756c74656420696e20666577657220636f696e73610460527f207468616e206578706563746564000000000000000000000000000000000000610480526104405060643561026051101561356f5760a461041cfd5b6004356004811061357f57600080fd5b600060c052602060c02001543b61359557600080fd5b600435600481106135a557600080fd5b600060c052602060c020015430186135bc57600080fd5b602061058060646323b872dd6104c052336104e0523061050052604435610520526104dc6000600435600481106135f257600080fd5b600060c052602060c02001545af161360957600080fd5b6000506105805161361957600080fd5b6024356004811061362957600080fd5b600060c052602060c02001543b61363f57600080fd5b6024356004811061364f57600080fd5b600060c052602060c0200154301861366657600080fd5b6020610640604463a9059cbb6105a052336105c052610260516105e0526105bc60006024356004811061369857600080fd5b600060c052602060c02001545af16136af57600080fd5b600050610640516136bf57600080fd5b60043561066052604435610680526024356106a052610260516106c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610660a2600062ffffff55005b63a6417ed660005114156141735762ffffff541561372a57600080fd5b600162ffffff55341561373c57600080fd5b6060516004358060405190131561375257600080fd5b809190121561376057600080fd5b506060516024358060405190131561377757600080fd5b809190121561378557600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101406004356004811061382157600080fd5b60200201516102606004356004811061383957600080fd5b6020020151808061384957600080fd5b8204905090506102e0526101406024356004811061386657600080fd5b60200201516102606024356004811061387e57600080fd5b6020020151808061388e57600080fd5b82049050905061030052604435670de0b6b3a764000080820282158284830414176138b857600080fd5b809050905090506102e05180806138ce57600080fd5b82049050905061032052610140610360525b61036051516020610360510161036052610360610360511015613902576138e0565b632ce785a3610380526004356103a0526024356103c052610320516103e052610400610140805182528060200151826020015280604001518260400152806060015182606001525050610460516104405161042051610400516103e0516103c0516103a05160065801612eb6565b6104c052610340610360525b610360515260206103605103610360526101406103605110151561399f5761397c565b6104c05161034052610340516103005180820282158284830414176139c357600080fd5b80905090509050670de0b6b3a764000080806139de57600080fd5b8204905090506104e0526308c379a061050052602061052052602e610540527f45786368616e676520726573756c74656420696e20666577657220636f696e73610560527f207468616e20657870656374656400000000000000000000000000000000000061058052610540506064356104e0511015613a5f5760a461051cfd5b6105c0600081526000816020015260018160400152600081606001525060243560048110613a8c57600080fd5b600160c052602060c02001543b613aa257600080fd5b60243560048110613ab257600080fd5b600160c052602060c02001543018613ac957600080fd5b60206106e060246370a082316106605260243560048110613ae957600080fd5b600060c052602060c02001546106805261067c60243560048110613b0c57600080fd5b600160c052602060c02001545afa613b2357600080fd5b6000506106e0516106405261034051610640511015613b77576103e36104e0518082028215828483041417613b5757600080fd5b809050905090506103e88080613b6c57600080fd5b8204905090506104e0525b6000610700526105c060043560048110613b9057600080fd5b602002015115613c385760043560048110613baa57600080fd5b600160c052602060c02001543b613bc057600080fd5b60043560048110613bd057600080fd5b600160c052602060c02001543018613be757600080fd5b6000600060646323b872dd61080052336108205230610840526044356108605261081c600060043560048110613c1c57600080fd5b600160c052602060c02001545af1613c3357600080fd5b613ce3565b60043560048110613c4857600080fd5b600160c052602060c02001543b613c5e57600080fd5b60043560048110613c6e57600080fd5b600160c052602060c02001543018613c8557600080fd5b60206107e060646323b872dd61072052336107405230610760526044356107805261073c600060043560048110613cbb57600080fd5b600160c052602060c02001545af1613cd257600080fd5b6000506107e051613ce257600080fd5b5b60043560048110613cf357600080fd5b600160c052602060c02001543b613d0957600080fd5b60043560048110613d1957600080fd5b600160c052602060c02001543018613d3057600080fd5b6020610960604463095ea7b36108c05260043560048110613d5057600080fd5b600060c052602060c02001546108e052604435610900526108dc600060043560048110613d7c57600080fd5b600160c052602060c02001545af1613d9357600080fd5b6000506109605060043560048110613daa57600080fd5b600060c052602060c02001543b613dc057600080fd5b60043560048110613dd057600080fd5b600060c052602060c02001543018613de757600080fd5b60006000602463b6b55f25610980526044356109a05261099c600060043560048110613e1257600080fd5b600060c052602060c02001545af1613e2957600080fd5b60243560048110613e3957600080fd5b600060c052602060c02001543b613e4f57600080fd5b60243560048110613e5f57600080fd5b600060c052602060c02001543018613e7657600080fd5b600060006024632e1a7d4d610a005261034051610a2052610a1c600060243560048110613ea257600080fd5b600060c052602060c02001545af1613eb957600080fd5b60243560048110613ec957600080fd5b600160c052602060c02001543b613edf57600080fd5b60243560048110613eef57600080fd5b600160c052602060c02001543018613f0657600080fd5b6020610b0060246370a08231610a805230610aa052610a9c60243560048110613f2e57600080fd5b600160c052602060c02001545afa613f4557600080fd5b600050610b00516104e0526308c379a0610b20526020610b4052602e610b60527f45786368616e676520726573756c74656420696e20666577657220636f696e73610b80527f207468616e206578706563746564000000000000000000000000000000000000610ba052610b60506064356104e0511015613fc75760a4610b3cfd5b6105c060243560048110613fda57600080fd5b60200201511561407e5760243560048110613ff457600080fd5b600160c052602060c02001543b61400a57600080fd5b6024356004811061401a57600080fd5b600160c052602060c0200154301861403157600080fd5b60006000604463a9059cbb610ca05233610cc0526104e051610ce052610cbc60006024356004811061406257600080fd5b600160c052602060c02001545af161407957600080fd5b614125565b6024356004811061408e57600080fd5b600160c052602060c02001543b6140a457600080fd5b602435600481106140b457600080fd5b600160c052602060c020015430186140cb57600080fd5b6020610c80604463a9059cbb610be05233610c00526104e051610c2052610bfc6000602435600481106140fd57600080fd5b600160c052602060c02001545af161411457600080fd5b600050610c805161412457600080fd5b5b600435610d4052604435610d6052602435610d80526104e051610da052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610d40a2600062ffffff55005b637d49d87560005114156144fb5762ffffff541561419057600080fd5b600162ffffff5534156141a257600080fd5b6007543b6141af57600080fd5b60075430186141bd57600080fd5b60206101c060046318160ddd6101605261017c6007545afa6141de57600080fd5b6000506101c051610140526101e0600081526000816020015260008160400152600081606001525061026060008152600081602001526000816040015260008160600152506102e060006004818352015b6102e0516004811061424057600080fd5b600260c052602060c0200154600435808202821582848304141761426357600080fd5b8090509050905061014051808061427957600080fd5b820490509050610300526308c379a0610320526020610340526030610360527f5769746864726177616c20726573756c74656420696e20666577657220636f69610380527f6e73207468616e206578706563746564000000000000000000000000000000006103a0526103605060246102e051600481106142f957600080fd5b602002013561030051101561430f5760a461033cfd5b6102e0516004811061432057600080fd5b600260c052602060c020018054610300518082101561433e57600080fd5b80820390509050815550610300516101e06102e0516004811061436057600080fd5b60200201526102e0516004811061437657600080fd5b600060c052602060c02001543b61438c57600080fd5b6102e0516004811061439d57600080fd5b600060c052602060c020015430186143b457600080fd5b6020610480604463a9059cbb6103e052336104005261030051610420526103fc60006102e051600481106143e757600080fd5b600060c052602060c02001545af16143fe57600080fd5b6000506104805161440e57600080fd5b5b815160010180835281141561422f575b50506007543b61442e57600080fd5b600754301861443c57600080fd5b6000600060446379cc67906104a052336104c0526004356104e0526104bc60006007545af161446a57600080fd5b6101e0516105405261020051610560526102205161058052610240516105a052610260516105c052610280516105e0526102a051610600526102c0516106205261014051600435808210156144be57600080fd5b8082039050905061064052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d610120610540a2600062ffffff55005b6318a7bd766000511415614ec25762ffffff541561451857600080fd5b600162ffffff55341561452a57600080fd5b600f541561453757600080fd5b6007543b61454457600080fd5b600754301861455257600080fd5b60206101c060046318160ddd6101605261017c6007545afa61457357600080fd5b6000506101c051610140526000610140511161458e57600080fd5b600454600480820282158284830414176145a757600080fd5b80905090509050600c80806145bb57600080fd5b8204905090506101e052600554610200526102206101406102a0525b6102a0515160206102a051016102a0526102a06102a05110156145f9576145d7565b600658016100a9565b6102c0526102e05261030052610320526102806102a0525b6102a0515260206102a051036102a0526101406102a05110151561463d5761461a565b6102c080518252806020015182602001528060400151826040015280606001518260600152505061034060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506103c0610340805182528060200151826020015280604001518260400152806060015182606001525050610140610460525b61046051516020610460510161046052610460610460511015614701576146df565b631f30ab74610480526104a061022080518252806020015182602001528060400151826040015280606001518260600152505061052061034080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a05160065801610759565b6105e052610440610460525b61046051526020610460510361046052610140610460511015156147b657614793565b6105e0516104405261060060006004818352015b6103c061060051600481106147de57600080fd5b602002018051600461060051600481106147f757600080fd5b60200201358082101561480957600080fd5b808203905090508152505b81516001018083528114156147ca575b5050610140610640525b610640515160206106405101610640526106406106405110156148505761482e565b631f30ab74610660526106806102208051825280602001518260200152806040015182604001528060600151826060015250506107006103c0805182528060200151826020015280604001518260400152806060015182606001525050610760516107405161072051610700516106e0516106c0516106a0516106805160065801610759565b6107c052610620610640525b6106405152602061064051036106405261014061064051101515614905576148e2565b6107c051610620526107e0600081526000816020015260008160400152600081606001525061086060006004818352015b61062051610340610860516004811061494e57600080fd5b6020020151808202821582848304141761496757600080fd5b8090509050905061044051808061497d57600080fd5b8204905090506108805260006108a0526103c061086051600481106149a157600080fd5b60200201516108805111156149ea57610880516103c061086051600481106149c857600080fd5b6020020151808210156149da57600080fd5b808203905090506108a052614a20565b6103c061086051600481106149fe57600080fd5b60200201516108805180821015614a1457600080fd5b808203905090506108a0525b6101e0516108a0518082028215828483041417614a3c57600080fd5b809050905090506402540be4008080614a5457600080fd5b8204905090506107e06108605160048110614a6e57600080fd5b60200201526103c06108605160048110614a8757600080fd5b60200201516107e06108605160048110614aa057600080fd5b6020020151610200518082028215828483041417614abd57600080fd5b809050905090506402540be4008080614ad557600080fd5b82049050905080821015614ae857600080fd5b808203905090506108605160048110614b0057600080fd5b600260c052602060c02001556103c06108605160048110614b2057600080fd5b6020020180516107e06108605160048110614b3a57600080fd5b602002015180821015614b4c57600080fd5b808203905090508152505b8151600101808352811415614936575b50506101406108e0525b6108e0515160206108e051016108e0526108e06108e0511015614b9357614b71565b631f30ab74610900526109206102208051825280602001518260200152806040015182604001528060600151826060015250506109a06103c0805182528060200151826020015280604001518260400152806060015182606001525050610a00516109e0516109c0516109a0516109805161096051610940516109205160065801610759565b610a60526108c06108e0525b6108e0515260206108e051036108e0526101406108e051101515614c4857614c25565b610a60516108c052610440516108c05180821015614c6557600080fd5b80820390509050610140518082028215828483041417614c8457600080fd5b80905090509050610440518080614c9a57600080fd5b820490509050610a80526000610a805111614cb457600080fd5b6308c379a0610aa0526020610ac0526014610ae0527f536c697070616765207363726577656420796f75000000000000000000000000610b0052610ae050608435610a80511115614d06576084610abcfd5b610b4060006004818352015b610b405160048110614d2357600080fd5b600060c052602060c02001543b614d3957600080fd5b610b405160048110614d4a57600080fd5b600060c052602060c02001543018614d6157600080fd5b6020610c00604463a9059cbb610b605233610b80526004610b405160048110614d8957600080fd5b6020020135610ba052610b7c6000610b405160048110614da857600080fd5b600060c052602060c02001545af1614dbf57600080fd5b600050610c0051614dcf57600080fd5b5b8151600101808352811415614d12575b50506007543b614def57600080fd5b6007543018614dfd57600080fd5b6000600060446379cc6790610c205233610c4052610a8051610c6052610c3c60006007545af1614e2c57600080fd5b600435610cc052602435610ce052604435610d0052606435610d20526107e051610d405261080051610d605261082051610d805261084051610da05261062051610dc05261014051610a805180821015614e8557600080fd5b80820390509050610de052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610cc0a2600062ffffff55005b63ee11f5b66000511415614f84573415614edb57600080fd5b6006543314614ee957600080fd5b60085415614ef657600080fd5b64012a05f2006044351115614f0a57600080fd5b426203f480818183011015614f1e57600080fd5b808201905090506101405261014051600855600435600a55602435600b55604435600c5560043561016052602435610180526044356101a052610140517f6081daa3b61098baf24d9c69bcd53af932e0635c89c6fd0617534b9ba76a7f736060610160a2005b632a7dd7cd6000511415615031573415614f9d57600080fd5b6006543314614fab57600080fd5b60006008541142600854111516614fc157600080fd5b6000600855600a5461014052600b5461016052600c5461018052610140516003556101605160045561018051600555610140516101a052610160516101c052610180516101e0527f752a27d1853eb7af3ee4ff764f2c4a51619386af721573dd3809e929c39db99e60606101a0a1005b63226840fb600051141561505f57341561504a57600080fd5b600654331461505857600080fd5b6000600855005b636b441a40600051141561510057341561507857600080fd5b600435602051811061508957600080fd5b50600654331461509857600080fd5b600954156150a557600080fd5b426203f4808181830110156150b957600080fd5b808201905090506101405261014051600955600435600d55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae600051141561517c57341561511957600080fd5b600654331461512757600080fd5b6000600954116009544210151661513d57600080fd5b6000600955600d546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19360005114156151aa57341561519557600080fd5b60065433146151a357600080fd5b6000600955005b6330c5408560005114156153235734156151c357600080fd5b60065433146151d157600080fd5b6101406001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101c060006004818352015b6101c0516004811061521357600080fd5b600060c052602060c02001546101e0526101e0513b61523157600080fd5b6101e051301861524057600080fd5b60206102a060246370a0823161022052306102405261023c6101e0515afa61526757600080fd5b6000506102a0516101c0516004811061527f57600080fd5b600260c052602060c02001548082101561529857600080fd5b8082039050905061020052600061020051111561530e576101e0513b6152bd57600080fd5b6101e05130186152cc57600080fd5b6020610360604463a9059cbb6102c052336102e05261020051610300526102dc60006101e0515af16152fd57600080fd5b6000506103605161530d57600080fd5b5b5b8151600101808352811415615202575b5050005b63e3698853600051141561535f57341561533c57600080fd5b600654331461534a57600080fd5b42600e541161535857600080fd5b6001600f55005b633046f972600051141561538d57341561537857600080fd5b600654331461538657600080fd5b6000600f55005b6323746eb860005114156153f25734156153a657600080fd5b606051600435806040519013156153bc57600080fd5b80919012156153ca57600080fd5b50600435600481106153db57600080fd5b600060c052602060c020015460005260206000f350005b63b739953e600051141561545757341561540b57600080fd5b6060516004358060405190131561542157600080fd5b809190121561542f57600080fd5b506004356004811061544057600080fd5b600160c052602060c020015460005260206000f350005b63065a80d860005114156154bc57341561547057600080fd5b6060516004358060405190131561548657600080fd5b809190121561549457600080fd5b50600435600481106154a557600080fd5b600260c052602060c020015460005260206000f350005b63f446c1d060005114156154e35734156154d557600080fd5b60035460005260206000f350005b63ddca3f43600051141561550a5734156154fc57600080fd5b60045460005260206000f350005b63fee3f7f9600051141561553157341561552357600080fd5b60055460005260206000f350005b638da5cb5b600051141561555857341561554a57600080fd5b60065460005260206000f350005b63405e28f8600051141561557f57341561557157600080fd5b60085460005260206000f350005b63e0a0b58660005114156155a657341561559857600080fd5b60095460005260206000f350005b63b4b577ad60005114156155cd5734156155bf57600080fd5b600a5460005260206000f350005b6358680d0b60005114156155f45734156155e657600080fd5b600b5460005260206000f350005b63e3824462600051141561561b57341561560d57600080fd5b600c5460005260206000f350005b631ec0cdc1600051141561564257341561563457600080fd5b600d5460005260206000f350005b5b60006000fd

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

000000000000000000000000acd43e627e64355f1861cec6d3a6688b31a6f952000000000000000000000000597ad1e0c13bfe8025993d9e79c69e1c0233522e0000000000000000000000002f08119c6f07c006695e079aafc638b8789faf1800000000000000000000000037d19d1c4e1fa9dc47bd1ea12f742a0887eda74a0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000085d4780b73119b644ae5ecd22b376000000000000000000000000173f8ee61c0fe712cae2a2fc8d5c0ccdda57e6da000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000003d0900

-----Decoded View---------------
Arg [0] : _coins (address[4]): 0xACd43E627e64355f1861cEC6d3a6688B31a6F952,0x597aD1e0c13Bfe8025993D9e79C69E1c0233522e,0x2f08119C6f07c006695E079AAFc638b8789FAf18,0x37d19d1c4E1fa9DC47bD1eA12f742a0887eDa74a
Arg [1] : _underlying_coins (address[4]): 0x6B175474E89094C44Da98b954EedeAC495271d0F,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7,0x0000000000085d4780B73119b644AE5ecd22b376
Arg [2] : _pool_token (address): 0x173f8ee61C0FE712caE2a2fc8d5c0ccDDa57E6dA
Arg [3] : _A (uint256): 70
Arg [4] : _fee (uint256): 4000000

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000acd43e627e64355f1861cec6d3a6688b31a6f952
Arg [1] : 000000000000000000000000597ad1e0c13bfe8025993d9e79c69e1c0233522e
Arg [2] : 0000000000000000000000002f08119c6f07c006695e079aafc638b8789faf18
Arg [3] : 00000000000000000000000037d19d1c4e1fa9dc47bd1ea12f742a0887eda74a
Arg [4] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [5] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [6] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [7] : 0000000000000000000000000000000000085d4780b73119b644ae5ecd22b376
Arg [8] : 000000000000000000000000173f8ee61c0fe712cae2a2fc8d5c0ccdda57e6da
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000046
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

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.