ETH Price: $2,636.26 (+0.35%)

Token

XDeFi Pool Token (XPT)
 

Overview

Max Total Supply

100 XPT

Holders

1

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
XDEFI: Staking
Balance
100 XPT

Value
$0.00
0x7f478b6c313cae4d36c1a6c0fb7c366b441bde58
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x9436c214...Bee3F868d
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
XPool

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-13
*/

// File: contracts/XVersion.sol

pragma solidity 0.5.17;

contract XVersion {
    function getVersion() external view returns (bytes32);
}

contract XApollo is XVersion {
    function getVersion() external view returns (bytes32) {
        return bytes32("APOLLO");
    }
}

// File: contracts/XConst.sol

pragma solidity 0.5.17;

contract XConst {
    uint256 public constant BONE = 10**18;

    uint256 public constant MIN_BOUND_TOKENS = 2;
    uint256 public constant MAX_BOUND_TOKENS = 8;

    uint256 public constant EXIT_ZERO_FEE = 0;

    uint256 public constant MIN_WEIGHT = BONE;
    uint256 public constant MAX_WEIGHT = BONE * 50;
    uint256 public constant MAX_TOTAL_WEIGHT = BONE * 50;

    // min effective value: 0.000001 TOKEN
    uint256 public constant MIN_BALANCE = 10**6;

    // BONE/(10**10) XPT
    uint256 public constant MIN_POOL_AMOUNT = 10**8;

    uint256 public constant INIT_POOL_SUPPLY = BONE * 100;

    uint256 public constant MAX_IN_RATIO = BONE / 2;
    uint256 public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei;
}

// File: contracts/lib/XNum.sol

pragma solidity 0.5.17;

library XNum {
    uint256 public constant BONE = 10**18;
    uint256 public constant MIN_BPOW_BASE = 1 wei;
    uint256 public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei;
    uint256 public constant BPOW_PRECISION = BONE / 10**10;

    function btoi(uint256 a) internal pure returns (uint256) {
        return a / BONE;
    }

    function bfloor(uint256 a) internal pure returns (uint256) {
        return btoi(a) * BONE;
    }

    function badd(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "ERR_ADD_OVERFLOW");
        return c;
    }

    function bsub(uint256 a, uint256 b) internal pure returns (uint256) {
        (uint256 c, bool flag) = bsubSign(a, b);
        require(!flag, "ERR_SUB_UNDERFLOW");
        return c;
    }

    function bsubSign(uint256 a, uint256 b)
        internal
        pure
        returns (uint256, bool)
    {
        if (a >= b) {
            return (a - b, false);
        } else {
            return (b - a, true);
        }
    }

    function bmul(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c0 = a * b;
        require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW");
        uint256 c1 = c0 + (BONE / 2);
        require(c1 >= c0, "ERR_MUL_OVERFLOW");
        uint256 c2 = c1 / BONE;
        return c2;
    }

    function bdiv(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "ERR_DIV_ZERO");
        uint256 c0 = a * BONE;
        require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow
        uint256 c1 = c0 + (b / 2);
        require(c1 >= c0, "ERR_DIV_INTERNAL"); //  badd require
        uint256 c2 = c1 / b;
        return c2;
    }

    // DSMath.wpow
    function bpowi(uint256 a, uint256 n) internal pure returns (uint256) {
        uint256 z = n % 2 != 0 ? a : BONE;

        for (n /= 2; n != 0; n /= 2) {
            a = bmul(a, a);

            if (n % 2 != 0) {
                z = bmul(z, a);
            }
        }
        return z;
    }

    // Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
    // Use `bpowi` for `b^e` and `bpowK` for k iterations
    // of approximation of b^0.w
    function bpow(uint256 base, uint256 exp) internal pure returns (uint256) {
        require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW");
        require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH");

        uint256 whole = bfloor(exp);
        uint256 remain = bsub(exp, whole);

        uint256 wholePow = bpowi(base, btoi(whole));

        if (remain == 0) {
            return wholePow;
        }

        uint256 partialResult = bpowApprox(base, remain, BPOW_PRECISION);
        return bmul(wholePow, partialResult);
    }

    function bpowApprox(
        uint256 base,
        uint256 exp,
        uint256 precision
    ) internal pure returns (uint256) {
        // term 0:
        uint256 a = exp;
        (uint256 x, bool xneg) = bsubSign(base, BONE);
        uint256 term = BONE;
        uint256 sum = term;
        bool negative = false;

        // term(k) = numer / denom
        //         = (product(a - i + 1, i=1-->k) * x^k) / (k!)
        // each iteration, multiply previous term by (a-(k-1)) * x / k
        // continue until term is less than precision
        for (uint256 i = 1; term >= precision; i++) {
            uint256 bigK = i * BONE;
            (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
            term = bmul(term, bmul(c, x));
            term = bdiv(term, bigK);
            if (term == 0) break;

            if (xneg) negative = !negative;
            if (cneg) negative = !negative;
            if (negative) {
                sum = bsub(sum, term);
            } else {
                sum = badd(sum, term);
            }
        }

        return sum;
    }
}

// File: contracts/interface/IERC20.sol

pragma solidity 0.5.17;

interface IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transfer(address _to, uint256 _value)
        external
        returns (bool success);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function approve(address _spender, uint256 _value)
        external
        returns (bool success);

    function allowance(address _owner, address _spender)
        external
        view
        returns (uint256 remaining);
}

// File: contracts/XPToken.sol

pragma solidity 0.5.17;




// Highly opinionated token implementation
contract XTokenBase {
    using XNum for uint256;

    mapping(address => uint256) internal _balance;
    mapping(address => mapping(address => uint256)) internal _allowance;
    uint256 internal _totalSupply;

    event Approval(address indexed src, address indexed dst, uint256 amt);
    event Transfer(address indexed src, address indexed dst, uint256 amt);

    function _mint(uint256 amt) internal {
        _balance[address(this)] = (_balance[address(this)]).badd(amt);
        _totalSupply = _totalSupply.badd(amt);
        emit Transfer(address(0), address(this), amt);
    }

    function _burn(uint256 amt) internal {
        require(_balance[address(this)] >= amt, "ERR_INSUFFICIENT_BAL");
        _balance[address(this)] = (_balance[address(this)]).bsub(amt);
        _totalSupply = _totalSupply.bsub(amt);
        emit Transfer(address(this), address(0), amt);
    }

    function _move(
        address src,
        address dst,
        uint256 amt
    ) internal {
        require(_balance[src] >= amt, "ERR_INSUFFICIENT_BAL");
        _balance[src] = (_balance[src]).bsub(amt);
        _balance[dst] = (_balance[dst]).badd(amt);
        emit Transfer(src, dst, amt);
    }
}

contract XPToken is XTokenBase, IERC20, XApollo {
    using XNum for uint256;

    string private constant _name = "XDeFi Pool Token";
    string private constant _symbol = "XPT";
    uint8 private constant _decimals = 18;

    function name() external view returns (string memory) {
        return _name;
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

    function decimals() external view returns (uint8) {
        return _decimals;
    }

    function allowance(address src, address dst)
        external
        view
        returns (uint256)
    {
        return _allowance[src][dst];
    }

    function balanceOf(address whom) external view returns (uint256) {
        return _balance[whom];
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function approve(address dst, uint256 amt) external returns (bool) {
        _allowance[msg.sender][dst] = amt;
        emit Approval(msg.sender, dst, amt);
        return true;
    }

    function transfer(address dst, uint256 amt) external returns (bool) {
        _move(msg.sender, dst, amt);
        return true;
    }

    function transferFrom(
        address src,
        address dst,
        uint256 amt
    ) external returns (bool) {
        require(
            msg.sender == src || amt <= _allowance[src][msg.sender],
            "ERR_BTOKEN_BAD_CALLER"
        );
        _move(src, dst, amt);
        if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) {
            _allowance[src][msg.sender] = (_allowance[src][msg.sender]).bsub(
                amt
            );
            emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
        }
        return true;
    }
}

// File: contracts/lib/XMath.sol

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.5.17;


library XMath {
    using XNum for uint256;

    uint256 public constant BONE = 10**18;
    uint256 public constant EXIT_ZERO_FEE = 0;

    /**********************************************************************************************
    // calcSpotPrice                                                                             //
    // sP = spotPrice                                                                            //
    // bI = tokenBalanceIn                ( bI / wI )         1                                  //
    // bO = tokenBalanceOut         sP =  -----------  *  ----------                             //
    // wI = tokenWeightIn                 ( bO / wO )     ( 1 - sF )                             //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcSpotPrice(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 swapFee
    ) public pure returns (uint256 spotPrice) {
        uint256 numer = tokenBalanceIn.bdiv(tokenWeightIn);
        uint256 denom = tokenBalanceOut.bdiv(tokenWeightOut);
        uint256 ratio = numer.bdiv(denom);
        uint256 scale = BONE.bdiv(BONE.bsub(swapFee));
        return (spotPrice = ratio.bmul(scale));
    }

    /**********************************************************************************************
    // calcOutGivenIn                                                                            //
    // aO = tokenAmountOut                                                                       //
    // bO = tokenBalanceOut                                                                      //
    // bI = tokenBalanceIn              /      /            bI             \    (wI / wO) \      //
    // aI = tokenAmountIn    aO = bO * |  1 - | --------------------------  | ^            |     //
    // wI = tokenWeightIn               \      \ ( bI + ( aI * ( 1 - sF )) /              /      //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcOutGivenIn(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountIn,
        uint256 swapFee
    ) public pure returns (uint256 tokenAmountOut) {
        uint256 weightRatio;
        if (tokenWeightIn == tokenWeightOut) {
            weightRatio = 1 * BONE;
        } else if (tokenWeightIn >> 1 == tokenWeightOut) {
            weightRatio = 2 * BONE;
        } else {
            weightRatio = tokenWeightIn.bdiv(tokenWeightOut);
        }
        uint256 adjustedIn = BONE.bsub(swapFee);
        adjustedIn = tokenAmountIn.bmul(adjustedIn);
        uint256 y = tokenBalanceIn.bdiv(tokenBalanceIn.badd(adjustedIn));
        uint256 foo;
        if (tokenWeightIn == tokenWeightOut) {
            foo = y;
        } else if (tokenWeightIn >> 1 == tokenWeightOut) {
            foo = y.bmul(y);
        } else {
            foo = y.bpow(weightRatio);
        }
        uint256 bar = BONE.bsub(foo);
        tokenAmountOut = tokenBalanceOut.bmul(bar);
        return tokenAmountOut;
    }

    /**********************************************************************************************
    // calcInGivenOut                                                                            //
    // aI = tokenAmountIn                                                                        //
    // bO = tokenBalanceOut               /  /     bO      \    (wO / wI)      \                 //
    // bI = tokenBalanceIn          bI * |  | ------------  | ^            - 1  |                //
    // aO = tokenAmountOut    aI =        \  \ ( bO - aO ) /                   /                 //
    // wI = tokenWeightIn           --------------------------------------------                 //
    // wO = tokenWeightOut                          ( 1 - sF )                                   //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcInGivenOut(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountOut,
        uint256 swapFee
    ) public pure returns (uint256 tokenAmountIn) {
        uint256 weightRatio;
        if (tokenWeightOut == tokenWeightIn) {
            weightRatio = 1 * BONE;
        } else if (tokenWeightOut >> 1 == tokenWeightIn) {
            weightRatio = 2 * BONE;
        } else {
            weightRatio = tokenWeightOut.bdiv(tokenWeightIn);
        }
        uint256 diff = tokenBalanceOut.bsub(tokenAmountOut);
        uint256 y = tokenBalanceOut.bdiv(diff);
        uint256 foo;
        if (tokenWeightOut == tokenWeightIn) {
            foo = y;
        } else if (tokenWeightOut >> 1 == tokenWeightIn) {
            foo = y.bmul(y);
        } else {
            foo = y.bpow(weightRatio);
        }
        foo = foo.bsub(BONE);
        tokenAmountIn = BONE.bsub(swapFee);
        tokenAmountIn = tokenBalanceIn.bmul(foo).bdiv(tokenAmountIn);
        return tokenAmountIn;
    }

    /**********************************************************************************************
    // calcPoolOutGivenSingleIn                                                                  //
    // pAo = poolAmountOut         /                                              \              //
    // tAi = tokenAmountIn        ///      /     //    wI \      \\       \     wI \             //
    // wI = tokenWeightIn        //| tAi *| 1 - || 1 - --  | * sF || + tBi \    --  \            //
    // tW = totalWeight     pAo=||  \      \     \\    tW /      //         | ^ tW   | * pS - pS //
    // tBi = tokenBalanceIn      \\  ------------------------------------- /        /            //
    // pS = poolSupply            \\                    tBi               /        /             //
    // sF = swapFee                \                                              /              //
    **********************************************************************************************/
    function calcPoolOutGivenSingleIn(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 poolSupply,
        uint256 totalWeight,
        uint256 tokenAmountIn,
        uint256 swapFee
    ) public pure returns (uint256 poolAmountOut) {
        // Charge the trading fee for the proportion of tokenAi
        ///  which is implicitly traded to the other pool tokens.
        // That proportion is (1- weightTokenIn)
        // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
        uint256 normalizedWeight = tokenWeightIn.bdiv(totalWeight);
        uint256 zaz = BONE.bsub(normalizedWeight).bmul(swapFee);
        uint256 tokenAmountInAfterFee = tokenAmountIn.bmul(BONE.bsub(zaz));

        uint256 newTokenBalanceIn = tokenBalanceIn.badd(tokenAmountInAfterFee);
        uint256 tokenInRatio = newTokenBalanceIn.bdiv(tokenBalanceIn);

        // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
        uint256 poolRatio = tokenInRatio.bpow(normalizedWeight);
        uint256 newPoolSupply = poolRatio.bmul(poolSupply);
        poolAmountOut = newPoolSupply.bsub(poolSupply);
        return poolAmountOut;
    }

    /**********************************************************************************************
    // calcSingleOutGivenPoolIn                                                                  //
    // tAo = tokenAmountOut            /      /                                             \\   //
    // bO = tokenBalanceOut           /      // pS - (pAi * (1 - eF)) \     /    1    \      \\  //
    // pAi = poolAmountIn            | bO - || ----------------------- | ^ | --------- | * b0 || //
    // ps = poolSupply                \      \\          pS           /     \(wO / tW)/      //  //
    // wI = tokenWeightIn      tAo =   \      \                                             //   //
    // tW = totalWeight                    /     /      wO \       \                             //
    // sF = swapFee                    *  | 1 - |  1 - ---- | * sF  |                            //
    // eF = exitFee                        \     \      tW /       /                             //
    **********************************************************************************************/
    function calcSingleOutGivenPoolIn(
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 poolSupply,
        uint256 totalWeight,
        uint256 poolAmountIn,
        uint256 swapFee
    ) public pure returns (uint256 tokenAmountOut) {
        uint256 normalizedWeight = tokenWeightOut.bdiv(totalWeight);
        // charge exit fee on the pool token side
        // pAiAfterExitFee = pAi*(1-exitFee)
        uint256 poolAmountInAfterExitFee =
            poolAmountIn.bmul(BONE.bsub(EXIT_ZERO_FEE));
        uint256 newPoolSupply = poolSupply.bsub(poolAmountInAfterExitFee);
        uint256 poolRatio = newPoolSupply.bdiv(poolSupply);

        // newBalTo = poolRatio^(1/weightTo) * balTo;
        uint256 tokenOutRatio = poolRatio.bpow(BONE.bdiv(normalizedWeight));
        uint256 newTokenBalanceOut = tokenOutRatio.bmul(tokenBalanceOut);

        uint256 tokenAmountOutBeforeSwapFee =
            tokenBalanceOut.bsub(newTokenBalanceOut);

        // charge swap fee on the output token side
        //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee)
        uint256 zaz = BONE.bsub(normalizedWeight).bmul(swapFee);
        tokenAmountOut = tokenAmountOutBeforeSwapFee.bmul(BONE.bsub(zaz));
        return tokenAmountOut;
    }
}

// File: contracts/interface/IXConfig.sol

pragma solidity 0.5.17;

interface IXConfig {
    function getCore() external view returns (address);

    function getSAFU() external view returns (address);

    function getMaxExitFee() external view returns (uint256);

    function getSafuFee() external view returns (uint256);

    function getSwapProxy() external view returns (address);

    function dedupPool(address[] calldata tokens, uint256[] calldata denorms)
        external
        returns (bool exist, bytes32 sig);

    function addPoolSig(bytes32 sig, address pool) external;
}

// File: contracts/XPool.sol

pragma solidity 0.5.17;







contract XPool is XApollo, XPToken, XConst {
    using XNum for uint256;

    //Swap Fees: 0.1%, 0.25%, 1%, 2.5%, 10%
    uint256[5] public SWAP_FEES = [
        BONE / 1000,
        (25 * BONE) / 10000,
        BONE / 100,
        (25 * BONE) / 1000,
        BONE / 10
    ];

    struct Record {
        bool bound; // is token bound to pool
        uint256 index; // private
        uint256 denorm; // denormalized weight
        uint256 balance;
    }

    event LOG_SWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256 tokenAmountIn,
        uint256 tokenAmountOut
    );

    event LOG_REFER(
        address indexed caller,
        address indexed ref,
        address indexed tokenIn,
        uint256 fee
    );

    event LOG_JOIN(
        address indexed caller,
        address indexed tokenIn,
        uint256 tokenAmountIn
    );

    event LOG_EXIT(
        address indexed caller,
        address indexed tokenOut,
        uint256 tokenAmountOut
    );

    event LOG_BIND(
        address indexed caller,
        address indexed token,
        uint256 denorm,
        uint256 balance
    );

    event LOG_UPDATE_SAFU(address indexed safu, uint256 fee);

    event LOG_EXIT_FEE(uint256 fee);

    event LOG_FINAL(uint256 swapFee);

    event SET_CONTROLLER(address indexed manager);

    event UPDATE_FARM(address indexed caller, bool isFarm);

    // anonymous event
    event LOG_CALL(
        bytes4 indexed sig,
        address indexed caller,
        bytes data
    ) anonymous;

    modifier _logs_() {
        emit LOG_CALL(msg.sig, msg.sender, msg.data);
        _;
    }

    modifier _lock_() {
        require(!_mutex, "ERR_REENTRY");
        _mutex = true;
        _;
        _mutex = false;
    }

    modifier _viewlock_() {
        require(!_mutex, "ERR_REENTRY");
        _;
    }

    bool private _mutex;

    address public controller; // has CONTROL role

    // `finalize` require CONTROL, `finalize` sets `can SWAP and can JOIN`
    bool public finalized;

    uint256 public swapFee;
    uint256 public exitFee;

    // Pool Governance
    address public SAFU;
    uint256 public safuFee;
    bool public isFarmPool;

    address[] internal _tokens;
    mapping(address => Record) internal _records;
    uint256 private _totalWeight;

    IXConfig public xconfig;
    address public origin;

    constructor(address _xconfig, address _controller) public {
        controller = _controller;
        origin = tx.origin;
        swapFee = SWAP_FEES[1];
        exitFee = EXIT_ZERO_FEE;
        finalized = false;
        xconfig = IXConfig(_xconfig);
        SAFU = xconfig.getSAFU();
        safuFee = xconfig.getSafuFee();
    }

    function isBound(address t) external view returns (bool) {
        return _records[t].bound;
    }

    function getNumTokens() external view returns (uint256) {
        return _tokens.length;
    }

    function getFinalTokens()
        external
        view
        _viewlock_
        returns (address[] memory tokens)
    {
        require(finalized, "ERR_NOT_FINALIZED");
        return _tokens;
    }

    function getDenormalizedWeight(address token)
        external
        view
        _viewlock_
        returns (uint256)
    {
        require(_records[token].bound, "ERR_NOT_BOUND");
        return _records[token].denorm;
    }

    function getTotalDenormalizedWeight()
        external
        view
        _viewlock_
        returns (uint256)
    {
        return _totalWeight;
    }

    function getNormalizedWeight(address token)
        external
        view
        _viewlock_
        returns (uint256)
    {
        require(_records[token].bound, "ERR_NOT_BOUND");
        uint256 denorm = _records[token].denorm;
        return denorm.bdiv(_totalWeight);
    }

    function getBalance(address token)
        external
        view
        _viewlock_
        returns (uint256)
    {
        require(_records[token].bound, "ERR_NOT_BOUND");
        return _records[token].balance;
    }

    function setController(address manager) external _logs_ {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(manager != address(0), "ERR_ZERO_ADDR");
        controller = manager;
        emit SET_CONTROLLER(manager);
    }

    function setExitFee(uint256 fee) external {
        require(!finalized, "ERR_IS_FINALIZED");
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(fee <= xconfig.getMaxExitFee(), "INVALID_EXIT_FEE");
        exitFee = fee;
        emit LOG_EXIT_FEE(fee);
    }

    // allow SAFU address and SAFE FEE be updated by xconfig
    function updateSafu(address safu, uint256 fee) external {
        require(msg.sender == address(xconfig), "ERR_NOT_CONFIG");
        require(safu != address(0), "ERR_ZERO_ADDR");
        SAFU = safu;
        safuFee = fee;

        emit LOG_UPDATE_SAFU(safu, fee);
    }

    // allow isFarmPool be updated by xconfig
    function updateFarm(bool isFarm) external {
        require(msg.sender == address(xconfig), "ERR_NOT_CONFIG");
        isFarmPool = isFarm;
        emit UPDATE_FARM(msg.sender, isFarm);
    }

    function bind(address token, uint256 denorm) external _lock_ {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(!_records[token].bound, "ERR_IS_BOUND");
        require(!finalized, "ERR_IS_FINALIZED");

        require(_tokens.length < MAX_BOUND_TOKENS, "ERR_MAX_TOKENS");

        require(denorm >= MIN_WEIGHT, "ERR_MIN_WEIGHT");
        require(denorm <= MAX_WEIGHT, "ERR_MAX_WEIGHT");

        uint256 balance = IERC20(token).balanceOf(address(this));

        uint256 decimal = 10**uint256(IERC20(token).decimals());
        require(decimal >= 10**6, "ERR_TOO_SMALL");

        // 0.000001 TOKEN
        require(balance >= decimal / MIN_BALANCE, "ERR_MIN_BALANCE");

        _totalWeight = _totalWeight.badd(denorm);
        require(_totalWeight <= MAX_TOTAL_WEIGHT, "ERR_MAX_TOTAL_WEIGHT");

        _records[token] = Record({
            bound: true,
            index: _tokens.length,
            denorm: denorm,
            balance: balance
        });
        _tokens.push(token);

        emit LOG_BIND(msg.sender, token, denorm, balance);
    }

    // _swapFee must be one of SWAP_FEES
    function finalize(uint256 _swapFee) external _lock_ {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(!finalized, "ERR_IS_FINALIZED");
        require(_tokens.length >= MIN_BOUND_TOKENS, "ERR_MIN_TOKENS");
        require(_tokens.length <= MAX_BOUND_TOKENS, "ERR_MAX_TOKENS");

        require(_swapFee >= SWAP_FEES[0], "ERR_MIN_FEE");
        require(_swapFee <= SWAP_FEES[SWAP_FEES.length - 1], "ERR_MAX_FEE");

        bool found = false;
        for (uint256 i = 0; i < SWAP_FEES.length; i++) {
            if (_swapFee == SWAP_FEES[i]) {
                found = true;
                break;
            }
        }
        require(found, "ERR_INVALID_SWAP_FEE");
        swapFee = _swapFee;

        finalized = true;

        _mintPoolShare(INIT_POOL_SUPPLY);
        _pushPoolShare(msg.sender, INIT_POOL_SUPPLY);

        emit LOG_FINAL(swapFee);
    }

    // Absorb any tokens that have been sent to this contract into the pool
    function gulp(address token) external _logs_ _lock_ {
        require(_records[token].bound, "ERR_NOT_BOUND");
        _records[token].balance = IERC20(token).balanceOf(address(this));
    }

    function getSpotPrice(address tokenIn, address tokenOut)
        external
        view
        _viewlock_
        returns (uint256 spotPrice)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return
            XMath.calcSpotPrice(
                inRecord.balance,
                inRecord.denorm,
                outRecord.balance,
                outRecord.denorm,
                swapFee
            );
    }

    function getSpotPriceSansFee(address tokenIn, address tokenOut)
        external
        view
        _viewlock_
        returns (uint256 spotPrice)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return
            XMath.calcSpotPrice(
                inRecord.balance,
                inRecord.denorm,
                outRecord.balance,
                outRecord.denorm,
                0
            );
    }

    function joinPool(uint256 poolAmountOut, uint256[] calldata maxAmountsIn)
        external
        _lock_
    {
        require(finalized, "ERR_NOT_FINALIZED");
        require(maxAmountsIn.length == _tokens.length, "ERR_LENGTH_MISMATCH");

        uint256 poolTotal = totalSupply();
        uint256 ratio = poolAmountOut.bdiv(poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            uint256 tokenAmountIn = ratio.bmul(bal);
            require(tokenAmountIn != 0, "ERR_MATH_APPROX");
            require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN");
            _records[t].balance = (_records[t].balance).badd(tokenAmountIn);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
        }
        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
    }

    function exitPool(uint256 poolAmountIn, uint256[] calldata minAmountsOut)
        external
        _lock_
    {
        require(finalized, "ERR_NOT_FINALIZED");
        require(minAmountsOut.length == _tokens.length, "ERR_LENGTH_MISMATCH");

        // min pool amount
        require(poolAmountIn >= MIN_POOL_AMOUNT, "ERR_MIN_AMOUNT");

        uint256 poolTotal = totalSupply();
        uint256 _exitFee = poolAmountIn.bmul(exitFee);

        // never charge exitFee to pool origin
        if (msg.sender == origin) {
            _exitFee = 0;
        }
        uint256 pAiAfterExitFee = poolAmountIn.bsub(_exitFee);
        uint256 ratio = pAiAfterExitFee.bdiv(poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        _pullPoolShare(msg.sender, poolAmountIn);
        // send exitFee to origin
        if (_exitFee > 0) {
            _pushPoolShare(origin, _exitFee);
        }
        _burnPoolShare(pAiAfterExitFee);

        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            uint256 tokenAmountOut = ratio.bmul(bal);
            require(tokenAmountOut != 0, "ERR_MATH_APPROX");
            require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT");
            _records[t].balance = (_records[t].balance).bsub(tokenAmountOut);
            emit LOG_EXIT(msg.sender, t, tokenAmountOut);
            _pushUnderlying(t, msg.sender, tokenAmountOut);
        }
    }

    function swapExactAmountIn(
        address tokenIn,
        uint256 tokenAmountIn,
        address tokenOut,
        uint256 minAmountOut,
        uint256 maxPrice
    ) external returns (uint256 tokenAmountOut, uint256 spotPriceAfter) {
        return
            swapExactAmountInRefer(
                tokenIn,
                tokenAmountIn,
                tokenOut,
                minAmountOut,
                maxPrice,
                address(0x0)
            );
    }

    function swapExactAmountInRefer(
        address tokenIn,
        uint256 tokenAmountIn,
        address tokenOut,
        uint256 minAmountOut,
        uint256 maxPrice,
        address referrer
    ) public _lock_ returns (uint256 tokenAmountOut, uint256 spotPriceAfter) {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(finalized, "ERR_NOT_FINALIZED");

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(
            tokenAmountIn <= (inRecord.balance).bmul(MAX_IN_RATIO),
            "ERR_MAX_IN_RATIO"
        );

        uint256 spotPriceBefore =
            XMath.calcSpotPrice(
                inRecord.balance,
                inRecord.denorm,
                outRecord.balance,
                outRecord.denorm,
                swapFee
            );
        require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");

        tokenAmountOut = calcOutGivenIn(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            tokenAmountIn,
            swapFee
        );
        require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");
        require(
            spotPriceBefore <= tokenAmountIn.bdiv(tokenAmountOut),
            "ERR_MATH_APPROX"
        );

        inRecord.balance = (inRecord.balance).badd(tokenAmountIn);
        outRecord.balance = (outRecord.balance).bsub(tokenAmountOut);

        spotPriceAfter = XMath.calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            swapFee
        );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");

        emit LOG_SWAP(
            msg.sender,
            tokenIn,
            tokenOut,
            tokenAmountIn,
            tokenAmountOut
        );

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        uint256 _swapFee = tokenAmountIn.bmul(swapFee);

        // to referral
        uint256 _referFee = 0;
        if (
            referrer != address(0) &&
            referrer != msg.sender &&
            referrer != tx.origin
        ) {
            _referFee = _swapFee / 5; // 20% to referrer
            _pushUnderlying(tokenIn, referrer, _referFee);
            inRecord.balance = (inRecord.balance).bsub(_referFee);
            emit LOG_REFER(msg.sender, referrer, tokenIn, _referFee);
        }

        // to SAFU
        uint256 _safuFee = tokenAmountIn.bmul(safuFee);
        if (isFarmPool) {
            _safuFee = _swapFee.bsub(_referFee);
        }
        require(_safuFee.badd(_referFee) <= _swapFee, "ERR_FEE_LIMIT");
        _pushUnderlying(tokenIn, SAFU, _safuFee);
        inRecord.balance = (inRecord.balance).bsub(_safuFee);

        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
        return (tokenAmountOut, spotPriceAfter);
    }

    function swapExactAmountOut(
        address tokenIn,
        uint256 maxAmountIn,
        address tokenOut,
        uint256 tokenAmountOut,
        uint256 maxPrice
    ) external returns (uint256 tokenAmountIn, uint256 spotPriceAfter) {
        return
            swapExactAmountOutRefer(
                tokenIn,
                maxAmountIn,
                tokenOut,
                tokenAmountOut,
                maxPrice,
                address(0x0)
            );
    }

    function swapExactAmountOutRefer(
        address tokenIn,
        uint256 maxAmountIn,
        address tokenOut,
        uint256 tokenAmountOut,
        uint256 maxPrice,
        address referrer
    ) public _lock_ returns (uint256 tokenAmountIn, uint256 spotPriceAfter) {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(finalized, "ERR_NOT_FINALIZED");

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(
            tokenAmountOut <= (outRecord.balance).bmul(MAX_OUT_RATIO),
            "ERR_MAX_OUT_RATIO"
        );

        uint256 spotPriceBefore =
            XMath.calcSpotPrice(
                inRecord.balance,
                inRecord.denorm,
                outRecord.balance,
                outRecord.denorm,
                swapFee
            );
        require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");

        tokenAmountIn = calcInGivenOut(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            tokenAmountOut,
            swapFee
        );
        require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN");
        require(
            spotPriceBefore <= tokenAmountIn.bdiv(tokenAmountOut),
            "ERR_MATH_APPROX"
        );

        inRecord.balance = (inRecord.balance).badd(tokenAmountIn);
        outRecord.balance = (outRecord.balance).bsub(tokenAmountOut);

        spotPriceAfter = XMath.calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            swapFee
        );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");

        emit LOG_SWAP(
            msg.sender,
            tokenIn,
            tokenOut,
            tokenAmountIn,
            tokenAmountOut
        );

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        uint256 _swapFee = tokenAmountIn.bmul(swapFee);
        // to referral
        uint256 _referFee = 0;
        if (
            referrer != address(0) &&
            referrer != msg.sender &&
            referrer != tx.origin
        ) {
            _referFee = _swapFee / 5; // 20% to referrer
            _pushUnderlying(tokenIn, referrer, _referFee);
            inRecord.balance = (inRecord.balance).bsub(_referFee);
            emit LOG_REFER(msg.sender, referrer, tokenIn, _referFee);
        }

        // to SAFU
        uint256 _safuFee = tokenAmountIn.bmul(safuFee);
        if (isFarmPool) {
            _safuFee = _swapFee.bsub(_referFee);
        }
        require(_safuFee.badd(_referFee) <= _swapFee, "ERR_FEE_LIMIT");
        _pushUnderlying(tokenIn, SAFU, _safuFee);
        inRecord.balance = (inRecord.balance).bsub(_safuFee);

        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
        return (tokenAmountIn, spotPriceAfter);
    }

    function joinswapExternAmountIn(
        address tokenIn,
        uint256 tokenAmountIn,
        uint256 minPoolAmountOut
    ) external _lock_ returns (uint256 poolAmountOut) {
        require(finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(
            tokenAmountIn <= (_records[tokenIn].balance).bmul(MAX_IN_RATIO),
            "ERR_MAX_IN_RATIO"
        );

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        // to SAFU
        uint256 _safuFee = tokenAmountIn.bmul(safuFee);
        if (isFarmPool) {
            _safuFee = tokenAmountIn.bmul(swapFee);
        }
        tokenAmountIn = tokenAmountIn.bsub(_safuFee);

        Record storage inRecord = _records[tokenIn];
        poolAmountOut = XMath.calcPoolOutGivenSingleIn(
            inRecord.balance,
            inRecord.denorm,
            _totalSupply,
            _totalWeight,
            tokenAmountIn,
            swapFee
        );
        require(poolAmountOut >= minPoolAmountOut, "ERR_LIMIT_OUT");

        inRecord.balance = (inRecord.balance).badd(tokenAmountIn);

        _pushUnderlying(tokenIn, SAFU, _safuFee);
        emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);
        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        return poolAmountOut;
    }

    function exitswapPoolAmountIn(
        address tokenOut,
        uint256 poolAmountIn,
        uint256 minAmountOut
    ) external _logs_ _lock_ returns (uint256 tokenAmountOut) {
        require(finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(poolAmountIn >= MIN_POOL_AMOUNT, "ERR_MIN_AMOUNT");

        _pullPoolShare(msg.sender, poolAmountIn);

        // exit fee to origin
        if (exitFee > 0 && msg.sender != origin) {
            uint256 _exitFee = poolAmountIn.bmul(exitFee);
            _pushPoolShare(origin, _exitFee);
            poolAmountIn = poolAmountIn.bsub(_exitFee);
        }

        _burnPoolShare(poolAmountIn);

        Record storage outRecord = _records[tokenOut];
        tokenAmountOut = XMath.calcSingleOutGivenPoolIn(
            outRecord.balance,
            outRecord.denorm,
            _totalSupply,
            _totalWeight,
            poolAmountIn,
            swapFee
        );

        require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");
        require(
            tokenAmountOut <= (_records[tokenOut].balance).bmul(MAX_OUT_RATIO),
            "ERR_MAX_OUT_RATIO"
        );

        outRecord.balance = (outRecord.balance).bsub(tokenAmountOut);

        // to SAFU
        uint256 _safuFee = tokenAmountOut.bmul(safuFee);
        if (isFarmPool) {
            _safuFee = tokenAmountOut.bmul(swapFee);
        }

        emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);
        _pushUnderlying(tokenOut, SAFU, _safuFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut.bsub(_safuFee));
        return tokenAmountOut;
    }

    function calcOutGivenIn(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountIn,
        uint256 _swapFee
    ) public pure returns (uint256) {
        return
            XMath.calcOutGivenIn(
                tokenBalanceIn,
                tokenWeightIn,
                tokenBalanceOut,
                tokenWeightOut,
                tokenAmountIn,
                _swapFee
            );
    }

    function calcInGivenOut(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountOut,
        uint256 _swapFee
    ) public pure returns (uint256) {
        return
            XMath.calcInGivenOut(
                tokenBalanceIn,
                tokenWeightIn,
                tokenBalanceOut,
                tokenWeightOut,
                tokenAmountOut,
                _swapFee
            );
    }

    // ==
    // 'Underlying' token-manipulation functions make external calls but are NOT locked
    // You must `_lock_` or otherwise ensure reentry-safety
    // Fixed ERC-20 transfer revert for some special token such as USDT
    function _pullUnderlying(
        address erc20,
        address from,
        uint256 amount
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) =
            erc20.call(
                abi.encodeWithSelector(0x23b872dd, from, address(this), amount)
            );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "ERC20_TRANSFER_FROM_FAILED"
        );
    }

    function _pushUnderlying(
        address erc20,
        address to,
        uint256 amount
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) =
            erc20.call(abi.encodeWithSelector(0xa9059cbb, to, amount));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "ERC20_TRANSFER_FAILED"
        );
    }

    function _pullPoolShare(address from, uint256 amount) internal {
        _move(from, address(this), amount);
    }

    function _pushPoolShare(address to, uint256 amount) internal {
        _move(address(this), to, amount);
    }

    function _mintPoolShare(uint256 amount) internal {
        _mint(amount);
    }

    function _burnPoolShare(uint256 amount) internal {
        _burn(amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_xconfig","type":"address"},{"internalType":"address","name":"_controller","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"denorm","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"LOG_BIND","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LOG_EXIT_FEE","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"LOG_FINAL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"ref","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LOG_REFER","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safu","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LOG_UPDATE_SAFU","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"SET_CONTROLLER","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bool","name":"isFarm","type":"bool"}],"name":"UPDATE_FARM","type":"event"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_ZERO_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_POOL_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SAFU","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"SWAP_FEES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"exitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFarmPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"origin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"safuFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setExitFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"swapExactAmountInRefer","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"swapExactAmountOutRefer","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"isFarm","type":"bool"}],"name":"updateFarm","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"safu","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateSafu","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"xconfig","outputs":[{"internalType":"contract IXConfig","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

61012060405266038d7ea4c6800060809081526608e1bc9bf0400060a052662386f26fc1000060c0526658d15e1762800060e05267016345785d8a00006101005262000050906003906005620001fb565b503480156200005e57600080fd5b5060405162004dbd38038062004dbd833981810160405260408110156200008457600080fd5b508051602090910151600880546001600160a01b03831661010002610100600160a81b0319909116179055601280546001600160a01b031916321790556003600101546009556000600a556008805460ff60a81b19169055601180546001600160a01b0319166001600160a01b03848116919091179182905560408051632a1bfe3d60e11b815290519290911691635437fc7a91600480820192602092909190829003018186803b1580156200013957600080fd5b505afa1580156200014e573d6000803e3d6000fd5b505050506040513d60208110156200016557600080fd5b5051600b80546001600160a01b0319166001600160a01b039283161790556011546040805163adf5f51f60e01b81529051919092169163adf5f51f916004808301926020929190829003018186803b158015620001c157600080fd5b505afa158015620001d6573d6000803e3d6000fd5b505050506040513d6020811015620001ed57600080fd5b5051600c55506200025e9050565b82600581019282156200022c579160200282015b828111156200022c5782518255916020019190600101906200020f565b506200023a9291506200023e565b5090565b6200025b91905b808211156200023a576000815560010162000245565b90565b614b4f806200026e6000396000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c80638c28cbe8116101de578063ba9530a61161010f578063e5a583a9116100ad578063f699a3911161007c578063f699a39114610ae5578063f77c479114610b02578063f8b2cb4f14610b0a578063f8d6aed414610b305761038e565b8063e5a583a914610a92578063e755f7ea14610aaf578063ec09302114610ab7578063f1b8a9b714610abf5761038e565b8063cd2ed8fb116100e9578063cd2ed8fb14610a30578063cd669be014610a38578063dd62ed3e14610a64578063e4a28a521461046f5761038e565b8063ba9530a61461099d578063be3bbd2e146109d8578063c36596a6146105485761038e565b8063992e2a921161017c578063b02f0b7311610156578063b02f0b731461090e578063b0e0d13614610985578063b3f05b971461098d578063b7b800a4146109955761038e565b8063992e2a92146108ae5780639c649fee146108b6578063a9059cbb146108e25761038e565b80639381cd2b116101b85780639381cd2b14610870578063938b5f3214610878578063948d8ce61461088057806395d89b41146108a65761038e565b80638c28cbe81461081c57806392eefe9b14610842578063936c3477146108685761038e565b80632f37b624116102c35780636a7f63fa116102615780637c5e9ea4116102305780637c5e9ea41461074c57806381efd24a1461078c5780638201aa3f146107d4578063867378c5146108145761038e565b80636a7f63fa146106b557806370a08231146106bd57806371cbfdca146106e35780637ae05237146106eb5761038e565b80634f69c0d41161029d5780634f69c0d4146105fc57806354cf2aeb146106735780635db342771461067b5780636284ae41146106ad5761038e565b80632f37b62414610586578063313ce567146105ac57806346ab38f1146105ca5761038e565b80631446a7ff1161033057806318160ddd1161030a57806318160ddd146105215780631ca22ea514610529578063218b53821461054857806323b872dd146105505761038e565b80631446a7ff146104bd57806315e84af9146104eb57806317ab06e1146105195761038e565b806309a3bbe41161036c57806309a3bbe41461046f5780630d8e6e2c146104895780630dbc6b3e1461049157806311b42b1e146104b55761038e565b806305261aea1461039357806306fdde03146103b2578063095ea7b31461042f575b600080fd5b6103b0600480360360208110156103a957600080fd5b5035610b6b565b005b6103ba610e84565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61045b6004803603604081101561044557600080fd5b506001600160a01b038135169060200135610eae565b604080519115158252519081900360200190f35b610477610f14565b60408051918252519081900360200190f35b610477610f21565b610499610f2e565b604080516001600160a01b039092168252519081900360200190f35b610477610f3d565b610477600480360360408110156104d357600080fd5b506001600160a01b0381358116916020013516610f42565b6104776004803603604081101561050157600080fd5b506001600160a01b038135811691602001351661111d565b6104776112c7565b6104776112cf565b6103b06004803603602081101561053f57600080fd5b503515156112d5565b61047761136f565b61045b6004803603606081101561056657600080fd5b506001600160a01b0381358116916020810135909116906040013561137b565b61045b6004803603602081101561059c57600080fd5b50356001600160a01b03166114ed565b6105b461150b565b6040805160ff9092168252519081900360200190f35b610477600480360360608110156105e057600080fd5b506001600160a01b038135169060208101359060400135611510565b6103b06004803603604081101561061257600080fd5b8135919081019060408101602082013564010000000081111561063457600080fd5b82018360208201111561064657600080fd5b8035906020019184602083028401116401000000008311171561066857600080fd5b509092509050611999565b610477611c9f565b6104776004803603606081101561069157600080fd5b506001600160a01b038135169060208101359060400135611ca5565b61047761200f565b610499612015565b610477600480360360208110156106d357600080fd5b50356001600160a01b0316612024565b61047761203f565b610733600480360360c081101561070157600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a0013516612045565b6040805192835260208301919091528051918290030190f35b610733600480360360a081101561076257600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561277e565b610733600480360360c08110156107a257600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a001351661279e565b610733600480360360a08110156107ea57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612eba565b610477612ecc565b6103b06004803603602081101561083257600080fd5b50356001600160a01b0316612ed3565b6103b06004803603602081101561085857600080fd5b50356001600160a01b031661307f565b6104776131d6565b610477613226565b610499613233565b6104776004803603602081101561089657600080fd5b50356001600160a01b0316613242565b6103ba613307565b610477613324565b6103b0600480360360408110156108cc57600080fd5b506001600160a01b038135169060200135613330565b61045b600480360360408110156108f857600080fd5b506001600160a01b03813516906020013561384d565b6103b06004803603604081101561092457600080fd5b8135919081019060408101602082013564010000000081111561094657600080fd5b82018360208201111561095857600080fd5b8035906020019184602083028401116401000000008311171561097a57600080fd5b509092509050613863565b610477613c17565b61045b613c1c565b610477613c2c565b610477600480360360c08110156109b357600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613c31565b6109e0613ce1565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a1c578181015183820152602001610a04565b505050509050019250505060405180910390f35b610477613ddc565b6103b060048036036040811015610a4e57600080fd5b506001600160a01b038135169060200135613de2565b61047760048036036040811015610a7a57600080fd5b506001600160a01b0381358116916020013516613ed8565b6103b060048036036020811015610aa857600080fd5b5035613f03565b61045b6140aa565b6104776140b3565b61047760048036036020811015610ad557600080fd5b50356001600160a01b03166140bf565b61047760048036036020811015610afb57600080fd5b503561419c565b6104996141b0565b61047760048036036020811015610b2057600080fd5b50356001600160a01b03166141c4565b610477600480360360c0811015610b4657600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614289565b60085460ff1615610bb1576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60088054600160ff19909116179081905561010090046001600160a01b03163314610c18576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b600854600160a81b900460ff1615610c6a576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600e5460021115610cb3576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d494e5f544f4b454e5360901b604482015290519081900360640190fd5b600e5460081015610cfc576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b600354811015610d41576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d494e5f46454560a81b604482015290519081900360640190fd5b600754811115610d86576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d41585f46454560a81b604482015290519081900360640190fd5b6000805b6005811015610dba5760038160058110610da057fe5b0154831415610db25760019150610dba565b600101610d8a565b5080610e04576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f535741505f46454560601b604482015290519081900360640190fd5b60098290556008805460ff60a81b1916600160a81b179055610e2e68056bc75e2d63100000614302565b610e413368056bc75e2d6310000061430e565b60095460408051918252517f385682b698dbab9a6c443fd4594a08df31e60958fa2369566cc3a76c0072a7fe9181900360200190a150506008805460ff19169055565b60408051808201909152601081526f2c2232a334902837b7b6102a37b5b2b760811b602082015290565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b6802b5e3af16b188000081565b6541504f4c4c4f60d01b90565b600b546001600160a01b031681565b600081565b60085460009060ff1615610f8b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff16610fe8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16611045576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f6020908152604080832093861683528083206003808601546002808801549284015490840154855163a221ee4960e01b81526004810193909352602483019390935260448201526064810191909152608481019490945290519092734f8d1c6dabbb379134272cb1273638cc98212a449263a221ee499260a480840193829003018186803b1580156110e857600080fd5b505af41580156110fc573d6000803e3d6000fd5b505050506040513d602081101561111257600080fd5b505195945050505050565b60085460009060ff1615611166576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff166111c3576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16611220576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f602090815260408083209386168352918290206003808501546002808701549284015490840154600954875163a221ee4960e01b81526004810194909452602484019490945260448301919091526064820152608481019190915292519092734f8d1c6dabbb379134272cb1273638cc98212a449263a221ee499260a480840193829003018186803b1580156110e857600080fd5b6305f5e10081565b60025490565b6011546001600160a01b03163314611325576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4e4f545f434f4e46494760901b604482015290519081900360640190fd5b600d805482151560ff199091168117909155604080519182525133917f1c37382de11fec2ccd27d010eaa40491f045ea806bc44380827628e4f767040d919081900360200190a250565b670de0b6b3a764000081565b6000336001600160a01b03851614806113b757506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b611400576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b61140b84848461431d565b336001600160a01b0385161480159061144957506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156114e3576001600160a01b0384166000908152600160209081526040808320338452909152902054611482908363ffffffff61443916565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35b5060019392505050565b6001600160a01b03166000908152600f602052604090205460ff1690565b601290565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085460ff16156115b9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611617576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611674576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6305f5e1008310156116be576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d05353d5539560921b604482015290519081900360640190fd5b6116c8338461449b565b6000600a541180156116e557506012546001600160a01b03163314155b1561172e576000611701600a54856144a690919063ffffffff16565b60125490915061171a906001600160a01b03168261430e565b61172a848263ffffffff61443916565b9350505b6117378361456f565b6001600160a01b0384166000908152600f6020908152604091829020600381015460028083015490546010546009548751634494c00960e11b815260048101959095526024850193909352604484019190915260648301526084820188905260a482015292519092734f8d1c6dabbb379134272cb1273638cc98212a449263892980129260c480840193829003018186803b1580156117d557600080fd5b505af41580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b5051915082821015611848576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060030154611876906704a03ce68d2155566144a6565b8211156118be576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b60038101546118d3908363ffffffff61443916565b6003820155600c546000906118ef90849063ffffffff6144a616565b600d5490915060ff16156119145760095461191190849063ffffffff6144a616565b90505b6040805184815290516001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9181900360200190a3600b5461196c9087906001600160a01b031683614578565b6119868633611981868563ffffffff61443916565b614578565b50506008805460ff191690559392505050565b60085460ff16156119df576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611a3d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e548114611a89576040805162461bcd60e51b815260206004820152601360248201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604482015290519081900360640190fd5b6000611a936112cf565b90506000611aa7858363ffffffff6146da16565b905080611aed576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600e54811015611c7a576000600e8281548110611b0957fe5b60009182526020808320909101546001600160a01b0316808352600f909152604082206003015490925090611b44858363ffffffff6144a616565b905080611b8a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878785818110611b9657fe5b90506020020135811115611be0576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f6020526040902060030154611c0c908263ffffffff6147e216565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3611c6f83338361482f565b505050600101611af0565b50611c8485614302565b611c8e338661430e565b50506008805460ff19169055505050565b60095481565b60085460009060ff1615611cee576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611d4c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611da9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060030154611dd7906706f05b59d3b200006144a6565b831115611e1e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b611e2984338561482f565b6000611e40600c54856144a690919063ffffffff16565b600d5490915060ff1615611e6557600954611e6290859063ffffffff6144a616565b90505b611e75848263ffffffff61443916565b6001600160a01b0386166000908152600f6020908152604091829020600381015460028083015490546010546009548751638656b65360e01b815260048101959095526024850193909352604484019190915260648301526084820186905260a4820152925193975092734f8d1c6dabbb379134272cb1273638cc98212a4492638656b6539260c4808301939192829003018186803b158015611f1757600080fd5b505af4158015611f2b573d6000803e3d6000fd5b505050506040513d6020811015611f4157600080fd5b5051925083831015611f8a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6003810154611f9f908663ffffffff6147e216565b6003820155600b54611fbc9087906001600160a01b031684614578565b6040805186815290516001600160a01b0388169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a361200583614302565b611986338461430e565b600a5481565b6011546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b600c5481565b600854600090819060ff1615612090576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0388166000908152600f602052604090205460ff166120fa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600f602052604090205460ff16612157576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600854600160a81b900460ff166121a9576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b038881166000908152600f60205260408082209289168252902060038201546121e1906706f05b59d3b200006144a6565b891115612228576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b1580156122ab57600080fd5b505af41580156122bf573d6000803e3d6000fd5b505050506040513d60208110156122d557600080fd5b5051905086811115612324576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b61234483600301548460020154846003015485600201548e600954613c31565b94508785101561238b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61239b8a8663ffffffff6146da16565b8111156123e1576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60038301546123f6908b63ffffffff6147e216565b600380850191909155820154612412908663ffffffff61443916565b8260030181905550734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b15801561249b57600080fd5b505af41580156124af573d6000803e3d6000fd5b505050506040513d60208110156124c557600080fd5b5051935080841015612510576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b86841115612557576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b886001600160a01b03168b6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788d89604051808381526020018281526020019250505060405180910390a46125bf8b338c61482f565b60006125d66009548c6144a690919063ffffffff16565b905060006001600160a01b038816158015906125fb57506001600160a01b0388163314155b801561261057506001600160a01b0388163214155b156126985750600581046126258d8983614578565b600385015461263a908263ffffffff61443916565b85600301819055508c6001600160a01b0316886001600160a01b0316336001600160a01b03167f2fa8f551635bc74da38059e0b4294901eedc1258f4dab545bbc85a3b809eb076846040518082815260200191505060405180910390a45b60006126af600c548e6144a690919063ffffffff16565b600d5490915060ff16156126d0576126cd838363ffffffff61443916565b90505b826126e1828463ffffffff6147e216565b1115612724576040805162461bcd60e51b815260206004820152600d60248201526c11549497d1915157d312535255609a1b604482015290519081900360640190fd5b600b5461273c908f906001600160a01b031683614578565b6003860154612751908263ffffffff61443916565b60038701556127618c338a614578565b5050505050506008805460ff191690559097909650945050505050565b6000806127908787878787600061279e565b915091509550959350505050565b600854600090819060ff16156127e9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0388166000908152600f602052604090205460ff16612853576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600f602052604090205460ff166128b0576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600854600160a81b900460ff16612902576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b038881166000908152600f602052604080822092891682529020600381015461293a906704a03ce68d2155566144a6565b871115612982576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015612a0557600080fd5b505af4158015612a19573d6000803e3d6000fd5b505050506040513d6020811015612a2f57600080fd5b5051905086811115612a7e576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b612a9e83600301548460020154846003015485600201548c600954614289565b945089851115612ae4576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b612af4858963ffffffff6146da16565b811115612b3a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b6003830154612b4f908663ffffffff6147e216565b600380850191909155820154612b6b908963ffffffff61443916565b8260030181905550734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015612bf457600080fd5b505af4158015612c08573d6000803e3d6000fd5b505050506040513d6020811015612c1e57600080fd5b5051935080841015612c69576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b86841115612cb0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b886001600160a01b03168b6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888c604051808381526020018281526020019250505060405180910390a4612d188b338761482f565b6000612d2f600954876144a690919063ffffffff16565b905060006001600160a01b03881615801590612d5457506001600160a01b0388163314155b8015612d6957506001600160a01b0388163214155b15612df1575060058104612d7e8d8983614578565b6003850154612d93908263ffffffff61443916565b85600301819055508c6001600160a01b0316886001600160a01b0316336001600160a01b03167f2fa8f551635bc74da38059e0b4294901eedc1258f4dab545bbc85a3b809eb076846040518082815260200191505060405180910390a45b6000612e08600c54896144a690919063ffffffff16565b600d5490915060ff1615612e2957612e26838363ffffffff61443916565b90505b82612e3a828463ffffffff6147e216565b1115612e7d576040805162461bcd60e51b815260206004820152600d60248201526c11549497d1915157d312535255609a1b604482015290519081900360640190fd5b600b54612e95908f906001600160a01b031683614578565b6003860154612eaa908263ffffffff61443916565b60038701556127618c338d614578565b60008061279087878787876000612045565b620f424081565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085460ff1615612f7a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0381166000908152600f602052604090205460ff16612fe4576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b15801561302a57600080fd5b505afa15801561303e573d6000803e3d6000fd5b505050506040513d602081101561305457600080fd5b50516001600160a01b039091166000908152600f60205260409020600301556008805460ff19169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085461010090046001600160a01b03163314613139576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b038116613184576040805162461bcd60e51b815260206004820152600d60248201526c22a9292fad22a927afa0a2222960991b604482015290519081900360640190fd5b60088054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517f37f86e4777739e0dbc5682f53e26f091cac39f3d134742d5431c06cbe0a58dff90600090a250565b60085460009060ff161561321f576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060105490565b68056bc75e2d6310000081565b6012546001600160a01b031681565b60085460009060ff161561328b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166132e8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206002015490565b60408051808201909152600381526216141560ea1b602082015290565b6704a03ce68d21555681565b60085460ff1615613376576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60088054600160ff19909116179081905561010090046001600160a01b031633146133dd576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff161561343a576040805162461bcd60e51b815260206004820152600c60248201526b11549497d254d7d093d5539160a21b604482015290519081900360640190fd5b600854600160a81b900460ff161561348c576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600e546008116134d4576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b670de0b6b3a7640000811015613522576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d5d15251d21560921b604482015290519081900360640190fd5b6802b5e3af16b1880000811115613571576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3505617d5d15251d21560921b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b1580156135bb57600080fd5b505afa1580156135cf573d6000803e3d6000fd5b505050506040513d60208110156135e557600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0386169163313ce567916004808301926020929190829003018186803b15801561362d57600080fd5b505afa158015613641573d6000803e3d6000fd5b505050506040513d602081101561365757600080fd5b505160ff16600a0a9050620f42408110156136a9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d513d3d7d4d3505313609a1b604482015290519081900360640190fd5b620f424081048210156136f5576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4d494e5f42414c414e434560881b604482015290519081900360640190fd5b601054613708908463ffffffff6147e216565b60108190556802b5e3af16b18800001015613761576040805162461bcd60e51b815260206004820152601460248201527311549497d3505617d513d5105317d5d15251d21560621b604482015290519081900360640190fd5b604080516080810182526001808252600e80546020808501918252848601898152606086018981526001600160a01b038c166000818152600f85528981209851895460ff19169015151789559451888801559151600288015551600390960195909555825493840183559190527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd90910180546001600160a01b0319168317905582518681529081018590528251919233927f5deb8656732bee68a74ef874b834356bfc2936842bd13b816ec4c219e362a71e9281900390910190a350506008805460ff191690555050565b600061385a33848461431d565b50600192915050565b60085460ff16156138a9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16613907576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e548114613953576040805162461bcd60e51b815260206004820152601360248201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604482015290519081900360640190fd5b6305f5e10083101561399d576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d05353d5539560921b604482015290519081900360640190fd5b60006139a76112cf565b905060006139c0600a54866144a690919063ffffffff16565b6012549091506001600160a01b03163314156139da575060005b60006139ec868363ffffffff61443916565b90506000613a00828563ffffffff6146da16565b905080613a46576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613a50338861449b565b8215613a6c57601254613a6c906001600160a01b03168461430e565b613a758261456f565b60005b600e54811015613c03576000600e8281548110613a9157fe5b60009182526020808320909101546001600160a01b0316808352600f909152604082206003015490925090613acc858363ffffffff6144a616565b905080613b12576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b898985818110613b1e57fe5b90506020020135811015613b69576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f6020526040902060030154613b95908263ffffffff61443916565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3613bf8833383614578565b505050600101613a78565b50506008805460ff19169055505050505050565b600881565b600854600160a81b900460ff1681565b600281565b60408051635d4a985360e11b8152600481018890526024810187905260448101869052606481018590526084810184905260a481018390529051600091734f8d1c6dabbb379134272cb1273638cc98212a449163ba9530a69160c480820192602092909190829003018186803b158015613caa57600080fd5b505af4158015613cbe573d6000803e3d6000fd5b505050506040513d6020811015613cd457600080fd5b5051979650505050505050565b60085460609060ff1615613d2a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b600854600160a81b900460ff16613d7c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e805480602002602001604051908101604052809291908181526020018280548015613dd257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613db4575b5050505050905090565b600e5490565b6011546001600160a01b03163314613e32576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4e4f545f434f4e46494760901b604482015290519081900360640190fd5b6001600160a01b038216613e7d576040805162461bcd60e51b815260206004820152600d60248201526c22a9292fad22a927afa0a2222960991b604482015290519081900360640190fd5b600b80546001600160a01b0384166001600160a01b03199091168117909155600c8290556040805183815290517fccaa809140cb901df601f6c5eae0a0d30849c3b29378df0886f660270c9735e99181900360200190a25050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600854600160a81b900460ff1615613f55576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b60085461010090046001600160a01b03163314613fae576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b601160009054906101000a90046001600160a01b03166001600160a01b031663ff42517d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613ffc57600080fd5b505afa158015614010573d6000803e3d6000fd5b505050506040513d602081101561402657600080fd5b505181111561406f576040805162461bcd60e51b815260206004820152601060248201526f494e56414c49445f455849545f46454560801b604482015290519081900360640190fd5b600a8190556040805182815290517f09ea89c001139a826eedf1b1b3a690524db01249f803b62c0f6a30b09f4976fc9181900360200190a150565b600d5460ff1681565b6706f05b59d3b2000081565b60085460009060ff1615614108576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614165576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090206002015460105461419590829063ffffffff6146da16565b9392505050565b600381600581106141a957fe5b0154905081565b60085461010090046001600160a01b031681565b60085460009060ff161561420d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff1661426a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206003015490565b60408051633e35abb560e21b8152600481018890526024810187905260448101869052606481018590526084810184905260a481018390529051600091734f8d1c6dabbb379134272cb1273638cc98212a449163f8d6aed49160c480820192602092909190829003018186803b158015613caa57600080fd5b61430b81614998565b50565b61431930838361431d565b5050565b6001600160a01b038316600090815260208190526040902054811115614381576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b0383166000908152602081905260409020546143aa908263ffffffff61443916565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546143df908263ffffffff6147e216565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008060006144488585614a19565b915091508015614493576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b61431982308361431d565b60008282028315806144c05750828482816144bd57fe5b04145b614504576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614557576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b61430b81614a3e565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106145f55780518252601f1990920191602091820191016145d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614657576040519150601f19603f3d011682016040523d82523d6000602084013e61465c565b606091505b509150915081801561468a57508051158061468a575080806020019051602081101561468757600080fd5b50515b6146d3576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c17d514905394d1915497d19052531151605a1b604482015290519081900360640190fd5b5050505050565b60008161471d576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806147455750670de0b6b3a764000084828161474257fe5b04145b614789576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600283048101818110156147d7576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600084828161456457fe5b600082820183811015614195576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604080516001600160a01b038481166024830152306044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000946060949389169392918291908083835b602083106148b25780518252601f199092019160209182019101614893565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614914576040519150601f19603f3d011682016040523d82523d6000602084013e614919565b606091505b5091509150818015614947575080511580614947575080806020019051602081101561494457600080fd5b50515b6146d3576040805162461bcd60e51b815260206004820152601a60248201527f45524332305f5452414e534645525f46524f4d5f4641494c4544000000000000604482015290519081900360640190fd5b306000908152602081905260409020546149b8908263ffffffff6147e216565b306000908152602081905260409020556002546149db908263ffffffff6147e216565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b600080828410614a2f5750508082036000614a37565b505081810360015b9250929050565b30600090815260208190526040902054811115614a99576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b30600090815260208190526040902054614ab9908263ffffffff61443916565b30600090815260208190526040902055600254614adc908263ffffffff61443916565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35056fea265627a7a72315820e4bc0b79265b34f3071fc12ee0e04d56963a3285dc6081942b73e464bfc1c8b064736f6c63430005110032000000000000000000000000cb2978a5dc9f6b68295e93d53a74ea2cf66265dc00000000000000000000000082484b7e77e4b80de6d78bdf9014e44cc715f66a

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061038e5760003560e01c80638c28cbe8116101de578063ba9530a61161010f578063e5a583a9116100ad578063f699a3911161007c578063f699a39114610ae5578063f77c479114610b02578063f8b2cb4f14610b0a578063f8d6aed414610b305761038e565b8063e5a583a914610a92578063e755f7ea14610aaf578063ec09302114610ab7578063f1b8a9b714610abf5761038e565b8063cd2ed8fb116100e9578063cd2ed8fb14610a30578063cd669be014610a38578063dd62ed3e14610a64578063e4a28a521461046f5761038e565b8063ba9530a61461099d578063be3bbd2e146109d8578063c36596a6146105485761038e565b8063992e2a921161017c578063b02f0b7311610156578063b02f0b731461090e578063b0e0d13614610985578063b3f05b971461098d578063b7b800a4146109955761038e565b8063992e2a92146108ae5780639c649fee146108b6578063a9059cbb146108e25761038e565b80639381cd2b116101b85780639381cd2b14610870578063938b5f3214610878578063948d8ce61461088057806395d89b41146108a65761038e565b80638c28cbe81461081c57806392eefe9b14610842578063936c3477146108685761038e565b80632f37b624116102c35780636a7f63fa116102615780637c5e9ea4116102305780637c5e9ea41461074c57806381efd24a1461078c5780638201aa3f146107d4578063867378c5146108145761038e565b80636a7f63fa146106b557806370a08231146106bd57806371cbfdca146106e35780637ae05237146106eb5761038e565b80634f69c0d41161029d5780634f69c0d4146105fc57806354cf2aeb146106735780635db342771461067b5780636284ae41146106ad5761038e565b80632f37b62414610586578063313ce567146105ac57806346ab38f1146105ca5761038e565b80631446a7ff1161033057806318160ddd1161030a57806318160ddd146105215780631ca22ea514610529578063218b53821461054857806323b872dd146105505761038e565b80631446a7ff146104bd57806315e84af9146104eb57806317ab06e1146105195761038e565b806309a3bbe41161036c57806309a3bbe41461046f5780630d8e6e2c146104895780630dbc6b3e1461049157806311b42b1e146104b55761038e565b806305261aea1461039357806306fdde03146103b2578063095ea7b31461042f575b600080fd5b6103b0600480360360208110156103a957600080fd5b5035610b6b565b005b6103ba610e84565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61045b6004803603604081101561044557600080fd5b506001600160a01b038135169060200135610eae565b604080519115158252519081900360200190f35b610477610f14565b60408051918252519081900360200190f35b610477610f21565b610499610f2e565b604080516001600160a01b039092168252519081900360200190f35b610477610f3d565b610477600480360360408110156104d357600080fd5b506001600160a01b0381358116916020013516610f42565b6104776004803603604081101561050157600080fd5b506001600160a01b038135811691602001351661111d565b6104776112c7565b6104776112cf565b6103b06004803603602081101561053f57600080fd5b503515156112d5565b61047761136f565b61045b6004803603606081101561056657600080fd5b506001600160a01b0381358116916020810135909116906040013561137b565b61045b6004803603602081101561059c57600080fd5b50356001600160a01b03166114ed565b6105b461150b565b6040805160ff9092168252519081900360200190f35b610477600480360360608110156105e057600080fd5b506001600160a01b038135169060208101359060400135611510565b6103b06004803603604081101561061257600080fd5b8135919081019060408101602082013564010000000081111561063457600080fd5b82018360208201111561064657600080fd5b8035906020019184602083028401116401000000008311171561066857600080fd5b509092509050611999565b610477611c9f565b6104776004803603606081101561069157600080fd5b506001600160a01b038135169060208101359060400135611ca5565b61047761200f565b610499612015565b610477600480360360208110156106d357600080fd5b50356001600160a01b0316612024565b61047761203f565b610733600480360360c081101561070157600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a0013516612045565b6040805192835260208301919091528051918290030190f35b610733600480360360a081101561076257600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561277e565b610733600480360360c08110156107a257600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a001351661279e565b610733600480360360a08110156107ea57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612eba565b610477612ecc565b6103b06004803603602081101561083257600080fd5b50356001600160a01b0316612ed3565b6103b06004803603602081101561085857600080fd5b50356001600160a01b031661307f565b6104776131d6565b610477613226565b610499613233565b6104776004803603602081101561089657600080fd5b50356001600160a01b0316613242565b6103ba613307565b610477613324565b6103b0600480360360408110156108cc57600080fd5b506001600160a01b038135169060200135613330565b61045b600480360360408110156108f857600080fd5b506001600160a01b03813516906020013561384d565b6103b06004803603604081101561092457600080fd5b8135919081019060408101602082013564010000000081111561094657600080fd5b82018360208201111561095857600080fd5b8035906020019184602083028401116401000000008311171561097a57600080fd5b509092509050613863565b610477613c17565b61045b613c1c565b610477613c2c565b610477600480360360c08110156109b357600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613c31565b6109e0613ce1565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a1c578181015183820152602001610a04565b505050509050019250505060405180910390f35b610477613ddc565b6103b060048036036040811015610a4e57600080fd5b506001600160a01b038135169060200135613de2565b61047760048036036040811015610a7a57600080fd5b506001600160a01b0381358116916020013516613ed8565b6103b060048036036020811015610aa857600080fd5b5035613f03565b61045b6140aa565b6104776140b3565b61047760048036036020811015610ad557600080fd5b50356001600160a01b03166140bf565b61047760048036036020811015610afb57600080fd5b503561419c565b6104996141b0565b61047760048036036020811015610b2057600080fd5b50356001600160a01b03166141c4565b610477600480360360c0811015610b4657600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614289565b60085460ff1615610bb1576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60088054600160ff19909116179081905561010090046001600160a01b03163314610c18576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b600854600160a81b900460ff1615610c6a576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600e5460021115610cb3576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d494e5f544f4b454e5360901b604482015290519081900360640190fd5b600e5460081015610cfc576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b600354811015610d41576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d494e5f46454560a81b604482015290519081900360640190fd5b600754811115610d86576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d41585f46454560a81b604482015290519081900360640190fd5b6000805b6005811015610dba5760038160058110610da057fe5b0154831415610db25760019150610dba565b600101610d8a565b5080610e04576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f535741505f46454560601b604482015290519081900360640190fd5b60098290556008805460ff60a81b1916600160a81b179055610e2e68056bc75e2d63100000614302565b610e413368056bc75e2d6310000061430e565b60095460408051918252517f385682b698dbab9a6c443fd4594a08df31e60958fa2369566cc3a76c0072a7fe9181900360200190a150506008805460ff19169055565b60408051808201909152601081526f2c2232a334902837b7b6102a37b5b2b760811b602082015290565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b6802b5e3af16b188000081565b6541504f4c4c4f60d01b90565b600b546001600160a01b031681565b600081565b60085460009060ff1615610f8b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff16610fe8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16611045576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f6020908152604080832093861683528083206003808601546002808801549284015490840154855163a221ee4960e01b81526004810193909352602483019390935260448201526064810191909152608481019490945290519092734f8d1c6dabbb379134272cb1273638cc98212a449263a221ee499260a480840193829003018186803b1580156110e857600080fd5b505af41580156110fc573d6000803e3d6000fd5b505050506040513d602081101561111257600080fd5b505195945050505050565b60085460009060ff1615611166576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff166111c3576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16611220576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f602090815260408083209386168352918290206003808501546002808701549284015490840154600954875163a221ee4960e01b81526004810194909452602484019490945260448301919091526064820152608481019190915292519092734f8d1c6dabbb379134272cb1273638cc98212a449263a221ee499260a480840193829003018186803b1580156110e857600080fd5b6305f5e10081565b60025490565b6011546001600160a01b03163314611325576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4e4f545f434f4e46494760901b604482015290519081900360640190fd5b600d805482151560ff199091168117909155604080519182525133917f1c37382de11fec2ccd27d010eaa40491f045ea806bc44380827628e4f767040d919081900360200190a250565b670de0b6b3a764000081565b6000336001600160a01b03851614806113b757506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b611400576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b61140b84848461431d565b336001600160a01b0385161480159061144957506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156114e3576001600160a01b0384166000908152600160209081526040808320338452909152902054611482908363ffffffff61443916565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35b5060019392505050565b6001600160a01b03166000908152600f602052604090205460ff1690565b601290565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085460ff16156115b9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611617576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611674576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6305f5e1008310156116be576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d05353d5539560921b604482015290519081900360640190fd5b6116c8338461449b565b6000600a541180156116e557506012546001600160a01b03163314155b1561172e576000611701600a54856144a690919063ffffffff16565b60125490915061171a906001600160a01b03168261430e565b61172a848263ffffffff61443916565b9350505b6117378361456f565b6001600160a01b0384166000908152600f6020908152604091829020600381015460028083015490546010546009548751634494c00960e11b815260048101959095526024850193909352604484019190915260648301526084820188905260a482015292519092734f8d1c6dabbb379134272cb1273638cc98212a449263892980129260c480840193829003018186803b1580156117d557600080fd5b505af41580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b5051915082821015611848576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060030154611876906704a03ce68d2155566144a6565b8211156118be576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b60038101546118d3908363ffffffff61443916565b6003820155600c546000906118ef90849063ffffffff6144a616565b600d5490915060ff16156119145760095461191190849063ffffffff6144a616565b90505b6040805184815290516001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9181900360200190a3600b5461196c9087906001600160a01b031683614578565b6119868633611981868563ffffffff61443916565b614578565b50506008805460ff191690559392505050565b60085460ff16156119df576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611a3d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e548114611a89576040805162461bcd60e51b815260206004820152601360248201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604482015290519081900360640190fd5b6000611a936112cf565b90506000611aa7858363ffffffff6146da16565b905080611aed576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600e54811015611c7a576000600e8281548110611b0957fe5b60009182526020808320909101546001600160a01b0316808352600f909152604082206003015490925090611b44858363ffffffff6144a616565b905080611b8a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878785818110611b9657fe5b90506020020135811115611be0576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f6020526040902060030154611c0c908263ffffffff6147e216565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3611c6f83338361482f565b505050600101611af0565b50611c8485614302565b611c8e338661430e565b50506008805460ff19169055505050565b60095481565b60085460009060ff1615611cee576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611d4c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611da9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060030154611dd7906706f05b59d3b200006144a6565b831115611e1e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b611e2984338561482f565b6000611e40600c54856144a690919063ffffffff16565b600d5490915060ff1615611e6557600954611e6290859063ffffffff6144a616565b90505b611e75848263ffffffff61443916565b6001600160a01b0386166000908152600f6020908152604091829020600381015460028083015490546010546009548751638656b65360e01b815260048101959095526024850193909352604484019190915260648301526084820186905260a4820152925193975092734f8d1c6dabbb379134272cb1273638cc98212a4492638656b6539260c4808301939192829003018186803b158015611f1757600080fd5b505af4158015611f2b573d6000803e3d6000fd5b505050506040513d6020811015611f4157600080fd5b5051925083831015611f8a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6003810154611f9f908663ffffffff6147e216565b6003820155600b54611fbc9087906001600160a01b031684614578565b6040805186815290516001600160a01b0388169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a361200583614302565b611986338461430e565b600a5481565b6011546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b600c5481565b600854600090819060ff1615612090576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0388166000908152600f602052604090205460ff166120fa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600f602052604090205460ff16612157576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600854600160a81b900460ff166121a9576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b038881166000908152600f60205260408082209289168252902060038201546121e1906706f05b59d3b200006144a6565b891115612228576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b1580156122ab57600080fd5b505af41580156122bf573d6000803e3d6000fd5b505050506040513d60208110156122d557600080fd5b5051905086811115612324576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b61234483600301548460020154846003015485600201548e600954613c31565b94508785101561238b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61239b8a8663ffffffff6146da16565b8111156123e1576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60038301546123f6908b63ffffffff6147e216565b600380850191909155820154612412908663ffffffff61443916565b8260030181905550734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b15801561249b57600080fd5b505af41580156124af573d6000803e3d6000fd5b505050506040513d60208110156124c557600080fd5b5051935080841015612510576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b86841115612557576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b886001600160a01b03168b6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788d89604051808381526020018281526020019250505060405180910390a46125bf8b338c61482f565b60006125d66009548c6144a690919063ffffffff16565b905060006001600160a01b038816158015906125fb57506001600160a01b0388163314155b801561261057506001600160a01b0388163214155b156126985750600581046126258d8983614578565b600385015461263a908263ffffffff61443916565b85600301819055508c6001600160a01b0316886001600160a01b0316336001600160a01b03167f2fa8f551635bc74da38059e0b4294901eedc1258f4dab545bbc85a3b809eb076846040518082815260200191505060405180910390a45b60006126af600c548e6144a690919063ffffffff16565b600d5490915060ff16156126d0576126cd838363ffffffff61443916565b90505b826126e1828463ffffffff6147e216565b1115612724576040805162461bcd60e51b815260206004820152600d60248201526c11549497d1915157d312535255609a1b604482015290519081900360640190fd5b600b5461273c908f906001600160a01b031683614578565b6003860154612751908263ffffffff61443916565b60038701556127618c338a614578565b5050505050506008805460ff191690559097909650945050505050565b6000806127908787878787600061279e565b915091509550959350505050565b600854600090819060ff16156127e9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0388166000908152600f602052604090205460ff16612853576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600f602052604090205460ff166128b0576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600854600160a81b900460ff16612902576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b038881166000908152600f602052604080822092891682529020600381015461293a906704a03ce68d2155566144a6565b871115612982576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015612a0557600080fd5b505af4158015612a19573d6000803e3d6000fd5b505050506040513d6020811015612a2f57600080fd5b5051905086811115612a7e576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b612a9e83600301548460020154846003015485600201548c600954614289565b945089851115612ae4576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b612af4858963ffffffff6146da16565b811115612b3a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b6003830154612b4f908663ffffffff6147e216565b600380850191909155820154612b6b908963ffffffff61443916565b8260030181905550734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015612bf457600080fd5b505af4158015612c08573d6000803e3d6000fd5b505050506040513d6020811015612c1e57600080fd5b5051935080841015612c69576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b86841115612cb0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b886001600160a01b03168b6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888c604051808381526020018281526020019250505060405180910390a4612d188b338761482f565b6000612d2f600954876144a690919063ffffffff16565b905060006001600160a01b03881615801590612d5457506001600160a01b0388163314155b8015612d6957506001600160a01b0388163214155b15612df1575060058104612d7e8d8983614578565b6003850154612d93908263ffffffff61443916565b85600301819055508c6001600160a01b0316886001600160a01b0316336001600160a01b03167f2fa8f551635bc74da38059e0b4294901eedc1258f4dab545bbc85a3b809eb076846040518082815260200191505060405180910390a45b6000612e08600c54896144a690919063ffffffff16565b600d5490915060ff1615612e2957612e26838363ffffffff61443916565b90505b82612e3a828463ffffffff6147e216565b1115612e7d576040805162461bcd60e51b815260206004820152600d60248201526c11549497d1915157d312535255609a1b604482015290519081900360640190fd5b600b54612e95908f906001600160a01b031683614578565b6003860154612eaa908263ffffffff61443916565b60038701556127618c338d614578565b60008061279087878787876000612045565b620f424081565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085460ff1615612f7a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0381166000908152600f602052604090205460ff16612fe4576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b15801561302a57600080fd5b505afa15801561303e573d6000803e3d6000fd5b505050506040513d602081101561305457600080fd5b50516001600160a01b039091166000908152600f60205260409020600301556008805460ff19169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085461010090046001600160a01b03163314613139576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b038116613184576040805162461bcd60e51b815260206004820152600d60248201526c22a9292fad22a927afa0a2222960991b604482015290519081900360640190fd5b60088054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517f37f86e4777739e0dbc5682f53e26f091cac39f3d134742d5431c06cbe0a58dff90600090a250565b60085460009060ff161561321f576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060105490565b68056bc75e2d6310000081565b6012546001600160a01b031681565b60085460009060ff161561328b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166132e8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206002015490565b60408051808201909152600381526216141560ea1b602082015290565b6704a03ce68d21555681565b60085460ff1615613376576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60088054600160ff19909116179081905561010090046001600160a01b031633146133dd576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff161561343a576040805162461bcd60e51b815260206004820152600c60248201526b11549497d254d7d093d5539160a21b604482015290519081900360640190fd5b600854600160a81b900460ff161561348c576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600e546008116134d4576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b670de0b6b3a7640000811015613522576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d5d15251d21560921b604482015290519081900360640190fd5b6802b5e3af16b1880000811115613571576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3505617d5d15251d21560921b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b1580156135bb57600080fd5b505afa1580156135cf573d6000803e3d6000fd5b505050506040513d60208110156135e557600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0386169163313ce567916004808301926020929190829003018186803b15801561362d57600080fd5b505afa158015613641573d6000803e3d6000fd5b505050506040513d602081101561365757600080fd5b505160ff16600a0a9050620f42408110156136a9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d513d3d7d4d3505313609a1b604482015290519081900360640190fd5b620f424081048210156136f5576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4d494e5f42414c414e434560881b604482015290519081900360640190fd5b601054613708908463ffffffff6147e216565b60108190556802b5e3af16b18800001015613761576040805162461bcd60e51b815260206004820152601460248201527311549497d3505617d513d5105317d5d15251d21560621b604482015290519081900360640190fd5b604080516080810182526001808252600e80546020808501918252848601898152606086018981526001600160a01b038c166000818152600f85528981209851895460ff19169015151789559451888801559151600288015551600390960195909555825493840183559190527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd90910180546001600160a01b0319168317905582518681529081018590528251919233927f5deb8656732bee68a74ef874b834356bfc2936842bd13b816ec4c219e362a71e9281900390910190a350506008805460ff191690555050565b600061385a33848461431d565b50600192915050565b60085460ff16156138a9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16613907576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e548114613953576040805162461bcd60e51b815260206004820152601360248201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604482015290519081900360640190fd5b6305f5e10083101561399d576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d05353d5539560921b604482015290519081900360640190fd5b60006139a76112cf565b905060006139c0600a54866144a690919063ffffffff16565b6012549091506001600160a01b03163314156139da575060005b60006139ec868363ffffffff61443916565b90506000613a00828563ffffffff6146da16565b905080613a46576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613a50338861449b565b8215613a6c57601254613a6c906001600160a01b03168461430e565b613a758261456f565b60005b600e54811015613c03576000600e8281548110613a9157fe5b60009182526020808320909101546001600160a01b0316808352600f909152604082206003015490925090613acc858363ffffffff6144a616565b905080613b12576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b898985818110613b1e57fe5b90506020020135811015613b69576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f6020526040902060030154613b95908263ffffffff61443916565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3613bf8833383614578565b505050600101613a78565b50506008805460ff19169055505050505050565b600881565b600854600160a81b900460ff1681565b600281565b60408051635d4a985360e11b8152600481018890526024810187905260448101869052606481018590526084810184905260a481018390529051600091734f8d1c6dabbb379134272cb1273638cc98212a449163ba9530a69160c480820192602092909190829003018186803b158015613caa57600080fd5b505af4158015613cbe573d6000803e3d6000fd5b505050506040513d6020811015613cd457600080fd5b5051979650505050505050565b60085460609060ff1615613d2a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b600854600160a81b900460ff16613d7c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e805480602002602001604051908101604052809291908181526020018280548015613dd257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613db4575b5050505050905090565b600e5490565b6011546001600160a01b03163314613e32576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4e4f545f434f4e46494760901b604482015290519081900360640190fd5b6001600160a01b038216613e7d576040805162461bcd60e51b815260206004820152600d60248201526c22a9292fad22a927afa0a2222960991b604482015290519081900360640190fd5b600b80546001600160a01b0384166001600160a01b03199091168117909155600c8290556040805183815290517fccaa809140cb901df601f6c5eae0a0d30849c3b29378df0886f660270c9735e99181900360200190a25050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600854600160a81b900460ff1615613f55576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b60085461010090046001600160a01b03163314613fae576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b601160009054906101000a90046001600160a01b03166001600160a01b031663ff42517d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613ffc57600080fd5b505afa158015614010573d6000803e3d6000fd5b505050506040513d602081101561402657600080fd5b505181111561406f576040805162461bcd60e51b815260206004820152601060248201526f494e56414c49445f455849545f46454560801b604482015290519081900360640190fd5b600a8190556040805182815290517f09ea89c001139a826eedf1b1b3a690524db01249f803b62c0f6a30b09f4976fc9181900360200190a150565b600d5460ff1681565b6706f05b59d3b2000081565b60085460009060ff1615614108576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614165576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090206002015460105461419590829063ffffffff6146da16565b9392505050565b600381600581106141a957fe5b0154905081565b60085461010090046001600160a01b031681565b60085460009060ff161561420d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff1661426a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206003015490565b60408051633e35abb560e21b8152600481018890526024810187905260448101869052606481018590526084810184905260a481018390529051600091734f8d1c6dabbb379134272cb1273638cc98212a449163f8d6aed49160c480820192602092909190829003018186803b158015613caa57600080fd5b61430b81614998565b50565b61431930838361431d565b5050565b6001600160a01b038316600090815260208190526040902054811115614381576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b0383166000908152602081905260409020546143aa908263ffffffff61443916565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546143df908263ffffffff6147e216565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008060006144488585614a19565b915091508015614493576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b61431982308361431d565b60008282028315806144c05750828482816144bd57fe5b04145b614504576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614557576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b61430b81614a3e565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106145f55780518252601f1990920191602091820191016145d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614657576040519150601f19603f3d011682016040523d82523d6000602084013e61465c565b606091505b509150915081801561468a57508051158061468a575080806020019051602081101561468757600080fd5b50515b6146d3576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c17d514905394d1915497d19052531151605a1b604482015290519081900360640190fd5b5050505050565b60008161471d576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806147455750670de0b6b3a764000084828161474257fe5b04145b614789576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600283048101818110156147d7576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600084828161456457fe5b600082820183811015614195576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604080516001600160a01b038481166024830152306044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000946060949389169392918291908083835b602083106148b25780518252601f199092019160209182019101614893565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614914576040519150601f19603f3d011682016040523d82523d6000602084013e614919565b606091505b5091509150818015614947575080511580614947575080806020019051602081101561494457600080fd5b50515b6146d3576040805162461bcd60e51b815260206004820152601a60248201527f45524332305f5452414e534645525f46524f4d5f4641494c4544000000000000604482015290519081900360640190fd5b306000908152602081905260409020546149b8908263ffffffff6147e216565b306000908152602081905260409020556002546149db908263ffffffff6147e216565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b600080828410614a2f5750508082036000614a37565b505081810360015b9250929050565b30600090815260208190526040902054811115614a99576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b30600090815260208190526040902054614ab9908263ffffffff61443916565b30600090815260208190526040902055600254614adc908263ffffffff61443916565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35056fea265627a7a72315820e4bc0b79265b34f3071fc12ee0e04d56963a3285dc6081942b73e464bfc1c8b064736f6c63430005110032

Deployed Bytecode Sourcemap

21048:24733:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21048:24733:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27609:917;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27609:917:0;;:::i;:::-;;7576:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7576:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8234:187;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8234:187:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;672:52;;;:::i;:::-;;;;;;;;;;;;;;;;184:97;;;:::i;23293:19::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23293:19:0;;;;;;;;;;;;;;521:41;;;:::i;29441:622::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29441:622:0;;;;;;;;;;:::i;28812:621::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28812:621:0;;;;;;;;;;:::i;855:47::-;;;:::i;8135:91::-;;;:::i;26239:195::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26239:195:0;;;;:::i;571:41::-;;;:::i;8573:598::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8573:598:0;;;;;;;;;;;;;;;;;:::i;23908:100::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23908:100:0;-1:-1:-1;;;;;23908:100:0;;:::i;7766:85::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41398:1702;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41398:1702:0;;;;;;;;;;;;;:::i;30071:1031::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30071:1031:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;30071:1031:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30071:1031:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;30071:1031:0;;-1:-1:-1;30071:1031:0;-1:-1:-1;30071:1031:0;:::i;23209:22::-;;;:::i;39998:1392::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39998:1392:0;;;;;;;;;;;;;:::i;23238:22::-;;;:::i;23500:23::-;;;:::i;8022:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8022:105:0;-1:-1:-1;;;;;8022:105:0;;:::i;23319:22::-;;;:::i;33130:3176::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;33130:3176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36314:494;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;36314:494:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36816:3174::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;36816:3174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32629:493::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;32629:493:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;777:43::-;;;:::i;28611:193::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28611:193:0;-1:-1:-1;;;;;28611:193:0;;:::i;25278:258::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25278:258:0;-1:-1:-1;;;;;25278:258:0;;:::i;24581:160::-;;;:::i;911:53::-;;;:::i;23530:21::-;;;:::i;24337:236::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24337:236:0;-1:-1:-1;;;;;24337:236:0;;:::i;7669:89::-;;;:::i;1027:58::-;;;:::i;26442:1117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26442:1117:0;;;;;;;;:::i;8429:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8429:136:0;;;;;;;;:::i;31110:1511::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31110:1511:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;31110:1511:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31110:1511:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;31110:1511:0;;-1:-1:-1;31110:1511:0;-1:-1:-1;31110:1511:0;:::i;468:44::-;;;:::i;23179:21::-;;;:::i;417:44::-;;;:::i;43108:517::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43108:517:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24120:209::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24120:209:0;;;;;;;;;;;;;;;;;24016:96;;;:::i;25907:277::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25907:277:0;;;;;;;;:::i;7859:155::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7859:155:0;;;;;;;;;;:::i;25544:293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25544:293:0;;:::i;23348:22::-;;;:::i;973:47::-;;;:::i;24749:287::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24749:287:0;-1:-1:-1;;;;;24749:287:0;;:::i;21174:159::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21174:159:0;;:::i;23049:25::-;;;:::i;25044:226::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25044:226:0;-1:-1:-1;;;;;25044:226:0;;:::i;43633:519::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43633:519:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27609:917::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;22872:4;-1:-1:-1;;22863:13:0;;;;;;;;;27694:10;;-1:-1:-1;;;;;27694:10:0;27680;:24;27672:55;;;;;-1:-1:-1;;;27672:55:0;;;;;;;;;;;;-1:-1:-1;;;27672:55:0;;;;;;;;;;;;;;;27747:9;;-1:-1:-1;;;27747:9:0;;;;27746:10;27738:39;;;;;-1:-1:-1;;;27738:39:0;;;;;;;;;;;;-1:-1:-1;;;27738:39:0;;;;;;;;;;;;;;;27796:7;:14;460:1;-1:-1:-1;27796:34:0;27788:61;;;;;-1:-1:-1;;;27788:61:0;;;;;;;;;;;;-1:-1:-1;;;27788:61:0;;;;;;;;;;;;;;;27868:7;:14;511:1;-1:-1:-1;27868:34:0;27860:61;;;;;-1:-1:-1;;;27860:61:0;;;;;;;;;;;;-1:-1:-1;;;27860:61:0;;;;;;;;;;;;;;;27954:9;:12;27942:24;;;27934:48;;;;;-1:-1:-1;;;27934:48:0;;;;;;;;;;;;-1:-1:-1;;;27934:48:0;;;;;;;;;;;;;;;28013:31;;28001:43;;;27993:67;;;;;-1:-1:-1;;;27993:67:0;;;;;;;;;;;;-1:-1:-1;;;27993:67:0;;;;;;;;;;;;;;;28073:10;;28102:174;28126:16;28122:1;:20;28102:174;;;28180:9;28190:1;28180:12;;;;;;;;;28168:8;:24;28164:101;;;28221:4;28213:12;;28244:5;;28164:101;28144:3;;28102:174;;;;28294:5;28286:38;;;;;-1:-1:-1;;;28286:38:0;;;;;;;;;;;;-1:-1:-1;;;28286:38:0;;;;;;;;;;;;;;;28335:7;:18;;;28366:9;:16;;-1:-1:-1;;;;28366:16:0;-1:-1:-1;;;28366:16:0;;;28395:32;954:10;28395:14;:32::i;:::-;28438:44;28453:10;954;28438:14;:44::i;:::-;28510:7;;28500:18;;;;;;;;;;;;;;;;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;27609:917::o;7576:85::-;7648:5;;;;;;;;;;;;-1:-1:-1;;;7648:5:0;;;;7576:85;:::o;8234:187::-;8323:10;8295:4;8312:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;8312:27:0;;;;;;;;;;;:33;;;8361:30;;;;;;;8295:4;;8312:27;;8323:10;;8361:30;;;;;;;;-1:-1:-1;8409:4:0;8234:187;;;;:::o;672:52::-;715:9;672:52;:::o;184:97::-;-1:-1:-1;;;184:97:0;:::o;23293:19::-;;;-1:-1:-1;;;;;23293:19:0;;:::o;521:41::-;561:1;521:41;:::o;29441:622::-;22971:6;;29575:17;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29618:17:0;;;;;;:8;:17;;;;;:23;;;29610:49;;;;;-1:-1:-1;;;29610:49:0;;;;;;;;;;;;-1:-1:-1;;;29610:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29678:18:0;;;;;;:8;:18;;;;;:24;;;29670:50;;;;;-1:-1:-1;;;29670:50:0;;;;;;;;;;;;-1:-1:-1;;;29670:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29757:17:0;;;29731:23;29757:17;;;:8;:17;;;;;;;;29812:18;;;;;;;;29899:16;;;;;29934:15;;;;;29968:17;;;;30004:16;;;;29861:194;;-1:-1:-1;;;29861:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29812:18;;29861:5;;:19;;:194;;;;;;;;;;:5;:194;;;5:2:-1;;;;30:1;27;20:12;5:2;29861:194:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29861:194:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29861:194:0;;29441:622;-1:-1:-1;;;;;29441:622:0:o;28812:621::-;22971:6;;28939:17;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28982:17:0;;;;;;:8;:17;;;;;:23;;;28974:49;;;;;-1:-1:-1;;;28974:49:0;;;;;;;;;;;;-1:-1:-1;;;28974:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29042:18:0;;;;;;:8;:18;;;;;:24;;;29034:50;;;;;-1:-1:-1;;;29034:50:0;;;;;;;;;;;;-1:-1:-1;;;29034:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29121:17:0;;;29095:23;29121:17;;;:8;:17;;;;;;;;29176:18;;;;;;;;;29263:16;;;;;29298:15;;;;;29332:17;;;;29368:16;;;;29403:7;;29225:200;;-1:-1:-1;;;29225:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29176:18;;29225:5;;:19;;:200;;;;;;;;;;:5;:200;;;5:2:-1;;;;30:1;27;20:12;855:47:0;897:5;855:47;:::o;8135:91::-;8206:12;;8135:91;:::o;26239:195::-;26322:7;;-1:-1:-1;;;;;26322:7:0;26300:10;:30;26292:57;;;;;-1:-1:-1;;;26292:57:0;;;;;;;;;;;;-1:-1:-1;;;26292:57:0;;;;;;;;;;;;;;;26360:10;:19;;;;;-1:-1:-1;;26360:19:0;;;;;;;;26395:31;;;;;;;26407:10;;26395:31;;;;;;;;;;26239:195;:::o;571:41::-;402:6;571:41;:::o;8573:598::-;8686:4;8725:10;-1:-1:-1;;;;;8725:17:0;;;;:55;;-1:-1:-1;;;;;;8753:15:0;;;;;;:10;:15;;;;;;;;8769:10;8753:27;;;;;;;;8746:34;;;8725:55;8703:126;;;;;-1:-1:-1;;;8703:126:0;;;;;;;;;;;;-1:-1:-1;;;8703:126:0;;;;;;;;;;;;;;;8840:20;8846:3;8851;8856;8840:5;:20::i;:::-;8875:10;-1:-1:-1;;;;;8875:17:0;;;;;;:63;;-1:-1:-1;;;;;;8896:15:0;;;;;;:10;:15;;;;;;;;8912:10;8896:27;;;;;;;;-1:-1:-1;;8896:42:0;;8875:63;8871:271;;;-1:-1:-1;;;;;8986:15:0;;;;;;:10;:15;;;;;;;;9002:10;8986:27;;;;;;;;8985:71;;9038:3;8985:71;:34;:71;:::i;:::-;-1:-1:-1;;;;;8955:15:0;;;;;;;:10;:15;;;;;;;;8971:10;8955:27;;;;;;;;;;:101;;;9076:54;;;;;;;;;;8971:10;;9076:54;;;;;;;;;;8871:271;-1:-1:-1;9159:4:0;8573:598;;;;;:::o;23908:100::-;-1:-1:-1;;;;;23983:11:0;23959:4;23983:11;;;:8;:11;;;;;:17;;;;23908:100::o;7766:85::-;7565:2;7766:85;:::o;41398:1702::-;41556:22;22743:10;-1:-1:-1;;;;;22725:39:0;22734:7;;-1:-1:-1;;;;;;22734:7:0;-1:-1:-1;;;;;22725:39:0;;22755:8;;22725:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;22725:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;22725:39:0;;;;-1:-1:-1;22725:39:0;;-1:-1:-1;;;;22725:39:0;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;41599:9:0;;22863:13;41599:9;41591:39;;;;;-1:-1:-1;;;41591:39:0;;;;;;;;;;;;-1:-1:-1;;;41591:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41649:18:0;;;;;;:8;:18;;;;;:24;;;41641:50;;;;;-1:-1:-1;;;41641:50:0;;;;;;;;;;;;-1:-1:-1;;;41641:50:0;;;;;;;;;;;;;;;897:5;41710:12;:31;;41702:58;;;;;-1:-1:-1;;;41702:58:0;;;;;;;;;;;;-1:-1:-1;;;41702:58:0;;;;;;;;;;;;;;;41773:40;41788:10;41800:12;41773:14;:40::i;:::-;41871:1;41861:7;;:11;:35;;;;-1:-1:-1;41890:6:0;;-1:-1:-1;;;;;41890:6:0;41876:10;:20;;41861:35;41857:217;;;41913:16;41932:26;41950:7;;41932:12;:17;;:26;;;;:::i;:::-;41988:6;;41913:45;;-1:-1:-1;41973:32:0;;-1:-1:-1;;;;;41988:6:0;41913:45;41973:14;:32::i;:::-;42035:27;:12;42053:8;42035:27;:17;:27;:::i;:::-;42020:42;;41857:217;;42086:28;42101:12;42086:14;:28::i;:::-;-1:-1:-1;;;;;42154:18:0;;42127:24;42154:18;;;:8;:18;;;;;;;;;42245:17;;;;42277:16;;;;;42308:12;;42335;;42389:7;;42200:207;;-1:-1:-1;;;42200:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42154:18;;42200:5;;:30;;:207;;;;;;;;;;:5;:207;;;5:2:-1;;;;30:1;27;20:12;5:2;42200:207:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42200:207:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42200:207:0;;-1:-1:-1;42428:30:0;;;;42420:56;;;;;-1:-1:-1;;;42420:56:0;;;;;;;;;;;;-1:-1:-1;;;42420:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42528:18:0;;;;;;:8;:18;;;;;1075:1;42528:26;;42527:48;;1067:18;42527:33;:48::i;:::-;42509:14;:66;;42487:133;;;;;-1:-1:-1;;;42487:133:0;;;;;;;;;;;;-1:-1:-1;;;42487:133:0;;;;;;;;;;;;;;;42654:17;;;;42653:40;;42678:14;42653:40;:24;:40;:::i;:::-;42633:17;;;:60;42765:7;;42726:16;;42745:28;;:14;;:28;:19;:28;:::i;:::-;42788:10;;42726:47;;-1:-1:-1;42788:10:0;;42784:82;;;42846:7;;42826:28;;:14;;:28;:19;:28;:::i;:::-;42815:39;;42784:82;42883:46;;;;;;;;-1:-1:-1;;;;;42883:46:0;;;42892:10;;42883:46;;;;;;;;;42966:4;;42940:41;;42956:8;;-1:-1:-1;;;;;42966:4:0;42972:8;42940:15;:41::i;:::-;42992:68;43008:8;43018:10;43030:29;:14;43050:8;43030:29;:19;:29;:::i;:::-;42992:15;:68::i;:::-;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;41398:1702;;-1:-1:-1;;;41398:1702:0:o;30071:1031::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;30203:9:0;;22863:13;30203:9;30195:39;;;;;-1:-1:-1;;;30195:39:0;;;;;;;;;;;;-1:-1:-1;;;30195:39:0;;;;;;;;;;;;;;;30276:7;:14;30253:37;;30245:69;;;;;-1:-1:-1;;;30245:69:0;;;;;;;;;;;;-1:-1:-1;;;30245:69:0;;;;;;;;;;;;;;;30327:17;30347:13;:11;:13::i;:::-;30327:33;-1:-1:-1;30371:13:0;30387:29;:13;30327:33;30387:29;:18;:29;:::i;:::-;30371:45;-1:-1:-1;30435:10:0;30427:38;;;;;-1:-1:-1;;;30427:38:0;;;;;;;;;;;;-1:-1:-1;;;30427:38:0;;;;;;;;;;;;;;;30483:9;30478:525;30502:7;:14;30498:18;;30478:525;;;30538:9;30550:7;30558:1;30550:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30550:10:0;30589:11;;;:8;:11;;;;;;:19;;;30550:10;;-1:-1:-1;30589:19:0;30647:15;:5;30589:19;30647:15;:10;:15;:::i;:::-;30623:39;-1:-1:-1;30685:18:0;30677:46;;;;;-1:-1:-1;;;30677:46:0;;;;;;;;;;;;-1:-1:-1;;;30677:46:0;;;;;;;;;;;;;;;30763:12;;30776:1;30763:15;;;;;;;;;;;;;30746:13;:32;;30738:57;;;;;-1:-1:-1;;;30738:57:0;;;;;;;;;;;;-1:-1:-1;;;30738:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30833:11:0;;;;;;:8;:11;;;;;:19;;;30832:41;;30859:13;30832:41;:26;:41;:::i;:::-;-1:-1:-1;;;;;30810:11:0;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;30893:38;;;;;;;30810:11;;30902:10;;30893:38;;;;;;;;;;30946:45;30962:1;30965:10;30977:13;30946:15;:45::i;:::-;-1:-1:-1;;;30518:3:0;;30478:525;;;;31013:29;31028:13;31013:14;:29::i;:::-;31053:41;31068:10;31080:13;31053:14;:41::i;:::-;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;-1:-1:-1;;;30071:1031:0:o;23209:22::-;;;;:::o;39998:1392::-;22830:6;;40155:21;;22830:6;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;40197:9:0;;22863:13;40197:9;40189:39;;;;;-1:-1:-1;;;40189:39:0;;;;;;;;;;;;-1:-1:-1;;;40189:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40247:17:0;;;;;;:8;:17;;;;;:23;;;40239:49;;;;;-1:-1:-1;;;40239:49:0;;;;;;;;;;;;-1:-1:-1;;;40239:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40339:17:0;;;;;;:8;:17;;;;;:25;;;40338:46;;1012:8;40338:32;:46::i;:::-;40321:13;:63;;40299:129;;;;;-1:-1:-1;;;40299:129:0;;;;;;;;;;;;-1:-1:-1;;;40299:129:0;;;;;;;;;;;;;;;40441:51;40457:7;40466:10;40478:13;40441:15;:51::i;:::-;40525:16;40544:27;40563:7;;40544:13;:18;;:27;;;;:::i;:::-;40586:10;;40525:46;;-1:-1:-1;40586:10:0;;40582:81;;;40643:7;;40624:27;;:13;;:27;:18;:27;:::i;:::-;40613:38;;40582:81;40689:28;:13;40708:8;40689:28;:18;:28;:::i;:::-;-1:-1:-1;;;;;40756:17:0;;40730:23;40756:17;;;:8;:17;;;;;;;;;40845:16;;;;40876:15;;;;;40906:12;;40933;;40988:7;;40800:206;;-1:-1:-1;;;40800:206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40673:44;;-1:-1:-1;40756:17:0;40800:5;;:30;;:206;;;;;40756:17;;40800:206;;;;;:5;:206;;;5:2:-1;;;;30:1;27;20:12;5:2;40800:206:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40800:206:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40800:206:0;;-1:-1:-1;41025:33:0;;;;41017:59;;;;;-1:-1:-1;;;41017:59:0;;;;;;;;;;;;-1:-1:-1;;;41017:59:0;;;;;;;;;;;;;;;41109:16;;;;41108:38;;41132:13;41108:38;:23;:38;:::i;:::-;41089:16;;;:57;41184:4;;41159:40;;41175:7;;-1:-1:-1;;;;;41184:4:0;41190:8;41159:15;:40::i;:::-;41215:44;;;;;;;;-1:-1:-1;;;;;41215:44:0;;;41224:10;;41215:44;;;;;;;;;41270:29;41285:13;41270:14;:29::i;:::-;41310:41;41325:10;41337:13;41310:14;:41::i;23238:22::-;;;;:::o;23500:23::-;;;-1:-1:-1;;;;;23500:23:0;;:::o;8022:105::-;-1:-1:-1;;;;;8105:14:0;8078:7;8105:14;;;;;;;;;;;;8022:105::o;23319:22::-;;;;:::o;33130:3176::-;22830:6;;33362:22;;;;22830:6;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;-1:-1:-1;;;;;33429:17:0;;22863:6;33429:17;;;:8;:17;;;;;:23;22863:13;33429:23;33421:49;;;;;-1:-1:-1;;;33421:49:0;;;;;;;;;;;;-1:-1:-1;;;33421:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33489:18:0;;;;;;:8;:18;;;;;:24;;;33481:50;;;;;-1:-1:-1;;;33481:50:0;;;;;;;;;;;;-1:-1:-1;;;33481:50:0;;;;;;;;;;;;;;;33550:9;;-1:-1:-1;;;33550:9:0;;;;33542:39;;;;;-1:-1:-1;;;33542:39:0;;;;;;;;;;;;-1:-1:-1;;;33542:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33620:26:0;;;33594:23;33620:26;;;:8;:26;;;;;;33684:27;;;;;;;33764:16;;;;33763:37;;1012:8;33763:23;:37::i;:::-;33746:13;:54;;33724:120;;;;;-1:-1:-1;;;33724:120:0;;;;;;;;;;;;-1:-1:-1;;;33724:120:0;;;;;;;;;;;;;;;33857:23;33896:5;:19;33934:8;:16;;;33969:8;:15;;;34003:9;:17;;;34039:9;:16;;;34074:7;;33896:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33896:200:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33896:200:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33896:200:0;;-1:-1:-1;34115:27:0;;;;34107:59;;;;;-1:-1:-1;;;34107:59:0;;;;;;;;;;;;-1:-1:-1;;;34107:59:0;;;;;;;;;;;;;;;34196:199;34225:8;:16;;;34256:8;:15;;;34286:9;:17;;;34318:9;:16;;;34349:13;34377:7;;34196:14;:199::i;:::-;34179:216;;34432:12;34414:14;:30;;34406:56;;;;;-1:-1:-1;;;34406:56:0;;;;;;;;;;;;-1:-1:-1;;;34406:56:0;;;;;;;;;;;;;;;34514:34;:13;34533:14;34514:34;:18;:34;:::i;:::-;34495:15;:53;;34473:118;;;;;-1:-1:-1;;;34473:118:0;;;;;;;;;;;;-1:-1:-1;;;34473:118:0;;;;;;;;;;;;;;;34624:16;;;;34623:38;;34647:13;34623:38;:23;:38;:::i;:::-;34604:16;;;;:57;;;;34693:17;;;34692:40;;34717:14;34692:40;:24;:40;:::i;:::-;34672:9;:17;;:60;;;;34762:5;:19;34796:8;:16;;;34827:8;:15;;;34857:9;:17;;;34889:9;:16;;;34920:7;;34762:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34762:176:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34762:176:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34762:176:0;;-1:-1:-1;34957:33:0;;;;34949:61;;;;;-1:-1:-1;;;34949:61:0;;;;;;;;;;;;-1:-1:-1;;;34949:61:0;;;;;;;;;;;;;;;35047:8;35029:14;:26;;35021:54;;;;;-1:-1:-1;;;35021:54:0;;;;;;;;;;;;-1:-1:-1;;;35021:54:0;;;;;;;;;;;;;;;35163:8;-1:-1:-1;;;;;35093:146:0;35141:7;-1:-1:-1;;;;;35093:146:0;35116:10;-1:-1:-1;;;;;35093:146:0;;35186:13;35214:14;35093:146;;;;;;;;;;;;;;;;;;;;;;;;35252:51;35268:7;35277:10;35289:13;35252:15;:51::i;:::-;35316:16;35335:27;35354:7;;35335:13;:18;;:27;;;;:::i;:::-;35316:46;-1:-1:-1;35399:17:0;-1:-1:-1;;;;;35449:22:0;;;;;;:61;;-1:-1:-1;;;;;;35488:22:0;;35500:10;35488:22;;35449:61;:99;;;;-1:-1:-1;;;;;;35527:21:0;;35539:9;35527:21;;35449:99;35431:398;;;-1:-1:-1;35598:1:0;35587:12;;35633:45;35649:7;35658:8;35587:12;35633:15;:45::i;:::-;35713:16;;;;35712:34;;35736:9;35712:34;:23;:34;:::i;:::-;35693:8;:16;;:53;;;;35798:7;-1:-1:-1;;;;;35766:51:0;35788:8;-1:-1:-1;;;;;35766:51:0;35776:10;-1:-1:-1;;;;;35766:51:0;;35807:9;35766:51;;;;;;;;;;;;;;;;;;35431:398;35861:16;35880:27;35899:7;;35880:13;:18;;:27;;;;:::i;:::-;35922:10;;35861:46;;-1:-1:-1;35922:10:0;;35918:78;;;35960:24;:8;35974:9;35960:24;:13;:24;:::i;:::-;35949:35;;35918:78;36042:8;36014:24;:8;36028:9;36014:24;:13;:24;:::i;:::-;:36;;36006:62;;;;;-1:-1:-1;;;36006:62:0;;;;;;;;;;;;-1:-1:-1;;;36006:62:0;;;;;;;;;;;;;;;36104:4;;36079:40;;36095:7;;-1:-1:-1;;;;;36104:4:0;36110:8;36079:15;:40::i;:::-;36150:16;;;;36149:33;;36173:8;36149:33;:23;:33;:::i;:::-;36130:16;;;:52;36195:53;36211:8;36221:10;36233:14;36195:15;:53::i;:::-;-1:-1:-1;;;;;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;33130:3176;;;;-1:-1:-1;33130:3176:0;-1:-1:-1;;;;;33130:3176:0:o;36314:494::-;36510:21;36533:22;36588:212;36630:7;36656:11;36686:8;36713:14;36746:8;36781:3;36588:23;:212::i;:::-;36568:232;;;;36314:494;;;;;;;;:::o;36816:3174::-;22830:6;;37049:21;;;;22830:6;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;-1:-1:-1;;;;;37115:17:0;;22863:6;37115:17;;;:8;:17;;;;;:23;22863:13;37115:23;37107:49;;;;;-1:-1:-1;;;37107:49:0;;;;;;;;;;;;-1:-1:-1;;;37107:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37175:18:0;;;;;;:8;:18;;;;;:24;;;37167:50;;;;;-1:-1:-1;;;37167:50:0;;;;;;;;;;;;-1:-1:-1;;;37167:50:0;;;;;;;;;;;;;;;37236:9;;-1:-1:-1;;;37236:9:0;;;;37228:39;;;;;-1:-1:-1;;;37228:39:0;;;;;;;;;;;;-1:-1:-1;;;37228:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37306:26:0;;;37280:23;37306:26;;;:8;:26;;;;;;37370:27;;;;;;;1075:1;37451:17;;;37450:39;;1067:18;37450:24;:39::i;:::-;37432:14;:57;;37410:124;;;;;-1:-1:-1;;;37410:124:0;;;;;;;;;;;;-1:-1:-1;;;37410:124:0;;;;;;;;;;;;;;;37547:23;37586:5;:19;37624:8;:16;;;37659:8;:15;;;37693:9;:17;;;37729:9;:16;;;37764:7;;37586:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37586:200:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37586:200:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37586:200:0;;-1:-1:-1;37805:27:0;;;;37797:59;;;;;-1:-1:-1;;;37797:59:0;;;;;;;;;;;;-1:-1:-1;;;37797:59:0;;;;;;;;;;;;;;;37885:200;37914:8;:16;;;37945:8;:15;;;37975:9;:17;;;38007:9;:16;;;38038:14;38067:7;;37885:14;:200::i;:::-;37869:216;;38121:11;38104:13;:28;;38096:53;;;;;-1:-1:-1;;;38096:53:0;;;;;;;;;;;;-1:-1:-1;;;38096:53:0;;;;;;;;;;;;;;;38201:34;:13;38220:14;38201:34;:18;:34;:::i;:::-;38182:15;:53;;38160:118;;;;;-1:-1:-1;;;38160:118:0;;;;;;;;;;;;-1:-1:-1;;;38160:118:0;;;;;;;;;;;;;;;38311:16;;;;38310:38;;38334:13;38310:38;:23;:38;:::i;:::-;38291:16;;;;:57;;;;38380:17;;;38379:40;;38404:14;38379:40;:24;:40;:::i;:::-;38359:9;:17;;:60;;;;38449:5;:19;38483:8;:16;;;38514:8;:15;;;38544:9;:17;;;38576:9;:16;;;38607:7;;38449:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38449:176:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38449:176:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38449:176:0;;-1:-1:-1;38644:33:0;;;;38636:61;;;;;-1:-1:-1;;;38636:61:0;;;;;;;;;;;;-1:-1:-1;;;38636:61:0;;;;;;;;;;;;;;;38734:8;38716:14;:26;;38708:54;;;;;-1:-1:-1;;;38708:54:0;;;;;;;;;;;;-1:-1:-1;;;38708:54:0;;;;;;;;;;;;;;;38850:8;-1:-1:-1;;;;;38780:146:0;38828:7;-1:-1:-1;;;;;38780:146:0;38803:10;-1:-1:-1;;;;;38780:146:0;;38873:13;38901:14;38780:146;;;;;;;;;;;;;;;;;;;;;;;;38939:51;38955:7;38964:10;38976:13;38939:15;:51::i;:::-;39003:16;39022:27;39041:7;;39022:13;:18;;:27;;;;:::i;:::-;39003:46;-1:-1:-1;39084:17:0;-1:-1:-1;;;;;39134:22:0;;;;;;:61;;-1:-1:-1;;;;;;39173:22:0;;39185:10;39173:22;;39134:61;:99;;;;-1:-1:-1;;;;;;39212:21:0;;39224:9;39212:21;;39134:99;39116:398;;;-1:-1:-1;39283:1:0;39272:12;;39318:45;39334:7;39343:8;39272:12;39318:15;:45::i;:::-;39398:16;;;;39397:34;;39421:9;39397:34;:23;:34;:::i;:::-;39378:8;:16;;:53;;;;39483:7;-1:-1:-1;;;;;39451:51:0;39473:8;-1:-1:-1;;;;;39451:51:0;39461:10;-1:-1:-1;;;;;39451:51:0;;39492:9;39451:51;;;;;;;;;;;;;;;;;;39116:398;39546:16;39565:27;39584:7;;39565:13;:18;;:27;;;;:::i;:::-;39607:10;;39546:46;;-1:-1:-1;39607:10:0;;39603:78;;;39645:24;:8;39659:9;39645:24;:13;:24;:::i;:::-;39634:35;;39603:78;39727:8;39699:24;:8;39713:9;39699:24;:13;:24;:::i;:::-;:36;;39691:62;;;;;-1:-1:-1;;;39691:62:0;;;;;;;;;;;;-1:-1:-1;;;39691:62:0;;;;;;;;;;;;;;;39789:4;;39764:40;;39780:7;;-1:-1:-1;;;;;39789:4:0;39795:8;39764:15;:40::i;:::-;39835:16;;;;39834:33;;39858:8;39834:33;:23;:33;:::i;:::-;39815:16;;;:52;39880:53;39896:8;39906:10;39918:14;39880:15;:53::i;32629:493::-;32824:22;32848;32903:211;32944:7;32970:13;33002:8;33029:12;33060:8;33095:3;32903:22;:211::i;777:43::-;815:5;777:43;:::o;28611:193::-;22743:10;-1:-1:-1;;;;;22725:39:0;22734:7;;-1:-1:-1;;;;;;22734:7:0;-1:-1:-1;;;;;22725:39:0;;22755:8;;22725:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;22725:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;22725:39:0;;;;-1:-1:-1;22725:39:0;;-1:-1:-1;;;;22725:39:0;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;-1:-1:-1;;;;;28682:15:0;;22863:6;28682:15;;;:8;:15;;;;;:21;22863:13;28682:21;28674:47;;;;;-1:-1:-1;;;28674:47:0;;;;;;;;;;;;-1:-1:-1;;;28674:47:0;;;;;;;;;;;;;;;28758:38;;;-1:-1:-1;;;28758:38:0;;28790:4;28758:38;;;;;;-1:-1:-1;;;;;28758:23:0;;;;;:38;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;28758:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28758:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28758:38:0;-1:-1:-1;;;;;28732:15:0;;;;;;;:8;28758:38;28732:15;;;;:23;;:64;22899:6;:14;;-1:-1:-1;;22899:14:0;;;28611:193::o;25278:258::-;22743:10;-1:-1:-1;;;;;22725:39:0;22734:7;;-1:-1:-1;;;;;;22734:7:0;-1:-1:-1;;;;;22725:39:0;;22755:8;;22725:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;22725:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;22725:39:0;;;;-1:-1:-1;22725:39:0;;-1:-1:-1;;;;22725:39:0;25367:10;;;;;-1:-1:-1;;;;;25367:10:0;25353;:24;25345:55;;;;;-1:-1:-1;;;25345:55:0;;;;;;;;;;;;-1:-1:-1;;;25345:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25419:21:0;;25411:47;;;;;-1:-1:-1;;;25411:47:0;;;;;;;;;;;;-1:-1:-1;;;25411:47:0;;;;;;;;;;;;;;;25469:10;:20;;-1:-1:-1;;;;;;25469:20:0;;-1:-1:-1;;;;;25469:20:0;;;;;;;;;;;;25505:23;;;;-1:-1:-1;;25505:23:0;25278:258;:::o;24581:160::-;22971:6;;24689:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;24721:12:0;;24581:160;:::o;911:53::-;954:10;911:53;:::o;23530:21::-;;;-1:-1:-1;;;;;23530:21:0;;:::o;24337:236::-;22971:6;;24453:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24486:15:0;;;;;;:8;:15;;;;;:21;;;24478:47;;;;;-1:-1:-1;;;24478:47:0;;;;;;;;;;;;-1:-1:-1;;;24478:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24543:15:0;;;;;:8;:15;;;;;:22;;;;24337:236::o;7669:89::-;7743:7;;;;;;;;;;;;-1:-1:-1;;;7743:7:0;;;;7669:89;:::o;1027:58::-;1067:18;1027:58;:::o;26442:1117::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;22872:4;-1:-1:-1;;22863:13:0;;;;;;;;;26536:10;;-1:-1:-1;;;;;26536:10:0;26522;:24;26514:55;;;;;-1:-1:-1;;;26514:55:0;;;;;;;;;;;;-1:-1:-1;;;26514:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26589:15:0;;;;;;:8;:15;;;;;:21;;;26588:22;26580:47;;;;;-1:-1:-1;;;26580:47:0;;;;;;;;;;;;-1:-1:-1;;;26580:47:0;;;;;;;;;;;;;;;26647:9;;-1:-1:-1;;;26647:9:0;;;;26646:10;26638:39;;;;;-1:-1:-1;;;26638:39:0;;;;;;;;;;;;-1:-1:-1;;;26638:39:0;;;;;;;;;;;;;;;26698:7;:14;511:1;-1:-1:-1;26690:60:0;;;;;-1:-1:-1;;;26690:60:0;;;;;;;;;;;;-1:-1:-1;;;26690:60:0;;;;;;;;;;;;;;;402:6;26771;:20;;26763:47;;;;;-1:-1:-1;;;26763:47:0;;;;;;;;;;;;-1:-1:-1;;;26763:47:0;;;;;;;;;;;;;;;656:9;26829:20;;;26821:47;;;;;-1:-1:-1;;;26821:47:0;;;;;;;;;;;;-1:-1:-1;;;26821:47:0;;;;;;;;;;;;;;;26899:38;;;-1:-1:-1;;;26899:38:0;;26931:4;26899:38;;;;;;26881:15;;-1:-1:-1;;;;;26899:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;26899:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26899:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26899:38:0;26980:24;;;-1:-1:-1;;;26980:24:0;;;;26899:38;;-1:-1:-1;26950:15:0;;-1:-1:-1;;;;;26980:22:0;;;;;:24;;;;;26899:38;;26980:24;;;;;;;:22;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;26980:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26980:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26980:24:0;26972:33;;26968:2;:37;;-1:-1:-1;27035:5:0;27024:16;;;27016:42;;;;;-1:-1:-1;;;27016:42:0;;;;;;;;;;;;-1:-1:-1;;;27016:42:0;;;;;;;;;;;;;;;815:5;27117:7;:21;27106:7;:32;;27098:60;;;;;-1:-1:-1;;;27098:60:0;;;;;;;;;;;;-1:-1:-1;;;27098:60:0;;;;;;;;;;;;;;;27186:12;;:25;;27204:6;27186:25;:17;:25;:::i;:::-;27171:12;:40;;;715:9;-1:-1:-1;27230:32:0;27222:65;;;;;-1:-1:-1;;;27222:65:0;;;;;;;;;;;;-1:-1:-1;;;27222:65:0;;;;;;;;;;;;;;;27318:141;;;;;;;;27347:4;27318:141;;;27373:7;:14;;27318:141;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27300:15:0;;-1:-1:-1;27300:15:0;;;:8;:15;;;;;:159;;;;-1:-1:-1;;27300:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;27470:19:0;;;;;;;;;-1:-1:-1;;;;;;27470:19:0;;;;;27507:44;;;;;;;;;;;;;27300:15;;27516:10;;27507:44;;;;;;;;;;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;-1:-1:-1;;26442:1117:0:o;8429:136::-;8491:4;8508:27;8514:10;8526:3;8531;8508:5;:27::i;:::-;-1:-1:-1;8553:4:0;8429:136;;;;:::o;31110:1511::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;31242:9:0;;22863:13;31242:9;31234:39;;;;;-1:-1:-1;;;31234:39:0;;;;;;;;;;;;-1:-1:-1;;;31234:39:0;;;;;;;;;;;;;;;31316:7;:14;31292:38;;31284:70;;;;;-1:-1:-1;;;31284:70:0;;;;;;;;;;;;-1:-1:-1;;;31284:70:0;;;;;;;;;;;;;;;897:5;31403:12;:31;;31395:58;;;;;-1:-1:-1;;;31395:58:0;;;;;;;;;;;;-1:-1:-1;;;31395:58:0;;;;;;;;;;;;;;;31466:17;31486:13;:11;:13::i;:::-;31466:33;;31510:16;31529:26;31547:7;;31529:12;:17;;:26;;;;:::i;:::-;31634:6;;31510:45;;-1:-1:-1;;;;;;31634:6:0;31620:10;:20;31616:65;;;-1:-1:-1;31668:1:0;31616:65;31691:23;31717:27;:12;31735:8;31717:27;:17;:27;:::i;:::-;31691:53;-1:-1:-1;31755:13:0;31771:31;31691:53;31792:9;31771:31;:20;:31;:::i;:::-;31755:47;-1:-1:-1;31821:10:0;31813:38;;;;;-1:-1:-1;;;31813:38:0;;;;;;;;;;;;-1:-1:-1;;;31813:38:0;;;;;;;;;;;;;;;31864:40;31879:10;31891:12;31864:14;:40::i;:::-;31954:12;;31950:77;;31998:6;;31983:32;;-1:-1:-1;;;;;31998:6:0;32006:8;31983:14;:32::i;:::-;32037:31;32052:15;32037:14;:31::i;:::-;32086:9;32081:533;32105:7;:14;32101:18;;32081:533;;;32141:9;32153:7;32161:1;32153:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32153:10:0;32192:11;;;:8;:11;;;;;;:19;;;32153:10;;-1:-1:-1;32192:19:0;32251:15;:5;32192:19;32251:15;:10;:15;:::i;:::-;32226:40;-1:-1:-1;32289:19:0;32281:47;;;;;-1:-1:-1;;;32281:47:0;;;;;;;;;;;;-1:-1:-1;;;32281:47:0;;;;;;;;;;;;;;;32369:13;;32383:1;32369:16;;;;;;;;;;;;;32351:14;:34;;32343:60;;;;;-1:-1:-1;;;32343:60:0;;;;;;;;;;;;-1:-1:-1;;;32343:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32441:11:0;;;;;;:8;:11;;;;;:19;;;32440:42;;32467:14;32440:42;:26;:42;:::i;:::-;-1:-1:-1;;;;;32418:11:0;;;;;;:8;:11;;;;;;;;;:19;;:64;;;;32502:39;;;;;;;32418:11;;32511:10;;32502:39;;;;;;;;;;32556:46;32572:1;32575:10;32587:14;32556:15;:46::i;:::-;-1:-1:-1;;;32121:3:0;;32081:533;;;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;-1:-1:-1;;;;;;31110:1511:0:o;468:44::-;511:1;468:44;:::o;23179:21::-;;;-1:-1:-1;;;23179:21:0;;;;;:::o;417:44::-;460:1;417:44;:::o;43108:517::-;43391:226;;;-1:-1:-1;;;43391:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43351:7;;43391:5;;:20;;:226;;;;;;;;;;;;;;;:5;:226;;;5:2:-1;;;;30:1;27;20:12;5:2;43391:226:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43391:226:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43391:226:0;;43108:517;-1:-1:-1;;;;;;;43108:517:0:o;24120:209::-;22971:6;;24216:23;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;24265:9;;-1:-1:-1;;;24265:9:0;;;;24257:39;;;;;-1:-1:-1;;;24257:39:0;;;;;;;;;;;;-1:-1:-1;;;24257:39:0;;;;;;;;;;;;;;;24314:7;24307:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24307:14:0;;;;;;;;;;;;;;;;;;;;;;;24120:209;:::o;24016:96::-;24090:7;:14;24016:96;:::o;25907:277::-;26004:7;;-1:-1:-1;;;;;26004:7:0;25982:10;:30;25974:57;;;;;-1:-1:-1;;;25974:57:0;;;;;;;;;;;;-1:-1:-1;;;25974:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26050:18:0;;26042:44;;;;;-1:-1:-1;;;26042:44:0;;;;;;;;;;;;-1:-1:-1;;;26042:44:0;;;;;;;;;;;;;;;26097:4;:11;;-1:-1:-1;;;;;26097:11:0;;-1:-1:-1;;;;;;26097:11:0;;;;;;;;26119:7;:13;;;26150:26;;;;;;;;;;;;;;;;;25907:277;;:::o;7859:155::-;-1:-1:-1;;;;;7986:15:0;;;7954:7;7986:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;7859:155::o;25544:293::-;25606:9;;-1:-1:-1;;;25606:9:0;;;;25605:10;25597:39;;;;;-1:-1:-1;;;25597:39:0;;;;;;;;;;;;-1:-1:-1;;;25597:39:0;;;;;;;;;;;;;;;25669:10;;;;;-1:-1:-1;;;;;25669:10:0;25655;:24;25647:55;;;;;-1:-1:-1;;;25647:55:0;;;;;;;;;;;;-1:-1:-1;;;25647:55:0;;;;;;;;;;;;;;;25728:7;;;;;;;;;-1:-1:-1;;;;;25728:7:0;-1:-1:-1;;;;;25728:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25728:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25728:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25728:23:0;25721:30;;;25713:59;;;;;-1:-1:-1;;;25713:59:0;;;;;;;;;;;;-1:-1:-1;;;25713:59:0;;;;;;;;;;;;;;;25783:7;:13;;;25812:17;;;;;;;;;;;;;;;;;25544:293;:::o;23348:22::-;;;;;;:::o;973:47::-;1012:8;973:47;:::o;24749:287::-;22971:6;;24863:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24896:15:0;;;;;;:8;:15;;;;;:21;;;24888:47;;;;;-1:-1:-1;;;24888:47:0;;;;;;;;;;;;-1:-1:-1;;;24888:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24963:15:0;;24946:14;24963:15;;;:8;:15;;;;;:22;;;25015:12;;25003:25;;24963:22;;25003:25;:11;:25;:::i;:::-;24996:32;24749:287;-1:-1:-1;;;24749:287:0:o;21174:159::-;;;;;;;;;;;;;-1:-1:-1;21174:159:0;:::o;23049:25::-;;;;;;-1:-1:-1;;;;;23049:25:0;;:::o;25044:226::-;22971:6;;25149:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25182:15:0;;;;;;:8;:15;;;;;:21;;;25174:47;;;;;-1:-1:-1;;;25174:47:0;;;;;;;;;;;;-1:-1:-1;;;25174:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25239:15:0;;;;;:8;:15;;;;;:23;;;;25044:226::o;43633:519::-;43917:227;;;-1:-1:-1;;;43917:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43877:7;;43917:5;;:20;;:227;;;;;;;;;;;;;;;:5;:227;;;5:2:-1;;;;30:1;27;20:12;45608:81:0;45668:13;45674:6;45668:5;:13::i;:::-;45608:81;:::o;45488:112::-;45560:32;45574:4;45581:2;45585:6;45560:5;:32::i;:::-;45488:112;;:::o;7022:312::-;-1:-1:-1;;;;;7138:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;7138:20:0;7130:53;;;;;-1:-1:-1;;;7130:53:0;;;;;;;;;;;;-1:-1:-1;;;7130:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;7211:13:0;;:8;:13;;;;;;;;;;;7210:25;;7231:3;7210:25;:20;:25;:::i;:::-;-1:-1:-1;;;;;7194:13:0;;;:8;:13;;;;;;;;;;;:41;;;;7263:13;;;;;;;7262:25;;7283:3;7262:25;:20;:25;:::i;:::-;-1:-1:-1;;;;;7246:13:0;;;:8;:13;;;;;;;;;;;;:41;;;;7303:23;;;;;;;7246:13;;7303:23;;;;;;;;;;;;;7022:312;;;:::o;1782:191::-;1841:7;1862:9;1873;1886:14;1895:1;1898;1886:8;:14::i;:::-;1861:39;;;;1920:4;1919:5;1911:35;;;;;-1:-1:-1;;;1911:35:0;;;;;;;;;;;;-1:-1:-1;;;1911:35:0;;;;;;;;;;;;;;;-1:-1:-1;1964:1:0;1782:191;-1:-1:-1;;;1782:191:0:o;45364:116::-;45438:34;45444:4;45458;45465:6;45438:5;:34::i;2230:306::-;2289:7;2322:5;;;2346:6;;;:21;;;2366:1;2361;2356:2;:6;;;;;;:11;2346:21;2338:50;;;;;-1:-1:-1;;;2338:50:0;;;;;;;;;;;;-1:-1:-1;;;2338:50:0;;;;;;;;;;;;;;;2418:8;2412:15;;2446:8;;;;2438:37;;;;;-1:-1:-1;;;2438:37:0;;;;;;;;;;;;-1:-1:-1;;;2438:37:0;;;;;;;;;;;;;;;2486:10;1206:6;2499:2;:9;;;2230:306;-1:-1:-1;;;;;;2230:306:0:o;45697:81::-;45757:13;45763:6;45757:5;:13::i;44913:443::-;45162:46;;;-1:-1:-1;;;;;45162:46:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45162:46:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;45151:58:0;;;;45103:12;;45117:17;;45151:10;;;;45162:46;45151:58;;;25:18:-1;45151:58:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;45151:58:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;45102:107:0;;;;45242:7;:57;;;;-1:-1:-1;45254:11:0;;:16;;:44;;;45285:4;45274:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45274:24:0;45254:44;45220:128;;;;;-1:-1:-1;;;45220:128:0;;;;;;;;;;;;-1:-1:-1;;;45220:128:0;;;;;;;;;;;;;;;44913:443;;;;;:::o;2544:382::-;2603:7;2631:6;2623:31;;;;;-1:-1:-1;;;2623:31:0;;;;;;;;;;;;-1:-1:-1;;;2623:31:0;;;;;;;;;;;;;;;1206:6;2678:8;;2705:6;;;:24;;;1206:6;2720:1;2715:2;:6;;;;;;:14;2705:24;2697:53;;;;;-1:-1:-1;;;2697:53:0;;;;;;;;;;;;-1:-1:-1;;;2697:53:0;;;;;;;;;;;;;;;2801:1;2797:5;;2791:12;;2822:8;;;;2814:37;;;;;-1:-1:-1;;;2814:37:0;;;;;;;;;;;;-1:-1:-1;;;2814:37:0;;;;;;;;;;;;;;;2879:10;2897:1;2892:2;:6;;;;1605:169;1664:7;1696:5;;;1720:6;;;;1712:35;;;;;-1:-1:-1;;;1712:35:0;;;;;;;;;;;;-1:-1:-1;;;1712:35:0;;;;;;;;;;;;;;44394:511;44675:63;;;-1:-1:-1;;;;;44675:63:0;;;;;;;44724:4;44675:63;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44675:63:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;44646:107:0;;;;44598:12;;44612:17;;44646:10;;;;44675:63;44646:107;;;25:18:-1;44646:107:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;44646:107:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;44597:156:0;;;;44786:7;:57;;;;-1:-1:-1;44798:11:0;;:16;;:44;;;44829:4;44818:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44818:24:0;44798:44;44764:133;;;;;-1:-1:-1;;;44764:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6490:221;6582:4;6565:8;:23;;;;;;;;;;;6564:35;;6595:3;6564:35;:30;:35;:::i;:::-;6555:4;6538:8;:23;;;;;;;;;;:61;6625:12;;:22;;6643:3;6625:22;:17;:22;:::i;:::-;6610:12;:37;6663:40;;;;;;;;6692:4;;6680:1;;6663:40;;;;;;;;;6490:221;:::o;1981:241::-;2071:7;2080:4;2111:1;2106;:6;2102:113;;-1:-1:-1;;2137:5:0;;;2144;2129:21;;2102:113;-1:-1:-1;;2191:5:0;;;2198:4;2102:113;1981:241;;;;;:::o;6719:295::-;6792:4;6775:8;:23;;;;;;;;;;;:30;-1:-1:-1;6775:30:0;6767:63;;;;;-1:-1:-1;;;6767:63:0;;;;;;;;;;;;-1:-1:-1;;;6767:63:0;;;;;;;;;;;;;;;6885:4;6868:8;:23;;;;;;;;;;;6867:35;;6898:3;6867:35;:30;:35;:::i;:::-;6858:4;6841:8;:23;;;;;;;;;;:61;6928:12;;:22;;6946:3;6928:22;:17;:22;:::i;:::-;6913:12;:37;6966:40;;;;;;;;6998:1;;6983:4;;6966:40;;;;;;;;;6719:295;:::o

Swarm Source

bzzr://e4bc0b79265b34f3071fc12ee0e04d56963a3285dc6081942b73e464bfc1c8b0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.