ETH Price: $2,739.42 (-3.22%)

Token

Value Liquidity Provider (VLP)
 

Overview

Max Total Supply

1,314.255000844647974991 VLP

Holders

4

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Value Defi: WETH/SNTVT Pool 98/2
Balance
1,314.047384981691331975 VLP

Value
$0.00
0xc9608B8dcEE2006a5aB57b1CDe0b1aA2e40391B0
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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

Contract Name:
FaaSPoolLite

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-26
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// 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/>.
library BConst {
    uint public constant BONE                     = 10**18;

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

    uint public constant DEFAULT_FEE              = BONE * 3 / 1000; // 0.3%
    uint public constant MIN_FEE                  = BONE / 10**6;
    uint public constant MAX_FEE                  = BONE / 10;

    uint public constant DEFAULT_COLLECTED_FEE    = BONE / 2000; // 0.05%
    uint public constant MAX_COLLECTED_FEE        = BONE / 200; // 0.5%

    uint public constant DEFAULT_EXIT_FEE         = 0;
    uint public constant MAX_EXIT_FEE             = BONE / 1000; // 0.1%

    uint public constant MIN_WEIGHT               = BONE;
    uint public constant MAX_WEIGHT               = BONE * 50;
    uint public constant MAX_TOTAL_WEIGHT         = BONE * 50;
    uint public constant MIN_BALANCE              = BONE / 10**12;

    uint public constant DEFAULT_INIT_POOL_SUPPLY = BONE * 100;
    uint public constant MIN_INIT_POOL_SUPPLY     = BONE / 1000;
    uint public constant MAX_INIT_POOL_SUPPLY     = BONE * 10**18;

    uint public constant MIN_BPOW_BASE            = 1 wei;
    uint public constant MAX_BPOW_BASE            = (2 * BONE) - 1 wei;
    uint public constant BPOW_PRECISION           = BONE / 10**10;

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

// 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/>.
contract BNum {

    function btoi(uint a)
        internal pure 
        returns (uint)
    {
        return a / BConst.BONE;
    }

    function bfloor(uint a)
        internal pure
        returns (uint)
    {
        return btoi(a) * BConst.BONE;
    }

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

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

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

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

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

    // DSMath.wpow
    function bpowi(uint a, uint n)
        internal pure
        returns (uint)
    {
        uint z = n % 2 != 0 ? a : BConst.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(uint base, uint exp)
        internal pure
        returns (uint)
    {
        require(base >= BConst.MIN_BPOW_BASE, "base too low");
        require(base <= BConst.MAX_BPOW_BASE, "base too high");

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

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

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

        uint partialResult = bpowApprox(base, remain, BConst.BPOW_PRECISION);
        return bmul(wholePow, partialResult);
    }

    function bpowApprox(uint base, uint exp, uint precision)
        internal pure
        returns (uint)
    {
        // term 0:
        uint a     = exp;
        (uint x, bool xneg)  = bsubSign(base, BConst.BONE);
        uint term = BConst.BONE;
        uint 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 (uint i = 1; term >= precision; i++) {
            uint bigK = i * BConst.BONE;
            (uint c, bool cneg) = bsubSign(a, bsub(bigK, BConst.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;
    }

}

// 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/>.
// Highly opinionated token implementation
interface IERC20 {
    event Approval(address indexed src, address indexed dst, uint amt);
    event Transfer(address indexed src, address indexed dst, uint amt);

    function totalSupply() external view returns (uint);
    function balanceOf(address whom) external view returns (uint);
    function allowance(address src, address dst) external view returns (uint);

    function approve(address dst, uint amt) external returns (bool);
    function transfer(address dst, uint amt) external returns (bool);
    function transferFrom(
        address src, address dst, uint amt
    ) external returns (bool);
}

contract BTokenBase is BNum {

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

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

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

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

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

    function _push(address to, uint amt) internal {
        _move(address(this), to, amt);
    }

    function _pull(address from, uint amt) internal {
        _move(from, address(this), amt);
    }
}

contract BToken is BTokenBase, IERC20 {
    string  private _name     = "Value Liquidity Provider";
    string  private _symbol   = "VLP";
    uint8   private _decimals = 18;

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

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

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

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

    function balanceOf(address whom) public override view returns (uint) {
        return _balance[whom];
    }

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

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

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

    function decreaseApproval(address dst, uint amt) external returns (bool) {
        uint oldValue = _allowance[msg.sender][dst];
        if (amt > oldValue) {
            _allowance[msg.sender][dst] = 0;
        } else {
            _allowance[msg.sender][dst] = bsub(oldValue, amt);
        }
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

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

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

// 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/>.
contract BMathLite is BNum {
    /**********************************************************************************************
    // calcSpotPrice                                                                             //
    // sP = spotPrice                                                                            //
    // bI = tokenBalanceIn                ( bI / wI )         1                                  //
    // bO = tokenBalanceOut         sP =  -----------  *  ----------                             //
    // wI = tokenWeightIn                 ( bO / wO )     ( 1 - sF )                             //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee (+ collectedFee)                                                             //
    **********************************************************************************************/
    function calcSpotPrice(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint swapFee
    )
        public pure
        returns (uint spotPrice)
    {
        uint numer = bdiv(tokenBalanceIn, tokenWeightIn);
        uint denom = bdiv(tokenBalanceOut, tokenWeightOut);
        uint ratio = bdiv(numer, denom);
        uint scale = bdiv(BConst.BONE, bsub(BConst.BONE, swapFee));
        return  (spotPrice = bmul(ratio, 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 (+ collectedFee)                                                             //
    **********************************************************************************************/
    function calcOutGivenIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint tokenAmountIn,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountOut)
    {
        uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
        uint adjustedIn = bsub(BConst.BONE, swapFee);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint foo = bpow(y, weightRatio);
        uint bar = bsub(BConst.BONE, foo);
        tokenAmountOut = bmul(tokenBalanceOut, 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 (+ collectedFee)                                                             //
    **********************************************************************************************/
    function calcInGivenOut(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint tokenAmountOut,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountIn)
    {
        uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
        uint diff = bsub(tokenBalanceOut, tokenAmountOut);
        uint y = bdiv(tokenBalanceOut, diff);
        uint foo = bpow(y, weightRatio);
        foo = bsub(foo, BConst.BONE);
        tokenAmountIn = bsub(BConst.BONE, swapFee);
        tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), 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 (+ collectedFee)\                                              /              //
    **********************************************************************************************/
    function calcPoolOutGivenSingleIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountIn,
        uint swapFee
    )
        public pure
        returns (uint poolAmountOut)
    {
        // @dev 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);
        uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
        uint zaz = bmul(bsub(BConst.BONE, normalizedWeight), swapFee);
        uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BConst.BONE, zaz));

        uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee);
        uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn);

        // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
        uint poolRatio = bpow(tokenInRatio, normalizedWeight);
        uint newPoolSupply = bmul(poolRatio, poolSupply);
        poolAmountOut = bsub(newPoolSupply, 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 (+ collectedFee)   *  | 1 - |  1 - ---- | * sF  |                            //
    // eF = exitFee                        \     \      tW /       /                             //
    **********************************************************************************************/
    function calcSingleOutGivenPoolIn(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountIn,
        uint swapFee,
        uint exitFee
    )
        public pure
        returns (uint tokenAmountOut)
    {
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        // charge exit fee on the pool token side
        // pAiAfterExitFee = pAi*(1-exitFee)
        uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BConst.BONE, exitFee));
        uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);
     
        // newBalTo = poolRatio^(1/weightTo) * balTo;
        uint tokenOutRatio = bpow(poolRatio, bdiv(BConst.BONE, normalizedWeight));
        uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut);

        uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut);

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


}

interface IBFactory {
    function collectedToken() external view returns (address);
}

contract BPoolLite is BToken, BMathLite {
    struct Record {
        bool bound;   // is token bound to pool
        uint index;   // private
        uint denorm;  // denormalized weight
        uint balance;
    }

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

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

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

    event LOG_COLLECTED_FUND(
        address indexed collectedToken,
        uint256 collectedAmount
    );

    event LOG_FINALIZE(
        uint swapFee,
        uint initPoolSupply,
        uint version,
        address[] bindTokens,
        uint[] bindDenorms,
        uint[] balances
    );

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

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

    bool private _mutex;

    uint public version = 2001;
    address public factory;    // BFactory address to push token exitFee to
    address public controller; // has CONTROL role

    // `setSwapFee` and `finalize` require CONTROL
    // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
    uint public swapFee;
    uint public collectedFee; // 0.05% | https://yfv.finance/vip-vote/vip_5
    uint public exitFee;
    bool public finalized;

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

    constructor(address _factory) public {
        controller = _factory;
        factory = _factory;
        swapFee = BConst.DEFAULT_FEE;
        collectedFee = BConst.DEFAULT_COLLECTED_FEE;
        exitFee = BConst.DEFAULT_EXIT_FEE;
        finalized = false;
    }

    function setCollectedFee(uint _collectedFee) public {
        require(msg.sender == factory, "!fctr");
        require(_collectedFee <= BConst.MAX_COLLECTED_FEE, ">maxCoFee");
        require(bmul(_collectedFee, 2) <= swapFee, ">sFee/2");
        collectedFee = _collectedFee;
    }

    function setExitFee(uint _exitFee) public {
        require(!finalized, "fnl");
        require(msg.sender == factory, "!fctr");
        require(_exitFee <= BConst.MAX_EXIT_FEE, ">maxExitFee");
        exitFee = _exitFee;
    }

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

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

    function getCurrentTokens()
    external view _viewlock_
    returns (address[] memory tokens)
    {
        return _tokens;
    }

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

    function getDenormalizedWeight(address token)
    external view
    _viewlock_
    returns (uint)
    {

        require(_records[token].bound, "!bound");
        return _records[token].denorm;
    }

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

    function getNormalizedWeight(address token)
    external view
    _viewlock_
    returns (uint)
    {

        require(_records[token].bound, "!bound");
        uint denorm = _records[token].denorm;
        return bdiv(denorm, _totalWeight);
    }

    function getBalance(address token)
    external view
    _viewlock_
    returns (uint)
    {

        require(_records[token].bound, "!bound");
        return _records[token].balance;
    }

    function setController(address _controller)
    external
    _lock_
    {
        require(msg.sender == controller, "!cntler");
        controller = _controller;
    }

    function finalize(
        uint _swapFee,
        uint _initPoolSupply,
        address[] calldata _bindTokens,
        uint[] calldata _bindDenorms
    ) external _lock_ {
        require(msg.sender == controller, "!cntler");
        require(!finalized, "fnl");

        require(_swapFee >= BConst.MIN_FEE, "<minFee");
        require(_swapFee <= BConst.MAX_FEE, ">maxFee");
        require(bmul(collectedFee, 2) <= _swapFee, "<Fee*2");
        swapFee = _swapFee;

        require(_initPoolSupply >= BConst.MIN_INIT_POOL_SUPPLY, "<minInitPSup");
        require(_initPoolSupply <= BConst.MAX_INIT_POOL_SUPPLY, ">maxInitPSup");

        require(_bindTokens.length >= BConst.MIN_BOUND_TOKENS, "<minTokens");
        require(_bindTokens.length < BConst.MAX_BOUND_TOKENS, ">maxTokens");
        require(_bindTokens.length == _bindDenorms.length, "erLengMism");

        uint totalWeight = 0;
        uint256[] memory balances = new uint[](_bindTokens.length);
        for (uint i = 0; i < _bindTokens.length; i++) {
            address token = _bindTokens[i];
            uint denorm = _bindDenorms[i];
            uint balance = BToken(token).balanceOf(address(this));
            balances[i] = balance;
            require(!_records[token].bound, "bound");
            require(denorm >= BConst.MIN_WEIGHT, "<minWeight");
            require(denorm <= BConst.MAX_WEIGHT, ">maxWeight");
            require(balance >= BConst.MIN_BALANCE, "<minBal");
            _records[token] = Record({
                bound : true,
                index : i,
                denorm : denorm,
                balance : balance
                });
            totalWeight = badd(totalWeight, denorm);
        }
        require(totalWeight <= BConst.MAX_TOTAL_WEIGHT, ">maxTWeight");
        _totalWeight = totalWeight;
        _tokens = _bindTokens;
        finalized = true;
        _mintPoolShare(_initPoolSupply);
        _pushPoolShare(msg.sender, _initPoolSupply);
        emit LOG_FINALIZE(swapFee, _initPoolSupply, version, _bindTokens, _bindDenorms, balances);
    }

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

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

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

    function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn)
    external virtual
    _lock_
    {
        require(finalized, "!fnl");

        uint poolTotal = totalSupply();
        uint ratio = bdiv(poolAmountOut, poolTotal);
        require(ratio != 0, "erMApr");

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

    function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut)
    external virtual
    _lock_
    {
        require(finalized, "!fnl");

        uint poolTotal = totalSupply();
        uint _exitFee = bmul(poolAmountIn, exitFee);
        uint pAiAfterExitFee = bsub(poolAmountIn, _exitFee);
        uint ratio = bdiv(pAiAfterExitFee, poolTotal);
        require(ratio != 0, "erMApr");

        _pullPoolShare(msg.sender, poolAmountIn);
        if (_exitFee > 0) {
            _pushPoolShare(factory, _exitFee);
        }
        _burnPoolShare(pAiAfterExitFee);

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

    function swapExactAmountIn(
        address tokenIn,
        uint tokenAmountIn,
        address tokenOut,
        uint minAmountOut,
        uint maxPrice
    )
    external
    _lock_
    returns (uint tokenAmountOut, uint spotPriceAfter)
    {

        require(_records[tokenIn].bound, "!bound");
        require(_records[tokenOut].bound, "!bound");

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

        require(tokenAmountIn <= bmul(inRecord.balance, BConst.MAX_IN_RATIO), ">maxIRat");

        uint spotPriceBefore = calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            swapFee
        );
        require(spotPriceBefore <= maxPrice, "badLimPrice");

        tokenAmountOut = calcOutGivenIn(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            tokenAmountIn,
            swapFee
        );
        require(tokenAmountOut >= minAmountOut, "<limO");

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

        spotPriceAfter = calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            swapFee
        );
        require(spotPriceAfter >= spotPriceBefore, "erMApr");
        require(spotPriceAfter <= maxPrice, ">limPrice");
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "erMApr");

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

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        uint _subTokenAmountIn;
        (_subTokenAmountIn, tokenAmountOut) = _pushCollectedFundGivenOut(tokenIn, tokenAmountIn, tokenOut, tokenAmountOut);
        if (_subTokenAmountIn > 0) inRecord.balance = bsub(inRecord.balance, _subTokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return (tokenAmountOut, spotPriceAfter);
    }

    function swapExactAmountOut(
        address tokenIn,
        uint maxAmountIn,
        address tokenOut,
        uint tokenAmountOut,
        uint maxPrice
    )
    external
    _lock_
    returns (uint tokenAmountIn, uint spotPriceAfter)
    {
        require(_records[tokenIn].bound, "!bound");
        require(_records[tokenOut].bound, "!bound");

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

        require(tokenAmountOut <= bmul(outRecord.balance, BConst.MAX_OUT_RATIO), ">maxORat");

        uint spotPriceBefore = calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            swapFee
        );
        require(spotPriceBefore <= maxPrice, "badLimPrice");

        tokenAmountIn = calcInGivenOut(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            tokenAmountOut,
            swapFee
        );
        require(tokenAmountIn <= maxAmountIn, "<limIn");

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

        spotPriceAfter = calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            swapFee
        );
        require(spotPriceAfter >= spotPriceBefore, "erMApr");
        require(spotPriceAfter <= maxPrice, ">limPrice");
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "erMApr");

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

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
        uint _collectedFeeAmount = _pushCollectedFundGivenIn(tokenIn, tokenAmountIn);
        if (_collectedFeeAmount > 0) inRecord.balance = bsub(inRecord.balance, _collectedFeeAmount);

        return (tokenAmountIn, spotPriceAfter);
    }

    function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut)
    external
    _lock_
    returns (uint poolAmountOut)

    {
        require(finalized, "!fnl");
        require(_records[tokenIn].bound, "!bound");
        require(tokenAmountIn <= bmul(_records[tokenIn].balance, BConst.MAX_IN_RATIO), ">maxIRat");

        Record storage inRecord = _records[tokenIn];

        poolAmountOut = calcPoolOutGivenSingleIn(
            inRecord.balance,
            inRecord.denorm,
            _totalSupply,
            _totalWeight,
            tokenAmountIn,
            swapFee
        );

        require(poolAmountOut >= minPoolAmountOut, "<limO");

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

        emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);

        _mintPoolShare(poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        uint _subTokenAmountIn;
        (_subTokenAmountIn, poolAmountOut) = _pushCollectedFundGivenOut(tokenIn, tokenAmountIn, address(this), poolAmountOut);
        if (_subTokenAmountIn > 0) inRecord.balance = bsub(inRecord.balance, _subTokenAmountIn);
        _pushPoolShare(msg.sender, poolAmountOut);

        return poolAmountOut;
    }

    function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut)
    external
    _lock_
    returns (uint tokenAmountOut)
    {
        require(finalized, "!fnl");
        require(_records[tokenOut].bound, "!bound");

        Record storage outRecord = _records[tokenOut];

        tokenAmountOut = calcSingleOutGivenPoolIn(
            outRecord.balance,
            outRecord.denorm,
            _totalSupply,
            _totalWeight,
            poolAmountIn,
            swapFee,
            exitFee
        );

        require(tokenAmountOut >= minAmountOut, "<limO");

        require(tokenAmountOut <= bmul(_records[tokenOut].balance, BConst.MAX_OUT_RATIO), ">maxORat");

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

        uint _exitFee = bmul(poolAmountIn, exitFee);

        emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(bsub(poolAmountIn, _exitFee));
        if (_exitFee > 0) {
            _pushPoolShare(factory, _exitFee);
        }
        (, tokenAmountOut) = _pushCollectedFundGivenOut(address(this), poolAmountIn, tokenOut, tokenAmountOut);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return tokenAmountOut;
    }

    // ==
    // '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, uint 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))), '!_pullU');
    }

    function _pushUnderlying(address erc20, address to, uint 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))), '!_pushU');
    }

    function _pullPoolShare(address from, uint amount)
    internal
    {
        _pull(from, amount);
    }

    function _pushPoolShare(address to, uint amount)
    internal
    {
        _push(to, amount);
    }

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

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

    function _pushCollectedFundGivenOut(address _tokenIn, uint _tokenAmountIn, address _tokenOut, uint _tokenAmountOut) internal returns (uint subTokenAmountIn, uint tokenAmountOut) {
        subTokenAmountIn = 0;
        tokenAmountOut = _tokenAmountOut;
        if (collectedFee > 0) {
            address _collectedToken = IBFactory(factory).collectedToken();
            if (_collectedToken == _tokenIn) {
                subTokenAmountIn = bdiv(bmul(_tokenAmountIn, collectedFee), BConst.BONE);
                _pushUnderlying(_tokenIn, factory, subTokenAmountIn);
                emit LOG_COLLECTED_FUND(_tokenIn, subTokenAmountIn);
            } else {
                uint _collectedFeeAmount = bdiv(bmul(_tokenAmountOut, collectedFee), BConst.BONE);
                _pushUnderlying(_tokenOut, factory, _collectedFeeAmount);
                tokenAmountOut = bsub(_tokenAmountOut, _collectedFeeAmount);
                emit LOG_COLLECTED_FUND(_tokenOut, _collectedFeeAmount);
            }
        }
    }

    // always push out _tokenIn (already have)
    function _pushCollectedFundGivenIn(address _tokenIn, uint _tokenAmountIn) internal returns (uint collectedFeeAmount) {
        collectedFeeAmount = 0;
        if (collectedFee > 0) {
            address _collectedToken = IBFactory(factory).collectedToken();
            if (_collectedToken != address(0)) {
                collectedFeeAmount = bdiv(bmul(_tokenAmountIn, collectedFee), BConst.BONE);
                _pushUnderlying(_tokenIn, factory, collectedFeeAmount);
                emit LOG_COLLECTED_FUND(_tokenIn, collectedFeeAmount);
            }
        }
    }
}

interface IFaaSPool {
    function stake(uint) external;
    function withdraw(uint) external;
    function getReward(uint8 _pid, address _account) external;
    function getAllRewards(address _account) external;
    function pendingReward(uint8 _pid, address _account) external view returns (uint);
    function emergencyWithdraw() external;
}

interface IFaaSRewardFund {
    function balance(IERC20 _token) external view returns (uint);
    function safeTransfer(IERC20 _token, address _to, uint _value) external;
}

// This implements BPool contract, and allows for generalized staking, yield farming, and token distribution.
contract FaaSPoolLite is BPoolLite, IFaaSPool {
    using SafeMath for uint;

    // Info of each user.
    struct UserInfo {
        uint amount;
        mapping(uint8 => uint) rewardDebt;
        mapping(uint8 => uint) accumulatedEarned; // will accumulate every time user harvest
        mapping(uint8 => uint) lockReward;
        mapping(uint8 => uint) lockRewardReleased;
        uint lastStakeTime;
    }

    // Info of each rewardPool funding.
    struct RewardPoolInfo {
        IERC20 rewardToken;     // Address of rewardPool token contract.
        uint lastRewardBlock;   // Last block number that rewardPool distribution occurs.
        uint endRewardBlock;    // Block number which rewardPool distribution ends.
        uint rewardPerBlock;    // Reward token amount to distribute per block.
        uint accRewardPerShare; // Accumulated rewardPool per share, times 1e18.

        uint lockRewardPercent; // Lock reward percent - 0 to disable lock & vesting
        uint startVestingBlock; // Block number which vesting starts.
        uint endVestingBlock;   // Block number which vesting ends.
        uint numOfVestingBlocks;

        uint totalPaidRewards;
    }

    mapping(address => UserInfo) private userInfo;
    RewardPoolInfo[] public rewardPoolInfo;

    IFaaSRewardFund public rewardFund;
    address public exchangeProxy;
    uint public unstakingFrozenTime = 3 days;

    event Deposit(address indexed account, uint256 amount);
    event Withdraw(address indexed account, uint256 amount);
    event RewardPaid(uint8 pid, address indexed account, uint256 amount);

    constructor(address _factory) public BPoolLite(_factory) {
    }

    modifier onlyController() {
        require(msg.sender == controller, "!cntler");
        _;
    }

    function setRewardFund(IFaaSRewardFund _rewardFund) public onlyController {
        rewardFund = _rewardFund;
    }

    function setExchangeProxy(address _exchangeProxy) public onlyController {
        exchangeProxy = _exchangeProxy;
    }

    function setUnstakingFrozenTime(uint _unstakingFrozenTime) public onlyController {
        assert(unstakingFrozenTime <= 30 days); // do not lock fund for too long, please!
        unstakingFrozenTime = _unstakingFrozenTime;
    }

    function addRewardPool(IERC20 _rewardToken, uint256 _startBlock, uint256 _endRewardBlock, uint256 _rewardPerBlock,
        uint256 _lockRewardPercent, uint256 _startVestingBlock, uint256 _endVestingBlock) public onlyController {
        require(rewardPoolInfo.length < 8, "exceed rwdPoolLim");
        require(_startVestingBlock <= _endVestingBlock, "sVB>eVB");
        _startBlock = (block.number > _startBlock) ? block.number : _startBlock;
        require(_startBlock < _endRewardBlock, "sB>=eB");
        updateReward();
        rewardPoolInfo.push(RewardPoolInfo({
            rewardToken : _rewardToken,
            lastRewardBlock : _startBlock,
            endRewardBlock : _endRewardBlock,
            rewardPerBlock : _rewardPerBlock,
            accRewardPerShare : 0,
            lockRewardPercent : _lockRewardPercent,
            startVestingBlock : _startVestingBlock,
            endVestingBlock : _endVestingBlock,
            numOfVestingBlocks: _endVestingBlock - _startVestingBlock,
            totalPaidRewards: 0
            }));
    }

    function updateRewardPool(uint8 _pid, uint256 _endRewardBlock, uint256 _rewardPerBlock) public onlyController {
        updateReward(_pid);
        RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid];
        require(block.number <= rewardPool.endRewardBlock, "late");
        rewardPool.endRewardBlock = _endRewardBlock;
        rewardPool.rewardPerBlock = _rewardPerBlock;
    }

    function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn) external override {
        joinPoolFor(msg.sender, poolAmountOut, maxAmountsIn);
    }

    function joinPoolFor(address account, uint poolAmountOut, uint[] calldata maxAmountsIn) public _lock_ {
        require(msg.sender == account || msg.sender == exchangeProxy, "!(prx||own)");
        _joinPool(account, poolAmountOut, maxAmountsIn);
        _stakePoolShare(account, poolAmountOut);
    }

    function joinPoolNotStake(uint poolAmountOut, uint[] calldata maxAmountsIn) external _lock_ {
        _joinPool(msg.sender, poolAmountOut, maxAmountsIn);
        _pushPoolShare(msg.sender, poolAmountOut);
    }

    function _joinPool(address account, uint poolAmountOut, uint[] calldata maxAmountsIn) internal {
        require(finalized, "!fnl");

        uint rewardTotal = totalSupply();
        uint ratio = bdiv(poolAmountOut, rewardTotal);
        require(ratio != 0, "erMApr");

        for (uint i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint bal = _records[t].balance;
            uint tokenAmountIn = bmul(ratio, bal);
            require(tokenAmountIn != 0 && tokenAmountIn <= maxAmountsIn[i], "erMApr||<limIn");
            _records[t].balance = badd(_records[t].balance, tokenAmountIn);
            emit LOG_JOIN(account, t, tokenAmountIn);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
        }
        _mintPoolShare(poolAmountOut);
    }

    function stake(uint _shares) external override {
        uint _before = balanceOf(address(this));
        _pullPoolShare(msg.sender, _shares);
        uint _after = balanceOf(address(this));
        _shares = bsub(_after, _before); // Additional check for deflationary tokens
        _stakePoolShare(msg.sender, _shares);
    }

    function _stakePoolShare(address _account, uint _shares) internal {
        UserInfo storage user = userInfo[_account];
        getAllRewards(_account);
        user.amount = user.amount.add(_shares);
        uint8 rewardPoolLength = uint8(rewardPoolInfo.length);
        for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) {
            user.rewardDebt[_pid] = user.amount.mul(rewardPoolInfo[_pid].accRewardPerShare).div(1e18);
        }
        user.lastStakeTime = block.timestamp;
        emit Deposit(_account, _shares);
    }

    function unfrozenStakeTime(address _account) public view returns (uint) {
        return userInfo[_account].lastStakeTime + unstakingFrozenTime;
    }

    function withdraw(uint _amount) public override {
        UserInfo storage user = userInfo[msg.sender];
        require(user.amount >= _amount, "am>us.am");
        require(block.timestamp >= user.lastStakeTime.add(unstakingFrozenTime), "frozen");
        getAllRewards(msg.sender);
        user.amount = bsub(user.amount, _amount);
        uint8 rewardPoolLength = uint8(rewardPoolInfo.length);
        for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) {
            user.rewardDebt[_pid] = user.amount.mul(rewardPoolInfo[_pid].accRewardPerShare).div(1e18);
        }
        _pushPoolShare(msg.sender, _amount);
        emit Withdraw(msg.sender, _amount);
    }

    // using PUSH pattern for using by Proxy if needed
    function getAllRewards(address _account) public override {
        uint8 rewardPoolLength = uint8(rewardPoolInfo.length);
        for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) {
            getReward(_pid, _account);
        }
    }

    function getReward(uint8 _pid, address _account) public override {
        updateReward(_pid);
        UserInfo storage user = userInfo[_account];
        RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid];
        uint _pendingReward = user.amount.mul(rewardPool.accRewardPerShare).div(1e18).sub(user.rewardDebt[_pid]);
        uint _lockRewardPercent = rewardPool.lockRewardPercent;
        if (_lockRewardPercent > 0) {
            if (block.number > rewardPool.endVestingBlock) {
                uint _unlockReward = user.lockReward[_pid].sub(user.lockRewardReleased[_pid]);
                if (_unlockReward > 0) {
                    _pendingReward = _pendingReward.add(_unlockReward);
                    user.lockRewardReleased[_pid] = user.lockRewardReleased[_pid].add(_unlockReward);
                }
            } else {
                if (_pendingReward > 0) {
                    uint _toLocked = _pendingReward.mul(_lockRewardPercent).div(100);
                    _pendingReward = _pendingReward.sub(_toLocked);
                    user.lockReward[_pid] = user.lockReward[_pid].add(_toLocked);
                }
                if (block.number > rewardPool.startVestingBlock) {
                    uint _toReleased = user.lockReward[_pid].mul(block.number.sub(rewardPool.startVestingBlock)).div(rewardPool.numOfVestingBlocks);
                    uint _lockRewardReleased = user.lockRewardReleased[_pid];
                    if (_toReleased > _lockRewardReleased) {
                        uint _unlockReward = _toReleased.sub(_lockRewardReleased);
                        user.lockRewardReleased[_pid] = _lockRewardReleased.add(_unlockReward);
                        _pendingReward = _pendingReward.add(_unlockReward);
                    }
                }
            }
        }
        if (_pendingReward > 0) {
            user.accumulatedEarned[_pid] = user.accumulatedEarned[_pid].add(_pendingReward);
            rewardPool.totalPaidRewards = rewardPool.totalPaidRewards.add(_pendingReward);
            rewardFund.safeTransfer(rewardPool.rewardToken, _account, _pendingReward);
            emit RewardPaid(_pid, _account, _pendingReward);
            user.rewardDebt[_pid] = user.amount.mul(rewardPoolInfo[_pid].accRewardPerShare).div(1e18);
        }
    }

    function pendingReward(uint8 _pid, address _account) public override view returns (uint _pending) {
        UserInfo storage user = userInfo[_account];
        RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid];
        uint _accRewardPerShare = rewardPool.accRewardPerShare;
        uint lpSupply = balanceOf(address(this));
        uint _endRewardBlockApplicable = block.number > rewardPool.endRewardBlock ? rewardPool.endRewardBlock : block.number;
        if (_endRewardBlockApplicable > rewardPool.lastRewardBlock && lpSupply != 0) {
            uint _numBlocks = _endRewardBlockApplicable.sub(rewardPool.lastRewardBlock);
            uint _incRewardPerShare = _numBlocks.mul(rewardPool.rewardPerBlock).mul(1e18).div(lpSupply);
            _accRewardPerShare = _accRewardPerShare.add(_incRewardPerShare);
        }
        _pending = user.amount.mul(_accRewardPerShare).div(1e18).sub(user.rewardDebt[_pid]);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw() external override {
        UserInfo storage user = userInfo[msg.sender];
        uint _amount = user.amount;
        _pushPoolShare(msg.sender, _amount);
        user.amount = 0;
        uint8 rewardPoolLength = uint8(rewardPoolInfo.length);
        for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) {
            user.rewardDebt[_pid] = 0;
        }
        emit Withdraw(msg.sender, _amount);
    }

    function getUserInfo(uint8 _pid, address _account) public view returns (uint amount, uint rewardDebt, uint accumulatedEarned, uint lockReward, uint lockRewardReleased) {
        UserInfo storage user = userInfo[_account];
        amount = user.amount;
        rewardDebt = user.rewardDebt[_pid];
        accumulatedEarned = user.accumulatedEarned[_pid];
        lockReward = user.lockReward[_pid];
        lockRewardReleased = user.lockRewardReleased[_pid];
    }

    function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external override _lock_ {
        require(finalized, "!fnl");

        uint rewardTotal = totalSupply();
        uint _exitFee = bmul(poolAmountIn, exitFee);
        uint pAiAfterExitFee = bsub(poolAmountIn, _exitFee);
        uint ratio = bdiv(pAiAfterExitFee, rewardTotal);
        require(ratio != 0, "erMApr");

        uint _externalShares = balanceOf(msg.sender);
        if (_externalShares < poolAmountIn) {
            uint _withdrawShares = bsub(poolAmountIn, _externalShares);
            uint _stakedShares = userInfo[msg.sender].amount;
            require(_stakedShares >= _withdrawShares, "stk<wdr");
            withdraw(_withdrawShares);
        }

        _pullPoolShare(msg.sender, poolAmountIn);
        if (_exitFee > 0) {
            _pushPoolShare(factory, _exitFee);
        }
        _burnPoolShare(pAiAfterExitFee);

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

    function updateReward() public {
        uint8 rewardPoolLength = uint8(rewardPoolInfo.length);
        for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) {
            updateReward(_pid);
        }
    }

    function updateReward(uint8 _pid) public {
        RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid];
        uint _endRewardBlockApplicable = block.number > rewardPool.endRewardBlock ? rewardPool.endRewardBlock : block.number;
        if (_endRewardBlockApplicable > rewardPool.lastRewardBlock) {
            uint lpSupply = balanceOf(address(this));
            if (lpSupply > 0) {
                uint _numBlocks = _endRewardBlockApplicable.sub(rewardPool.lastRewardBlock);
                uint _incRewardPerShare = _numBlocks.mul(rewardPool.rewardPerBlock).mul(1e18).div(lpSupply);
                rewardPool.accRewardPerShare = rewardPool.accRewardPerShare.add(_incRewardPerShare);
            }
            rewardPool.lastRewardBlock = _endRewardBlockApplicable;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collectedToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"collectedAmount","type":"uint256"}],"name":"LOG_COLLECTED_FUND","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":"swapFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"initPoolSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"bindTokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bindDenorms","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"name":"LOG_FINALIZE","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":"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":false,"internalType":"uint8","name":"pid","type":"uint8"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPaid","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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_lockRewardPercent","type":"uint256"},{"internalType":"uint256","name":"_startVestingBlock","type":"uint256"},{"internalType":"uint256","name":"_endVestingBlock","type":"uint256"}],"name":"addRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"tokenAmountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"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":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"exitFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"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":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"collectedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exchangeProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"},{"internalType":"uint256","name":"_initPoolSupply","type":"uint256"},{"internalType":"address[]","name":"_bindTokens","type":"address[]"},{"internalType":"uint256[]","name":"_bindDenorms","type":"uint256[]"}],"name":"finalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"accumulatedEarned","type":"uint256"},{"internalType":"uint256","name":"lockReward","type":"uint256"},{"internalType":"uint256","name":"lockRewardReleased","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPoolFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPoolNotStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"_pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardFund","outputs":[{"internalType":"contract IFaaSRewardFund","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPoolInfo","outputs":[{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"lockRewardPercent","type":"uint256"},{"internalType":"uint256","name":"startVestingBlock","type":"uint256"},{"internalType":"uint256","name":"endVestingBlock","type":"uint256"},{"internalType":"uint256","name":"numOfVestingBlocks","type":"uint256"},{"internalType":"uint256","name":"totalPaidRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectedFee","type":"uint256"}],"name":"setCollectedFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_exchangeProxy","type":"address"}],"name":"setExchangeProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_exitFee","type":"uint256"}],"name":"setExitFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IFaaSRewardFund","name":"_rewardFund","type":"address"}],"name":"setRewardFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unstakingFrozenTime","type":"uint256"}],"name":"setUnstakingFrozenTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"unfrozenStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unstakingFrozenTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"}],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052601860808190527f56616c7565204c69717569646974792050726f7669646572000000000000000060a090815262000040916003919062000112565b50604080518082019091526003808252620564c560ec1b60209092019182526200006d9160049162000112565b506005805460ff191660121790556107d16006556203f4806014553480156200009557600080fd5b5060405162005d2038038062005d2083398181016040526020811015620000bb57600080fd5b5051600880546001600160a01b039092166001600160a01b0319928316811790915560078054909216179055660aa87bee5380006009556601c6bf52634000600a556000600b55600c805460ff19169055620001ae565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200015557805160ff191683800117855562000185565b8280016001018555821562000185579182015b828111156200018557825182559160200191906001019062000168565b506200019392915062000197565b5090565b5b8082111562000193576000815560010162000198565b615b6280620001be6000396000f3fe608060405234801561001057600080fd5b50600436106103db5760003560e01c80638656b6531161020a578063c45a015511610125578063e653bf3a116100b8578063f36c0a7211610087578063f36c0a7214610ef1578063f77c479114610ef9578063f863b96114610f01578063f8b2cb4f14610f76578063f8d6aed414610f9c576103db565b8063e653bf3a14610e95578063e811f50a14610ebb578063efe2226614610ec3578063f1b8a9b714610ecb576103db565b8063d73dd623116100f4578063d73dd62314610e16578063db2e21bc14610e42578063dd62ed3e14610e4a578063e5a583a914610e78576103db565b8063c45a015514610dda578063c7c30be114610dfe578063cc77828d14610e06578063cd2ed8fb14610e0e576103db565b8063a221ee491161019d578063b3f05b971161016c578063b3f05b9714610d10578063ba9530a614610d18578063be3bbd2e14610d53578063be61533514610dab576103db565b8063a221ee4914610c1d578063a694fc3a14610c52578063a9059cbb14610c6f578063b02f0b7314610c9b576103db565b8063936c3477116101d9578063936c347714610bca578063948d8ce614610bd257806395d89b4114610bf85780639da9532614610c00576103db565b80638656b65314610b1d578063884f6f7f14610b585780638c28cbe814610b7e57806392eefe9b14610ba4576103db565b806354cf2aeb116102fa5780636d3c6d921161028d57806379104ea61161025c57806379104ea614610a235780637c5e9ea414610a645780638201aa3f14610abd57806385cc179e14610afd576103db565b80636d3c6d921461092b57806370a082311461095a57806372aa0a601461098057806376d743fe146109f7576103db565b80636284ae41116102c95780636284ae41146107e3578063650e872c146107eb57806366188463146108b55780636d142e5b146108e1576103db565b806354cf2aeb1461077b57806354fd4d50146107835780635db342771461078b57806360d47088146107bd576103db565b80632e1a7d4d11610372578063429b4ae611610341578063429b4ae61461063457806346ab38f1146106515780634d950c74146106835780634f69c0d414610706576103db565b80632e1a7d4d146105ab5780632f37b624146105ca578063313ce567146105f0578063362a3fad1461060e576103db565b806317837baa116103ae57806317837baa1461050b57806318160ddd1461051357806323b872dd1461051b57806329d7958814610551576103db565b806306fdde03146103e0578063095ea7b31461045d5780631446a7ff1461049d57806315e84af9146104dd575b600080fd5b6103e8610fd7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042257818101518382015260200161040a565b50505050905090810190601f16801561044f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104896004803603604081101561047357600080fd5b506001600160a01b03813516906020013561106d565b604080519115158252519081900360200190f35b6104cb600480360360408110156104b357600080fd5b506001600160a01b03813581169160200135166110c2565b60408051918252519081900360200190f35b6104cb600480360360408110156104f357600080fd5b506001600160a01b0381358116916020013516611205565b6104cb61133f565b6104cb611345565b6104896004803603606081101561053157600080fd5b506001600160a01b0381358116916020810135909116906040013561134b565b6105806004803603604081101561056757600080fd5b50803560ff1690602001356001600160a01b0316611498565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6105c8600480360360208110156105c157600080fd5b50356114f0565b005b610489600480360360208110156105e057600080fd5b50356001600160a01b0316611660565b6105f861167e565b6040805160ff9092168252519081900360200190f35b6105c86004803603602081101561062457600080fd5b50356001600160a01b0316611687565b6105c86004803603602081101561064a57600080fd5b50356116b2565b6104cb6004803603606081101561066757600080fd5b506001600160a01b038135169060208101359060400135611791565b6105c86004803603606081101561069957600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156106c857600080fd5b8201836020820111156106da57600080fd5b803590602001918460208302840111600160201b831117156106fb57600080fd5b509092509050611a3f565b6105c86004803603604081101561071c57600080fd5b81359190810190604081016020820135600160201b81111561073d57600080fd5b82018360208201111561074f57600080fd5b803590602001918460208302840111600160201b8311171561077057600080fd5b509092509050611b1c565b6104cb611b28565b6104cb611b2e565b6104cb600480360360608110156107a157600080fd5b506001600160a01b038135169060208101359060400135611b34565b6104cb600480360360208110156107d357600080fd5b50356001600160a01b0316611daa565b6104cb611dcf565b6105c86004803603608081101561080157600080fd5b813591602081013591810190606081016040820135600160201b81111561082757600080fd5b82018360208201111561083957600080fd5b803590602001918460208302840111600160201b8311171561085a57600080fd5b919390929091602081019035600160201b81111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460208302840111600160201b831117156108aa57600080fd5b509092509050611dd5565b610489600480360360408110156108cb57600080fd5b506001600160a01b03813516906020013561254a565b6105c8600480360360e08110156108f757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a08101359060c00135612622565b6105c86004803603604081101561094157600080fd5b50803560ff1690602001356001600160a01b031661294c565b6104cb6004803603602081101561097057600080fd5b50356001600160a01b0316612cd1565b61099d6004803603602081101561099657600080fd5b5035612cec565b604080516001600160a01b03909b168b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b6105c860048036036060811015610a0d57600080fd5b5060ff8135169060208101359060400135612d57565b6104cb600480360360e0811015610a3957600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612e1e565b610aa4600480360360a0811015610a7a57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612eed565b6040805192835260208301919091528051918290030190f35b610aa4600480360360a0811015610ad357600080fd5b506001600160a01b03813581169160208101359160408201351690606081013590608001356132f7565b6105c860048036036020811015610b1357600080fd5b503560ff166136ea565b6104cb600480360360c0811015610b3357600080fd5b5080359060208101359060408101359060608101359060808101359060a001356137b5565b6105c860048036036020811015610b6e57600080fd5b50356001600160a01b0316613851565b6105c860048036036020811015610b9457600080fd5b50356001600160a01b03166138bc565b6105c860048036036020811015610bba57600080fd5b50356001600160a01b0316613a04565b6104cb613ad2565b6104cb60048036036020811015610be857600080fd5b50356001600160a01b0316613b23565b6103e8613be2565b6105c860048036036020811015610c1657600080fd5b5035613c43565b6104cb600480360360a0811015610c3357600080fd5b5080359060208101359060408101359060608101359060800135613ca0565b6105c860048036036020811015610c6857600080fd5b5035613d0a565b61048960048036036040811015610c8557600080fd5b506001600160a01b038135169060200135613d44565b6105c860048036036040811015610cb157600080fd5b81359190810190604081016020820135600160201b811115610cd257600080fd5b820183602082011115610ce457600080fd5b803590602001918460208302840111600160201b83111715610d0557600080fd5b509092509050613d5a565b610489614098565b6104cb600480360360c0811015610d2e57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356140a1565b610d5b614122565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d97578181015183820152602001610d7f565b505050509050019250505060405180910390f35b6104cb60048036036040811015610dc157600080fd5b50803560ff1690602001356001600160a01b031661420b565b610de2614324565b604080516001600160a01b039092168252519081900360200190f35b610de2614333565b610d5b614342565b6104cb61438c565b61048960048036036040811015610e2c57600080fd5b506001600160a01b038135169060200135614392565b6105c8614413565b6104cb60048036036040811015610e6057600080fd5b506001600160a01b03813581169160200135166144a3565b6105c860048036036020811015610e8e57600080fd5b50356144ce565b6105c860048036036020811015610eab57600080fd5b50356001600160a01b03166145a2565b6104cb61460d565b610de2614613565b6104cb60048036036020811015610ee157600080fd5b50356001600160a01b0316614622565b6105c86146f3565b610de261471c565b6105c860048036036040811015610f1757600080fd5b81359190810190604081016020820135600160201b811115610f3857600080fd5b820183602082011115610f4a57600080fd5b803590602001918460208302840111600160201b83111715610f6b57600080fd5b50909250905061472b565b6104cb60048036036020811015610f8c57600080fd5b50356001600160a01b03166147a7565b6104cb600480360360c0811015610fb257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614866565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110635780601f1061103857610100808354040283529160200191611063565b820191906000526020600020905b81548152906001019060200180831161104657829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020615b0d833981519152928290030190a35060015b92915050565b600554600090610100900460ff161561110c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff16611162576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166111b8576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e602052604080822092851682528120600380840154600280860154928401549084015493946111fc9492939290613ca0565b95945050505050565b600554600090610100900460ff161561124f576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff166112a5576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166112fb576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e60205260408082209285168252902060038083015460028085015492840154908401546009546111fc94929190613ca0565b60145481565b60025490565b6000336001600160a01b038516148061138757506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6113c3576040805162461bcd60e51b815260206004820152600860248201526710b9b832b73232b960c11b604482015290519081900360640190fd5b6113ce8484846148e9565b336001600160a01b0385161480159061140c57506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b1561148e576001600160a01b038416600090815260016020908152604080832033845290915290205461143f90836149eb565b6001600160a01b0385811660009081526001602090815260408083203380855290835292819020859055805194855251928716939192600080516020615b0d8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152601060209081526040808320805460ff9095168452600181018352818420546002820184528285205460038301855283862054600490930190945291909320549394909391929190565b3360009081526010602052604090208054821115611540576040805162461bcd60e51b8152602060048201526008602482015267616d3e75732e616d60c01b604482015290519081900360640190fd5b601454600582015461155191614a49565b42101561158e576040805162461bcd60e51b8152602060048201526006602482015265333937bd32b760d11b604482015290519081900360640190fd5b61159733611687565b80546115a390836149eb565b815560115460005b8160ff168160ff16101561161a576115fa670de0b6b3a76400006115f460118460ff16815481106115d857fe5b600091825260209091206004600a909202010154865490614aa3565b90614afc565b60ff821660009081526001808601602052604090912091909155016115ab565b506116253384614b3e565b60408051848152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03166000908152600e602052604090205460ff1690565b60055460ff1690565b60115460005b8160ff168160ff1610156116ad576116a5818461294c565b60010161168d565b505050565b6007546001600160a01b031633146116f9576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b6611c37937e08000811115611741576040805162461bcd60e51b81526020600482015260096024820152683e6d6178436f46656560b81b604482015290519081900360640190fd5b60095461174f826002614b48565b111561178c576040805162461bcd60e51b81526020600482015260076024820152661f39a332b2979960c91b604482015290519081900360640190fd5b600a55565b600554600090610100900460ff16156117db576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff1661182a576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff16611880576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954600b546118bd95949392918a91612e1e565b9150828210156118fc576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e6020526040902060039081015461193191670de0b6b3a76400005b04600101614b48565b821115611970576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b61197e8160030154836149eb565b8160030181905550600061199485600b54614b48565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36119e23386614c09565b6119f46119ef86836149eb565b614c13565b8015611a1057600754611a10906001600160a01b031682614b3e565b611a1c30868886614c1f565b9350611a2b9050863385614db3565b50506005805461ff00191690559392505050565b600554610100900460ff1615611a86576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055336001600160a01b0385161480611ab657506013546001600160a01b031633145b611af5576040805162461bcd60e51b815260206004820152600b60248201526a21287072787c7c6f776e2960a81b604482015290519081900360640190fd5b611b0184848484614f07565b611b0b84846150f2565b50506005805461ff00191690555050565b6116ad33848484611a3f565b60095481565b60065481565b600554600090610100900460ff1615611b7e576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16611bcd576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff16611c23576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060030154611c55906002670de0b6b3a76400005b04614b48565b831115611c94576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954611cce949392919089906137b5565b915082821015611d0d576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b611d1b8160030154856151c0565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3611d6982615209565b611d74853386615212565b6000611d8286863086614c1f565b935090508015611da057611d9a8260030154826149eb565b60038301555b611a2b3384614b3e565b6014546001600160a01b03821660009081526010602052604090206005015401919050565b600b5481565b600554610100900460ff1615611e1c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614611e76576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600c5460ff1615611eb4576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b64e8d4a51000861015611ef8576040805162461bcd60e51b81526020600482015260076024820152663c6d696e46656560c81b604482015290519081900360640190fd5b67016345785d8a0000861115611f3f576040805162461bcd60e51b81526020600482015260076024820152663e6d617846656560c81b604482015290519081900360640190fd5b85611f4d600a546002614b48565b1115611f89576040805162461bcd60e51b81526020600482015260066024820152651e2332b2951960d11b604482015290519081900360640190fd5b600986905566038d7ea4c68000851015611fd9576040805162461bcd60e51b815260206004820152600c60248201526b03c6d696e496e6974505375760a41b604482015290519081900360640190fd5b6ec097ce7bc90715b34b9f100000000085111561202c576040805162461bcd60e51b815260206004820152600c60248201526b03e6d6178496e6974505375760a41b604482015290519081900360640190fd5b600283101561206f576040805162461bcd60e51b815260206004820152600a6024820152693c6d696e546f6b656e7360b01b604482015290519081900360640190fd5b600883106120b1576040805162461bcd60e51b815260206004820152600a6024820152693e6d6178546f6b656e7360b01b604482015290519081900360640190fd5b8281146120f2576040805162461bcd60e51b815260206004820152600a60248201526965724c656e674d69736d60b01b604482015290519081900360640190fd5b600060608467ffffffffffffffff8111801561210d57600080fd5b50604051908082528060200260200182016040528015612137578160200160208202803683370190505b50905060005b858110156123c157600087878381811061215357fe5b905060200201356001600160a01b03169050600086868481811061217357fe5b9050602002013590506000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156121cb57600080fd5b505afa1580156121df573d6000803e3d6000fd5b505050506040513d60208110156121f557600080fd5b50518551909150819086908690811061220a57fe5b6020908102919091018101919091526001600160a01b0384166000908152600e909152604090205460ff161561226f576040805162461bcd60e51b8152602060048201526005602482015264189bdd5b9960da1b604482015290519081900360640190fd5b670de0b6b3a76400008210156122b9576040805162461bcd60e51b815260206004820152600a6024820152690f1b5a5b95d95a59da1d60b21b604482015290519081900360640190fd5b6802b5e3af16b1880000821115612304576040805162461bcd60e51b815260206004820152600a6024820152690f9b585e15d95a59da1d60b21b604482015290519081900360640190fd5b620f4240811015612346576040805162461bcd60e51b81526020600482015260076024820152660f1b5a5b90985b60ca1b604482015290519081900360640190fd5b6040805160808101825260018082526020808301888152838501878152606085018781526001600160a01b038a166000908152600e909452959092209351845460ff1916901515178455519183019190915551600282015590516003909101556123b086836151c0565b9550506001909201915061213d9050565b506802b5e3af16b188000082111561240e576040805162461bcd60e51b815260206004820152600b60248201526a0f9b585e1515d95a59da1d60aa1b604482015290519081900360640190fd5b600f82905561241f600d8787615a69565b50600c805460ff1916600117905561243687615209565b6124403388614b3e565b7f84544fec6632b8b4c691c6d5d5288102f47b6d448e731f535b38767d2bfd2662600954886006548989898988604051808981526020018881526020018781526020018060200180602001806020018481038452898982818152602001925060200280828437600083820152601f01601f191690910185810384528781526020908101915088908802808284376000838201819052601f909101601f19169092018681038452875181528751602091820193828a0193509102908190849084905b83811015612519578181015183820152602001612501565b505050509050019b50505050505050505050505060405180910390a150506005805461ff0019169055505050505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561259f573360009081526001602090815260408083206001600160a01b03881684529091528120556125ce565b6125a981846149eb565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020615b0d833981519152929181900390910190a35060019392505050565b6008546001600160a01b0316331461266b576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b6011546008116126b6576040805162461bcd60e51b815260206004820152601160248201527065786365656420727764506f6f6c4c696d60781b604482015290519081900360640190fd5b808211156126f5576040805162461bcd60e51b815260206004820152600760248201526639ab211f32ab2160c91b604482015290519081900360640190fd5b8543116127025785612704565b435b9550848610612743576040805162461bcd60e51b815260206004820152600660248201526539a11f1eb2a160d11b604482015290519081900360640190fd5b61274b6146f3565b60408051610140810182526001600160a01b039889168152602081019788529081019586526060810194855260006080820181815260a0830195865260c0830185815260e08401858152959094036101008401908152610120840183815260118054600181018255945293517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68600a90940293840180546001600160a01b03191691909c1617909a5597517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6982015595517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a87015593517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b86015594517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6c85015590517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6d84015592517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6e83015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6f82015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c70830155517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c7190910155565b612955826136ea565b6001600160a01b03811660009081526010602052604081206011805491929160ff861690811061298157fe5b6000918252602080832060ff88168452600186019091526040832054600a9290920201600481015485549194506129d092916129ca91670de0b6b3a7640000916115f491614aa3565b90615365565b60058301549091508015612b6a578260070154431115612a655760ff8616600090815260048501602090815260408083205460038801909252822054612a1591615365565b90508015612a5f57612a278382614a49565b60ff88166000908152600487016020526040902054909350612a499082614a49565b60ff881660009081526004870160205260409020555b50612b6a565b8115612ac1576000612a7c60646115f48585614aa3565b9050612a888382615365565b60ff88166000908152600387016020526040902054909350612aaa9082614a49565b60ff88166000908152600387016020526040902055505b8260060154431115612b6a576000612b0c84600801546115f4612af187600601544361536590919063ffffffff16565b60ff8b16600090815260038a01602052604090205490614aa3565b60ff8816600090815260048701602052604090205490915080821115612b67576000612b388383615365565b9050612b448282614a49565b60ff8a166000908152600489016020526040902055612b638582614a49565b9450505b50505b8115612cc95760ff86166000908152600285016020526040902054612b8f9083614a49565b60ff871660009081526002860160205260409020556009830154612bb39083614a49565b600984015560125483546040805163d1660f9960e01b81526001600160a01b0392831660048201528883166024820152604481018690529051919092169163d1660f9991606480830192600092919082900301818387803b158015612c1757600080fd5b505af1158015612c2b573d6000803e3d6000fd5b50506040805160ff8a1681526020810186905281516001600160a01b038a1694507f636c8a1a63bdbdbe782bbd46665206ecd64f1d1f745ed547cc9dd708864fd2b093509081900390910190a2612cb3670de0b6b3a76400006115f460118960ff1681548110612c9757fe5b600091825260209091206004600a909202010154875490614aa3565b60ff871660009081526001860160205260409020555b505050505050565b6001600160a01b031660009081526020819052604090205490565b60118181548110612cf957fe5b60009182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b03909816995095979496939592949193909291908a565b6008546001600160a01b03163314612da0576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b612da9836136ea565b600060118460ff1681548110612dbb57fe5b90600052602060002090600a020190508060020154431115612e0d576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b600281019290925560039091015550565b600080612e2b88876153a7565b90506000612e4a86612e45670de0b6b3a7640000876149eb565b614b48565b90506000612e5889836149eb565b90506000612e66828b6153a7565b90506000612e8582612e80670de0b6b3a7640000886153a7565b6154a3565b90506000612e93828f614b48565b90506000612ea18f836149eb565b90506000612ec0612eba670de0b6b3a76400008a6149eb565b8c614b48565b9050612ed882612e45670de0b6b3a7640000846149eb565b98505050505050505050979650505050505050565b6005546000908190610100900460ff1615612f39576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff16612f9e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff16612ff4576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e60205260408082209288168252902060038082015461302d91670de0b6b3a7640000611928565b86111561306c576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b600061308d8360030154846002015484600301548560020154600954613ca0565b9050858111156130d2576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6130f283600301548460020154846003015485600201548b600954614866565b945088851115613132576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6131408360030154866151c0565b83600301819055506131568260030154886149eb565b600380840182905584015460028086015490850154600954613179949190613ca0565b9350808410156131b9576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b858411156131fa576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b61320485886153a7565b811115613241576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a46132a98a3387615212565b6132b4883389614db3565b60006132c08b8761559f565b905080156132dc576132d68460030154826149eb565b60038501555b505050506005805461ff001916905590969095509350505050565b6005546000908190610100900460ff1615613343576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff166133a8576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff166133fe576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e6020526040808220928816825290206003820154613438906002670de0b6b3a7640000611c4f565b881115613477576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b60006134988360030154846002015484600301548560020154600954613ca0565b9050858111156134dd576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6134fd83600301548460020154846003015485600201548d6009546140a1565b94508685101561353c576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b61354a83600301548a6151c0565b83600301819055506135608260030154866149eb565b600380840182905584015460028086015490850154600954613583949190613ca0565b9350808410156135c3576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b85841115613604576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b61360e89866153a7565b81111561364b576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46136b38a338b615212565b60006136c18b8b8b89614c1f565b9650905080156136df576136d98460030154826149eb565b60038501555b6132dc893388614db3565b600060118260ff16815481106136fc57fe5b90600052602060002090600a0201905060008160020154431161371f5743613725565b81600201545b905081600101548111156116ad57600061373e30612cd1565b905080156137aa57600061375f84600101548461536590919063ffffffff16565b90506000613790836115f4670de0b6b3a764000061378a896003015487614aa390919063ffffffff16565b90614aa3565b60048601549091506137a29082614a49565b600486015550505b506001919091015550565b6000806137c287866153a7565b905060006137e16137db670de0b6b3a7640000846149eb565b85614b48565b905060006137fb86612e45670de0b6b3a7640000856149eb565b905060006138098b836151c0565b90506000613817828d6153a7565b9050600061382582876154a3565b90506000613833828d614b48565b905061383f818d6149eb565b9e9d5050505050505050505050505050565b6008546001600160a01b0316331461389a576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600554610100900460ff1615613903576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600e602052604090205460ff16613968576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156139ae57600080fd5b505afa1580156139c2573d6000803e3d6000fd5b505050506040513d60208110156139d857600080fd5b50516001600160a01b039091166000908152600e60205260409020600301556005805461ff0019169055565b600554610100900460ff1615613a4b576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614613aa5576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613b1c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b50600f5490565b600554600090610100900460ff1615613b6d576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16613bc3576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110635780601f1061103857610100808354040283529160200191611063565b6008546001600160a01b03163314613c8c576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b62278d006014541115613c9b57fe5b601455565b600080613cad87876153a7565b90506000613cbb86866153a7565b90506000613cc983836153a7565b90506000613cf0670de0b6b3a7640000613ceb670de0b6b3a7640000896149eb565b6153a7565b9050613cfc8282614b48565b9a9950505050505050505050565b6000613d1530612cd1565b9050613d213383614c09565b6000613d2c30612cd1565b9050613d3881836149eb565b92506116ad33846150f2565b6000613d513384846148e9565b50600192915050565b600554610100900460ff1615613da1576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16613df0576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6000613dfa611345565b90506000613e0a85600b54614b48565b90506000613e1886836149eb565b90506000613e2682856153a7565b905080613e63576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b6000613e6e33612cd1565b905087811015613ee2576000613e8489836149eb565b3360009081526010602052604090205490915081811015613ed6576040805162461bcd60e51b815260206004820152600760248201526639ba359e3bb23960c91b604482015290519081900360640190fd5b613edf826114f0565b50505b613eec3389614c09565b8315613f0857600754613f08906001600160a01b031685614b3e565b613f1183614c13565b60005b600d54811015614082576000600d8281548110613f2d57fe5b60009182526020808320909101546001600160a01b0316808352600e909152604082206003015490925090613f628683614b48565b905080613f9f576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b8a8a85818110613fab57fe5b90506020020135811015613fee576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090206003015461401490826149eb565b6001600160a01b0384166000818152600e60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3614077833383614db3565b505050600101613f14565b50506005805461ff001916905550505050505050565b600c5460ff1681565b6000806140ae87866153a7565b905060006140c4670de0b6b3a7640000856149eb565b90506140d08582614b48565b905060006140e28a613ceb8c856151c0565b905060006140f082856154a3565b90506000614106670de0b6b3a7640000836149eb565b90506141128a82614b48565b9c9b505050505050505050505050565b600554606090610100900460ff161561416c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600c5460ff166141ac576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b600d80548060200260200160405190810160405280929190818152602001828054801561106357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141e4575050505050905090565b6001600160a01b03811660009081526010602052604081206011805483919060ff871690811061423757fe5b90600052602060002090600a02019050600081600401549050600061425b30612cd1565b90506000836002015443116142705743614276565b83600201545b905083600101548111801561428a57508115155b156142e45760006142a885600101548361536590919063ffffffff16565b905060006142d3846115f4670de0b6b3a764000061378a8a6003015487614aa390919063ffffffff16565b90506142df8582614a49565b945050505b60ff88166000908152600186016020526040902054855461431891906129ca90670de0b6b3a7640000906115f49088614aa3565b98975050505050505050565b6007546001600160a01b031681565b6013546001600160a01b031681565b600554606090610100900460ff16156141ac576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600d5490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546143c090836151c0565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020615b0d833981519152929081900390910190a350600192915050565b336000818152601060205260409020805490916144309082614b3e565b6000808355601154905b8160ff168160ff1610156144675760ff81166000908152600180860160205260408220919091550161443a565b5060408051838152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5460ff161561450c576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b6007546001600160a01b03163314614553576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b66038d7ea4c6800081111561459d576040805162461bcd60e51b815260206004820152600b60248201526a3e6d61784578697446656560a81b604482015290519081900360640190fd5b600b55565b6008546001600160a01b031633146145eb576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600a5481565b6012546001600160a01b031681565b600554600090610100900460ff161561466c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166146c2576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e6020526040902060020154600f546146ec9082906153a7565b9392505050565b60115460005b8160ff168160ff16101561471857614710816136ea565b6001016146f9565b5050565b6008546001600160a01b031681565b600554610100900460ff1615614772576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561478d33848484614f07565b6147973384614b3e565b50506005805461ff001916905550565b600554600090610100900460ff16156147f1576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16614847576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206003015490565b60008061487385886153a7565b9050600061488187866149eb565b9050600061488f88836153a7565b9050600061489d82856154a3565b90506148b181670de0b6b3a76400006149eb565b90506148c5670de0b6b3a7640000876149eb565b94506148da6148d48c83614b48565b866153a7565b9b9a5050505050505050505050565b6001600160a01b03831660009081526020819052604090205481111561493f576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b6001600160a01b03831660009081526020819052604090205461496290826149eb565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461499190826151c0565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008060006149fa858561569d565b915091508015614a41576040805162461bcd60e51b815260206004820152600d60248201526c73756220756e646572666c6f7760981b604482015290519081900360640190fd5b509392505050565b6000828201838110156146ec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082614ab2575060006110bc565b82820282848281614abf57fe5b04146146ec5760405162461bcd60e51b8152600401808060200182810382526021815260200180615aec6021913960400191505060405180910390fd5b60006146ec83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506156c2565b6147188282615764565b6000828202831580614b62575082848281614b5f57fe5b04145b614ba2576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614bf1576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b614718828261576f565b614c1c8161577a565b50565b600a54600090829015614daa57600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b158015614c7157600080fd5b505afa158015614c85573d6000803e3d6000fd5b505050506040513d6020811015614c9b57600080fd5b505190506001600160a01b038082169088161415614d2f57614cd0614cc287600a54614b48565b670de0b6b3a76400006153a7565b600754909350614ceb9088906001600160a01b031685614db3565b6040805184815290516001600160a01b038916917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a2614da8565b6000614d40614cc286600a54614b48565b600754909150614d5b9087906001600160a01b031683614db3565b614d6585826149eb565b6040805183815290519194506001600160a01b038816917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd9181900360200190a2505b505b94509492505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310614e305780518252601f199092019160209182019101614e11565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614e92576040519150601f19603f3d011682016040523d82523d6000602084013e614e97565b606091505b5091509150818015614ec5575080511580614ec55750808060200190516020811015614ec257600080fd5b50515b614f00576040805162461bcd60e51b8152602060048201526007602482015266215f707573685560c81b604482015290519081900360640190fd5b5050505050565b600c5460ff16614f47576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6000614f51611345565b90506000614f5f85836153a7565b905080614f9c576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b60005b600d548110156150e8576000600d8281548110614fb857fe5b60009182526020808320909101546001600160a01b0316808352600e909152604082206003015490925090614fed8583614b48565b90508015801590615010575087878581811061500557fe5b905060200201358111155b615052576040805162461bcd60e51b815260206004820152600e60248201526d32b926a0b8393e3e1e3634b6a4b760911b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090206003015461507890826151c0565b6001600160a01b038085166000818152600e602090815260409182902060030194909455805185815290519193928e16927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a92918290030190a36150dd833383615212565b505050600101614f9f565b50612cc985615209565b6001600160a01b038216600090815260106020526040902061511383611687565b805461511f9083614a49565b815560115460005b8160ff168160ff16101561517457615154670de0b6b3a76400006115f460118460ff16815481106115d857fe5b60ff82166000908152600180860160205260409091209190915501615127565b504260058301556040805184815290516001600160a01b038616917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b6000828201838110156146ec576040805162461bcd60e51b815260206004820152600c60248201526b616464206f766572666c6f7760a01b604482015290519081900360640190fd5b614c1c8161583c565b604080516001600160a01b038481166024830152306044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000946060949389169392918291908083835b602083106152955780518252601f199092019160209182019101615276565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146152f7576040519150601f19603f3d011682016040523d82523d6000602084013e6152fc565b606091505b509150915081801561532a57508051158061532a575080806020019051602081101561532757600080fd5b50515b614f00576040805162461bcd60e51b8152602060048201526007602482015266215f70756c6c5560c81b604482015290519081900360640190fd5b60006146ec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506158b1565b6000816153e6576040805162461bcd60e51b8152602060048201526008602482015267064697620627920360c41b604482015290519081900360640190fd5b670de0b6b3a7640000830283158061540e5750670de0b6b3a764000084828161540b57fe5b04145b61544e576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b60028304810181811015615498576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b6000848281614bfe57fe5b600060018310156154ea576040805162461bcd60e51b815260206004820152600c60248201526b6261736520746f6f206c6f7760a01b604482015290519081900360640190fd5b671bc16d674ec7ffff831115615537576040805162461bcd60e51b815260206004820152600d60248201526c0c4c2e6ca40e8dede40d0d2ced609b1b604482015290519081900360640190fd5b60006155428361590b565b9050600061555084836149eb565b905060006155668661556185615926565b615934565b9050816155775792506110bc915050565b600061558887846305f5e10061598b565b90506155948282614b48565b979650505050505050565b600a54600090156110bc57600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b1580156155ef57600080fd5b505afa158015615603573d6000803e3d6000fd5b505050506040513d602081101561561957600080fd5b505190506001600160a01b038116156156965761563b614cc284600a54614b48565b6007549092506156569085906001600160a01b031684614db3565b6040805183815290516001600160a01b038616917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a25b5092915050565b6000808284106156b357505080820360006156bb565b505081810360015b9250929050565b6000818361574e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156157135781810151838201526020016156fb565b50505050905090810190601f1680156157405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161575a57fe5b0495945050505050565b6147183083836148e9565b6147188230836148e9565b306000908152602081905260409020548111156157c7576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b306000908152602081905260409020546157e190826149eb565b306000908152602081905260409020556002546157fe90826149eb565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b3060009081526020819052604090205461585690826151c0565b3060009081526020819052604090205560025461587390826151c0565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b600081848411156159035760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156157135781810151838201526020016156fb565b505050900390565b6000670de0b6b3a764000061591f83615926565b0292915050565b670de0b6b3a7640000900490565b6000806002830661594d57670de0b6b3a764000061594f565b835b90506002830492505b82156146ec576159688485614b48565b935060028306156159805761597d8185614b48565b90505b600283049250615958565b60008281806159a287670de0b6b3a764000061569d565b9092509050670de0b6b3a764000080600060015b888410615a5a576000670de0b6b3a7640000820290506000806159ea8a6159e585670de0b6b3a76400006149eb565b61569d565b915091506159fc87612e45848c614b48565b9650615a0887846153a7565b965086615a1757505050615a5a565b8715615a21579315935b8015615a2b579315935b8415615a4257615a3b86886149eb565b9550615a4f565b615a4c86886151c0565b95505b5050506001016159b6565b50909998505050505050505050565b828054828255906000526020600020908101928215615abc579160200282015b82811115615abc5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190615a89565b50615ac8929150615acc565b5090565b5b80821115615ac85780546001600160a01b0319168155600101615acd56fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f778c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212205244d561ab957f642811181d4738e42d8fc500e51540cee56676d02270a132e264736f6c634300060c0033000000000000000000000000ebc44681c125d63210a33d30c55fd3d37762675b

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103db5760003560e01c80638656b6531161020a578063c45a015511610125578063e653bf3a116100b8578063f36c0a7211610087578063f36c0a7214610ef1578063f77c479114610ef9578063f863b96114610f01578063f8b2cb4f14610f76578063f8d6aed414610f9c576103db565b8063e653bf3a14610e95578063e811f50a14610ebb578063efe2226614610ec3578063f1b8a9b714610ecb576103db565b8063d73dd623116100f4578063d73dd62314610e16578063db2e21bc14610e42578063dd62ed3e14610e4a578063e5a583a914610e78576103db565b8063c45a015514610dda578063c7c30be114610dfe578063cc77828d14610e06578063cd2ed8fb14610e0e576103db565b8063a221ee491161019d578063b3f05b971161016c578063b3f05b9714610d10578063ba9530a614610d18578063be3bbd2e14610d53578063be61533514610dab576103db565b8063a221ee4914610c1d578063a694fc3a14610c52578063a9059cbb14610c6f578063b02f0b7314610c9b576103db565b8063936c3477116101d9578063936c347714610bca578063948d8ce614610bd257806395d89b4114610bf85780639da9532614610c00576103db565b80638656b65314610b1d578063884f6f7f14610b585780638c28cbe814610b7e57806392eefe9b14610ba4576103db565b806354cf2aeb116102fa5780636d3c6d921161028d57806379104ea61161025c57806379104ea614610a235780637c5e9ea414610a645780638201aa3f14610abd57806385cc179e14610afd576103db565b80636d3c6d921461092b57806370a082311461095a57806372aa0a601461098057806376d743fe146109f7576103db565b80636284ae41116102c95780636284ae41146107e3578063650e872c146107eb57806366188463146108b55780636d142e5b146108e1576103db565b806354cf2aeb1461077b57806354fd4d50146107835780635db342771461078b57806360d47088146107bd576103db565b80632e1a7d4d11610372578063429b4ae611610341578063429b4ae61461063457806346ab38f1146106515780634d950c74146106835780634f69c0d414610706576103db565b80632e1a7d4d146105ab5780632f37b624146105ca578063313ce567146105f0578063362a3fad1461060e576103db565b806317837baa116103ae57806317837baa1461050b57806318160ddd1461051357806323b872dd1461051b57806329d7958814610551576103db565b806306fdde03146103e0578063095ea7b31461045d5780631446a7ff1461049d57806315e84af9146104dd575b600080fd5b6103e8610fd7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042257818101518382015260200161040a565b50505050905090810190601f16801561044f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104896004803603604081101561047357600080fd5b506001600160a01b03813516906020013561106d565b604080519115158252519081900360200190f35b6104cb600480360360408110156104b357600080fd5b506001600160a01b03813581169160200135166110c2565b60408051918252519081900360200190f35b6104cb600480360360408110156104f357600080fd5b506001600160a01b0381358116916020013516611205565b6104cb61133f565b6104cb611345565b6104896004803603606081101561053157600080fd5b506001600160a01b0381358116916020810135909116906040013561134b565b6105806004803603604081101561056757600080fd5b50803560ff1690602001356001600160a01b0316611498565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6105c8600480360360208110156105c157600080fd5b50356114f0565b005b610489600480360360208110156105e057600080fd5b50356001600160a01b0316611660565b6105f861167e565b6040805160ff9092168252519081900360200190f35b6105c86004803603602081101561062457600080fd5b50356001600160a01b0316611687565b6105c86004803603602081101561064a57600080fd5b50356116b2565b6104cb6004803603606081101561066757600080fd5b506001600160a01b038135169060208101359060400135611791565b6105c86004803603606081101561069957600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156106c857600080fd5b8201836020820111156106da57600080fd5b803590602001918460208302840111600160201b831117156106fb57600080fd5b509092509050611a3f565b6105c86004803603604081101561071c57600080fd5b81359190810190604081016020820135600160201b81111561073d57600080fd5b82018360208201111561074f57600080fd5b803590602001918460208302840111600160201b8311171561077057600080fd5b509092509050611b1c565b6104cb611b28565b6104cb611b2e565b6104cb600480360360608110156107a157600080fd5b506001600160a01b038135169060208101359060400135611b34565b6104cb600480360360208110156107d357600080fd5b50356001600160a01b0316611daa565b6104cb611dcf565b6105c86004803603608081101561080157600080fd5b813591602081013591810190606081016040820135600160201b81111561082757600080fd5b82018360208201111561083957600080fd5b803590602001918460208302840111600160201b8311171561085a57600080fd5b919390929091602081019035600160201b81111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460208302840111600160201b831117156108aa57600080fd5b509092509050611dd5565b610489600480360360408110156108cb57600080fd5b506001600160a01b03813516906020013561254a565b6105c8600480360360e08110156108f757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a08101359060c00135612622565b6105c86004803603604081101561094157600080fd5b50803560ff1690602001356001600160a01b031661294c565b6104cb6004803603602081101561097057600080fd5b50356001600160a01b0316612cd1565b61099d6004803603602081101561099657600080fd5b5035612cec565b604080516001600160a01b03909b168b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b6105c860048036036060811015610a0d57600080fd5b5060ff8135169060208101359060400135612d57565b6104cb600480360360e0811015610a3957600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612e1e565b610aa4600480360360a0811015610a7a57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612eed565b6040805192835260208301919091528051918290030190f35b610aa4600480360360a0811015610ad357600080fd5b506001600160a01b03813581169160208101359160408201351690606081013590608001356132f7565b6105c860048036036020811015610b1357600080fd5b503560ff166136ea565b6104cb600480360360c0811015610b3357600080fd5b5080359060208101359060408101359060608101359060808101359060a001356137b5565b6105c860048036036020811015610b6e57600080fd5b50356001600160a01b0316613851565b6105c860048036036020811015610b9457600080fd5b50356001600160a01b03166138bc565b6105c860048036036020811015610bba57600080fd5b50356001600160a01b0316613a04565b6104cb613ad2565b6104cb60048036036020811015610be857600080fd5b50356001600160a01b0316613b23565b6103e8613be2565b6105c860048036036020811015610c1657600080fd5b5035613c43565b6104cb600480360360a0811015610c3357600080fd5b5080359060208101359060408101359060608101359060800135613ca0565b6105c860048036036020811015610c6857600080fd5b5035613d0a565b61048960048036036040811015610c8557600080fd5b506001600160a01b038135169060200135613d44565b6105c860048036036040811015610cb157600080fd5b81359190810190604081016020820135600160201b811115610cd257600080fd5b820183602082011115610ce457600080fd5b803590602001918460208302840111600160201b83111715610d0557600080fd5b509092509050613d5a565b610489614098565b6104cb600480360360c0811015610d2e57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356140a1565b610d5b614122565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d97578181015183820152602001610d7f565b505050509050019250505060405180910390f35b6104cb60048036036040811015610dc157600080fd5b50803560ff1690602001356001600160a01b031661420b565b610de2614324565b604080516001600160a01b039092168252519081900360200190f35b610de2614333565b610d5b614342565b6104cb61438c565b61048960048036036040811015610e2c57600080fd5b506001600160a01b038135169060200135614392565b6105c8614413565b6104cb60048036036040811015610e6057600080fd5b506001600160a01b03813581169160200135166144a3565b6105c860048036036020811015610e8e57600080fd5b50356144ce565b6105c860048036036020811015610eab57600080fd5b50356001600160a01b03166145a2565b6104cb61460d565b610de2614613565b6104cb60048036036020811015610ee157600080fd5b50356001600160a01b0316614622565b6105c86146f3565b610de261471c565b6105c860048036036040811015610f1757600080fd5b81359190810190604081016020820135600160201b811115610f3857600080fd5b820183602082011115610f4a57600080fd5b803590602001918460208302840111600160201b83111715610f6b57600080fd5b50909250905061472b565b6104cb60048036036020811015610f8c57600080fd5b50356001600160a01b03166147a7565b6104cb600480360360c0811015610fb257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614866565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110635780601f1061103857610100808354040283529160200191611063565b820191906000526020600020905b81548152906001019060200180831161104657829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020615b0d833981519152928290030190a35060015b92915050565b600554600090610100900460ff161561110c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff16611162576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166111b8576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e602052604080822092851682528120600380840154600280860154928401549084015493946111fc9492939290613ca0565b95945050505050565b600554600090610100900460ff161561124f576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff166112a5576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166112fb576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e60205260408082209285168252902060038083015460028085015492840154908401546009546111fc94929190613ca0565b60145481565b60025490565b6000336001600160a01b038516148061138757506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6113c3576040805162461bcd60e51b815260206004820152600860248201526710b9b832b73232b960c11b604482015290519081900360640190fd5b6113ce8484846148e9565b336001600160a01b0385161480159061140c57506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b1561148e576001600160a01b038416600090815260016020908152604080832033845290915290205461143f90836149eb565b6001600160a01b0385811660009081526001602090815260408083203380855290835292819020859055805194855251928716939192600080516020615b0d8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152601060209081526040808320805460ff9095168452600181018352818420546002820184528285205460038301855283862054600490930190945291909320549394909391929190565b3360009081526010602052604090208054821115611540576040805162461bcd60e51b8152602060048201526008602482015267616d3e75732e616d60c01b604482015290519081900360640190fd5b601454600582015461155191614a49565b42101561158e576040805162461bcd60e51b8152602060048201526006602482015265333937bd32b760d11b604482015290519081900360640190fd5b61159733611687565b80546115a390836149eb565b815560115460005b8160ff168160ff16101561161a576115fa670de0b6b3a76400006115f460118460ff16815481106115d857fe5b600091825260209091206004600a909202010154865490614aa3565b90614afc565b60ff821660009081526001808601602052604090912091909155016115ab565b506116253384614b3e565b60408051848152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03166000908152600e602052604090205460ff1690565b60055460ff1690565b60115460005b8160ff168160ff1610156116ad576116a5818461294c565b60010161168d565b505050565b6007546001600160a01b031633146116f9576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b6611c37937e08000811115611741576040805162461bcd60e51b81526020600482015260096024820152683e6d6178436f46656560b81b604482015290519081900360640190fd5b60095461174f826002614b48565b111561178c576040805162461bcd60e51b81526020600482015260076024820152661f39a332b2979960c91b604482015290519081900360640190fd5b600a55565b600554600090610100900460ff16156117db576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff1661182a576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff16611880576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954600b546118bd95949392918a91612e1e565b9150828210156118fc576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e6020526040902060039081015461193191670de0b6b3a76400005b04600101614b48565b821115611970576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b61197e8160030154836149eb565b8160030181905550600061199485600b54614b48565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36119e23386614c09565b6119f46119ef86836149eb565b614c13565b8015611a1057600754611a10906001600160a01b031682614b3e565b611a1c30868886614c1f565b9350611a2b9050863385614db3565b50506005805461ff00191690559392505050565b600554610100900460ff1615611a86576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055336001600160a01b0385161480611ab657506013546001600160a01b031633145b611af5576040805162461bcd60e51b815260206004820152600b60248201526a21287072787c7c6f776e2960a81b604482015290519081900360640190fd5b611b0184848484614f07565b611b0b84846150f2565b50506005805461ff00191690555050565b6116ad33848484611a3f565b60095481565b60065481565b600554600090610100900460ff1615611b7e576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16611bcd576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff16611c23576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060030154611c55906002670de0b6b3a76400005b04614b48565b831115611c94576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954611cce949392919089906137b5565b915082821015611d0d576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b611d1b8160030154856151c0565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3611d6982615209565b611d74853386615212565b6000611d8286863086614c1f565b935090508015611da057611d9a8260030154826149eb565b60038301555b611a2b3384614b3e565b6014546001600160a01b03821660009081526010602052604090206005015401919050565b600b5481565b600554610100900460ff1615611e1c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614611e76576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600c5460ff1615611eb4576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b64e8d4a51000861015611ef8576040805162461bcd60e51b81526020600482015260076024820152663c6d696e46656560c81b604482015290519081900360640190fd5b67016345785d8a0000861115611f3f576040805162461bcd60e51b81526020600482015260076024820152663e6d617846656560c81b604482015290519081900360640190fd5b85611f4d600a546002614b48565b1115611f89576040805162461bcd60e51b81526020600482015260066024820152651e2332b2951960d11b604482015290519081900360640190fd5b600986905566038d7ea4c68000851015611fd9576040805162461bcd60e51b815260206004820152600c60248201526b03c6d696e496e6974505375760a41b604482015290519081900360640190fd5b6ec097ce7bc90715b34b9f100000000085111561202c576040805162461bcd60e51b815260206004820152600c60248201526b03e6d6178496e6974505375760a41b604482015290519081900360640190fd5b600283101561206f576040805162461bcd60e51b815260206004820152600a6024820152693c6d696e546f6b656e7360b01b604482015290519081900360640190fd5b600883106120b1576040805162461bcd60e51b815260206004820152600a6024820152693e6d6178546f6b656e7360b01b604482015290519081900360640190fd5b8281146120f2576040805162461bcd60e51b815260206004820152600a60248201526965724c656e674d69736d60b01b604482015290519081900360640190fd5b600060608467ffffffffffffffff8111801561210d57600080fd5b50604051908082528060200260200182016040528015612137578160200160208202803683370190505b50905060005b858110156123c157600087878381811061215357fe5b905060200201356001600160a01b03169050600086868481811061217357fe5b9050602002013590506000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156121cb57600080fd5b505afa1580156121df573d6000803e3d6000fd5b505050506040513d60208110156121f557600080fd5b50518551909150819086908690811061220a57fe5b6020908102919091018101919091526001600160a01b0384166000908152600e909152604090205460ff161561226f576040805162461bcd60e51b8152602060048201526005602482015264189bdd5b9960da1b604482015290519081900360640190fd5b670de0b6b3a76400008210156122b9576040805162461bcd60e51b815260206004820152600a6024820152690f1b5a5b95d95a59da1d60b21b604482015290519081900360640190fd5b6802b5e3af16b1880000821115612304576040805162461bcd60e51b815260206004820152600a6024820152690f9b585e15d95a59da1d60b21b604482015290519081900360640190fd5b620f4240811015612346576040805162461bcd60e51b81526020600482015260076024820152660f1b5a5b90985b60ca1b604482015290519081900360640190fd5b6040805160808101825260018082526020808301888152838501878152606085018781526001600160a01b038a166000908152600e909452959092209351845460ff1916901515178455519183019190915551600282015590516003909101556123b086836151c0565b9550506001909201915061213d9050565b506802b5e3af16b188000082111561240e576040805162461bcd60e51b815260206004820152600b60248201526a0f9b585e1515d95a59da1d60aa1b604482015290519081900360640190fd5b600f82905561241f600d8787615a69565b50600c805460ff1916600117905561243687615209565b6124403388614b3e565b7f84544fec6632b8b4c691c6d5d5288102f47b6d448e731f535b38767d2bfd2662600954886006548989898988604051808981526020018881526020018781526020018060200180602001806020018481038452898982818152602001925060200280828437600083820152601f01601f191690910185810384528781526020908101915088908802808284376000838201819052601f909101601f19169092018681038452875181528751602091820193828a0193509102908190849084905b83811015612519578181015183820152602001612501565b505050509050019b50505050505050505050505060405180910390a150506005805461ff0019169055505050505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561259f573360009081526001602090815260408083206001600160a01b03881684529091528120556125ce565b6125a981846149eb565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020615b0d833981519152929181900390910190a35060019392505050565b6008546001600160a01b0316331461266b576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b6011546008116126b6576040805162461bcd60e51b815260206004820152601160248201527065786365656420727764506f6f6c4c696d60781b604482015290519081900360640190fd5b808211156126f5576040805162461bcd60e51b815260206004820152600760248201526639ab211f32ab2160c91b604482015290519081900360640190fd5b8543116127025785612704565b435b9550848610612743576040805162461bcd60e51b815260206004820152600660248201526539a11f1eb2a160d11b604482015290519081900360640190fd5b61274b6146f3565b60408051610140810182526001600160a01b039889168152602081019788529081019586526060810194855260006080820181815260a0830195865260c0830185815260e08401858152959094036101008401908152610120840183815260118054600181018255945293517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68600a90940293840180546001600160a01b03191691909c1617909a5597517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6982015595517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a87015593517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b86015594517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6c85015590517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6d84015592517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6e83015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6f82015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c70830155517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c7190910155565b612955826136ea565b6001600160a01b03811660009081526010602052604081206011805491929160ff861690811061298157fe5b6000918252602080832060ff88168452600186019091526040832054600a9290920201600481015485549194506129d092916129ca91670de0b6b3a7640000916115f491614aa3565b90615365565b60058301549091508015612b6a578260070154431115612a655760ff8616600090815260048501602090815260408083205460038801909252822054612a1591615365565b90508015612a5f57612a278382614a49565b60ff88166000908152600487016020526040902054909350612a499082614a49565b60ff881660009081526004870160205260409020555b50612b6a565b8115612ac1576000612a7c60646115f48585614aa3565b9050612a888382615365565b60ff88166000908152600387016020526040902054909350612aaa9082614a49565b60ff88166000908152600387016020526040902055505b8260060154431115612b6a576000612b0c84600801546115f4612af187600601544361536590919063ffffffff16565b60ff8b16600090815260038a01602052604090205490614aa3565b60ff8816600090815260048701602052604090205490915080821115612b67576000612b388383615365565b9050612b448282614a49565b60ff8a166000908152600489016020526040902055612b638582614a49565b9450505b50505b8115612cc95760ff86166000908152600285016020526040902054612b8f9083614a49565b60ff871660009081526002860160205260409020556009830154612bb39083614a49565b600984015560125483546040805163d1660f9960e01b81526001600160a01b0392831660048201528883166024820152604481018690529051919092169163d1660f9991606480830192600092919082900301818387803b158015612c1757600080fd5b505af1158015612c2b573d6000803e3d6000fd5b50506040805160ff8a1681526020810186905281516001600160a01b038a1694507f636c8a1a63bdbdbe782bbd46665206ecd64f1d1f745ed547cc9dd708864fd2b093509081900390910190a2612cb3670de0b6b3a76400006115f460118960ff1681548110612c9757fe5b600091825260209091206004600a909202010154875490614aa3565b60ff871660009081526001860160205260409020555b505050505050565b6001600160a01b031660009081526020819052604090205490565b60118181548110612cf957fe5b60009182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b03909816995095979496939592949193909291908a565b6008546001600160a01b03163314612da0576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b612da9836136ea565b600060118460ff1681548110612dbb57fe5b90600052602060002090600a020190508060020154431115612e0d576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b600281019290925560039091015550565b600080612e2b88876153a7565b90506000612e4a86612e45670de0b6b3a7640000876149eb565b614b48565b90506000612e5889836149eb565b90506000612e66828b6153a7565b90506000612e8582612e80670de0b6b3a7640000886153a7565b6154a3565b90506000612e93828f614b48565b90506000612ea18f836149eb565b90506000612ec0612eba670de0b6b3a76400008a6149eb565b8c614b48565b9050612ed882612e45670de0b6b3a7640000846149eb565b98505050505050505050979650505050505050565b6005546000908190610100900460ff1615612f39576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff16612f9e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff16612ff4576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e60205260408082209288168252902060038082015461302d91670de0b6b3a7640000611928565b86111561306c576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b600061308d8360030154846002015484600301548560020154600954613ca0565b9050858111156130d2576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6130f283600301548460020154846003015485600201548b600954614866565b945088851115613132576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6131408360030154866151c0565b83600301819055506131568260030154886149eb565b600380840182905584015460028086015490850154600954613179949190613ca0565b9350808410156131b9576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b858411156131fa576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b61320485886153a7565b811115613241576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a46132a98a3387615212565b6132b4883389614db3565b60006132c08b8761559f565b905080156132dc576132d68460030154826149eb565b60038501555b505050506005805461ff001916905590969095509350505050565b6005546000908190610100900460ff1615613343576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff166133a8576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff166133fe576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e6020526040808220928816825290206003820154613438906002670de0b6b3a7640000611c4f565b881115613477576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b60006134988360030154846002015484600301548560020154600954613ca0565b9050858111156134dd576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6134fd83600301548460020154846003015485600201548d6009546140a1565b94508685101561353c576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b61354a83600301548a6151c0565b83600301819055506135608260030154866149eb565b600380840182905584015460028086015490850154600954613583949190613ca0565b9350808410156135c3576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b85841115613604576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b61360e89866153a7565b81111561364b576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46136b38a338b615212565b60006136c18b8b8b89614c1f565b9650905080156136df576136d98460030154826149eb565b60038501555b6132dc893388614db3565b600060118260ff16815481106136fc57fe5b90600052602060002090600a0201905060008160020154431161371f5743613725565b81600201545b905081600101548111156116ad57600061373e30612cd1565b905080156137aa57600061375f84600101548461536590919063ffffffff16565b90506000613790836115f4670de0b6b3a764000061378a896003015487614aa390919063ffffffff16565b90614aa3565b60048601549091506137a29082614a49565b600486015550505b506001919091015550565b6000806137c287866153a7565b905060006137e16137db670de0b6b3a7640000846149eb565b85614b48565b905060006137fb86612e45670de0b6b3a7640000856149eb565b905060006138098b836151c0565b90506000613817828d6153a7565b9050600061382582876154a3565b90506000613833828d614b48565b905061383f818d6149eb565b9e9d5050505050505050505050505050565b6008546001600160a01b0316331461389a576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600554610100900460ff1615613903576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600e602052604090205460ff16613968576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156139ae57600080fd5b505afa1580156139c2573d6000803e3d6000fd5b505050506040513d60208110156139d857600080fd5b50516001600160a01b039091166000908152600e60205260409020600301556005805461ff0019169055565b600554610100900460ff1615613a4b576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614613aa5576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613b1c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b50600f5490565b600554600090610100900460ff1615613b6d576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16613bc3576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110635780601f1061103857610100808354040283529160200191611063565b6008546001600160a01b03163314613c8c576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b62278d006014541115613c9b57fe5b601455565b600080613cad87876153a7565b90506000613cbb86866153a7565b90506000613cc983836153a7565b90506000613cf0670de0b6b3a7640000613ceb670de0b6b3a7640000896149eb565b6153a7565b9050613cfc8282614b48565b9a9950505050505050505050565b6000613d1530612cd1565b9050613d213383614c09565b6000613d2c30612cd1565b9050613d3881836149eb565b92506116ad33846150f2565b6000613d513384846148e9565b50600192915050565b600554610100900460ff1615613da1576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16613df0576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6000613dfa611345565b90506000613e0a85600b54614b48565b90506000613e1886836149eb565b90506000613e2682856153a7565b905080613e63576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b6000613e6e33612cd1565b905087811015613ee2576000613e8489836149eb565b3360009081526010602052604090205490915081811015613ed6576040805162461bcd60e51b815260206004820152600760248201526639ba359e3bb23960c91b604482015290519081900360640190fd5b613edf826114f0565b50505b613eec3389614c09565b8315613f0857600754613f08906001600160a01b031685614b3e565b613f1183614c13565b60005b600d54811015614082576000600d8281548110613f2d57fe5b60009182526020808320909101546001600160a01b0316808352600e909152604082206003015490925090613f628683614b48565b905080613f9f576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b8a8a85818110613fab57fe5b90506020020135811015613fee576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090206003015461401490826149eb565b6001600160a01b0384166000818152600e60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3614077833383614db3565b505050600101613f14565b50506005805461ff001916905550505050505050565b600c5460ff1681565b6000806140ae87866153a7565b905060006140c4670de0b6b3a7640000856149eb565b90506140d08582614b48565b905060006140e28a613ceb8c856151c0565b905060006140f082856154a3565b90506000614106670de0b6b3a7640000836149eb565b90506141128a82614b48565b9c9b505050505050505050505050565b600554606090610100900460ff161561416c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600c5460ff166141ac576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b600d80548060200260200160405190810160405280929190818152602001828054801561106357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141e4575050505050905090565b6001600160a01b03811660009081526010602052604081206011805483919060ff871690811061423757fe5b90600052602060002090600a02019050600081600401549050600061425b30612cd1565b90506000836002015443116142705743614276565b83600201545b905083600101548111801561428a57508115155b156142e45760006142a885600101548361536590919063ffffffff16565b905060006142d3846115f4670de0b6b3a764000061378a8a6003015487614aa390919063ffffffff16565b90506142df8582614a49565b945050505b60ff88166000908152600186016020526040902054855461431891906129ca90670de0b6b3a7640000906115f49088614aa3565b98975050505050505050565b6007546001600160a01b031681565b6013546001600160a01b031681565b600554606090610100900460ff16156141ac576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600d5490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546143c090836151c0565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020615b0d833981519152929081900390910190a350600192915050565b336000818152601060205260409020805490916144309082614b3e565b6000808355601154905b8160ff168160ff1610156144675760ff81166000908152600180860160205260408220919091550161443a565b5060408051838152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5460ff161561450c576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b6007546001600160a01b03163314614553576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b66038d7ea4c6800081111561459d576040805162461bcd60e51b815260206004820152600b60248201526a3e6d61784578697446656560a81b604482015290519081900360640190fd5b600b55565b6008546001600160a01b031633146145eb576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600a5481565b6012546001600160a01b031681565b600554600090610100900460ff161561466c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166146c2576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e6020526040902060020154600f546146ec9082906153a7565b9392505050565b60115460005b8160ff168160ff16101561471857614710816136ea565b6001016146f9565b5050565b6008546001600160a01b031681565b600554610100900460ff1615614772576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561478d33848484614f07565b6147973384614b3e565b50506005805461ff001916905550565b600554600090610100900460ff16156147f1576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16614847576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206003015490565b60008061487385886153a7565b9050600061488187866149eb565b9050600061488f88836153a7565b9050600061489d82856154a3565b90506148b181670de0b6b3a76400006149eb565b90506148c5670de0b6b3a7640000876149eb565b94506148da6148d48c83614b48565b866153a7565b9b9a5050505050505050505050565b6001600160a01b03831660009081526020819052604090205481111561493f576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b6001600160a01b03831660009081526020819052604090205461496290826149eb565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461499190826151c0565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008060006149fa858561569d565b915091508015614a41576040805162461bcd60e51b815260206004820152600d60248201526c73756220756e646572666c6f7760981b604482015290519081900360640190fd5b509392505050565b6000828201838110156146ec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082614ab2575060006110bc565b82820282848281614abf57fe5b04146146ec5760405162461bcd60e51b8152600401808060200182810382526021815260200180615aec6021913960400191505060405180910390fd5b60006146ec83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506156c2565b6147188282615764565b6000828202831580614b62575082848281614b5f57fe5b04145b614ba2576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614bf1576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b614718828261576f565b614c1c8161577a565b50565b600a54600090829015614daa57600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b158015614c7157600080fd5b505afa158015614c85573d6000803e3d6000fd5b505050506040513d6020811015614c9b57600080fd5b505190506001600160a01b038082169088161415614d2f57614cd0614cc287600a54614b48565b670de0b6b3a76400006153a7565b600754909350614ceb9088906001600160a01b031685614db3565b6040805184815290516001600160a01b038916917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a2614da8565b6000614d40614cc286600a54614b48565b600754909150614d5b9087906001600160a01b031683614db3565b614d6585826149eb565b6040805183815290519194506001600160a01b038816917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd9181900360200190a2505b505b94509492505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310614e305780518252601f199092019160209182019101614e11565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614e92576040519150601f19603f3d011682016040523d82523d6000602084013e614e97565b606091505b5091509150818015614ec5575080511580614ec55750808060200190516020811015614ec257600080fd5b50515b614f00576040805162461bcd60e51b8152602060048201526007602482015266215f707573685560c81b604482015290519081900360640190fd5b5050505050565b600c5460ff16614f47576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6000614f51611345565b90506000614f5f85836153a7565b905080614f9c576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b60005b600d548110156150e8576000600d8281548110614fb857fe5b60009182526020808320909101546001600160a01b0316808352600e909152604082206003015490925090614fed8583614b48565b90508015801590615010575087878581811061500557fe5b905060200201358111155b615052576040805162461bcd60e51b815260206004820152600e60248201526d32b926a0b8393e3e1e3634b6a4b760911b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090206003015461507890826151c0565b6001600160a01b038085166000818152600e602090815260409182902060030194909455805185815290519193928e16927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a92918290030190a36150dd833383615212565b505050600101614f9f565b50612cc985615209565b6001600160a01b038216600090815260106020526040902061511383611687565b805461511f9083614a49565b815560115460005b8160ff168160ff16101561517457615154670de0b6b3a76400006115f460118460ff16815481106115d857fe5b60ff82166000908152600180860160205260409091209190915501615127565b504260058301556040805184815290516001600160a01b038616917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b6000828201838110156146ec576040805162461bcd60e51b815260206004820152600c60248201526b616464206f766572666c6f7760a01b604482015290519081900360640190fd5b614c1c8161583c565b604080516001600160a01b038481166024830152306044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000946060949389169392918291908083835b602083106152955780518252601f199092019160209182019101615276565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146152f7576040519150601f19603f3d011682016040523d82523d6000602084013e6152fc565b606091505b509150915081801561532a57508051158061532a575080806020019051602081101561532757600080fd5b50515b614f00576040805162461bcd60e51b8152602060048201526007602482015266215f70756c6c5560c81b604482015290519081900360640190fd5b60006146ec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506158b1565b6000816153e6576040805162461bcd60e51b8152602060048201526008602482015267064697620627920360c41b604482015290519081900360640190fd5b670de0b6b3a7640000830283158061540e5750670de0b6b3a764000084828161540b57fe5b04145b61544e576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b60028304810181811015615498576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b6000848281614bfe57fe5b600060018310156154ea576040805162461bcd60e51b815260206004820152600c60248201526b6261736520746f6f206c6f7760a01b604482015290519081900360640190fd5b671bc16d674ec7ffff831115615537576040805162461bcd60e51b815260206004820152600d60248201526c0c4c2e6ca40e8dede40d0d2ced609b1b604482015290519081900360640190fd5b60006155428361590b565b9050600061555084836149eb565b905060006155668661556185615926565b615934565b9050816155775792506110bc915050565b600061558887846305f5e10061598b565b90506155948282614b48565b979650505050505050565b600a54600090156110bc57600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b1580156155ef57600080fd5b505afa158015615603573d6000803e3d6000fd5b505050506040513d602081101561561957600080fd5b505190506001600160a01b038116156156965761563b614cc284600a54614b48565b6007549092506156569085906001600160a01b031684614db3565b6040805183815290516001600160a01b038616917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a25b5092915050565b6000808284106156b357505080820360006156bb565b505081810360015b9250929050565b6000818361574e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156157135781810151838201526020016156fb565b50505050905090810190601f1680156157405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161575a57fe5b0495945050505050565b6147183083836148e9565b6147188230836148e9565b306000908152602081905260409020548111156157c7576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b306000908152602081905260409020546157e190826149eb565b306000908152602081905260409020556002546157fe90826149eb565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b3060009081526020819052604090205461585690826151c0565b3060009081526020819052604090205560025461587390826151c0565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b600081848411156159035760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156157135781810151838201526020016156fb565b505050900390565b6000670de0b6b3a764000061591f83615926565b0292915050565b670de0b6b3a7640000900490565b6000806002830661594d57670de0b6b3a764000061594f565b835b90506002830492505b82156146ec576159688485614b48565b935060028306156159805761597d8185614b48565b90505b600283049250615958565b60008281806159a287670de0b6b3a764000061569d565b9092509050670de0b6b3a764000080600060015b888410615a5a576000670de0b6b3a7640000820290506000806159ea8a6159e585670de0b6b3a76400006149eb565b61569d565b915091506159fc87612e45848c614b48565b9650615a0887846153a7565b965086615a1757505050615a5a565b8715615a21579315935b8015615a2b579315935b8415615a4257615a3b86886149eb565b9550615a4f565b615a4c86886151c0565b95505b5050506001016159b6565b50909998505050505050505050565b828054828255906000526020600020908101928215615abc579160200282015b82811115615abc5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190615a89565b50615ac8929150615acc565b5090565b5b80821115615ac85780546001600160a01b0319168155600101615acd56fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f778c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212205244d561ab957f642811181d4738e42d8fc500e51540cee56676d02270a132e264736f6c634300060c0033

Deployed Bytecode Sourcemap

47491:14130:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14801:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15436:193;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15436:193:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34268:465;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34268:465:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33796:464;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33796:464:0;;;;;;;;;;:::i;48882:40::-;;;:::i;15331:97::-;;;:::i;16452:487::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16452:487:0;;;;;;;;;;;;;;;;;:::i;58652:470::-;;;;;;;;;;;;;;;;-1:-1:-1;58652:470:0;;;;;;;;-1:-1:-1;;;;;58652:470:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53859:679;;;;;;;;;;;;;;;;-1:-1:-1;53859:679:0;;:::i;:::-;;29831:115;;;;;;;;;;;;;;;;-1:-1:-1;29831:115:0;-1:-1:-1;;;;;29831:115:0;;:::i;14987:82::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54602:245;;;;;;;;;;;;;;;;-1:-1:-1;54602:245:0;-1:-1:-1;;;;;54602:245:0;;:::i;29296:287::-;;;;;;;;;;;;;;;;-1:-1:-1;29296:287:0;;:::i;42444:1328::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42444:1328:0;;;;;;;;;;;;;:::i;51456:305::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51456:305:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51456:305:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51456:305:0;;;;;;;;;;-1:-1:-1;51456:305:0;;-1:-1:-1;51456:305:0;-1:-1:-1;51456:305:0;:::i;51291:157::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51291:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51291:157:0;;;;;;;;;;-1:-1:-1;51291:157:0;;-1:-1:-1;51291:157:0;-1:-1:-1;51291:157:0;:::i;28740:19::-;;;:::i;28463:26::-;;;:::i;41150:1286::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41150:1286:0;;;;;;;;;;;;;:::i;53699:152::-;;;;;;;;;;;;;;;;-1:-1:-1;53699:152:0;-1:-1:-1;;;;;53699:152:0;;:::i;28843:19::-;;;:::i;31405:2104::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:2104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:2104:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:2104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:2104:0;;;;;;;;;;-1:-1:-1;31405:2104:0;;-1:-1:-1;31405:2104:0;-1:-1:-1;31405:2104:0;:::i;15897:397::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15897:397:0;;;;;;;;:::i;49808:1076::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49808:1076:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54855:2330::-;;;;;;;;;;;;;;;;-1:-1:-1;54855:2330:0;;;;;;;;-1:-1:-1;;;;;54855:2330:0;;:::i;15214:109::-;;;;;;;;;;;;;;;;-1:-1:-1;15214:109:0;-1:-1:-1;;;;;15214:109:0;;:::i;48760:38::-;;;;;;;;;;;;;;;;-1:-1:-1;48760:38:0;;:::i;:::-;;;;-1:-1:-1;;;;;48760:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50892:391;;;;;;;;;;;;;;;;-1:-1:-1;50892:391:0;;;;;;;;;;;;;;:::i;25802:1312::-;;;;;;;;;;;;;;;;-1:-1:-1;25802:1312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38989:2153::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38989:2153:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36760:2221;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36760:2221:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60815:803::-;;;;;;;;;;;;;;;;-1:-1:-1;60815:803:0;;;;:::i;23500:1183::-;;;;;;;;;;;;;;;;-1:-1:-1;23500:1183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49313:117::-;;;;;;;;;;;;;;;;-1:-1:-1;49313:117:0;-1:-1:-1;;;;;49313:117:0;;:::i;33594:194::-;;;;;;;;;;;;;;;;-1:-1:-1;33594:194:0;-1:-1:-1;;;;;33594:194:0;;:::i;31224:173::-;;;;;;;;;;;;;;;;-1:-1:-1;31224:173:0;-1:-1:-1;;;;;31224:173:0;;:::i;30611:136::-;;;:::i;30396:207::-;;;;;;;;;;;;;;;;-1:-1:-1;30396:207:0;-1:-1:-1;;;;;30396:207:0;;:::i;14892:87::-;;;:::i;49567:233::-;;;;;;;;;;;;;;;;-1:-1:-1;49567:233:0;;:::i;18539:523::-;;;;;;;;;;;;;;;;-1:-1:-1;18539:523:0;;;;;;;;;;;;;;;;;;;;;;:::i;52807:333::-;;;;;;;;;;;;;;;;-1:-1:-1;52807:333:0;;:::i;16302:142::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16302:142:0;;;;;;;;:::i;59130:1457::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59130:1457:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59130:1457:0;;;;;;;;;;-1:-1:-1;59130:1457:0;;-1:-1:-1;59130:1457:0;-1:-1:-1;59130:1457:0;:::i;28869:21::-;;;:::i;20080:697::-;;;;;;;;;;;;;;;;-1:-1:-1;20080:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30213:175::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57193:936;;;;;;;;;;;;;;;;-1:-1:-1;57193:936:0;;;;;;;;-1:-1:-1;;;;;57193:936:0;;:::i;28496:22::-;;;:::i;:::-;;;;-1:-1:-1;;;;;28496:22:0;;;;;;;;;;;;;;48847:28;;;:::i;30070:135::-;;;:::i;29954:108::-;;;:::i;15637:252::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15637:252:0;;;;;;;;:::i;58200:444::-;;;:::i;15077:129::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15077:129:0;;;;;;;;;;:::i;29591:232::-;;;;;;;;;;;;;;;;-1:-1:-1;29591:232:0;;:::i;49438:121::-;;;;;;;;;;;;;;;;-1:-1:-1;49438:121:0;-1:-1:-1;;;;;49438:121:0;;:::i;28766:24::-;;;:::i;48807:33::-;;;:::i;30755:256::-;;;;;;;;;;;;;;;;-1:-1:-1;30755:256:0;-1:-1:-1;;;;;30755:256:0;;:::i;60595:212::-;;;:::i;28573:25::-;;;:::i;51769:213::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51769:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51769:213:0;;;;;;;;;;-1:-1:-1;51769:213:0;;-1:-1:-1;51769:213:0;-1:-1:-1;51769:213:0;:::i;31019:197::-;;;;;;;;;;;;;;;;-1:-1:-1;31019:197:0;-1:-1:-1;;;;;31019:197:0;;:::i;21795:686::-;;;;;;;;;;;;;;;;-1:-1:-1;21795:686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14801:83::-;14871:5;14864:12;;;;;;;;-1:-1:-1;;14864:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14838:13;;14864:12;;14871:5;;14864:12;;14871:5;14864:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14801:83;:::o;15436:193::-;15531:10;15503:4;15520:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15520:27:0;;;;;;;;;;;:33;;;15569:30;;;;;;;15503:4;;15520:27;;15531:10;;-1:-1:-1;;;;;;;;;;;15569:30:0;;;;;;;-1:-1:-1;15617:4:0;15436:193;;;;;:::o;34268:465::-;28389:6;;34381:14;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34421:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;34413:42;;;::::0;;-1:-1:-1;;;34413:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34413:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34474:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;34466:43;;;::::0;;-1:-1:-1;;;34466:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34466:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34546:17:0;;::::1;34520:23;34546:17:::0;;;:8:::1;:17;::::0;;;;;34601:18;;::::1;::::0;;;;34651:16:::1;::::0;;::::1;::::0;34669:15:::1;::::0;;::::1;::::0;34686:17;;::::1;::::0;34705:16;;::::1;::::0;34601:18;;34637:88:::1;::::0;34651:16;;34669:15;34705:16;34637:13:::1;:88::i;:::-;34630:95:::0;34268:465;-1:-1:-1;;;;;34268:465:0:o;33796:464::-;28389:6;;33902:14;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33942:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;33934:42;;;::::0;;-1:-1:-1;;;33934:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33934:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33995:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;33987:43;;;::::0;;-1:-1:-1;;;33987:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33987:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34067:17:0;;::::1;34041:23;34067:17:::0;;;:8:::1;:17;::::0;;;;;34122:18;;::::1;::::0;;;;34172:16:::1;::::0;;::::1;::::0;34190:15:::1;::::0;;::::1;::::0;34207:17;;::::1;::::0;34226:16;;::::1;::::0;34244:7:::1;::::0;34158:94:::1;::::0;34190:15;34207:17;34226:16;34158:13:::1;:94::i;48882:40::-:0;;;;:::o;15331:97::-;15408:12;;15331:97;:::o;16452:487::-;16537:4;16562:10;-1:-1:-1;;;;;16562:17:0;;;;:55;;-1:-1:-1;;;;;;16590:15:0;;;;;;:10;:15;;;;;;;;16606:10;16590:27;;;;;;;;16583:34;;;16562:55;16554:76;;;;;-1:-1:-1;;;16554:76:0;;;;;;;;;;;;-1:-1:-1;;;16554:76:0;;;;;;;;;;;;;;;16641:20;16647:3;16652;16657;16641:5;:20::i;:::-;16676:10;-1:-1:-1;;;;;16676:17:0;;;;;;:63;;-1:-1:-1;;;;;;16697:15:0;;;;;;:10;:15;;;;;;;;16713:10;16697:27;;;;;;;;-1:-1:-1;;16697:42:0;;16676:63;16672:238;;;-1:-1:-1;;;;;16791:15:0;;;;;;:10;:15;;;;;;;;16807:10;16791:27;;;;;;;;16786:38;;16820:3;16786:4;:38::i;:::-;-1:-1:-1;;;;;16756:15:0;;;;;;;:10;:15;;;;;;;;16772:10;16756:27;;;;;;;;;;:68;;;16844:54;;;;;;;;;;16772:10;;-1:-1:-1;;;;;;;;;;;16844:54:0;;;;;;;;;16672:238;-1:-1:-1;16927:4:0;16452:487;;;;;:::o;58652:470::-;-1:-1:-1;;;;;58855:18:0;58724:11;58855:18;;;:8;:18;;;;;;;;58893:11;;58928:21;;;;;;:15;;;:21;;;;;;58980:22;;;:28;;;;;;59032:15;;;:21;;;;;;59085:23;;;;:29;;;;;;;;58893:11;;58928:21;;58980:28;;59032:21;59085:29;58652:470::o;53859:679::-;53951:10;53918:21;53942:20;;;:8;:20;;;;;53981:11;;:22;-1:-1:-1;53981:22:0;53973:43;;;;;-1:-1:-1;;;53973:43:0;;;;;;;;;;;;-1:-1:-1;;;53973:43:0;;;;;;;;;;;;;;;54077:19;;54054:18;;;;:43;;:22;:43::i;:::-;54035:15;:62;;54027:81;;;;;-1:-1:-1;;;54027:81:0;;;;;;;;;;;;-1:-1:-1;;;54027:81:0;;;;;;;;;;;;;;;54119:25;54133:10;54119:13;:25::i;:::-;54174:11;;54169:26;;54187:7;54169:4;:26::i;:::-;54155:40;;54237:14;:21;54155:11;54270:170;54298:16;54291:23;;:4;:23;;;54270:170;;;54363:65;54423:4;54363:55;54379:14;54394:4;54379:20;;;;;;;;;;;;;;;;;;:38;:20;;;;;:38;;54363:11;;;:15;:55::i;:::-;:59;;:65::i;:::-;54339:21;;;;;;;:15;;;;:21;;;;;;:89;;;;54316:6;54270:170;;;;54450:35;54465:10;54477:7;54450:14;:35::i;:::-;54501:29;;;;;;;;54510:10;;54501:29;;;;;;;;;;53859:679;;;:::o;29831:115::-;-1:-1:-1;;;;;29921:11:0;29892:4;29921:11;;;:8;:11;;;;;:17;;;;29831:115::o;14987:82::-;15052:9;;;;14987:82;:::o;54602:245::-;54701:14;:21;54670:22;54734:106;54762:16;54755:23;;:4;:23;;;54734:106;;;54803:25;54813:4;54819:8;54803:9;:25::i;:::-;54780:6;;54734:106;;;;54602:245;;:::o;29296:287::-;29381:7;;-1:-1:-1;;;;;29381:7:0;29367:10;:21;29359:39;;;;;-1:-1:-1;;;29359:39:0;;;;;;;;;;;;-1:-1:-1;;;29359:39:0;;;;;;;;;;;;;;;6545:10;29417:41;;;29409:63;;;;;-1:-1:-1;;;29409:63:0;;;;;;;;;;;;-1:-1:-1;;;29409:63:0;;;;;;;;;;;;;;;29517:7;;29491:22;29496:13;29511:1;29491:4;:22::i;:::-;:33;;29483:53;;;;;-1:-1:-1;;;29483:53:0;;;;;;;;;;;;-1:-1:-1;;;29483:53:0;;;;;;;;;;;;;;;29547:12;:28;29296:287::o;42444:1328::-;28252:6;;42570:19;;28252:6;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;42615:9:::1;::::0;28281:13;42615:9:::1;42607:26;;;::::0;;-1:-1:-1;;;42607:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;42607:26:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;42652:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;42644:43;;;::::0;;-1:-1:-1;;;42644:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42644:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;42727:18:0;::::1;42700:24;42727:18:::0;;;:8:::1;:18;::::0;;;;42814:17:::1;::::0;::::1;::::0;42846:16:::1;::::0;;::::1;::::0;42877:12;;42904::::1;::::0;42958:7:::1;::::0;42980::::1;::::0;42775:223:::1;::::0;42814:17;42846:16;42877:12;42904;42931;;42775:24:::1;:223::i;:::-;42758:240;;43037:12;43019:14;:30;;43011:48;;;::::0;;-1:-1:-1;;;43011:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43011:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;43103:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:26:::1;::::0;;::::1;::::0;43098:54:::1;::::0;6082:6:::1;7477:8;;7489:5;7476:18;43098:4;:54::i;:::-;43080:14;:72;;43072:93;;;::::0;;-1:-1:-1;;;43072:93:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43072:93:0;;;;;;;;;;;;;::::1;;43198:39;43203:9;:17;;;43222:14;43198:4;:39::i;:::-;43178:9;:17;;:59;;;;43250:13;43266:27;43271:12;43285:7;;43266:4;:27::i;:::-;43311:46;::::0;;;;;;;43250:43;;-1:-1:-1;;;;;;43311:46:0;::::1;::::0;43320:10:::1;::::0;43311:46:::1;::::0;;;;;::::1;::::0;;::::1;43370:40;43385:10;43397:12;43370:14;:40::i;:::-;43421:44;43436:28;43441:12;43455:8;43436:4;:28::i;:::-;43421:14;:44::i;:::-;43480:12:::0;;43476:78:::1;;43524:7;::::0;43509:33:::1;::::0;-1:-1:-1;;;;;43524:7:0::1;43533:8:::0;43509:14:::1;:33::i;:::-;43585:81;43620:4;43627:12;43641:8;43651:14;43585:26;:81::i;:::-;43564:102:::0;-1:-1:-1;43677:53:0::1;::::0;-1:-1:-1;43693:8:0;43703:10:::1;43564:102:::0;43677:15:::1;:53::i;:::-;43743:21;;28317:6:::0;:14;;-1:-1:-1;;28317:14:0;;;42444:1328;;-1:-1:-1;;;42444:1328:0:o;51456:305::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;51577:10:::1;-1:-1:-1::0;;;;;51577:21:0;::::1;;::::0;:52:::1;;-1:-1:-1::0;51616:13:0::1;::::0;-1:-1:-1;;;;;51616:13:0::1;51602:10;:27;51577:52;51569:76;;;::::0;;-1:-1:-1;;;51569:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51569:76:0;;;;;;;;;;;;;::::1;;51656:47;51666:7;51675:13;51690:12;;51656:9;:47::i;:::-;51714:39;51730:7;51739:13;51714:15;:39::i;:::-;-1:-1:-1::0;;28317:6:0;:14;;-1:-1:-1;;28317:14:0;;;-1:-1:-1;;51456:305:0:o;51291:157::-;51388:52;51400:10;51412:13;51427:12;;51388:11;:52::i;28740:19::-;;;;:::o;28463:26::-;;;;:::o;41150:1286::-;28252:6;;41282:18;;28252:6;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;41328:9:::1;::::0;28281:13;41328:9:::1;41320:26;;;::::0;;-1:-1:-1;;;41320:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;41320:26:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41365:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;41357:42;;;::::0;;-1:-1:-1;;;41357:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41357:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41440:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:25:::1;;::::0;41435:52:::1;::::0;7420:1:::1;6082:6;7413:8;;41435:4;:52::i;:::-;41418:13;:69;;41410:90;;;::::0;;-1:-1:-1;;;41410:90:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41410:90:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41539:17:0;::::1;41513:23;41539:17:::0;;;:8:::1;:17;::::0;;;;41624:16:::1;::::0;::::1;::::0;41655:15:::1;::::0;;::::1;::::0;41685:12;;41712::::1;::::0;41767:7:::1;::::0;41585:200:::1;::::0;41624:16;41655:15;41685:12;41712;41739:13;;41585:24:::1;:200::i;:::-;41569:216;;41823:16;41806:13;:33;;41798:51;;;::::0;;-1:-1:-1;;;41798:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41798:51:0;;;;;;;;;;;;;::::1;;41881:37;41886:8;:16;;;41904:13;41881:4;:37::i;:::-;41862:16;::::0;::::1;:56:::0;41936:44:::1;::::0;;;;;;;-1:-1:-1;;;;;41936:44:0;::::1;::::0;41945:10:::1;::::0;41936:44:::1;::::0;;;;::::1;::::0;;::::1;41993:29;42008:13;41993:14;:29::i;:::-;42033:51;42049:7;42058:10;42070:13;42033:15;:51::i;:::-;42095:22;42165:80;42192:7;42201:13;42224:4;42231:13;42165:26;:80::i;:::-;42128:117:::0;-1:-1:-1;42128:117:0;-1:-1:-1;42260:21:0;;42256:87:::1;;42302:41;42307:8;:16;;;42325:17;42302:4;:41::i;:::-;42283:16;::::0;::::1;:60:::0;42256:87:::1;42354:41;42369:10;42381:13;42354:14;:41::i;53699:152::-:0;53824:19;;-1:-1:-1;;;;;53789:18:0;;53765:4;53789:18;;;:8;:18;;;;;:32;;;:54;53699:152;;;:::o;28843:19::-;;;;:::o;31405:2104::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;31614:10:::1;::::0;31600::::1;-1:-1:-1::0;;;;;31614:10:0;;::::1;31600:24;31592:44;;;::::0;;-1:-1:-1;;;31592:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31592:44:0;;;;;;;;;;;;;::::1;;31656:9;::::0;::::1;;31655:10;31647:26;;;::::0;;-1:-1:-1;;;31647:26:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31647:26:0;;;;;;;;;;;;;::::1;;6337:12:::0;31694:26;::::1;;31686:46;;;::::0;;-1:-1:-1;;;31686:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31686:46:0;;;;;;;;;;;;;::::1;;6404:9:::0;31751:26;::::1;;31743:46;;;::::0;;-1:-1:-1;;;31743:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31743:46:0;;;;;;;;;;;;;::::1;;31833:8;31808:21;31813:12;;31827:1;31808:4;:21::i;:::-;:33;;31800:52;;;::::0;;-1:-1:-1;;;31800:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31800:52:0;;;;;;;;;;;;;::::1;;31863:7;:18:::0;;;7074:11;31902:46;::::1;;31894:71;;;::::0;;-1:-1:-1;;;31894:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31894:71:0;;;;;;;;;;;;;::::1;;7140:13:::0;31984:46;::::1;;31976:71;;;::::0;;-1:-1:-1;;;31976:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31976:71:0;;;;;;;;;;;;;::::1;;6145:1;32068:45:::0;::::1;;32060:68;;;::::0;;-1:-1:-1;;;32060:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32060:68:0;;;;;;;;;;;;;::::1;;6201:1;32147:44:::0;::::1;32139:67;;;::::0;;-1:-1:-1;;;32139:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32139:67:0;;;;;;;;;;;;;::::1;;32225:41:::0;;::::1;32217:64;;;::::0;;-1:-1:-1;;;32217:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32217:64:0;;;;;;;;;;;;;::::1;;32294:16;32325:25;32364:11:::0;32353:30:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;32353:30:0::1;;32325:58;;32399:6;32394:743;32411:22:::0;;::::1;32394:743;;;32455:13;32471:11;;32483:1;32471:14;;;;;;;;;;;;;-1:-1:-1::0;;;;;32471:14:0::1;32455:30;;32500:11;32514:12;;32527:1;32514:15;;;;;;;;;;;;;32500:29;;32544:12;32566:5;-1:-1:-1::0;;;;;32559:23:0::1;;32591:4;32559:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;32559:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32559:38:0;32612:11;;32559:38;;-1:-1:-1;32559:38:0;;32612:8;;32621:1;;32612:11;::::1;;;;;;::::0;;::::1;::::0;;;;;;:21;;;;-1:-1:-1;;;;;32657:15:0;::::1;;::::0;;;:8:::1;:15:::0;;;;;;:21;::::1;;32656:22;32648:40;;;::::0;;-1:-1:-1;;;32648:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32648:40:0;;;;;;;;;;;;;::::1;;6082:6;32711;:27;;32703:50;;;::::0;;-1:-1:-1;;;32703:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32703:50:0;;;;;;;;;;;;;::::1;;6811:9:::0;32776:27;::::1;;32768:50;;;::::0;;-1:-1:-1;;;32768:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32768:50:0;;;;;;;;;;;;;::::1;;6939:13:::0;32841:29;::::1;;32833:49;;;::::0;;-1:-1:-1;;;32833:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32833:49:0;;;;;;;;;;;;;::::1;;32915:156;::::0;;::::1;::::0;::::1;::::0;;32949:4:::1;32915:156:::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32897:15:0;::::1;-1:-1:-1::0;32897:15:0;;;:8:::1;:15:::0;;;;;;;:174;;;;-1:-1:-1;;32897:174:0::1;::::0;::::1;;;::::0;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;33100:25:::1;33105:11:::0;32915:156;33100:4:::1;:25::i;:::-;33086:39:::0;-1:-1:-1;;32435:3:0::1;::::0;;::::1;::::0;-1:-1:-1;32394:743:0::1;::::0;-1:-1:-1;32394:743:0::1;;-1:-1:-1::0;6875:9:0;33155:38;::::1;;33147:62;;;::::0;;-1:-1:-1;;;33147:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33147:62:0;;;;;;;;;;;;;::::1;;33220:12;:26:::0;;;33257:21:::1;:7;33267:11:::0;;33257:21:::1;:::i;:::-;-1:-1:-1::0;33289:9:0::1;:16:::0;;-1:-1:-1;;33289:16:0::1;33301:4;33289:16;::::0;;33316:31:::1;33331:15:::0;33316:14:::1;:31::i;:::-;33358:43;33373:10;33385:15;33358:14;:43::i;:::-;33417:84;33430:7;;33439:15;33456:7;;33465:11;;33478:12;;33492:8;33417:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;33417:84:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;33417:84:0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;33417:84:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;-1:-1:-1;33417:84:0;::::1;::::0;;;;;;;::::1;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;28317:6:0;:14;;-1:-1:-1;;28317:14:0;;;-1:-1:-1;;;;;;31405:2104:0:o;15897:397::-;16008:10;15964:4;15997:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15997:27:0;;;;;;;;;;16039:14;;;16035:160;;;16081:10;16100:1;16070:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16070:27:0;;;;;;;;;:31;16035:160;;;16164:19;16169:8;16179:3;16164:4;:19::i;:::-;16145:10;16134:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16134:27:0;;;;;;;;;:49;16035:160;16219:10;16236:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16210:54:0;;16236:27;;;;;;;;;;;16210:54;;;;;;;;;16219:10;-1:-1:-1;;;;;;;;;;;16210:54:0;;;;;;;;;;-1:-1:-1;16282:4:0;;15897:397;-1:-1:-1;;;15897:397:0:o;49808:1076::-;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;50055:14:::1;:21:::0;50079:1:::1;-1:-1:-1::0;50047:55:0::1;;;::::0;;-1:-1:-1;;;50047:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50047:55:0;;;;;;;;;;;;;::::1;;50143:16;50121:18;:38;;50113:58;;;::::0;;-1:-1:-1;;;50113:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50113:58:0;;;;;;;;;;;;;::::1;;50212:11;50197:12;:26;50196:57;;50242:11;50196:57;;;50227:12;50196:57;50182:71;;50286:15;50272:11;:29;50264:48;;;::::0;;-1:-1:-1;;;50264:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50264:48:0;;;;;;;;;;;;;::::1;;50323:14;:12;:14::i;:::-;50368:507;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;50368:507:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;50368:507:0;;;;;;;;;;;;;;;;;;;;;;;;50788:37;;;::::1;50368:507:::0;;;;;;;;;;;;50348:14:::1;:528:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;50348:528:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49808:1076::o;54855:2330::-;54931:18;54944:4;54931:12;:18::i;:::-;-1:-1:-1;;;;;54984:18:0;;54960:21;54984:18;;;:8;:18;;;;;55049:14;:20;;54984:18;;54960:21;55049:20;;;;;;;;;;;;;;;;;;55162:21;;;;;:15;;;:21;;;;;;;55049:20;;;;;;55118:28;;;;55102:11;;55049:20;;-1:-1:-1;55102:82:0;;55162:21;55102:55;;55152:4;;55102:45;;:15;:45::i;:55::-;:59;;:82::i;:::-;55221:28;;;;55080:104;;-1:-1:-1;55264:22:0;;55260:1432;;55322:10;:26;;;55307:12;:41;55303:1378;;;55416:29;;;55369:18;55416:29;;;:23;;;:29;;;;;;;;;55390:15;;;:21;;;;;;:56;;:25;:56::i;:::-;55369:77;-1:-1:-1;55469:17:0;;55465:219;;55528:33;:14;55547:13;55528:18;:33::i;:::-;55616:29;;;;;;;:23;;;:29;;;;;;55511:50;;-1:-1:-1;55616:48:0;;55650:13;55616:33;:48::i;:::-;55584:29;;;;;;;:23;;;:29;;;;;:80;55465:219;55303:1378;;;;55728:18;;55724:283;;55771:14;55788:47;55831:3;55788:38;:14;55807:18;55788;:38::i;:47::-;55771:64;-1:-1:-1;55875:29:0;:14;55771:64;55875:18;:29::i;:::-;55951:21;;;;;;;:15;;;:21;;;;;;55858:46;;-1:-1:-1;55951:36:0;;55977:9;55951:25;:36::i;:::-;55927:21;;;;;;;:15;;;:21;;;;;:60;-1:-1:-1;55724:283:0;56044:10;:28;;;56029:12;:43;56025:641;;;56097:16;56116:108;56194:10;:29;;;56116:73;56142:46;56159:10;:28;;;56142:12;:16;;:46;;;;:::i;:::-;56116:21;;;;;;;:15;;;:21;;;;;;;:25;:73::i;:108::-;56274:29;;;56247:24;56274:29;;;:23;;;:29;;;;;;56097:127;;-1:-1:-1;56330:33:0;;;56326:321;;;56392:18;56413:36;:11;56429:19;56413:15;:36::i;:::-;56392:57;-1:-1:-1;56508:38:0;:19;56392:57;56508:23;:38::i;:::-;56476:29;;;;;;;:23;;;:29;;;;;:70;56590:33;:14;56609:13;56590:18;:33::i;:::-;56573:50;;56326:321;;56025:641;;;56706:18;;56702:476;;56772:28;;;;;;;:22;;;:28;;;;;;:48;;56805:14;56772:32;:48::i;:::-;56741:28;;;;;;;:22;;;:28;;;;;:79;56865:27;;;;:47;;56897:14;56865:31;:47::i;:::-;56835:27;;;:77;56927:10;;56951:22;;56927:73;;;-1:-1:-1;;;56927:73:0;;-1:-1:-1;;;;;56951:22:0;;;56927:73;;;;;;;;;;;;;;;;;;;:10;;;;;:23;;:73;;;;;:10;;:73;;;;;;;:10;;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57020:42:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57020:42:0;;;-1:-1:-1;57020:42:0;;-1:-1:-1;57020:42:0;;;;;;;;;57101:65;57161:4;57101:55;57117:14;57132:4;57117:20;;;;;;;;;;;;;;;;;;:38;:20;;;;;:38;;57101:11;;;:15;:55::i;:65::-;57077:21;;;;;;;:15;;;:21;;;;;:89;56702:476;54855:2330;;;;;;:::o;15214:109::-;-1:-1:-1;;;;;15301:14:0;15277:4;15301:14;;;;;;;;;;;;15214:109::o;48760:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48760:38:0;;;;-1:-1:-1;48760:38:0;;;;;;;;;;;;;;;:::o;50892:391::-;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;51013:18:::1;51026:4;51013:12;:18::i;:::-;51042:33;51078:14;51093:4;51078:20;;;;;;;;;;;;;;;;;;;;51042:56;;51133:10;:25;;;51117:12;:41;;51109:58;;;::::0;;-1:-1:-1;;;51109:58:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;51109:58:0;;;;;;;;;;;;;::::1;;51178:25;::::0;::::1;:43:::0;;;;51232:25:::1;::::0;;::::1;:43:::0;-1:-1:-1;50892:391:0:o;25802:1312::-;26070:19;26107:21;26131:33;26136:14;26152:11;26131:4;:33::i;:::-;26107:57;;26272:29;26304:46;26309:12;26323:26;6082:6;26341:7;26323:4;:26::i;:::-;26304:4;:46::i;:::-;26272:78;;26361:18;26382:42;26387:10;26399:24;26382:4;:42::i;:::-;26361:63;;26435:14;26452:31;26457:13;26472:10;26452:4;:31::i;:::-;26435:48;;26556:18;26577:52;26582:9;26593:35;6082:6;26611:16;26593:4;:35::i;:::-;26577:4;:52::i;:::-;26556:73;;26640:23;26666:36;26671:13;26686:15;26666:4;:36::i;:::-;26640:62;;26715:32;26750:41;26755:15;26772:18;26750:4;:41::i;:::-;26715:76;;26928:8;26939:50;26944:35;6082:6;26962:16;26944:4;:35::i;:::-;26981:7;26939:4;:50::i;:::-;26928:61;;27017:57;27022:27;27051:22;6082:6;27069:3;27051:4;:22::i;27017:57::-;27000:74;;27085:21;;;;;;;;25802:1312;;;;;;;;;:::o;38989:2153::-;28252:6;;39198:18;;;;28252:6;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;-1:-1:-1;;;;;39263:17:0;::::1;28281:13:::0;39263:17;;;:8:::1;:17;::::0;;;;:23;28281:13;39263:23:::1;39255:42;;;::::0;;-1:-1:-1;;;39255:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39255:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;39316:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;39308:43;;;::::0;;-1:-1:-1;;;39308:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39308:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;39390:26:0;;::::1;39364:23;39390:26:::0;;;:8:::1;:26;::::0;;;;;39454:27;;::::1;::::0;;;;39525:17:::1;::::0;;::::1;::::0;39520:45:::1;::::0;6082:6:::1;7477:8;::::0;39520:45:::1;39502:14;:63;;39494:84;;;::::0;;-1:-1:-1;;;39494:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39494:84:0;;;;;;;;;;;;;::::1;;39591:20;39614:170;39642:8;:16;;;39673:8;:15;;;39703:9;:17;;;39735:9;:16;;;39766:7;;39614:13;:170::i;:::-;39591:193;;39822:8;39803:15;:27;;39795:51;;;::::0;;-1:-1:-1;;;39795:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39795:51:0;;;;;;;;;;;;;::::1;;39875:200;39904:8;:16;;;39935:8;:15;;;39965:9;:17;;;39997:9;:16;;;40028:14;40057:7;;39875:14;:200::i;:::-;39859:216;;40111:11;40094:13;:28;;40086:47;;;::::0;;-1:-1:-1;;;40086:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40086:47:0;;;;;;;;;;;;;::::1;;40165:37;40170:8;:16;;;40188:13;40165:4;:37::i;:::-;40146:8;:16;;:56;;;;40233:39;40238:9;:17;;;40257:14;40233:4;:39::i;:::-;40213:17;::::0;;::::1;:59:::0;;;40330:16;::::1;::::0;40361:15:::1;::::0;;::::1;::::0;40423:16;;::::1;::::0;40454:7:::1;::::0;40302:170:::1;::::0;40213:59;40423:16;40302:13:::1;:170::i;:::-;40285:187;;40509:15;40491:14;:33;;40483:52;;;::::0;;-1:-1:-1;;;40483:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40483:52:0;;;;;;;;;;;;;::::1;;40572:8;40554:14;:26;;40546:48;;;::::0;;-1:-1:-1;;;40546:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40546:48:0;;;;;;;;;;;;;::::1;;40632:35;40637:13;40652:14;40632:4;:35::i;:::-;40613:15;:54;;40605:73;;;::::0;;-1:-1:-1;;;40605:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40605:73:0;;;;;;;;;;;;;::::1;;40726:8;-1:-1:-1::0;;;;;40696:70:0::1;40717:7;-1:-1:-1::0;;;;;40696:70:0::1;40705:10;-1:-1:-1::0;;;;;40696:70:0::1;;40736:13;40751:14;40696:70;;;;;;;;;;;;;;;;;;;;;;;;40779:51;40795:7;40804:10;40816:13;40779:15;:51::i;:::-;40841:53;40857:8;40867:10;40879:14;40841:15;:53::i;:::-;40905:24;40932:49;40958:7;40967:13;40932:25;:49::i;:::-;40905:76:::0;-1:-1:-1;40996:23:0;;40992:91:::1;;41040:43;41045:8;:16;;;41063:19;41040:4;:43::i;:::-;41021:16;::::0;::::1;:62:::0;40992:91:::1;41096:38;;;;28317:6:::0;:14;;-1:-1:-1;;28317:14:0;;;38989:2153;;;;-1:-1:-1;38989:2153:0;-1:-1:-1;;;;38989:2153:0:o;36760:2221::-;28252:6;;36968:19;;;;28252:6;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;-1:-1:-1;;;;;37036:17:0;::::1;28281:13:::0;37036:17;;;:8:::1;:17;::::0;;;;:23;28281:13;37036:23:::1;37028:42;;;::::0;;-1:-1:-1;;;37028:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37028:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37089:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;37081:43;;;::::0;;-1:-1:-1;;;37081:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37081:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37163:26:0;;::::1;37137:23;37163:26:::0;;;:8:::1;:26;::::0;;;;;37227:27;;::::1;::::0;;;;37297:16:::1;::::0;::::1;::::0;37292:43:::1;::::0;7420:1:::1;6082:6;7413:8;::::0;37292:43:::1;37275:13;:60;;37267:81;;;::::0;;-1:-1:-1;;;37267:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37267:81:0;;;;;;;;;;;;;::::1;;37361:20;37384:170;37412:8;:16;;;37443:8;:15;;;37473:9;:17;;;37505:9;:16;;;37536:7;;37384:13;:170::i;:::-;37361:193;;37592:8;37573:15;:27;;37565:51;;;::::0;;-1:-1:-1;;;37565:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37565:51:0;;;;;;;;;;;;;::::1;;37646:199;37675:8;:16;;;37706:8;:15;;;37736:9;:17;;;37768:9;:16;;;37799:13;37827:7;;37646:14;:199::i;:::-;37629:216;;37882:12;37864:14;:30;;37856:48;;;::::0;;-1:-1:-1;;;37856:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37856:48:0;;;;;;;;;;;;;::::1;;37936:37;37941:8;:16;;;37959:13;37936:4;:37::i;:::-;37917:8;:16;;:56;;;;38004:39;38009:9;:17;;;38028:14;38004:4;:39::i;:::-;37984:17;::::0;;::::1;:59:::0;;;38101:16;::::1;::::0;38132:15:::1;::::0;;::::1;::::0;38194:16;;::::1;::::0;38225:7:::1;::::0;38073:170:::1;::::0;37984:59;38194:16;38073:13:::1;:170::i;:::-;38056:187;;38280:15;38262:14;:33;;38254:52;;;::::0;;-1:-1:-1;;;38254:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38254:52:0;;;;;;;;;;;;;::::1;;38343:8;38325:14;:26;;38317:48;;;::::0;;-1:-1:-1;;;38317:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38317:48:0;;;;;;;;;;;;;::::1;;38403:35;38408:13;38423:14;38403:4;:35::i;:::-;38384:15;:54;;38376:73;;;::::0;;-1:-1:-1;;;38376:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38376:73:0;;;;;;;;;;;;;::::1;;38497:8;-1:-1:-1::0;;;;;38467:70:0::1;38488:7;-1:-1:-1::0;;;;;38467:70:0::1;38476:10;-1:-1:-1::0;;;;;38467:70:0::1;;38507:13;38522:14;38467:70;;;;;;;;;;;;;;;;;;;;;;;;38550:51;38566:7;38575:10;38587:13;38550:15;:51::i;:::-;38612:22;38683:76;38710:7;38719:13;38734:8;38744:14;38683:26;:76::i;:::-;38645:114:::0;-1:-1:-1;38645:114:0;-1:-1:-1;38774:21:0;;38770:87:::1;;38816:41;38821:8;:16;;;38839:17;38816:4;:41::i;:::-;38797:16;::::0;::::1;:60:::0;38770:87:::1;38868:53;38884:8;38894:10;38906:14;38868:15;:53::i;60815:803::-:0;60867:33;60903:14;60918:4;60903:20;;;;;;;;;;;;;;;;;;;;60867:56;;60934:30;60982:10;:25;;;60967:12;:40;:83;;61038:12;60967:83;;;61010:10;:25;;;60967:83;60934:116;;61093:10;:26;;;61065:25;:54;61061:550;;;61136:13;61152:24;61170:4;61152:9;:24::i;:::-;61136:40;-1:-1:-1;61195:12:0;;61191:340;;61228:15;61246:57;61276:10;:26;;;61246:25;:29;;:57;;;;:::i;:::-;61228:75;;61322:23;61348:65;61404:8;61348:51;61394:4;61348:41;61363:10;:25;;;61348:10;:14;;:41;;;;:::i;:::-;:45;;:51::i;:65::-;61463:28;;;;61322:91;;-1:-1:-1;61463:52:0;;61322:91;61463:32;:52::i;:::-;61432:28;;;:83;-1:-1:-1;;61191:340:0;-1:-1:-1;61545:26:0;;;;;:54;-1:-1:-1;60815:803:0:o;23500:1183::-;23744:18;24031:21;24055:32;24060:13;24075:11;24055:4;:32::i;:::-;24031:56;;24098:8;24109:50;24114:35;6082:6;24132:16;24114:4;:35::i;:::-;24151:7;24109:4;:50::i;:::-;24098:61;;24170:26;24199:43;24204:13;24219:22;6082:6;24237:3;24219:4;:22::i;24199:43::-;24170:72;;24255:22;24280:43;24285:14;24301:21;24280:4;:43::i;:::-;24255:68;;24334:17;24354:39;24359:17;24378:14;24354:4;:39::i;:::-;24334:59;;24474:14;24491:36;24496:12;24510:16;24491:4;:36::i;:::-;24474:53;;24538:18;24559:27;24564:9;24575:10;24559:4;:27::i;:::-;24538:48;;24613:31;24618:13;24633:10;24613:4;:31::i;:::-;24597:47;23500:1183;-1:-1:-1;;;;;;;;;;;;;;23500:1183:0:o;49313:117::-;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;49398:10:::1;:24:::0;;-1:-1:-1;;;;;;49398:24:0::1;-1:-1:-1::0;;;;;49398:24:0;;;::::1;::::0;;;::::1;::::0;;49313:117::o;33594:194::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;-1:-1:-1;;;;;33673:15:0;::::1;28281:13:::0;33673:15;;;:8:::1;:15;::::0;;;;:21;28281:13;33673:21:::1;33665:40;;;::::0;;-1:-1:-1;;;33665:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33665:40:0;;;;;;;;;;;;;::::1;;33742:38;::::0;;-1:-1:-1;;;33742:38:0;;33774:4:::1;33742:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;33742:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33742:38:0;-1:-1:-1;;;;;33716:15:0;;::::1;;::::0;;;:8:::1;33742:38;33716:15:::0;;;;:23:::1;;:64:::0;28317:6;:14;;-1:-1:-1;;28317:14:0;;;33594:194::o;31224:173::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;31332:10:::1;::::0;31318::::1;-1:-1:-1::0;;;;;31332:10:0;;::::1;31318:24;31310:44;;;::::0;;-1:-1:-1;;;31310:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31310:44:0;;;;;;;;;;;;;::::1;;31365:10;:24:::0;;-1:-1:-1;;;;;;31365:24:0::1;-1:-1:-1::0;;;;;31365:24:0;;;::::1;::::0;;;::::1;::::0;;28317:6;:14;;-1:-1:-1;;28317:14:0;;;31224:173::o;30611:136::-;28389:6;;30698:4;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;30727:12:0::1;::::0;30611:136;:::o;30396:207::-;28389:6;;30491:4;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30523:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;30515:40;;;::::0;;-1:-1:-1;;;30515:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30515:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;30573:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;;30396:207::o;14892:87::-;14964:7;14957:14;;;;;;;;-1:-1:-1;;14957:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14931:13;;14957:14;;14964:7;;14957:14;;14964:7;14957:14;;;;;;;;;;;;;;;;;;;;;;;;49567:233;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;49689:7:::1;49666:19;;:30;;49659:38;;;;49750:19;:42:::0;49567:233::o;18539:523::-;18751:14;18783:10;18796:35;18801:14;18817:13;18796:4;:35::i;:::-;18783:48;;18842:10;18855:37;18860:15;18877:14;18855:4;:37::i;:::-;18842:50;;18903:10;18916:18;18921:5;18928;18916:4;:18::i;:::-;18903:31;;18945:10;18958:45;6082:6;18976:26;6082:6;18994:7;18976:4;:26::i;:::-;18958:4;:45::i;:::-;18945:58;;19035:18;19040:5;19047;19035:4;:18::i;:::-;19023:30;18539:523;-1:-1:-1;;;;;;;;;;18539:523:0:o;52807:333::-;52865:12;52880:24;52898:4;52880:9;:24::i;:::-;52865:39;;52915:35;52930:10;52942:7;52915:14;:35::i;:::-;52961:11;52975:24;52993:4;52975:9;:24::i;:::-;52961:38;;53020:21;53025:6;53033:7;53020:4;:21::i;:::-;53010:31;;53096:36;53112:10;53124:7;53096:15;:36::i;16302:142::-;16370:4;16387:27;16393:10;16405:3;16410;16387:5;:27::i;:::-;-1:-1:-1;16432:4:0;16302:142;;;;:::o;59130:1457::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;59242:9:::1;::::0;28281:13;59242:9:::1;59234:26;;;::::0;;-1:-1:-1;;;59234:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;59234:26:0;;;;;;;;;;;;;::::1;;59273:16;59292:13;:11;:13::i;:::-;59273:32;;59316:13;59332:27;59337:12;59351:7;;59332:4;:27::i;:::-;59316:43;;59370:20;59393:28;59398:12;59412:8;59393:4;:28::i;:::-;59370:51;;59432:10;59445:34;59450:15;59467:11;59445:4;:34::i;:::-;59432:47:::0;-1:-1:-1;59498:10:0;59490:29:::1;;;::::0;;-1:-1:-1;;;59490:29:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59490:29:0;;;;;;;;;;;;;::::1;;59532:20;59555:21;59565:10;59555:9;:21::i;:::-;59532:44;;59609:12;59591:15;:30;59587:291;;;59638:20;59661:35;59666:12;59680:15;59661:4;:35::i;:::-;59741:10;59711:18;59732:20:::0;;;:8:::1;:20;::::0;;;;:27;59638:58;;-1:-1:-1;59782:32:0;;::::1;;59774:52;;;::::0;;-1:-1:-1;;;59774:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59774:52:0;;;;;;;;;;;;;::::1;;59841:25;59850:15;59841:8;:25::i;:::-;59587:291;;;59890:40;59905:10;59917:12;59890:14;:40::i;:::-;59945:12:::0;;59941:78:::1;;59989:7;::::0;59974:33:::1;::::0;-1:-1:-1;;;;;59989:7:0::1;59998:8:::0;59974:14:::1;:33::i;:::-;60029:31;60044:15;60029:14;:31::i;:::-;60078:6;60073:507;60094:7;:14:::0;60090:18;::::1;60073:507;;;60130:9;60142:7;60150:1;60142:10;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;60142:10:0::1;60178:11:::0;;;:8:::1;:11:::0;;;;;;:19:::1;;::::0;60142:10;;-1:-1:-1;60178:19:0;60234:16:::1;60239:5:::0;60178:19;60234:4:::1;:16::i;:::-;60212:38:::0;-1:-1:-1;60273:19:0;60265:38:::1;;;::::0;;-1:-1:-1;;;60265:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;60265:38:0;;;;;;;;;;;;;::::1;;60344:13;;60358:1;60344:16;;;;;;;;;;;;;60326:14;:34;;60318:52;;;::::0;;-1:-1:-1;;;60318:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;60318:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;60412:11:0;::::1;;::::0;;;:8:::1;:11;::::0;;;;:19:::1;;::::0;60407:41:::1;::::0;60433:14;60407:4:::1;:41::i;:::-;-1:-1:-1::0;;;;;60385:11:0;::::1;;::::0;;;:8:::1;:11;::::0;;;;;;;;:19:::1;;:63:::0;;;;60468:39;;;;;;;60385:11;;60477:10:::1;::::0;60468:39:::1;::::0;;;;;;;;::::1;60522:46;60538:1;60541:10;60553:14;60522:15;:46::i;:::-;-1:-1:-1::0;;;60110:3:0::1;;60073:507;;;-1:-1:-1::0;;28317:6:0;:14;;-1:-1:-1;;28317:14:0;;;-1:-1:-1;;;;;;;59130:1457:0:o;28869:21::-;;;;;;:::o;20080:697::-;20322:19;20359:16;20378:35;20383:13;20398:14;20378:4;:35::i;:::-;20359:54;;20424:15;20442:26;6082:6;20460:7;20442:4;:26::i;:::-;20424:44;;20492:31;20497:13;20512:10;20492:4;:31::i;:::-;20479:44;;20534:6;20543:54;20548:14;20564:32;20569:14;20585:10;20564:4;:32::i;20543:54::-;20534:63;;20608:8;20619:20;20624:1;20627:11;20619:4;:20::i;:::-;20608:31;;20650:8;20661:22;6082:6;20679:3;20661:4;:22::i;:::-;20650:33;;20711:26;20716:15;20733:3;20711:4;:26::i;:::-;20694:43;20080:697;-1:-1:-1;;;;;;;;;;;;20080:697:0:o;30213:175::-;28389:6;;30288:23;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;30337:9:::1;::::0;::::1;;30329:26;;;::::0;;-1:-1:-1;;;30329:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;30329:26:0;;;;;;;;;;;;;::::1;;30373:7;30366:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;30366:14:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;30213:175:::0;:::o;57193:936::-;-1:-1:-1;;;;;57326:18:0;;57276:13;57326:18;;;:8;:18;;;;;57391:14;:20;;57276:13;;57391:14;:20;;;;;;;;;;;;;;;;;;;;57355:56;;57422:23;57448:10;:28;;;57422:54;;57487:13;57503:24;57521:4;57503:9;:24::i;:::-;57487:40;;57538:30;57586:10;:25;;;57571:12;:40;:83;;57642:12;57571:83;;;57614:10;:25;;;57571:83;57538:116;;57697:10;:26;;;57669:25;:54;:71;;;;-1:-1:-1;57727:13:0;;;57669:71;57665:363;;;57757:15;57775:57;57805:10;:26;;;57775:25;:29;;:57;;;;:::i;:::-;57757:75;;57847:23;57873:65;57929:8;57873:51;57919:4;57873:41;57888:10;:25;;;57873:10;:14;;:41;;;;:::i;:65::-;57847:91;-1:-1:-1;57974:42:0;:18;57847:91;57974:22;:42::i;:::-;57953:63;;57665:363;;;58099:21;;;;;;;:15;;;:21;;;;;;58049:11;;:72;;58099:21;58049:45;;58089:4;;58049:35;;58065:18;58049:15;:35::i;:72::-;58038:83;57193:936;-1:-1:-1;;;;;;;;57193:936:0:o;28496:22::-;;;-1:-1:-1;;;;;28496:22:0;;:::o;48847:28::-;;;-1:-1:-1;;;;;48847:28:0;;:::o;30070:135::-;28389:6;;30142:23;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;29954:108;30040:7;:14;29954:108;:::o;15637:252::-;15767:10;15704:4;15756:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15756:27:0;;;;;;;;;;15751:38;;15785:3;15751:4;:38::i;:::-;15732:10;15721:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15721:27:0;;;;;;;;;;;;:68;;;15805:54;;;;;;15721:27;;-1:-1:-1;;;;;;;;;;;15805:54:0;;;;;;;;;;-1:-1:-1;15877:4:0;15637:252;;;;:::o;58200:444::-;58291:10;58258:21;58282:20;;;:8;:20;;;;;58328:11;;58282:20;;58350:35;;58328:11;58350:14;:35::i;:::-;58410:1;58396:15;;;58453:14;:21;;58486:106;58514:16;58507:23;;:4;:23;;;58486:106;;;58555:21;;;58579:1;58555:21;;;:15;;;;:21;;;;;:25;;;;58532:6;58486:106;;;-1:-1:-1;58607:29:0;;;;;;;;58616:10;;58607:29;;;;;;;;;;58200:444;;;:::o;15077:129::-;-1:-1:-1;;;;;15178:15:0;;;15154:4;15178:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;15077:129::o;29591:232::-;29653:9;;;;29652:10;29644:26;;;;;-1:-1:-1;;;29644:26:0;;;;;;;;;;;;-1:-1:-1;;;29644:26:0;;;;;;;;;;;;;;;29703:7;;-1:-1:-1;;;;;29703:7:0;29689:10;:21;29681:39;;;;;-1:-1:-1;;;29681:39:0;;;;;;;;;;;;-1:-1:-1;;;29681:39:0;;;;;;;;;;;;;;;6676:11;29739:31;;;29731:55;;;;;-1:-1:-1;;;29731:55:0;;;;;;;;;;;;-1:-1:-1;;;29731:55:0;;;;;;;;;;;;;;;29797:7;:18;29591:232::o;49438:121::-;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;49521:13:::1;:30:::0;;-1:-1:-1;;;;;;49521:30:0::1;-1:-1:-1::0;;;;;49521:30:0;;;::::1;::::0;;;::::1;::::0;;49438:121::o;28766:24::-;;;;:::o;48807:33::-;;;-1:-1:-1;;;;;48807:33:0;;:::o;30755:256::-;28389:6;;30848:4;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30880:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;30872:40;;;::::0;;-1:-1:-1;;;30872:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30872:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;30937:15:0;::::1;30923:11;30937:15:::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;30990:12:::1;::::0;30977:26:::1;::::0;30937:22;;30977:4:::1;:26::i;:::-;30970:33:::0;30755:256;-1:-1:-1;;;30755:256:0:o;60595:212::-;60668:14;:21;60637:22;60701:99;60729:16;60722:23;;:4;:23;;;60701:99;;;60770:18;60783:4;60770:12;:18::i;:::-;60747:6;;60701:99;;;;60595:212;:::o;28573:25::-;;;-1:-1:-1;;;;;28573:25:0;;:::o;51769:213::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;51872:50:::1;51882:10;51894:13:::0;51909:12;;51872:9:::1;:50::i;:::-;51933:41;51948:10;51960:13;51933:14;:41::i;:::-;-1:-1:-1::0;;28317:6:0;:14;;-1:-1:-1;;28317:14:0;;;-1:-1:-1;51769:213:0:o;31019:197::-;28389:6;;31103:4;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31135:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;31127:40;;;::::0;;-1:-1:-1;;;31127:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31127:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;31185:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:23:::1;;::::0;;31019:197::o;21795:686::-;22038:18;22074:16;22093:35;22098:14;22114:13;22093:4;:35::i;:::-;22074:54;;22139:9;22151:37;22156:15;22173:14;22151:4;:37::i;:::-;22139:49;;22199:6;22208:27;22213:15;22230:4;22208;:27::i;:::-;22199:36;;22246:8;22257:20;22262:1;22265:11;22257:4;:20::i;:::-;22246:31;;22294:22;22299:3;6082:6;22294:4;:22::i;:::-;22288:28;;22343:26;6082:6;22361:7;22343:4;:26::i;:::-;22327:42;;22396:46;22401:25;22406:14;22422:3;22401:4;:25::i;:::-;22428:13;22396:4;:46::i;:::-;22380:62;21795:686;-1:-1:-1;;;;;;;;;;;21795:686:0:o;14144:257::-;-1:-1:-1;;;;;14223:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;14223:20:0;14215:37;;;;;-1:-1:-1;;;14215:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;14215:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14284:13:0;;:8;:13;;;;;;;;;;;14279:24;;14299:3;14279:4;:24::i;:::-;-1:-1:-1;;;;;14263:13:0;;;:8;:13;;;;;;;;;;;:40;;;;14335:13;;;;;;;14330:24;;14350:3;14330:4;:24::i;:::-;-1:-1:-1;;;;;14314:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;14370:23;;;;;;;14314:13;;14370:23;;;;;;;;;;;;;14144:257;;;:::o;8614:198::-;8685:4;8708:6;8716:9;8729:14;8738:1;8741;8729:8;:14::i;:::-;8707:36;;;;8763:4;8762:5;8754:31;;;;;-1:-1:-1;;;8754:31:0;;;;;;;;;;;;-1:-1:-1;;;8754:31:0;;;;;;;;;;;;;;;-1:-1:-1;8803:1:0;8614:198;-1:-1:-1;;;8614:198:0:o;902:181::-;960:7;992:5;;;1016:6;;;;1008:46;;;;;-1:-1:-1;;;1008:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2256:471;2314:7;2559:6;2555:47;;-1:-1:-1;2589:1:0;2582:8;;2555:47;2626:5;;;2630:1;2626;:5;:1;2650:5;;;;;:10;2642:56;;;;-1:-1:-1;;;2642:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3203:132;3261:7;3288:39;3292:1;3295;3288:39;;;;;;;;;;;;;;;;;:3;:39::i;44874:104::-;44953:17;44959:2;44963:6;44953:5;:17::i;9051:317::-;9122:4;9154:5;;;9178:6;;;:21;;;9198:1;9193;9188:2;:6;;;;;;:11;9178:21;9170:46;;;;;-1:-1:-1;;;9170:46:0;;;;;;;;;;;;-1:-1:-1;;;9170:46:0;;;;;;;;;;;;;;;9243:15;9237:22;;9278:8;;;;9270:33;;;;;-1:-1:-1;;;9270:33:0;;;;;;;;;;;;-1:-1:-1;;;9270:33:0;;;;;;;;;;;;;;;9314:7;6082:6;9324:2;:16;;;9051:317;-1:-1:-1;;;;;;9051:317:0:o;44758:108::-;44839:19;44845:4;44851:6;44839:5;:19::i;45082:88::-;45149:13;45155:6;45149:5;:13::i;:::-;45082:88;:::o;45178:1024::-;45445:12;;45312:21;;45415:15;;45445:16;45441:754;;45514:7;;45504:35;;;-1:-1:-1;;;45504:35:0;;;;45478:23;;-1:-1:-1;;;;;45514:7:0;;45504:33;;:35;;;;;;;;;;;;;;45514:7;45504:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45504:35:0;;-1:-1:-1;;;;;;45558:27:0;;;;;;;45554:630;;;45625:53;45630:34;45635:14;45651:12;;45630:4;:34::i;:::-;6082:6;45625:4;:53::i;:::-;45723:7;;45606:72;;-1:-1:-1;45697:52:0;;45713:8;;-1:-1:-1;;;;;45723:7:0;45606:72;45697:15;:52::i;:::-;45773:46;;;;;;;;-1:-1:-1;;;;;45773:46:0;;;;;;;;;;;;;45554:630;;;45860:24;45887:54;45892:35;45897:15;45914:12;;45892:4;:35::i;45887:54::-;45987:7;;45860:81;;-1:-1:-1;45960:56:0;;45976:9;;-1:-1:-1;;;;;45987:7:0;45860:81;45960:15;:56::i;:::-;46052:42;46057:15;46074:19;46052:4;:42::i;:::-;46118:50;;;;;;;;46035:59;;-1:-1:-1;;;;;;46118:50:0;;;;;;;;;;;;45554:630;;45441:754;;45178:1024;;;;;;;:::o;44403:347::-;44607:46;;;-1:-1:-1;;;;;44607:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44607:46:0;-1:-1:-1;;;44607:46:0;;;44596:58;;;;44561:12;;44575:17;;44596:10;;;;44607:46;44596:58;;;44607:46;44596:58;;44607:46;44596:58;;;;;;;;;;-1:-1:-1;;44596:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44560:94;;;;44673:7;:57;;;;-1:-1:-1;44685:11:0;;:16;;:44;;;44716:4;44705:24;;;;;;;;;;;;;;;-1:-1:-1;44705:24:0;44685:44;44665:77;;;;;-1:-1:-1;;;44665:77:0;;;;;;;;;;;;-1:-1:-1;;;44665:77:0;;;;;;;;;;;;;;;44403:347;;;;;:::o;51990:809::-;52104:9;;;;52096:26;;;;;-1:-1:-1;;;52096:26:0;;;;;;;;;;;;;;;-1:-1:-1;;;52096:26:0;;;;;;;;;;;;;;;52135:16;52154:13;:11;:13::i;:::-;52135:32;;52178:10;52191:32;52196:13;52211:11;52191:4;:32::i;:::-;52178:45;-1:-1:-1;52242:10:0;52234:29;;;;;-1:-1:-1;;;52234:29:0;;;;;;;;;;;;-1:-1:-1;;;52234:29:0;;;;;;;;;;;;;;;52281:6;52276:476;52297:7;:14;52293:18;;52276:476;;;52333:9;52345:7;52353:1;52345:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52345:10:0;52381:11;;;:8;:11;;;;;;:19;;;52345:10;;-1:-1:-1;52381:19:0;52436:16;52441:5;52381:19;52436:4;:16::i;:::-;52415:37;-1:-1:-1;52475:18:0;;;;;:54;;;52514:12;;52527:1;52514:15;;;;;;;;;;;;;52497:13;:32;;52475:54;52467:81;;;;;-1:-1:-1;;;52467:81:0;;;;;;;;;;;;-1:-1:-1;;;52467:81:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52590:11:0;;;;;;:8;:11;;;;;:19;;;52585:40;;52611:13;52585:4;:40::i;:::-;-1:-1:-1;;;;;52563:11:0;;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;52645:35;;;;;;;52563:11;;52645:35;;;;;;;;;;;;;52695:45;52711:1;52714:10;52726:13;52695:15;:45::i;:::-;-1:-1:-1;;;52313:3:0;;52276:476;;;;52762:29;52777:13;52762:14;:29::i;53148:543::-;-1:-1:-1;;;;;53249:18:0;;53225:21;53249:18;;;:8;:18;;;;;53278:23;53258:8;53278:13;:23::i;:::-;53326:11;;:24;;53342:7;53326:15;:24::i;:::-;53312:38;;53392:14;:21;53312:11;53425:170;53453:16;53446:23;;:4;:23;;;53425:170;;;53518:65;53578:4;53518:55;53534:14;53549:4;53534:20;;;;;;;;;53518:65;53494:21;;;;;;;:15;;;;:21;;;;;;:89;;;;53471:6;53425:170;;;-1:-1:-1;53626:15:0;53605:18;;;:36;53657:26;;;;;;;;-1:-1:-1;;;;;53657:26:0;;;;;;;;;;;;;53148:543;;;;:::o;8430:176::-;8501:4;8532:5;;;8556:6;;;;8548:31;;;;;-1:-1:-1;;;8548:31:0;;;;;;;;;;;;-1:-1:-1;;;8548:31:0;;;;;;;;;;;;;;44986:88;45053:13;45059:6;45053:5;:13::i;44022:373::-;44235:63;;;-1:-1:-1;;;;;44235:63:0;;;;;;;44284:4;44235:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44235:63:0;-1:-1:-1;;;44235:63:0;;;44224:75;;;;44189:12;;44203:17;;44224:10;;;;44235:63;44224:75;;;44235:63;44224:75;;44235:63;44224:75;;;;;;;;;;-1:-1:-1;;44224:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44188:111;;;;44318:7;:57;;;;-1:-1:-1;44330:11:0;;:16;;:44;;;44361:4;44350:24;;;;;;;;;;;;;;;-1:-1:-1;44350:24:0;44330:44;44310:77;;;;;-1:-1:-1;;;44310:77:0;;;;;;;;;;;;-1:-1:-1;;;44310:77:0;;;;;;;;;;;;;;1366:136;1424:7;1451:43;1455:1;1458;1451:43;;;;;;;;;;;;;;;;;:3;:43::i;9376:389::-;9447:4;9477:6;9469:27;;;;;-1:-1:-1;;;9469:27:0;;;;;;;;;;;;-1:-1:-1;;;9469:27:0;;;;;;;;;;;;;;;6082:6;9517:15;;9551:6;;;:31;;;6082:6;9566:1;9561:2;:6;;;;;;:21;9551:31;9543:56;;;;;-1:-1:-1;;;9543:56:0;;;;;;;;;;;;-1:-1:-1;;;9543:56:0;;;;;;;;;;;;;;;9647:1;9643:5;;9637:12;;9668:8;;;;9660:33;;;;;-1:-1:-1;;;9660:33:0;;;;;;;;;;;;-1:-1:-1;;;9660:33:0;;;;;;;;;;;;;;;9721:7;9736:1;9731:2;:6;;;;10275:558;10351:4;7210:5;10381:4;:28;;10373:53;;;;;-1:-1:-1;;;10373:53:0;;;;;;;;;;;;-1:-1:-1;;;10373:53:0;;;;;;;;;;;;;;;7270:18;10445:28;;;10437:54;;;;;-1:-1:-1;;;10437:54:0;;;;;;;;;;;;-1:-1:-1;;;10437:54:0;;;;;;;;;;;;;;;10504:10;10518:11;10525:3;10518:6;:11::i;:::-;10504:25;;10543:11;10557:16;10562:3;10567:5;10557:4;:16::i;:::-;10543:30;;10586:13;10602:24;10608:4;10614:11;10619:5;10614:4;:11::i;:::-;10602:5;:24::i;:::-;10586:40;-1:-1:-1;10643:11:0;10639:59;;10678:8;-1:-1:-1;10671:15:0;;-1:-1:-1;;10671:15:0;10639:59;10710:18;10731:47;10742:4;10748:6;7343:13;10731:10;:47::i;:::-;10710:68;;10796:29;10801:8;10811:13;10796:4;:29::i;:::-;10789:36;10275:558;-1:-1:-1;;;;;;;10275:558:0:o;46258:581::-;46423:12;;46350:23;;46423:16;46419:413;;46492:7;;46482:35;;;-1:-1:-1;;;46482:35:0;;;;46456:23;;-1:-1:-1;;;;;46492:7:0;;46482:33;;:35;;;;;;;;;;;;;;46492:7;46482:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46482:35:0;;-1:-1:-1;;;;;;46536:29:0;;;46532:289;;46607:53;46612:34;46617:14;46633:12;;46612:4;:34::i;46607:53::-;46705:7;;46586:74;;-1:-1:-1;46679:54:0;;46695:8;;-1:-1:-1;;;;;46705:7:0;46586:74;46679:15;:54::i;:::-;46757:48;;;;;;;;-1:-1:-1;;;;;46757:48:0;;;;;;;;;;;;;46532:289;46419:413;46258:581;;;;:::o;8820:223::-;8895:4;8901;8932:1;8927;:6;8923:113;;-1:-1:-1;;8958:5:0;;;8965;8950:21;;8923:113;-1:-1:-1;;9012:5:0;;;9019:4;8923:113;8820:223;;;;;:::o;3831:278::-;3917:7;3952:12;3945:5;3937:28;;;;-1:-1:-1;;;3937:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3976:9;3992:1;3988;:5;;;;;;;3831:278;-1:-1:-1;;;;;3831:278:0:o;14409:94::-;14466:29;14480:4;14487:2;14491:3;14466:5;:29::i;14511:98::-;14570:31;14576:4;14590;14597:3;14570:5;:31::i;13860:276::-;13930:4;13913:8;:23;;;;;;;;;;;:30;-1:-1:-1;13913:30:0;13905:47;;;;;-1:-1:-1;;;13905:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;13905:47:0;;;;;;;;;;;;;;;14011:4;13994:8;:23;;;;;;;;;;;13989:34;;14019:3;13989:4;:34::i;:::-;13980:4;13963:8;:23;;;;;;;;;;:60;14054:12;;14049:23;;14068:3;14049:4;:23::i;:::-;14034:12;:38;14088:40;;;;;;;;14120:1;;14105:4;;14088:40;;;;;;;;;13860:276;:::o;13634:218::-;13727:4;13710:8;:23;;;;;;;;;;;13705:34;;13735:3;13705:4;:34::i;:::-;13696:4;13679:8;:23;;;;;;;;;;:60;13770:12;;13765:23;;13784:3;13765:4;:23::i;:::-;13750:12;:38;13804:40;;;;;;;;13833:4;;13821:1;;13804:40;;;;;;;;;13634:218;:::o;1805:192::-;1891:7;1927:12;1919:6;;;;1911:29;;;;-1:-1:-1;;;1911:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1963:5:0;;;1805:192::o;8299:123::-;8364:4;6082:6;8393:7;8398:1;8393:4;:7::i;:::-;:21;;8299:123;-1:-1:-1;;8299:123:0:o;8175:116::-;6082:6;8268:15;;;8175:116::o;9793:321::-;9865:4;;9900:1;9896;:5;:28;;6082:6;9896:28;;;9909:1;9896:28;9887:37;-1:-1:-1;9947:1:0;9942:6;;;;9937:151;9950:6;;9937:151;;9985:10;9990:1;9993;9985:4;:10::i;:::-;9981:14;-1:-1:-1;10020:1:0;10016;:5;:10;10012:65;;10051:10;10056:1;10059;10051:4;:10::i;:::-;10047:14;;10012:65;9963:1;9958:6;;;;9937:151;;10841:1108;10939:4;10994:3;10939:4;;11031:27;11040:4;6082:6;11031:8;:27::i;:::-;11008:50;;-1:-1:-1;11008:50:0;-1:-1:-1;6082:6:0;;11069:9;11410:1;11396:523;11421:9;11413:4;:17;11396:523;;11452:9;6082:6;11464:1;:15;11452:27;;11495:6;11503:9;11516:36;11525:1;11528:23;11533:4;6082:6;11528:4;:23::i;:::-;11516:8;:36::i;:::-;11494:58;;;;11574:22;11579:4;11585:10;11590:1;11593;11585:4;:10::i;11574:22::-;11567:29;;11618:16;11623:4;11629;11618;:16::i;:::-;11611:23;-1:-1:-1;11653:9:0;11649:20;;11664:5;;;;;11649:20;11690:4;11686:30;;;11707:9;;;11686:30;11735:4;11731:30;;;11752:9;;;11731:30;11780:8;11776:132;;;11815:15;11820:3;11825:4;11815;:15::i;:::-;11809:21;;11776:132;;;11877:15;11882:3;11887:4;11877;:15::i;:::-;11871:21;;11776:132;-1:-1:-1;;;11432:3:0;;11396:523;;;-1:-1:-1;11938:3:0;;10841:1108;-1:-1:-1;;;;;;;;;10841:1108:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://5244d561ab957f642811181d4738e42d8fc500e51540cee56676d02270a132e2
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.