ETH Price: $3,227.52 (+1.03%)

Contract

0x8438d64Da58772E9F7FCeAa1506bA300F935ABBd
 
Transaction Hash
Method
Block
From
To
Exitswap Pool Am...202638812024-07-08 19:29:59128 days ago1720466999IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.000546463.95819135
Approve202637562024-07-08 19:04:23128 days ago1720465463IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.000390248.40801256
Approve202636512024-07-08 18:43:11128 days ago1720464191IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.000426799.1954239
Approve202636392024-07-08 18:40:47128 days ago1720464047IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.000212124.57029611
Joinswap Extern ...202636112024-07-08 18:35:11128 days ago1720463711IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.000651084.53310001
Get All Rewards174818412023-06-15 0:50:23518 days ago1686790223IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0008779114.35158718
Get Reward161063452022-12-03 19:23:11711 days ago1670095391IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.00045412
Exitswap Pool Am...158201012022-10-24 19:42:47751 days ago1666640567IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.002675120.82898446
Approve158200442022-10-24 19:31:11751 days ago1666639871IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0011714525.23920506
Joinswap Extern ...158200252022-10-24 19:27:23751 days ago1666639643IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0030120121.29354525
Approve158199992022-10-24 19:22:11751 days ago1666639331IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0011726225.44216217
Exit Pool127551882021-07-03 14:39:211229 days ago1625323161IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0023619511
Exit Pool125174512021-05-27 16:32:571266 days ago1622133177IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.004492744
Exit Pool122931352021-04-23 0:01:341301 days ago1619136094IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0151602384
Get All Rewards121323752021-03-29 5:56:541325 days ago1616997414IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.008925390
Get All Rewards121269902021-03-28 10:03:091326 days ago1616925789IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.007933680.00000145
Exit Pool120064822021-03-09 20:32:301345 days ago1615321950IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.02260692120
Get All Rewards119913732021-03-07 12:34:591347 days ago1615120499IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0110744997.00000145
Get All Rewards119850312021-03-06 13:05:171348 days ago1615035917IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.006941970
Get All Rewards119762522021-03-05 4:57:041349 days ago1614920224IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0097044585
Get All Rewards119649392021-03-03 11:14:461351 days ago1614770086IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0106748993.5000016
Get All Rewards119476402021-02-28 19:16:351354 days ago1614539795IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.01153117101
Get All Rewards119400412021-02-27 15:05:121355 days ago1614438312IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.01389173140.08
Get All Rewards119395892021-02-27 13:20:111355 days ago1614432011IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.01120621113
Get All Rewards119042612021-02-22 2:54:491361 days ago1613962489IN
Value Defi: USDC/BSDS Pool 80/20
0 ETH0.0148421130
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
114663692020-12-16 20:35:111428 days ago1608150911  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x635e4A8d...3663A7325
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 700 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-28
*/

// 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 / 1000; // 0.1%
    uint public constant MAX_FEE                  = BONE / 10; // 10%

    uint public constant DEFAULT_COLLECTED_FEE    = BONE * 33 / 10000; // 0.33%
    uint public constant MAX_COLLECTED_FEE        = BONE * 334 / 10000; // 3.34%

    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");
        swapFee = _swapFee;
        collectedFee = _swapFee / 3;

        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 = 0 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 finalizeRewardFundInfo(IFaaSRewardFund _rewardFund, uint _unstakingFrozenTime) external onlyController {
        require(address(rewardFund) == address(0), "rewardFund!=null");
        assert(unstakingFrozenTime <= 30 days);
        // do not lock fund for too long, please!
        unstakingFrozenTime = _unstakingFrozenTime;
        rewardFund = _rewardFund;
    }

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

    function addRewardPool(IERC20 _rewardToken, uint256 _startBlock, uint256 _endRewardBlock, uint256 _rewardPerBlock,
        uint256 _lockRewardPercent, uint256 _startVestingBlock, uint256 _endVestingBlock) external 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":[{"internalType":"contract IFaaSRewardFund","name":"_rewardFund","type":"address"},{"internalType":"uint256","name":"_unstakingFrozenTime","type":"uint256"}],"name":"finalizeRewardFundInfo","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":"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"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103d05760003560e01c80638656b653116101ff578063c7c30be11161011a578063e811f50a116100ad578063f77c47911161007c578063f77c479114610ee1578063f863b96114610ee9578063f8b2cb4f14610f60578063f8d6aed414610f86576103d0565b8063e811f50a14610ea3578063efe2226614610eab578063f1b8a9b714610eb3578063f36c0a7214610ed9576103d0565b8063db2e21bc116100e9578063db2e21bc14610e2a578063dd62ed3e14610e32578063e5a583a914610e60578063e653bf3a14610e7d576103d0565b8063c7c30be114610de6578063cc77828d14610dee578063cd2ed8fb14610df6578063d73dd62314610dfe576103d0565b8063a9059cbb11610192578063be3bbd2e11610161578063be3bbd2e14610d0f578063be61533514610d67578063c06b6f1d14610d96578063c45a015514610dc2576103d0565b8063a9059cbb14610c29578063b02f0b7314610c55578063b3f05b9714610ccc578063ba9530a614610cd4576103d0565b8063948d8ce6116101ce578063948d8ce614610ba957806395d89b4114610bcf578063a221ee4914610bd7578063a694fc3a14610c0c576103d0565b80638656b65314610b1a5780638c28cbe814610b5557806392eefe9b14610b7b578063936c347714610ba1576103d0565b806354cf2aeb116102ef5780636d3c6d921161028257806379104ea61161025157806379104ea614610a205780637c5e9ea414610a615780638201aa3f14610aba57806385cc179e14610afa576103d0565b80636d3c6d921461092857806370a082311461095757806372aa0a601461097d57806376d743fe146109f4576103d0565b80636284ae41116102be5780636284ae41146107dc578063650e872c146107e457806366188463146108b25780636d142e5b146108de576103d0565b806354cf2aeb1461077457806354fd4d501461077c5780635db342771461078457806360d47088146107b6576103d0565b80632e1a7d4d11610367578063429b4ae611610336578063429b4ae61461062957806346ab38f1146106465780634d950c74146106785780634f69c0d4146106fd576103d0565b80632e1a7d4d146105a05780632f37b624146105bf578063313ce567146105e5578063362a3fad14610603576103d0565b806317837baa116103a357806317837baa1461050057806318160ddd1461050857806323b872dd1461051057806329d7958814610546576103d0565b806306fdde03146103d5578063095ea7b3146104525780631446a7ff1461049257806315e84af9146104d2575b600080fd5b6103dd610fc1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104175781810151838201526020016103ff565b50505050905090810190601f1680156104445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61047e6004803603604081101561046857600080fd5b506001600160a01b038135169060200135611057565b604080519115158252519081900360200190f35b6104c0600480360360408110156104a857600080fd5b506001600160a01b03813581169160200135166110be565b60408051918252519081900360200190f35b6104c0600480360360408110156104e857600080fd5b506001600160a01b0381358116916020013516611201565b6104c061133b565b6104c0611341565b61047e6004803603606081101561052657600080fd5b506001600160a01b03813581169160208101359091169060400135611347565b6105756004803603604081101561055c57600080fd5b50803560ff1690602001356001600160a01b03166114bb565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6105bd600480360360208110156105b657600080fd5b5035611513565b005b61047e600480360360208110156105d557600080fd5b50356001600160a01b0316611698565b6105ed6116b6565b6040805160ff9092168252519081900360200190f35b6105bd6004803603602081101561061957600080fd5b50356001600160a01b03166116bf565b6105bd6004803603602081101561063f57600080fd5b50356116ea565b6104c06004803603606081101561065c57600080fd5b506001600160a01b0381351690602081013590604001356117dd565b6105bd6004803603606081101561068e57600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156106be57600080fd5b8201836020820111156106d057600080fd5b803590602001918460208302840111640100000000831117156106f257600080fd5b509092509050611a8b565b6105bd6004803603604081101561071357600080fd5b8135919081019060408101602082013564010000000081111561073557600080fd5b82018360208201111561074757600080fd5b8035906020019184602083028401116401000000008311171561076957600080fd5b509092509050611b7a565b6104c0611b86565b6104c0611b8c565b6104c06004803603606081101561079a57600080fd5b506001600160a01b038135169060208101359060400135611b92565b6104c0600480360360208110156107cc57600080fd5b50356001600160a01b0316611e08565b6104c0611e2d565b6105bd600480360360808110156107fa57600080fd5b81359160208101359181019060608101604082013564010000000081111561082157600080fd5b82018360208201111561083357600080fd5b8035906020019184602083028401116401000000008311171561085557600080fd5b91939092909160208101903564010000000081111561087357600080fd5b82018360208201111561088557600080fd5b803590602001918460208302840111640100000000831117156108a757600080fd5b509092509050611e33565b61047e600480360360408110156108c857600080fd5b506001600160a01b0381351690602001356125fa565b6105bd600480360360e08110156108f457600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a08101359060c001356126e4565b6105bd6004803603604081101561093e57600080fd5b50803560ff1690602001356001600160a01b0316612a1a565b6104c06004803603602081101561096d57600080fd5b50356001600160a01b0316612d9f565b61099a6004803603602081101561099357600080fd5b5035612dba565b604080516001600160a01b03909b168b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b6105bd60048036036060811015610a0a57600080fd5b5060ff8135169060208101359060400135612e25565b6104c0600480360360e0811015610a3657600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612eec565b610aa1600480360360a0811015610a7757600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612fbb565b6040805192835260208301919091528051918290030190f35b610aa1600480360360a0811015610ad057600080fd5b506001600160a01b03813581169160208101359160408201351690606081013590608001356133c5565b6105bd60048036036020811015610b1057600080fd5b503560ff166137b8565b6104c0600480360360c0811015610b3057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613883565b6105bd60048036036020811015610b6b57600080fd5b50356001600160a01b031661391f565b6105bd60048036036020811015610b9157600080fd5b50356001600160a01b0316613a67565b6104c0613b35565b6104c060048036036020811015610bbf57600080fd5b50356001600160a01b0316613b86565b6103dd613c45565b6104c0600480360360a0811015610bed57600080fd5b5080359060208101359060408101359060608101359060800135613ca6565b6105bd60048036036020811015610c2257600080fd5b5035613d10565b61047e60048036036040811015610c3f57600080fd5b506001600160a01b038135169060200135613d4a565b6105bd60048036036040811015610c6b57600080fd5b81359190810190604081016020820135640100000000811115610c8d57600080fd5b820183602082011115610c9f57600080fd5b80359060200191846020830284011164010000000083111715610cc157600080fd5b509092509050613d60565b61047e61409e565b6104c0600480360360c0811015610cea57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356140a7565b610d17614128565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d53578181015183820152602001610d3b565b505050509050019250505060405180910390f35b6104c060048036036040811015610d7d57600080fd5b50803560ff1690602001356001600160a01b0316614211565b6105bd60048036036040811015610dac57600080fd5b506001600160a01b03813516906020013561432a565b610dca614405565b604080516001600160a01b039092168252519081900360200190f35b610dca614414565b610d17614423565b6104c061446d565b61047e60048036036040811015610e1457600080fd5b506001600160a01b038135169060200135614473565b6105bd614506565b6104c060048036036040811015610e4857600080fd5b506001600160a01b0381358116916020013516614596565b6105bd60048036036020811015610e7657600080fd5b50356145c1565b6105bd60048036036020811015610e9357600080fd5b50356001600160a01b03166146a7565b6104c0614712565b610dca614718565b6104c060048036036020811015610ec957600080fd5b50356001600160a01b0316614727565b6105bd6147f8565b610dca614821565b6105bd60048036036040811015610eff57600080fd5b81359190810190604081016020820135640100000000811115610f2157600080fd5b820183602082011115610f3357600080fd5b80359060200191846020830284011164010000000083111715610f5557600080fd5b509092509050614830565b6104c060048036036020811015610f7657600080fd5b50356001600160a01b03166148ac565b6104c0600480360360c0811015610f9c57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561496b565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104d5780601f106110225761010080835404028352916020019161104d565b820191906000526020600020905b81548152906001019060200180831161103057829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b600554600090610100900460ff1615611108576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff1661115e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166111b4576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e602052604080822092851682528120600380840154600280860154928401549084015493946111f89492939290613ca6565b95945050505050565b600554600090610100900460ff161561124b576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff166112a1576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166112f7576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e60205260408082209285168252902060038083015460028085015492840154908401546009546111f894929190613ca6565b60145481565b60025490565b6000336001600160a01b038516148061138357506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6113d4576040805162461bcd60e51b815260206004820152600860248201527f217370656e646572000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6113df8484846149ee565b336001600160a01b0385161480159061141d57506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156114b1576001600160a01b03841660009081526001602090815260408083203384529091529020546114509083614af0565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35b5060019392505050565b6001600160a01b03166000908152601060209081526040808320805460ff9095168452600181018352818420546002820184528285205460038301855283862054600490930190945291909320549394909391929190565b3360009081526010602052604090208054821115611578576040805162461bcd60e51b815260206004820152600860248201527f616d3e75732e616d000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b601454600582015461158991614b5e565b4210156115c6576040805162461bcd60e51b8152602060048201526006602482015265333937bd32b760d11b604482015290519081900360640190fd5b6115cf336116bf565b80546115db9083614af0565b815560115460005b8160ff168160ff16101561165257611632670de0b6b3a764000061162c60118460ff168154811061161057fe5b600091825260209091206004600a909202010154865490614bb8565b90614c11565b60ff821660009081526001808601602052604090912091909155016115e3565b5061165d3384614c53565b60408051848152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03166000908152600e602052604090205460ff1690565b60055460ff1690565b60115460005b8160ff168160ff1610156116e5576116dd8184612a1a565b6001016116c5565b505050565b6007546001600160a01b03163314611731576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b6676a91f7f7f800081111561178d576040805162461bcd60e51b815260206004820152600960248201527f3e6d6178436f4665650000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60095461179b826002614c5d565b11156117d8576040805162461bcd60e51b81526020600482015260076024820152661f39a332b2979960c91b604482015290519081900360640190fd5b600a55565b600554600090610100900460ff1615611827576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16611876576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff166118cc576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954600b5461190995949392918a91612eec565b915082821015611948576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e6020526040902060039081015461197d91670de0b6b3a76400005b04600101614c5d565b8211156119bc576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b6119ca816003015483614af0565b816003018190555060006119e085600b54614c5d565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a3611a2e3386614d1e565b611a40611a3b8683614af0565b614d28565b8015611a5c57600754611a5c906001600160a01b031682614c53565b611a6830868886614d34565b9350611a779050863385614ec8565b50506005805461ff00191690559392505050565b600554610100900460ff1615611ad2576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055336001600160a01b0385161480611b0257506013546001600160a01b031633145b611b53576040805162461bcd60e51b815260206004820152600b60248201527f21287072787c7c6f776e29000000000000000000000000000000000000000000604482015290519081900360640190fd5b611b5f84848484615031565b611b69848461522b565b50506005805461ff00191690555050565b6116e533848484611a8b565b60095481565b60065481565b600554600090610100900460ff1615611bdc576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16611c2b576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff16611c81576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060030154611cb3906002670de0b6b3a76400005b04614c5d565b831115611cf2576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954611d2c94939291908990613883565b915082821015611d6b576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b611d798160030154856152f9565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3611dc782615353565b611dd285338661535c565b6000611de086863086614d34565b935090508015611dfe57611df8826003015482614af0565b60038301555b611a773384614c53565b6014546001600160a01b03821660009081526010602052604090206005015401919050565b600b5481565b600554610100900460ff1615611e7a576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614611ed4576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600c5460ff1615611f12576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b66038d7ea4c68000861015611f58576040805162461bcd60e51b81526020600482015260076024820152663c6d696e46656560c81b604482015290519081900360640190fd5b67016345785d8a0000861115611f9f576040805162461bcd60e51b81526020600482015260076024820152663e6d617846656560c81b604482015290519081900360640190fd5b600986905560038604600a5566038d7ea4c68000851015612007576040805162461bcd60e51b815260206004820152600c60248201527f3c6d696e496e6974505375700000000000000000000000000000000000000000604482015290519081900360640190fd5b6ec097ce7bc90715b34b9f100000000085111561206b576040805162461bcd60e51b815260206004820152600c60248201527f3e6d6178496e6974505375700000000000000000000000000000000000000000604482015290519081900360640190fd5b60028310156120c1576040805162461bcd60e51b815260206004820152600a60248201527f3c6d696e546f6b656e7300000000000000000000000000000000000000000000604482015290519081900360640190fd5b60088310612116576040805162461bcd60e51b815260206004820152600a60248201527f3e6d6178546f6b656e7300000000000000000000000000000000000000000000604482015290519081900360640190fd5b82811461216a576040805162461bcd60e51b815260206004820152600a60248201527f65724c656e674d69736d00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600060608467ffffffffffffffff8111801561218557600080fd5b506040519080825280602002602001820160405280156121af578160200160208202803683370190505b50905060005b8581101561245f5760008787838181106121cb57fe5b905060200201356001600160a01b0316905060008686848181106121eb57fe5b9050602002013590506000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561224357600080fd5b505afa158015612257573d6000803e3d6000fd5b505050506040513d602081101561226d57600080fd5b50518551909150819086908690811061228257fe5b6020908102919091018101919091526001600160a01b0384166000908152600e909152604090205460ff16156122e7576040805162461bcd60e51b8152602060048201526005602482015264189bdd5b9960da1b604482015290519081900360640190fd5b670de0b6b3a7640000821015612344576040805162461bcd60e51b815260206004820152600a60248201527f3c6d696e57656967687400000000000000000000000000000000000000000000604482015290519081900360640190fd5b6802b5e3af16b18800008211156123a2576040805162461bcd60e51b815260206004820152600a60248201527f3e6d617857656967687400000000000000000000000000000000000000000000604482015290519081900360640190fd5b620f42408110156123e4576040805162461bcd60e51b81526020600482015260076024820152660f1b5a5b90985b60ca1b604482015290519081900360640190fd5b6040805160808101825260018082526020808301888152838501878152606085018781526001600160a01b038a166000908152600e909452959092209351845460ff19169015151784555191830191909155516002820155905160039091015561244e86836152f9565b955050600190920191506121b59050565b506802b5e3af16b18800008211156124be576040805162461bcd60e51b815260206004820152600b60248201527f3e6d617854576569676874000000000000000000000000000000000000000000604482015290519081900360640190fd5b600f8290556124cf600d8787615bfe565b50600c805460ff191660011790556124e687615353565b6124f03388614c53565b7f84544fec6632b8b4c691c6d5d5288102f47b6d448e731f535b38767d2bfd2662600954886006548989898988604051808981526020018881526020018781526020018060200180602001806020018481038452898982818152602001925060200280828437600083820152601f01601f191690910185810384528781526020908101915088908802808284376000838201819052601f909101601f19169092018681038452875181528751602091820193828a0193509102908190849084905b838110156125c95781810151838201526020016125b1565b505050509050019b50505050505050505050505060405180910390a150506005805461ff0019169055505050505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561264f573360009081526001602090815260408083206001600160a01b038816845290915281205561267e565b6126598184614af0565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6008546001600160a01b0316331461272d576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601154600811612784576040805162461bcd60e51b815260206004820152601160248201527f65786365656420727764506f6f6c4c696d000000000000000000000000000000604482015290519081900360640190fd5b808211156127c3576040805162461bcd60e51b815260206004820152600760248201526639ab211f32ab2160c91b604482015290519081900360640190fd5b8543116127d057856127d2565b435b9550848610612811576040805162461bcd60e51b815260206004820152600660248201526539a11f1eb2a160d11b604482015290519081900360640190fd5b6128196147f8565b60408051610140810182526001600160a01b039889168152602081019788529081019586526060810194855260006080820181815260a0830195865260c0830185815260e08401858152959094036101008401908152610120840183815260118054600181018255945293517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68600a90940293840180546001600160a01b03191691909c1617909a5597517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6982015595517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a87015593517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b86015594517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6c85015590517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6d84015592517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6e83015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6f82015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c70830155517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c7190910155565b612a23826137b8565b6001600160a01b03811660009081526010602052604081206011805491929160ff8616908110612a4f57fe5b6000918252602080832060ff88168452600186019091526040832054600a929092020160048101548554919450612a9e9291612a9891670de0b6b3a76400009161162c91614bb8565b906154c4565b60058301549091508015612c38578260070154431115612b335760ff8616600090815260048501602090815260408083205460038801909252822054612ae3916154c4565b90508015612b2d57612af58382614b5e565b60ff88166000908152600487016020526040902054909350612b179082614b5e565b60ff881660009081526004870160205260409020555b50612c38565b8115612b8f576000612b4a606461162c8585614bb8565b9050612b5683826154c4565b60ff88166000908152600387016020526040902054909350612b789082614b5e565b60ff88166000908152600387016020526040902055505b8260060154431115612c38576000612bda846008015461162c612bbf8760060154436154c490919063ffffffff16565b60ff8b16600090815260038a01602052604090205490614bb8565b60ff8816600090815260048701602052604090205490915080821115612c35576000612c0683836154c4565b9050612c128282614b5e565b60ff8a166000908152600489016020526040902055612c318582614b5e565b9450505b50505b8115612d975760ff86166000908152600285016020526040902054612c5d9083614b5e565b60ff871660009081526002860160205260409020556009830154612c819083614b5e565b600984015560125483546040805163d1660f9960e01b81526001600160a01b0392831660048201528883166024820152604481018690529051919092169163d1660f9991606480830192600092919082900301818387803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b50506040805160ff8a1681526020810186905281516001600160a01b038a1694507f636c8a1a63bdbdbe782bbd46665206ecd64f1d1f745ed547cc9dd708864fd2b093509081900390910190a2612d81670de0b6b3a764000061162c60118960ff1681548110612d6557fe5b600091825260209091206004600a909202010154875490614bb8565b60ff871660009081526001860160205260409020555b505050505050565b6001600160a01b031660009081526020819052604090205490565b60118181548110612dc757fe5b60009182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b03909816995095979496939592949193909291908a565b6008546001600160a01b03163314612e6e576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b612e77836137b8565b600060118460ff1681548110612e8957fe5b90600052602060002090600a020190508060020154431115612edb576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b600281019290925560039091015550565b600080612ef98887615506565b90506000612f1886612f13670de0b6b3a764000087614af0565b614c5d565b90506000612f268983614af0565b90506000612f34828b615506565b90506000612f5382612f4e670de0b6b3a764000088615506565b615617565b90506000612f61828f614c5d565b90506000612f6f8f83614af0565b90506000612f8e612f88670de0b6b3a76400008a614af0565b8c614c5d565b9050612fa682612f13670de0b6b3a764000084614af0565b98505050505050505050979650505050505050565b6005546000908190610100900460ff1615613007576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff1661306c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff166130c2576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e6020526040808220928816825290206003808201546130fb91670de0b6b3a7640000611974565b86111561313a576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b600061315b8360030154846002015484600301548560020154600954613ca6565b9050858111156131a0576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6131c083600301548460020154846003015485600201548b60095461496b565b945088851115613200576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b61320e8360030154866152f9565b8360030181905550613224826003015488614af0565b600380840182905584015460028086015490850154600954613247949190613ca6565b935080841015613287576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b858411156132c8576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b6132d28588615506565b81111561330f576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a46133778a338761535c565b613382883389614ec8565b600061338e8b87615734565b905080156133aa576133a4846003015482614af0565b60038501555b505050506005805461ff001916905590969095509350505050565b6005546000908190610100900460ff1615613411576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff16613476576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff166134cc576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e6020526040808220928816825290206003820154613506906002670de0b6b3a7640000611cad565b881115613545576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b60006135668360030154846002015484600301548560020154600954613ca6565b9050858111156135ab576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6135cb83600301548460020154846003015485600201548d6009546140a7565b94508685101561360a576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b61361883600301548a6152f9565b836003018190555061362e826003015486614af0565b600380840182905584015460028086015490850154600954613651949190613ca6565b935080841015613691576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b858411156136d2576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b6136dc8986615506565b811115613719576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46137818a338b61535c565b600061378f8b8b8b89614d34565b9650905080156137ad576137a7846003015482614af0565b60038501555b6133aa893388614ec8565b600060118260ff16815481106137ca57fe5b90600052602060002090600a020190506000816002015443116137ed57436137f3565b81600201545b905081600101548111156116e557600061380c30612d9f565b9050801561387857600061382d8460010154846154c490919063ffffffff16565b9050600061385e8361162c670de0b6b3a7640000613858896003015487614bb890919063ffffffff16565b90614bb8565b60048601549091506138709082614b5e565b600486015550505b506001919091015550565b6000806138908786615506565b905060006138af6138a9670de0b6b3a764000084614af0565b85614c5d565b905060006138c986612f13670de0b6b3a764000085614af0565b905060006138d78b836152f9565b905060006138e5828d615506565b905060006138f38287615617565b90506000613901828d614c5d565b905061390d818d614af0565b9e9d5050505050505050505050505050565b600554610100900460ff1615613966576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600e602052604090205460ff166139cb576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613a1157600080fd5b505afa158015613a25573d6000803e3d6000fd5b505050506040513d6020811015613a3b57600080fd5b50516001600160a01b039091166000908152600e60205260409020600301556005805461ff0019169055565b600554610100900460ff1615613aae576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614613b08576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613b7f576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b50600f5490565b600554600090610100900460ff1615613bd0576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16613c26576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561104d5780601f106110225761010080835404028352916020019161104d565b600080613cb38787615506565b90506000613cc18686615506565b90506000613ccf8383615506565b90506000613cf6670de0b6b3a7640000613cf1670de0b6b3a764000089614af0565b615506565b9050613d028282614c5d565b9a9950505050505050505050565b6000613d1b30612d9f565b9050613d273383614d1e565b6000613d3230612d9f565b9050613d3e8183614af0565b92506116e5338461522b565b6000613d573384846149ee565b50600192915050565b600554610100900460ff1615613da7576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16613df6576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6000613e00611341565b90506000613e1085600b54614c5d565b90506000613e1e8683614af0565b90506000613e2c8285615506565b905080613e69576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b6000613e7433612d9f565b905087811015613ee8576000613e8a8983614af0565b3360009081526010602052604090205490915081811015613edc576040805162461bcd60e51b815260206004820152600760248201526639ba359e3bb23960c91b604482015290519081900360640190fd5b613ee582611513565b50505b613ef23389614d1e565b8315613f0e57600754613f0e906001600160a01b031685614c53565b613f1783614d28565b60005b600d54811015614088576000600d8281548110613f3357fe5b60009182526020808320909101546001600160a01b0316808352600e909152604082206003015490925090613f688683614c5d565b905080613fa5576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b8a8a85818110613fb157fe5b90506020020135811015613ff4576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090206003015461401a9082614af0565b6001600160a01b0384166000818152600e60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a361407d833383614ec8565b505050600101613f1a565b50506005805461ff001916905550505050505050565b600c5460ff1681565b6000806140b48786615506565b905060006140ca670de0b6b3a764000085614af0565b90506140d68582614c5d565b905060006140e88a613cf18c856152f9565b905060006140f68285615617565b9050600061410c670de0b6b3a764000083614af0565b90506141188a82614c5d565b9c9b505050505050505050505050565b600554606090610100900460ff1615614172576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600c5460ff166141b2576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b600d80548060200260200160405190810160405280929190818152602001828054801561104d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141ea575050505050905090565b6001600160a01b03811660009081526010602052604081206011805483919060ff871690811061423d57fe5b90600052602060002090600a02019050600081600401549050600061426130612d9f565b9050600083600201544311614276574361427c565b83600201545b905083600101548111801561429057508115155b156142ea5760006142ae8560010154836154c490919063ffffffff16565b905060006142d98461162c670de0b6b3a76400006138588a6003015487614bb890919063ffffffff16565b90506142e58582614b5e565b945050505b60ff88166000908152600186016020526040902054855461431e9190612a9890670de0b6b3a76400009061162c9088614bb8565b98975050505050505050565b6008546001600160a01b03163314614373576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b6012546001600160a01b0316156143d1576040805162461bcd60e51b815260206004820152601060248201527f72657761726446756e64213d6e756c6c00000000000000000000000000000000604482015290519081900360640190fd5b62278d0060145411156143e057fe5b601455601280546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b6013546001600160a01b031681565b600554606090610100900460ff16156141b2576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600d5490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546144a190836152f9565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b336000818152601060205260409020805490916145239082614c53565b6000808355601154905b8160ff168160ff16101561455a5760ff81166000908152600180860160205260408220919091550161452d565b5060408051838152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5460ff16156145ff576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b6007546001600160a01b03163314614646576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b66038d7ea4c680008111156146a2576040805162461bcd60e51b815260206004820152600b60248201527f3e6d617845786974466565000000000000000000000000000000000000000000604482015290519081900360640190fd5b600b55565b6008546001600160a01b031633146146f0576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600a5481565b6012546001600160a01b031681565b600554600090610100900460ff1615614771576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166147c7576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e6020526040902060020154600f546147f1908290615506565b9392505050565b60115460005b8160ff168160ff16101561481d57614815816137b8565b6001016147fe565b5050565b6008546001600160a01b031681565b600554610100900460ff1615614877576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561489233848484615031565b61489c3384614c53565b50506005805461ff001916905550565b600554600090610100900460ff16156148f6576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff1661494c576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206003015490565b6000806149788588615506565b905060006149868786614af0565b905060006149948883615506565b905060006149a28285615617565b90506149b681670de0b6b3a7640000614af0565b90506149ca670de0b6b3a764000087614af0565b94506149df6149d98c83614c5d565b86615506565b9b9a5050505050505050505050565b6001600160a01b038316600090815260208190526040902054811115614a44576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b6001600160a01b038316600090815260208190526040902054614a679082614af0565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614a9690826152f9565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000806000614aff8585615832565b915091508015614b56576040805162461bcd60e51b815260206004820152600d60248201527f73756220756e646572666c6f7700000000000000000000000000000000000000604482015290519081900360640190fd5b509392505050565b6000828201838110156147f1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082614bc7575060006110b8565b82820282848281614bd457fe5b04146147f15760405162461bcd60e51b8152600401808060200182810382526021815260200180615c816021913960400191505060405180910390fd5b60006147f183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615857565b61481d82826158f9565b6000828202831580614c77575082848281614c7457fe5b04145b614cb7576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614d06576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b61481d8282615904565b614d318161590f565b50565b600a54600090829015614ebf57600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b158015614d8657600080fd5b505afa158015614d9a573d6000803e3d6000fd5b505050506040513d6020811015614db057600080fd5b505190506001600160a01b038082169088161415614e4457614de5614dd787600a54614c5d565b670de0b6b3a7640000615506565b600754909350614e009088906001600160a01b031685614ec8565b6040805184815290516001600160a01b038916917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a2614ebd565b6000614e55614dd786600a54614c5d565b600754909150614e709087906001600160a01b031683614ec8565b614e7a8582614af0565b6040805183815290519194506001600160a01b038816917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd9181900360200190a2505b505b94509492505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310614f5a5780518252601f199092019160209182019101614f3b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614fbc576040519150601f19603f3d011682016040523d82523d6000602084013e614fc1565b606091505b5091509150818015614fef575080511580614fef5750808060200190516020811015614fec57600080fd5b50515b61502a576040805162461bcd60e51b8152602060048201526007602482015266215f707573685560c81b604482015290519081900360640190fd5b5050505050565b600c5460ff16615071576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b600061507b611341565b905060006150898583615506565b9050806150c6576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b60005b600d54811015615221576000600d82815481106150e257fe5b60009182526020808320909101546001600160a01b0316808352600e9091526040822060030154909250906151178583614c5d565b9050801580159061513a575087878581811061512f57fe5b905060200201358111155b61518b576040805162461bcd60e51b815260206004820152600e60248201527f65724d4170727c7c3c6c696d496e000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600e60205260409020600301546151b190826152f9565b6001600160a01b038085166000818152600e602090815260409182902060030194909455805185815290519193928e16927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a92918290030190a361521683338361535c565b5050506001016150c9565b50612d9785615353565b6001600160a01b038216600090815260106020526040902061524c836116bf565b80546152589083614b5e565b815560115460005b8160ff168160ff1610156152ad5761528d670de0b6b3a764000061162c60118460ff168154811061161057fe5b60ff82166000908152600180860160205260409091209190915501615260565b504260058301556040805184815290516001600160a01b038616917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b6000828201838110156147f1576040805162461bcd60e51b815260206004820152600c60248201527f616464206f766572666c6f770000000000000000000000000000000000000000604482015290519081900360640190fd5b614d31816159d1565b604080516001600160a01b038481166024830152306044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b178152925182516000946060949389169392918291908083835b602083106153f45780518252601f1990920191602091820191016153d5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615456576040519150601f19603f3d011682016040523d82523d6000602084013e61545b565b606091505b5091509150818015615489575080511580615489575080806020019051602081101561548657600080fd5b50515b61502a576040805162461bcd60e51b8152602060048201526007602482015266215f70756c6c5560c81b604482015290519081900360640190fd5b60006147f183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615a46565b60008161555a576040805162461bcd60e51b815260206004820152600860248201527f6469762062792030000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b670de0b6b3a764000083028315806155825750670de0b6b3a764000084828161557f57fe5b04145b6155c2576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b6002830481018181101561560c576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b6000848281614d1357fe5b6000600183101561566f576040805162461bcd60e51b815260206004820152600c60248201527f6261736520746f6f206c6f770000000000000000000000000000000000000000604482015290519081900360640190fd5b671bc16d674ec7ffff8311156156cc576040805162461bcd60e51b815260206004820152600d60248201527f6261736520746f6f206869676800000000000000000000000000000000000000604482015290519081900360640190fd5b60006156d783615aa0565b905060006156e58483614af0565b905060006156fb866156f685615abb565b615ac9565b90508161570c5792506110b8915050565b600061571d87846305f5e100615b20565b90506157298282614c5d565b979650505050505050565b600a54600090156110b857600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b15801561578457600080fd5b505afa158015615798573d6000803e3d6000fd5b505050506040513d60208110156157ae57600080fd5b505190506001600160a01b0381161561582b576157d0614dd784600a54614c5d565b6007549092506157eb9085906001600160a01b031684614ec8565b6040805183815290516001600160a01b038616917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a25b5092915050565b6000808284106158485750508082036000615850565b505081810360015b9250929050565b600081836158e35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156158a8578181015183820152602001615890565b50505050905090810190601f1680156158d55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816158ef57fe5b0495945050505050565b61481d3083836149ee565b61481d8230836149ee565b3060009081526020819052604090205481111561595c576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b306000908152602081905260409020546159769082614af0565b306000908152602081905260409020556002546159939082614af0565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b306000908152602081905260409020546159eb90826152f9565b30600090815260208190526040902055600254615a0890826152f9565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b60008184841115615a985760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156158a8578181015183820152602001615890565b505050900390565b6000670de0b6b3a7640000615ab483615abb565b0292915050565b670de0b6b3a7640000900490565b60008060028306615ae257670de0b6b3a7640000615ae4565b835b90506002830492505b82156147f157615afd8485614c5d565b93506002830615615b1557615b128185614c5d565b90505b600283049250615aed565b6000828180615b3787670de0b6b3a7640000615832565b9092509050670de0b6b3a764000080600060015b888410615bef576000670de0b6b3a764000082029050600080615b7f8a615b7a85670de0b6b3a7640000614af0565b615832565b91509150615b9187612f13848c614c5d565b9650615b9d8784615506565b965086615bac57505050615bef565b8715615bb6579315935b8015615bc0579315935b8415615bd757615bd08688614af0565b9550615be4565b615be186886152f9565b95505b505050600101615b4b565b50909998505050505050505050565b828054828255906000526020600020908101928215615c51579160200282015b82811115615c515781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190615c1e565b50615c5d929150615c61565b5090565b5b80821115615c5d5780546001600160a01b0319168155600101615c6256fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220ed25ab735b494d192255c92c5c826f77a35050dad2cc13156cffa6332de25c3264736f6c634300060c0033

Deployed Bytecode Sourcemap

47495:14155:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14830:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15465:193;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15465:193:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34272:465;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34272:465:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33800:464;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33800:464:0;;;;;;;;;;:::i;48886:40::-;;;:::i;15360:97::-;;;:::i;16481:487::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16481:487:0;;;;;;;;;;;;;;;;;:::i;58681:470::-;;;;;;;;;;;;;;;;-1:-1:-1;58681:470:0;;;;;;;;-1:-1:-1;;;;;58681:470:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53888:679;;;;;;;;;;;;;;;;-1:-1:-1;53888:679:0;;:::i;:::-;;29860:115;;;;;;;;;;;;;;;;-1:-1:-1;29860:115:0;-1:-1:-1;;;;;29860:115:0;;:::i;15016:82::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54631:245;;;;;;;;;;;;;;;;-1:-1:-1;54631:245:0;-1:-1:-1;;;;;54631:245:0;;:::i;29325:287::-;;;;;;;;;;;;;;;;-1:-1:-1;29325:287:0;;:::i;42448:1328::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42448:1328:0;;;;;;;;;;;;;:::i;51485:305::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51485:305:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51485:305:0;;-1:-1:-1;51485:305:0;-1:-1:-1;51485:305:0;:::i;51320:157::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51320:157:0;;-1:-1:-1;51320:157:0;-1:-1:-1;51320:157:0;:::i;28769:19::-;;;:::i;28492:26::-;;;:::i;41154:1286::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41154:1286:0;;;;;;;;;;;;;:::i;53728:152::-;;;;;;;;;;;;;;;;-1:-1:-1;53728:152:0;-1:-1:-1;;;;;53728:152:0;;:::i;28872:19::-;;;:::i;31434:2079::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31434:2079:0;;-1:-1:-1;31434:2079:0;-1:-1:-1;31434:2079:0;:::i;15926:397::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15926:397:0;;;;;;;;:::i;49835:1078::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49835:1078:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54884:2330::-;;;;;;;;;;;;;;;;-1:-1:-1;54884:2330:0;;;;;;;;-1:-1:-1;;;;;54884:2330:0;;:::i;15243:109::-;;;;;;;;;;;;;;;;-1:-1:-1;15243:109:0;-1:-1:-1;;;;;15243:109:0;;:::i;48764:38::-;;;;;;;;;;;;;;;;-1:-1:-1;48764:38:0;;:::i;:::-;;;;-1:-1:-1;;;;;48764:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50921:391;;;;;;;;;;;;;;;;-1:-1:-1;50921:391:0;;;;;;;;;;;;;;:::i;25831:1312::-;;;;;;;;;;;;;;;;-1:-1:-1;25831:1312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38993:2153::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38993:2153:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36764:2221;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36764:2221:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60844:803::-;;;;;;;;;;;;;;;;-1:-1:-1;60844:803:0;;;;:::i;23529:1183::-;;;;;;;;;;;;;;;;-1:-1:-1;23529:1183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33598:194::-;;;;;;;;;;;;;;;;-1:-1:-1;33598:194:0;-1:-1:-1;;;;;33598:194:0;;:::i;31253:173::-;;;;;;;;;;;;;;;;-1:-1:-1;31253:173:0;-1:-1:-1;;;;;31253:173:0;;:::i;30640:136::-;;;:::i;30425:207::-;;;;;;;;;;;;;;;;-1:-1:-1;30425:207:0;-1:-1:-1;;;;;30425:207:0;;:::i;14921:87::-;;;:::i;18568:523::-;;;;;;;;;;;;;;;;-1:-1:-1;18568:523:0;;;;;;;;;;;;;;;;;;;;;;:::i;52836:333::-;;;;;;;;;;;;;;;;-1:-1:-1;52836:333:0;;:::i;16331:142::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16331:142:0;;;;;;;;:::i;59159:1457::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59159:1457:0;;-1:-1:-1;59159:1457:0;-1:-1:-1;59159:1457:0;:::i;28898:21::-;;;:::i;20109:697::-;;;;;;;;;;;;;;;;-1:-1:-1;20109:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30242:175::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57222:936;;;;;;;;;;;;;;;;-1:-1:-1;57222:936:0;;;;;;;;-1:-1:-1;;;;;57222:936:0;;:::i;49317:381::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49317:381:0;;;;;;;;:::i;28525:22::-;;;:::i;:::-;;;;-1:-1:-1;;;;;28525:22:0;;;;;;;;;;;;;;48851:28;;;:::i;30099:135::-;;;:::i;29983:108::-;;;:::i;15666:252::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15666:252:0;;;;;;;;:::i;58229:444::-;;;:::i;15106:129::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15106:129:0;;;;;;;;;;:::i;29620:232::-;;;;;;;;;;;;;;;;-1:-1:-1;29620:232:0;;:::i;49706:121::-;;;;;;;;;;;;;;;;-1:-1:-1;49706:121:0;-1:-1:-1;;;;;49706:121:0;;:::i;28795:24::-;;;:::i;48811:33::-;;;:::i;30784:256::-;;;;;;;;;;;;;;;;-1:-1:-1;30784:256:0;-1:-1:-1;;;;;30784:256:0;;:::i;60624:212::-;;;:::i;28602:25::-;;;:::i;51798:213::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51798:213:0;;-1:-1:-1;51798:213:0;-1:-1:-1;51798:213:0;:::i;31048:197::-;;;;;;;;;;;;;;;;-1:-1:-1;31048:197:0;-1:-1:-1;;;;;31048:197:0;;:::i;21824:686::-;;;;;;;;;;;;;;;;-1:-1:-1;21824:686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14830:83::-;14900:5;14893:12;;;;;;;;-1:-1:-1;;14893:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14867:13;;14893:12;;14900:5;;14893:12;;14900:5;14893:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14830:83;:::o;15465:193::-;15560:10;15532:4;15549:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15549:27:0;;;;;;;;;;;:33;;;15598:30;;;;;;;15532:4;;15549:27;;15560:10;;15598:30;;;;;;;;-1:-1:-1;15646:4:0;15465:193;;;;;:::o;34272:465::-;28418:6;;34385:14;;28418:6;;;;;28417:7;28409:27;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34425:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;34417:42;;;::::0;;-1:-1:-1;;;34417:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34417:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34478:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;34470:43;;;::::0;;-1:-1:-1;;;34470:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34470:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34550:17:0;;::::1;34524:23;34550:17:::0;;;:8:::1;:17;::::0;;;;;34605:18;;::::1;::::0;;;;34655:16:::1;::::0;;::::1;::::0;34673:15:::1;::::0;;::::1;::::0;34690:17;;::::1;::::0;34709:16;;::::1;::::0;34605:18;;34641:88:::1;::::0;34655:16;;34673:15;34709:16;34641:13:::1;:88::i;:::-;34634:95:::0;34272:465;-1:-1:-1;;;;;34272:465:0:o;33800:464::-;28418:6;;33906:14;;28418:6;;;;;28417:7;28409:27;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33946:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;33938:42;;;::::0;;-1:-1:-1;;;33938:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33938:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33999:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;33991:43;;;::::0;;-1:-1:-1;;;33991:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33991:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34071:17:0;;::::1;34045:23;34071:17:::0;;;:8:::1;:17;::::0;;;;;34126:18;;::::1;::::0;;;;34176:16:::1;::::0;;::::1;::::0;34194:15:::1;::::0;;::::1;::::0;34211:17;;::::1;::::0;34230:16;;::::1;::::0;34248:7:::1;::::0;34162:94:::1;::::0;34194:15;34211:17;34230:16;34162:13:::1;:94::i;48886:40::-:0;;;;:::o;15360:97::-;15437:12;;15360:97;:::o;16481:487::-;16566:4;16591:10;-1:-1:-1;;;;;16591:17:0;;;;:55;;-1:-1:-1;;;;;;16619:15:0;;;;;;:10;:15;;;;;;;;16635:10;16619:27;;;;;;;;16612:34;;;16591:55;16583:76;;;;;-1:-1:-1;;;16583:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16670:20;16676:3;16681;16686;16670:5;:20::i;:::-;16705:10;-1:-1:-1;;;;;16705:17:0;;;;;;:63;;-1:-1:-1;;;;;;16726:15:0;;;;;;:10;:15;;;;;;;;16742:10;16726:27;;;;;;;;-1:-1:-1;;16726:42:0;;16705:63;16701:238;;;-1:-1:-1;;;;;16820:15:0;;;;;;:10;:15;;;;;;;;16836:10;16820:27;;;;;;;;16815:38;;16849:3;16815:4;:38::i;:::-;-1:-1:-1;;;;;16785:15:0;;;;;;;:10;:15;;;;;;;;16801:10;16785:27;;;;;;;;;;:68;;;16873:54;;;;;;;;;;16801:10;;16873:54;;;;;;;;;;16701:238;-1:-1:-1;16956:4:0;16481:487;;;;;:::o;58681:470::-;-1:-1:-1;;;;;58884:18:0;58753:11;58884:18;;;:8;:18;;;;;;;;58922:11;;58957:21;;;;;;:15;;;:21;;;;;;59009:22;;;:28;;;;;;59061:15;;;:21;;;;;;59114:23;;;;:29;;;;;;;;58922:11;;58957:21;;59009:28;;59061:21;59114:29;58681:470::o;53888:679::-;53980:10;53947:21;53971:20;;;:8;:20;;;;;54010:11;;:22;-1:-1:-1;54010:22:0;54002:43;;;;;-1:-1:-1;;;54002:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54106:19;;54083:18;;;;:43;;:22;:43::i;:::-;54064:15;:62;;54056:81;;;;;-1:-1:-1;;;54056:81:0;;;;;;;;;;;;-1:-1:-1;;;54056:81:0;;;;;;;;;;;;;;;54148:25;54162:10;54148:13;:25::i;:::-;54203:11;;54198:26;;54216:7;54198:4;:26::i;:::-;54184:40;;54266:14;:21;54184:11;54299:170;54327:16;54320:23;;:4;:23;;;54299:170;;;54392:65;54452:4;54392:55;54408:14;54423:4;54408:20;;;;;;;;;;;;;;;;;;:38;:20;;;;;:38;;54392:11;;;:15;:55::i;:::-;:59;;:65::i;:::-;54368:21;;;;;;;:15;;;;:21;;;;;;:89;;;;54345:6;54299:170;;;;54479:35;54494:10;54506:7;54479:14;:35::i;:::-;54530:29;;;;;;;;54539:10;;54530:29;;;;;;;;;;53888:679;;;:::o;29860:115::-;-1:-1:-1;;;;;29950:11:0;29921:4;29950:11;;;:8;:11;;;;;:17;;;;29860:115::o;15016:82::-;15081:9;;;;15016:82;:::o;54631:245::-;54730:14;:21;54699:22;54763:106;54791:16;54784:23;;:4;:23;;;54763:106;;;54832:25;54842:4;54848:8;54832:9;:25::i;:::-;54809:6;;54763:106;;;;54631:245;;:::o;29325:287::-;29410:7;;-1:-1:-1;;;;;29410:7:0;29396:10;:21;29388:39;;;;;-1:-1:-1;;;29388:39:0;;;;;;;;;;;;-1:-1:-1;;;29388:39:0;;;;;;;;;;;;;;;6565:18;29446:41;;;29438:63;;;;;-1:-1:-1;;;29438:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29546:7;;29520:22;29525:13;29540:1;29520:4;:22::i;:::-;:33;;29512:53;;;;;-1:-1:-1;;;29512:53:0;;;;;;;;;;;;-1:-1:-1;;;29512:53:0;;;;;;;;;;;;;;;29576:12;:28;29325:287::o;42448:1328::-;28281:6;;42574:19;;28281:6;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;42619:9:::1;::::0;28310:13;42619:9:::1;42611:26;;;::::0;;-1:-1:-1;;;42611:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;42611:26:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;42656:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;42648:43;;;::::0;;-1:-1:-1;;;42648:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42648:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;42731:18:0;::::1;42704:24;42731:18:::0;;;:8:::1;:18;::::0;;;;42818:17:::1;::::0;::::1;::::0;42850:16:::1;::::0;;::::1;::::0;42881:12;;42908::::1;::::0;42962:7:::1;::::0;42984::::1;::::0;42779:223:::1;::::0;42818:17;42850:16;42881:12;42908;42935;;42779:24:::1;:223::i;:::-;42762:240;;43041:12;43023:14;:30;;43015:48;;;::::0;;-1:-1:-1;;;43015:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43015:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;43107:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:26:::1;::::0;;::::1;::::0;43102:54:::1;::::0;6082:6:::1;7506:8;;7518:5;7505:18;43102:4;:54::i;:::-;43084:14;:72;;43076:93;;;::::0;;-1:-1:-1;;;43076:93:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43076:93:0;;;;;;;;;;;;;::::1;;43202:39;43207:9;:17;;;43226:14;43202:4;:39::i;:::-;43182:9;:17;;:59;;;;43254:13;43270:27;43275:12;43289:7;;43270:4;:27::i;:::-;43315:46;::::0;;;;;;;43254:43;;-1:-1:-1;;;;;;43315:46:0;::::1;::::0;43324:10:::1;::::0;43315:46:::1;::::0;;;;;::::1;::::0;;::::1;43374:40;43389:10;43401:12;43374:14;:40::i;:::-;43425:44;43440:28;43445:12;43459:8;43440:4;:28::i;:::-;43425:14;:44::i;:::-;43484:12:::0;;43480:78:::1;;43528:7;::::0;43513:33:::1;::::0;-1:-1:-1;;;;;43528:7:0::1;43537:8:::0;43513:14:::1;:33::i;:::-;43589:81;43624:4;43631:12;43645:8;43655:14;43589:26;:81::i;:::-;43568:102:::0;-1:-1:-1;43681:53:0::1;::::0;-1:-1:-1;43697:8:0;43707:10:::1;43568:102:::0;43681:15:::1;:53::i;:::-;43747:21;;28346:6:::0;:14;;-1:-1:-1;;28346:14:0;;;42448:1328;;-1:-1:-1;;;42448:1328:0:o;51485:305::-;28281:6;;;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;51606:10:::1;-1:-1:-1::0;;;;;51606:21:0;::::1;;::::0;:52:::1;;-1:-1:-1::0;51645:13:0::1;::::0;-1:-1:-1;;;;;51645:13:0::1;51631:10;:27;51606:52;51598:76;;;::::0;;-1:-1:-1;;;51598:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;51685:47;51695:7;51704:13;51719:12;;51685:9;:47::i;:::-;51743:39;51759:7;51768:13;51743:15;:39::i;:::-;-1:-1:-1::0;;28346:6:0;:14;;-1:-1:-1;;28346:14:0;;;-1:-1:-1;;51485:305:0:o;51320:157::-;51417:52;51429:10;51441:13;51456:12;;51417:11;:52::i;28769:19::-;;;;:::o;28492:26::-;;;;:::o;41154:1286::-;28281:6;;41286:18;;28281:6;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;41332:9:::1;::::0;28310:13;41332:9:::1;41324:26;;;::::0;;-1:-1:-1;;;41324:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;41324:26:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41369:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;41361:42;;;::::0;;-1:-1:-1;;;41361:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41361:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41444:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:25:::1;;::::0;41439:52:::1;::::0;7449:1:::1;6082:6;7442:8;;41439:4;:52::i;:::-;41422:13;:69;;41414:90;;;::::0;;-1:-1:-1;;;41414:90:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41414:90:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41543:17:0;::::1;41517:23;41543:17:::0;;;:8:::1;:17;::::0;;;;41628:16:::1;::::0;::::1;::::0;41659:15:::1;::::0;;::::1;::::0;41689:12;;41716::::1;::::0;41771:7:::1;::::0;41589:200:::1;::::0;41628:16;41659:15;41689:12;41716;41743:13;;41589:24:::1;:200::i;:::-;41573:216;;41827:16;41810:13;:33;;41802:51;;;::::0;;-1:-1:-1;;;41802:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41802:51:0;;;;;;;;;;;;;::::1;;41885:37;41890:8;:16;;;41908:13;41885:4;:37::i;:::-;41866:16;::::0;::::1;:56:::0;41940:44:::1;::::0;;;;;;;-1:-1:-1;;;;;41940:44:0;::::1;::::0;41949:10:::1;::::0;41940:44:::1;::::0;;;;::::1;::::0;;::::1;41997:29;42012:13;41997:14;:29::i;:::-;42037:51;42053:7;42062:10;42074:13;42037:15;:51::i;:::-;42099:22;42169:80;42196:7;42205:13;42228:4;42235:13;42169:26;:80::i;:::-;42132:117:::0;-1:-1:-1;42132:117:0;-1:-1:-1;42264:21:0;;42260:87:::1;;42306:41;42311:8;:16;;;42329:17;42306:4;:41::i;:::-;42287:16;::::0;::::1;:60:::0;42260:87:::1;42358:41;42373:10;42385:13;42358:14;:41::i;53728:152::-:0;53853:19;;-1:-1:-1;;;;;53818:18:0;;53794:4;53818:18;;;:8;:18;;;;;:32;;;:54;53728:152;;;:::o;28872:19::-;;;;:::o;31434:2079::-;28281:6;;;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;31643:10:::1;::::0;31629::::1;-1:-1:-1::0;;;;;31643:10:0;;::::1;31629:24;31621:44;;;::::0;;-1:-1:-1;;;31621:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31621:44:0;;;;;;;;;;;;;::::1;;31685:9;::::0;::::1;;31684:10;31676:26;;;::::0;;-1:-1:-1;;;31676:26:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31676:26:0;;;;;;;;;;;;;::::1;;6337:11:::0;31723:26;::::1;;31715:46;;;::::0;;-1:-1:-1;;;31715:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31715:46:0;;;;;;;;;;;;;::::1;;6411:9:::0;31780:26;::::1;;31772:46;;;::::0;;-1:-1:-1;;;31772:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31772:46:0;;;;;;;;;;;;;::::1;;31829:7;:18:::0;;;31884:1:::1;31873:12:::0;::::1;31858;:27:::0;7103:11;31906:46;::::1;;31898:71;;;::::0;;-1:-1:-1;;;31898:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;7169:13:::0;31988:46;::::1;;31980:71;;;::::0;;-1:-1:-1;;;31980:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;6145:1;32072:45:::0;::::1;;32064:68;;;::::0;;-1:-1:-1;;;32064:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;6201:1;32151:44:::0;::::1;32143:67;;;::::0;;-1:-1:-1;;;32143:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32229:41:::0;;::::1;32221:64;;;::::0;;-1:-1:-1;;;32221:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32298:16;32329:25;32368:11:::0;32357:30:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;32357:30:0::1;;32329:58;;32403:6;32398:743;32415:22:::0;;::::1;32398:743;;;32459:13;32475:11;;32487:1;32475:14;;;;;;;;;;;;;-1:-1:-1::0;;;;;32475:14:0::1;32459:30;;32504:11;32518:12;;32531:1;32518:15;;;;;;;;;;;;;32504:29;;32548:12;32570:5;-1:-1:-1::0;;;;;32563:23:0::1;;32595:4;32563:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;32563:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32563:38:0;32616:11;;32563:38;;-1:-1:-1;32563:38:0;;32616:8;;32625:1;;32616:11;::::1;;;;;;::::0;;::::1;::::0;;;;;;:21;;;;-1:-1:-1;;;;;32661:15:0;::::1;;::::0;;;:8:::1;:15:::0;;;;;;:21;::::1;;32660:22;32652:40;;;::::0;;-1:-1:-1;;;32652:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32652:40:0;;;;;;;;;;;;;::::1;;6082:6;32715;:27;;32707:50;;;::::0;;-1:-1:-1;;;32707:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;6840:9:::0;32780:27;::::1;;32772:50;;;::::0;;-1:-1:-1;;;32772:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;6968:13:::0;32845:29;::::1;;32837:49;;;::::0;;-1:-1:-1;;;32837:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32837:49:0;;;;;;;;;;;;;::::1;;32919:156;::::0;;::::1;::::0;::::1;::::0;;32953:4:::1;32919:156:::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32901:15:0;::::1;-1:-1:-1::0;32901:15:0;;;:8:::1;:15:::0;;;;;;;:174;;;;-1:-1:-1;;32901:174:0::1;::::0;::::1;;;::::0;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;33104:25:::1;33109:11:::0;32919:156;33104:4:::1;:25::i;:::-;33090:39:::0;-1:-1:-1;;32439:3:0::1;::::0;;::::1;::::0;-1:-1:-1;32398:743:0::1;::::0;-1:-1:-1;32398:743:0::1;;-1:-1:-1::0;6904:9:0;33159:38;::::1;;33151:62;;;::::0;;-1:-1:-1;;;33151:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33224:12;:26:::0;;;33261:21:::1;:7;33271:11:::0;;33261:21:::1;:::i;:::-;-1:-1:-1::0;33293:9:0::1;:16:::0;;-1:-1:-1;;33293:16:0::1;33305:4;33293:16;::::0;;33320:31:::1;33335:15:::0;33320:14:::1;:31::i;:::-;33362:43;33377:10;33389:15;33362:14;:43::i;:::-;33421:84;33434:7;;33443:15;33460:7;;33469:11;;33482:12;;33496:8;33421:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;33421:84:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;33421:84:0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;33421:84:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;-1:-1:-1;33421:84:0;::::1;::::0;;;;;;;::::1;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;28346:6:0;:14;;-1:-1:-1;;28346:14:0;;;-1:-1:-1;;;;;;31434:2079:0:o;15926:397::-;16037:10;15993:4;16026:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16026:27:0;;;;;;;;;;16068:14;;;16064:160;;;16110:10;16129:1;16099:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16099:27:0;;;;;;;;;:31;16064:160;;;16193:19;16198:8;16208:3;16193:4;:19::i;:::-;16174:10;16163:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16163:27:0;;;;;;;;;:49;16064:160;16248:10;16265:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16239:54:0;;16265:27;;;;;;;;;;;16239:54;;;;;;;;;16248:10;16239:54;;;;;;;;;;;-1:-1:-1;16311:4:0;;15926:397;-1:-1:-1;;;15926:397:0:o;49835:1078::-;49267:10;;-1:-1:-1;;;;;49267:10:0;49253;:24;49245:44;;;;;-1:-1:-1;;;49245:44:0;;;;;;;;;;;;-1:-1:-1;;;49245:44:0;;;;;;;;;;;;;;;50084:14:::1;:21:::0;50108:1:::1;-1:-1:-1::0;50076:55:0::1;;;::::0;;-1:-1:-1;;;50076:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50172:16;50150:18;:38;;50142:58;;;::::0;;-1:-1:-1;;;50142:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50142:58:0;;;;;;;;;;;;;::::1;;50241:11;50226:12;:26;50225:57;;50271:11;50225:57;;;50256:12;50225:57;50211:71;;50315:15;50301:11;:29;50293:48;;;::::0;;-1:-1:-1;;;50293:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50293:48:0;;;;;;;;;;;;;::::1;;50352:14;:12;:14::i;:::-;50397:507;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;50397:507:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;50397:507:0;;;;;;;;;;;;;;;;;;;;;;;;50817:37;;;::::1;50397:507:::0;;;;;;;;;;;;50377:14:::1;:528:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;50377:528:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49835:1078::o;54884:2330::-;54960:18;54973:4;54960:12;:18::i;:::-;-1:-1:-1;;;;;55013:18:0;;54989:21;55013:18;;;:8;:18;;;;;55078:14;:20;;55013:18;;54989:21;55078:20;;;;;;;;;;;;;;;;;;55191:21;;;;;:15;;;:21;;;;;;;55078:20;;;;;;55147:28;;;;55131:11;;55078:20;;-1:-1:-1;55131:82:0;;55191:21;55131:55;;55181:4;;55131:45;;:15;:45::i;:55::-;:59;;:82::i;:::-;55250:28;;;;55109:104;;-1:-1:-1;55293:22:0;;55289:1432;;55351:10;:26;;;55336:12;:41;55332:1378;;;55445:29;;;55398:18;55445:29;;;:23;;;:29;;;;;;;;;55419:15;;;:21;;;;;;:56;;:25;:56::i;:::-;55398:77;-1:-1:-1;55498:17:0;;55494:219;;55557:33;:14;55576:13;55557:18;:33::i;:::-;55645:29;;;;;;;:23;;;:29;;;;;;55540:50;;-1:-1:-1;55645:48:0;;55679:13;55645:33;:48::i;:::-;55613:29;;;;;;;:23;;;:29;;;;;:80;55494:219;55332:1378;;;;55757:18;;55753:283;;55800:14;55817:47;55860:3;55817:38;:14;55836:18;55817;:38::i;:47::-;55800:64;-1:-1:-1;55904:29:0;:14;55800:64;55904:18;:29::i;:::-;55980:21;;;;;;;:15;;;:21;;;;;;55887:46;;-1:-1:-1;55980:36:0;;56006:9;55980:25;:36::i;:::-;55956:21;;;;;;;:15;;;:21;;;;;:60;-1:-1:-1;55753:283:0;56073:10;:28;;;56058:12;:43;56054:641;;;56126:16;56145:108;56223:10;:29;;;56145:73;56171:46;56188:10;:28;;;56171:12;:16;;:46;;;;:::i;:::-;56145:21;;;;;;;:15;;;:21;;;;;;;:25;:73::i;:108::-;56303:29;;;56276:24;56303:29;;;:23;;;:29;;;;;;56126:127;;-1:-1:-1;56359:33:0;;;56355:321;;;56421:18;56442:36;:11;56458:19;56442:15;:36::i;:::-;56421:57;-1:-1:-1;56537:38:0;:19;56421:57;56537:23;:38::i;:::-;56505:29;;;;;;;:23;;;:29;;;;;:70;56619:33;:14;56638:13;56619:18;:33::i;:::-;56602:50;;56355:321;;56054:641;;;56735:18;;56731:476;;56801:28;;;;;;;:22;;;:28;;;;;;:48;;56834:14;56801:32;:48::i;:::-;56770:28;;;;;;;:22;;;:28;;;;;:79;56894:27;;;;:47;;56926:14;56894:31;:47::i;:::-;56864:27;;;:77;56956:10;;56980:22;;56956:73;;;-1:-1:-1;;;56956:73:0;;-1:-1:-1;;;;;56980:22:0;;;56956:73;;;;;;;;;;;;;;;;;;;:10;;;;;:23;;:73;;;;;:10;;:73;;;;;;;:10;;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57049:42:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57049:42:0;;;-1:-1:-1;57049:42:0;;-1:-1:-1;57049:42:0;;;;;;;;;57130:65;57190:4;57130:55;57146:14;57161:4;57146:20;;;;;;;;;;;;;;;;;;:38;:20;;;;;:38;;57130:11;;;:15;:55::i;:65::-;57106:21;;;;;;;:15;;;:21;;;;;:89;56731:476;54884:2330;;;;;;:::o;15243:109::-;-1:-1:-1;;;;;15330:14:0;15306:4;15330:14;;;;;;;;;;;;15243:109::o;48764:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48764:38:0;;;;-1:-1:-1;48764:38:0;;;;;;;;;;;;;;;:::o;50921:391::-;49267:10;;-1:-1:-1;;;;;49267:10:0;49253;:24;49245:44;;;;;-1:-1:-1;;;49245:44:0;;;;;;;;;;;;-1:-1:-1;;;49245:44:0;;;;;;;;;;;;;;;51042:18:::1;51055:4;51042:12;:18::i;:::-;51071:33;51107:14;51122:4;51107:20;;;;;;;;;;;;;;;;;;;;51071:56;;51162:10;:25;;;51146:12;:41;;51138:58;;;::::0;;-1:-1:-1;;;51138:58:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;51138:58:0;;;;;;;;;;;;;::::1;;51207:25;::::0;::::1;:43:::0;;;;51261:25:::1;::::0;;::::1;:43:::0;-1:-1:-1;50921:391:0:o;25831:1312::-;26099:19;26136:21;26160:33;26165:14;26181:11;26160:4;:33::i;:::-;26136:57;;26301:29;26333:46;26338:12;26352:26;6082:6;26370:7;26352:4;:26::i;:::-;26333:4;:46::i;:::-;26301:78;;26390:18;26411:42;26416:10;26428:24;26411:4;:42::i;:::-;26390:63;;26464:14;26481:31;26486:13;26501:10;26481:4;:31::i;:::-;26464:48;;26585:18;26606:52;26611:9;26622:35;6082:6;26640:16;26622:4;:35::i;:::-;26606:4;:52::i;:::-;26585:73;;26669:23;26695:36;26700:13;26715:15;26695:4;:36::i;:::-;26669:62;;26744:32;26779:41;26784:15;26801:18;26779:4;:41::i;:::-;26744:76;;26957:8;26968:50;26973:35;6082:6;26991:16;26973:4;:35::i;:::-;27010:7;26968:4;:50::i;:::-;26957:61;;27046:57;27051:27;27080:22;6082:6;27098:3;27080:4;:22::i;27046:57::-;27029:74;;27114:21;;;;;;;;25831:1312;;;;;;;;;:::o;38993:2153::-;28281:6;;39202:18;;;;28281:6;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;-1:-1:-1;;;;;39267:17:0;::::1;28310:13:::0;39267:17;;;:8:::1;:17;::::0;;;;:23;28310:13;39267:23:::1;39259:42;;;::::0;;-1:-1:-1;;;39259:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39259:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;39320:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;39312:43;;;::::0;;-1:-1:-1;;;39312:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39312:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;39394:26:0;;::::1;39368:23;39394:26:::0;;;:8:::1;:26;::::0;;;;;39458:27;;::::1;::::0;;;;39529:17:::1;::::0;;::::1;::::0;39524:45:::1;::::0;6082:6:::1;7506:8;::::0;39524:45:::1;39506:14;:63;;39498:84;;;::::0;;-1:-1:-1;;;39498:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39498:84:0;;;;;;;;;;;;;::::1;;39595:20;39618:170;39646:8;:16;;;39677:8;:15;;;39707:9;:17;;;39739:9;:16;;;39770:7;;39618:13;:170::i;:::-;39595:193;;39826:8;39807:15;:27;;39799:51;;;::::0;;-1:-1:-1;;;39799:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39799:51:0;;;;;;;;;;;;;::::1;;39879:200;39908:8;:16;;;39939:8;:15;;;39969:9;:17;;;40001:9;:16;;;40032:14;40061:7;;39879:14;:200::i;:::-;39863:216;;40115:11;40098:13;:28;;40090:47;;;::::0;;-1:-1:-1;;;40090:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40090:47:0;;;;;;;;;;;;;::::1;;40169:37;40174:8;:16;;;40192:13;40169:4;:37::i;:::-;40150:8;:16;;:56;;;;40237:39;40242:9;:17;;;40261:14;40237:4;:39::i;:::-;40217:17;::::0;;::::1;:59:::0;;;40334:16;::::1;::::0;40365:15:::1;::::0;;::::1;::::0;40427:16;;::::1;::::0;40458:7:::1;::::0;40306:170:::1;::::0;40217:59;40427:16;40306:13:::1;:170::i;:::-;40289:187;;40513:15;40495:14;:33;;40487:52;;;::::0;;-1:-1:-1;;;40487:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40487:52:0;;;;;;;;;;;;;::::1;;40576:8;40558:14;:26;;40550:48;;;::::0;;-1:-1:-1;;;40550:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40550:48:0;;;;;;;;;;;;;::::1;;40636:35;40641:13;40656:14;40636:4;:35::i;:::-;40617:15;:54;;40609:73;;;::::0;;-1:-1:-1;;;40609:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40609:73:0;;;;;;;;;;;;;::::1;;40730:8;-1:-1:-1::0;;;;;40700:70:0::1;40721:7;-1:-1:-1::0;;;;;40700:70:0::1;40709:10;-1:-1:-1::0;;;;;40700:70:0::1;;40740:13;40755:14;40700:70;;;;;;;;;;;;;;;;;;;;;;;;40783:51;40799:7;40808:10;40820:13;40783:15;:51::i;:::-;40845:53;40861:8;40871:10;40883:14;40845:15;:53::i;:::-;40909:24;40936:49;40962:7;40971:13;40936:25;:49::i;:::-;40909:76:::0;-1:-1:-1;41000:23:0;;40996:91:::1;;41044:43;41049:8;:16;;;41067:19;41044:4;:43::i;:::-;41025:16;::::0;::::1;:62:::0;40996:91:::1;41100:38;;;;28346:6:::0;:14;;-1:-1:-1;;28346:14:0;;;38993:2153;;;;-1:-1:-1;38993:2153:0;-1:-1:-1;;;;38993:2153:0:o;36764:2221::-;28281:6;;36972:19;;;;28281:6;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;-1:-1:-1;;;;;37040:17:0;::::1;28310:13:::0;37040:17;;;:8:::1;:17;::::0;;;;:23;28310:13;37040:23:::1;37032:42;;;::::0;;-1:-1:-1;;;37032:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37032:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37093:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;37085:43;;;::::0;;-1:-1:-1;;;37085:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37085:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37167:26:0;;::::1;37141:23;37167:26:::0;;;:8:::1;:26;::::0;;;;;37231:27;;::::1;::::0;;;;37301:16:::1;::::0;::::1;::::0;37296:43:::1;::::0;7449:1:::1;6082:6;7442:8;::::0;37296:43:::1;37279:13;:60;;37271:81;;;::::0;;-1:-1:-1;;;37271:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37271:81:0;;;;;;;;;;;;;::::1;;37365:20;37388:170;37416:8;:16;;;37447:8;:15;;;37477:9;:17;;;37509:9;:16;;;37540:7;;37388:13;:170::i;:::-;37365:193;;37596:8;37577:15;:27;;37569:51;;;::::0;;-1:-1:-1;;;37569:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37569:51:0;;;;;;;;;;;;;::::1;;37650:199;37679:8;:16;;;37710:8;:15;;;37740:9;:17;;;37772:9;:16;;;37803:13;37831:7;;37650:14;:199::i;:::-;37633:216;;37886:12;37868:14;:30;;37860:48;;;::::0;;-1:-1:-1;;;37860:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37860:48:0;;;;;;;;;;;;;::::1;;37940:37;37945:8;:16;;;37963:13;37940:4;:37::i;:::-;37921:8;:16;;:56;;;;38008:39;38013:9;:17;;;38032:14;38008:4;:39::i;:::-;37988:17;::::0;;::::1;:59:::0;;;38105:16;::::1;::::0;38136:15:::1;::::0;;::::1;::::0;38198:16;;::::1;::::0;38229:7:::1;::::0;38077:170:::1;::::0;37988:59;38198:16;38077:13:::1;:170::i;:::-;38060:187;;38284:15;38266:14;:33;;38258:52;;;::::0;;-1:-1:-1;;;38258:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38258:52:0;;;;;;;;;;;;;::::1;;38347:8;38329:14;:26;;38321:48;;;::::0;;-1:-1:-1;;;38321:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38321:48:0;;;;;;;;;;;;;::::1;;38407:35;38412:13;38427:14;38407:4;:35::i;:::-;38388:15;:54;;38380:73;;;::::0;;-1:-1:-1;;;38380:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38380:73:0;;;;;;;;;;;;;::::1;;38501:8;-1:-1:-1::0;;;;;38471:70:0::1;38492:7;-1:-1:-1::0;;;;;38471:70:0::1;38480:10;-1:-1:-1::0;;;;;38471:70:0::1;;38511:13;38526:14;38471:70;;;;;;;;;;;;;;;;;;;;;;;;38554:51;38570:7;38579:10;38591:13;38554:15;:51::i;:::-;38616:22;38687:76;38714:7;38723:13;38738:8;38748:14;38687:26;:76::i;:::-;38649:114:::0;-1:-1:-1;38649:114:0;-1:-1:-1;38778:21:0;;38774:87:::1;;38820:41;38825:8;:16;;;38843:17;38820:4;:41::i;:::-;38801:16;::::0;::::1;:60:::0;38774:87:::1;38872:53;38888:8;38898:10;38910:14;38872:15;:53::i;60844:803::-:0;60896:33;60932:14;60947:4;60932:20;;;;;;;;;;;;;;;;;;;;60896:56;;60963:30;61011:10;:25;;;60996:12;:40;:83;;61067:12;60996:83;;;61039:10;:25;;;60996:83;60963:116;;61122:10;:26;;;61094:25;:54;61090:550;;;61165:13;61181:24;61199:4;61181:9;:24::i;:::-;61165:40;-1:-1:-1;61224:12:0;;61220:340;;61257:15;61275:57;61305:10;:26;;;61275:25;:29;;:57;;;;:::i;:::-;61257:75;;61351:23;61377:65;61433:8;61377:51;61423:4;61377:41;61392:10;:25;;;61377:10;:14;;:41;;;;:::i;:::-;:45;;:51::i;:65::-;61492:28;;;;61351:91;;-1:-1:-1;61492:52:0;;61351:91;61492:32;:52::i;:::-;61461:28;;;:83;-1:-1:-1;;61220:340:0;-1:-1:-1;61574:26:0;;;;;:54;-1:-1:-1;60844:803:0:o;23529:1183::-;23773:18;24060:21;24084:32;24089:13;24104:11;24084:4;:32::i;:::-;24060:56;;24127:8;24138:50;24143:35;6082:6;24161:16;24143:4;:35::i;:::-;24180:7;24138:4;:50::i;:::-;24127:61;;24199:26;24228:43;24233:13;24248:22;6082:6;24266:3;24248:4;:22::i;24228:43::-;24199:72;;24284:22;24309:43;24314:14;24330:21;24309:4;:43::i;:::-;24284:68;;24363:17;24383:39;24388:17;24407:14;24383:4;:39::i;:::-;24363:59;;24503:14;24520:36;24525:12;24539:16;24520:4;:36::i;:::-;24503:53;;24567:18;24588:27;24593:9;24604:10;24588:4;:27::i;:::-;24567:48;;24642:31;24647:13;24662:10;24642:4;:31::i;:::-;24626:47;23529:1183;-1:-1:-1;;;;;;;;;;;;;;23529:1183:0:o;33598:194::-;28281:6;;;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;-1:-1:-1;;;;;33677:15:0;::::1;28310:13:::0;33677:15;;;:8:::1;:15;::::0;;;;:21;28310:13;33677:21:::1;33669:40;;;::::0;;-1:-1:-1;;;33669:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33669:40:0;;;;;;;;;;;;;::::1;;33746:38;::::0;;-1:-1:-1;;;33746:38:0;;33778:4:::1;33746:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;33746:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33746:38:0;-1:-1:-1;;;;;33720:15:0;;::::1;;::::0;;;:8:::1;33746:38;33720:15:::0;;;;:23:::1;;:64:::0;28346:6;:14;;-1:-1:-1;;28346:14:0;;;33598:194::o;31253:173::-;28281:6;;;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;31361:10:::1;::::0;31347::::1;-1:-1:-1::0;;;;;31361:10:0;;::::1;31347:24;31339:44;;;::::0;;-1:-1:-1;;;31339:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31339:44:0;;;;;;;;;;;;;::::1;;31394:10;:24:::0;;-1:-1:-1;;;;;;31394:24:0::1;-1:-1:-1::0;;;;;31394:24:0;;;::::1;::::0;;;::::1;::::0;;28346:6;:14;;-1:-1:-1;;28346:14:0;;;31253:173::o;30640:136::-;28418:6;;30727:4;;28418:6;;;;;28417:7;28409:27;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;;;;-1:-1:-1;30756:12:0::1;::::0;30640:136;:::o;30425:207::-;28418:6;;30520:4;;28418:6;;;;;28417:7;28409:27;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30552:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;30544:40;;;::::0;;-1:-1:-1;;;30544:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30544:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;30602:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;;30425:207::o;14921:87::-;14993:7;14986:14;;;;;;;;-1:-1:-1;;14986:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14960:13;;14986:14;;14993:7;;14986:14;;14993:7;14986:14;;;;;;;;;;;;;;;;;;;;;;;;18568:523;18780:14;18812:10;18825:35;18830:14;18846:13;18825:4;:35::i;:::-;18812:48;;18871:10;18884:37;18889:15;18906:14;18884:4;:37::i;:::-;18871:50;;18932:10;18945:18;18950:5;18957;18945:4;:18::i;:::-;18932:31;;18974:10;18987:45;6082:6;19005:26;6082:6;19023:7;19005:4;:26::i;:::-;18987:4;:45::i;:::-;18974:58;;19064:18;19069:5;19076;19064:4;:18::i;:::-;19052:30;18568:523;-1:-1:-1;;;;;;;;;;18568:523:0:o;52836:333::-;52894:12;52909:24;52927:4;52909:9;:24::i;:::-;52894:39;;52944:35;52959:10;52971:7;52944:14;:35::i;:::-;52990:11;53004:24;53022:4;53004:9;:24::i;:::-;52990:38;;53049:21;53054:6;53062:7;53049:4;:21::i;:::-;53039:31;;53125:36;53141:10;53153:7;53125:15;:36::i;16331:142::-;16399:4;16416:27;16422:10;16434:3;16439;16416:5;:27::i;:::-;-1:-1:-1;16461:4:0;16331:142;;;;:::o;59159:1457::-;28281:6;;;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;59271:9:::1;::::0;28310:13;59271:9:::1;59263:26;;;::::0;;-1:-1:-1;;;59263:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;59263:26:0;;;;;;;;;;;;;::::1;;59302:16;59321:13;:11;:13::i;:::-;59302:32;;59345:13;59361:27;59366:12;59380:7;;59361:4;:27::i;:::-;59345:43;;59399:20;59422:28;59427:12;59441:8;59422:4;:28::i;:::-;59399:51;;59461:10;59474:34;59479:15;59496:11;59474:4;:34::i;:::-;59461:47:::0;-1:-1:-1;59527:10:0;59519:29:::1;;;::::0;;-1:-1:-1;;;59519:29:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59519:29:0;;;;;;;;;;;;;::::1;;59561:20;59584:21;59594:10;59584:9;:21::i;:::-;59561:44;;59638:12;59620:15;:30;59616:291;;;59667:20;59690:35;59695:12;59709:15;59690:4;:35::i;:::-;59770:10;59740:18;59761:20:::0;;;:8:::1;:20;::::0;;;;:27;59667:58;;-1:-1:-1;59811:32:0;;::::1;;59803:52;;;::::0;;-1:-1:-1;;;59803:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59803:52:0;;;;;;;;;;;;;::::1;;59870:25;59879:15;59870:8;:25::i;:::-;59616:291;;;59919:40;59934:10;59946:12;59919:14;:40::i;:::-;59974:12:::0;;59970:78:::1;;60018:7;::::0;60003:33:::1;::::0;-1:-1:-1;;;;;60018:7:0::1;60027:8:::0;60003:14:::1;:33::i;:::-;60058:31;60073:15;60058:14;:31::i;:::-;60107:6;60102:507;60123:7;:14:::0;60119:18;::::1;60102:507;;;60159:9;60171:7;60179:1;60171:10;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;60171:10:0::1;60207:11:::0;;;:8:::1;:11:::0;;;;;;:19:::1;;::::0;60171:10;;-1:-1:-1;60207:19:0;60263:16:::1;60268:5:::0;60207:19;60263:4:::1;:16::i;:::-;60241:38:::0;-1:-1:-1;60302:19:0;60294:38:::1;;;::::0;;-1:-1:-1;;;60294:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;60294:38:0;;;;;;;;;;;;;::::1;;60373:13;;60387:1;60373:16;;;;;;;;;;;;;60355:14;:34;;60347:52;;;::::0;;-1:-1:-1;;;60347:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;60347:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;60441:11:0;::::1;;::::0;;;:8:::1;:11;::::0;;;;:19:::1;;::::0;60436:41:::1;::::0;60462:14;60436:4:::1;:41::i;:::-;-1:-1:-1::0;;;;;60414:11:0;::::1;;::::0;;;:8:::1;:11;::::0;;;;;;;;:19:::1;;:63:::0;;;;60497:39;;;;;;;60414:11;;60506:10:::1;::::0;60497:39:::1;::::0;;;;;;;;::::1;60551:46;60567:1;60570:10;60582:14;60551:15;:46::i;:::-;-1:-1:-1::0;;;60139:3:0::1;;60102:507;;;-1:-1:-1::0;;28346:6:0;:14;;-1:-1:-1;;28346:14:0;;;-1:-1:-1;;;;;;;59159:1457:0:o;28898:21::-;;;;;;:::o;20109:697::-;20351:19;20388:16;20407:35;20412:13;20427:14;20407:4;:35::i;:::-;20388:54;;20453:15;20471:26;6082:6;20489:7;20471:4;:26::i;:::-;20453:44;;20521:31;20526:13;20541:10;20521:4;:31::i;:::-;20508:44;;20563:6;20572:54;20577:14;20593:32;20598:14;20614:10;20593:4;:32::i;20572:54::-;20563:63;;20637:8;20648:20;20653:1;20656:11;20648:4;:20::i;:::-;20637:31;;20679:8;20690:22;6082:6;20708:3;20690:4;:22::i;:::-;20679:33;;20740:26;20745:15;20762:3;20740:4;:26::i;:::-;20723:43;20109:697;-1:-1:-1;;;;;;;;;;;;20109:697:0:o;30242:175::-;28418:6;;30317:23;;28418:6;;;;;28417:7;28409:27;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;;;;30366:9:::1;::::0;::::1;;30358:26;;;::::0;;-1:-1:-1;;;30358:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;30358:26:0;;;;;;;;;;;;;::::1;;30402:7;30395:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;30395:14:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;30242:175:::0;:::o;57222:936::-;-1:-1:-1;;;;;57355:18:0;;57305:13;57355:18;;;:8;:18;;;;;57420:14;:20;;57305:13;;57420:14;:20;;;;;;;;;;;;;;;;;;;;57384:56;;57451:23;57477:10;:28;;;57451:54;;57516:13;57532:24;57550:4;57532:9;:24::i;:::-;57516:40;;57567:30;57615:10;:25;;;57600:12;:40;:83;;57671:12;57600:83;;;57643:10;:25;;;57600:83;57567:116;;57726:10;:26;;;57698:25;:54;:71;;;;-1:-1:-1;57756:13:0;;;57698:71;57694:363;;;57786:15;57804:57;57834:10;:26;;;57804:25;:29;;:57;;;;:::i;:::-;57786:75;;57876:23;57902:65;57958:8;57902:51;57948:4;57902:41;57917:10;:25;;;57902:10;:14;;:41;;;;:::i;:65::-;57876:91;-1:-1:-1;58003:42:0;:18;57876:91;58003:22;:42::i;:::-;57982:63;;57694:363;;;58128:21;;;;;;;:15;;;:21;;;;;;58078:11;;:72;;58128:21;58078:45;;58118:4;;58078:35;;58094:18;58078:15;:35::i;:72::-;58067:83;57222:936;-1:-1:-1;;;;;;;;57222:936:0:o;49317:381::-;49267:10;;-1:-1:-1;;;;;49267:10:0;49253;:24;49245:44;;;;;-1:-1:-1;;;49245:44:0;;;;;;;;;;;;-1:-1:-1;;;49245:44:0;;;;;;;;;;;;;;;49456:10:::1;::::0;-1:-1:-1;;;;;49456:10:0::1;49448:33:::0;49440:62:::1;;;::::0;;-1:-1:-1;;;49440:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;49543:7;49520:19;;:30;;49513:38;;;;49613:19;:42:::0;49666:10:::1;:24:::0;;-1:-1:-1;;;;;;49666:24:0::1;-1:-1:-1::0;;;;;49666:24:0;;;::::1;::::0;;;::::1;::::0;;49317:381::o;28525:22::-;;;-1:-1:-1;;;;;28525:22:0;;:::o;48851:28::-;;;-1:-1:-1;;;;;48851:28:0;;:::o;30099:135::-;28418:6;;30171:23;;28418:6;;;;;28417:7;28409:27;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;;;29983:108;30069:7;:14;29983:108;:::o;15666:252::-;15796:10;15733:4;15785:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15785:27:0;;;;;;;;;;15780:38;;15814:3;15780:4;:38::i;:::-;15761:10;15750:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15750:27:0;;;;;;;;;;;;:68;;;15834:54;;;;;;15750:27;;15834:54;;;;;;;;;;;-1:-1:-1;15906:4:0;15666:252;;;;:::o;58229:444::-;58320:10;58287:21;58311:20;;;:8;:20;;;;;58357:11;;58311:20;;58379:35;;58357:11;58379:14;:35::i;:::-;58439:1;58425:15;;;58482:14;:21;;58515:106;58543:16;58536:23;;:4;:23;;;58515:106;;;58584:21;;;58608:1;58584:21;;;:15;;;;:21;;;;;:25;;;;58561:6;58515:106;;;-1:-1:-1;58636:29:0;;;;;;;;58645:10;;58636:29;;;;;;;;;;58229:444;;;:::o;15106:129::-;-1:-1:-1;;;;;15207:15:0;;;15183:4;15207:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;15106:129::o;29620:232::-;29682:9;;;;29681:10;29673:26;;;;;-1:-1:-1;;;29673:26:0;;;;;;;;;;;;-1:-1:-1;;;29673:26:0;;;;;;;;;;;;;;;29732:7;;-1:-1:-1;;;;;29732:7:0;29718:10;:21;29710:39;;;;;-1:-1:-1;;;29710:39:0;;;;;;;;;;;;-1:-1:-1;;;29710:39:0;;;;;;;;;;;;;;;6705:11;29768:31;;;29760:55;;;;;-1:-1:-1;;;29760:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29826:7;:18;29620:232::o;49706:121::-;49267:10;;-1:-1:-1;;;;;49267:10:0;49253;:24;49245:44;;;;;-1:-1:-1;;;49245:44:0;;;;;;;;;;;;-1:-1:-1;;;49245:44:0;;;;;;;;;;;;;;;49789:13:::1;:30:::0;;-1:-1:-1;;;;;;49789:30:0::1;-1:-1:-1::0;;;;;49789:30:0;;;::::1;::::0;;;::::1;::::0;;49706:121::o;28795:24::-;;;;:::o;48811:33::-;;;-1:-1:-1;;;;;48811:33:0;;:::o;30784:256::-;28418:6;;30877:4;;28418:6;;;;;28417:7;28409:27;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30909:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;30901:40;;;::::0;;-1:-1:-1;;;30901:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30901:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;30966:15:0;::::1;30952:11;30966:15:::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;31019:12:::1;::::0;31006:26:::1;::::0;30966:22;;31006:4:::1;:26::i;:::-;30999:33:::0;30784:256;-1:-1:-1;;;30784:256:0:o;60624:212::-;60697:14;:21;60666:22;60730:99;60758:16;60751:23;;:4;:23;;;60730:99;;;60799:18;60812:4;60799:12;:18::i;:::-;60776:6;;60730:99;;;;60624:212;:::o;28602:25::-;;;-1:-1:-1;;;;;28602:25:0;;:::o;51798:213::-;28281:6;;;;;;;28280:7;28272:27;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;-1:-1:-1;;;28272:27:0;;;;;;;;;;;;;;;28310:6;:13;;-1:-1:-1;;28310:13:0;;;;;51901:50:::1;51911:10;51923:13:::0;51938:12;;51901:9:::1;:50::i;:::-;51962:41;51977:10;51989:13;51962:14;:41::i;:::-;-1:-1:-1::0;;28346:6:0;:14;;-1:-1:-1;;28346:14:0;;;-1:-1:-1;51798:213:0:o;31048:197::-;28418:6;;31132:4;;28418:6;;;;;28417:7;28409:27;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;-1:-1:-1;;;28409:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31164:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;31156:40;;;::::0;;-1:-1:-1;;;31156:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31156:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;31214:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:23:::1;;::::0;;31048:197::o;21824:686::-;22067:18;22103:16;22122:35;22127:14;22143:13;22122:4;:35::i;:::-;22103:54;;22168:9;22180:37;22185:15;22202:14;22180:4;:37::i;:::-;22168:49;;22228:6;22237:27;22242:15;22259:4;22237;:27::i;:::-;22228:36;;22275:8;22286:20;22291:1;22294:11;22286:4;:20::i;:::-;22275:31;;22323:22;22328:3;6082:6;22323:4;:22::i;:::-;22317:28;;22372:26;6082:6;22390:7;22372:4;:26::i;:::-;22356:42;;22425:46;22430:25;22435:14;22451:3;22430:4;:25::i;:::-;22457:13;22425:4;:46::i;:::-;22409:62;21824:686;-1:-1:-1;;;;;;;;;;;21824:686:0:o;14173:257::-;-1:-1:-1;;;;;14252:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;14252:20:0;14244:37;;;;;-1:-1:-1;;;14244:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;14244:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14313:13:0;;:8;:13;;;;;;;;;;;14308:24;;14328:3;14308:4;:24::i;:::-;-1:-1:-1;;;;;14292:13:0;;;:8;:13;;;;;;;;;;;:40;;;;14364:13;;;;;;;14359:24;;14379:3;14359:4;:24::i;:::-;-1:-1:-1;;;;;14343:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;14399:23;;;;;;;14343:13;;14399:23;;;;;;;;;;;;;14173:257;;;:::o;8643:198::-;8714:4;8737:6;8745:9;8758:14;8767:1;8770;8758:8;:14::i;:::-;8736:36;;;;8792:4;8791:5;8783:31;;;;;-1:-1:-1;;;8783:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8832:1:0;8643:198;-1:-1:-1;;;8643: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;44878:104::-;44957:17;44963:2;44967:6;44957:5;:17::i;9080:317::-;9151:4;9183:5;;;9207:6;;;:21;;;9227:1;9222;9217:2;:6;;;;;;:11;9207:21;9199:46;;;;;-1:-1:-1;;;9199:46:0;;;;;;;;;;;;-1:-1:-1;;;9199:46:0;;;;;;;;;;;;;;;9272:15;9266:22;;9307:8;;;;9299:33;;;;;-1:-1:-1;;;9299:33:0;;;;;;;;;;;;-1:-1:-1;;;9299:33:0;;;;;;;;;;;;;;;9343:7;6082:6;9353:2;:16;;;9080:317;-1:-1:-1;;;;;;9080:317:0:o;44762:108::-;44843:19;44849:4;44855:6;44843:5;:19::i;45086:88::-;45153:13;45159:6;45153:5;:13::i;:::-;45086:88;:::o;45182:1024::-;45449:12;;45316:21;;45419:15;;45449:16;45445:754;;45518:7;;45508:35;;;-1:-1:-1;;;45508:35:0;;;;45482:23;;-1:-1:-1;;;;;45518:7:0;;45508:33;;:35;;;;;;;;;;;;;;45518:7;45508:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45508:35:0;;-1:-1:-1;;;;;;45562:27:0;;;;;;;45558:630;;;45629:53;45634:34;45639:14;45655:12;;45634:4;:34::i;:::-;6082:6;45629:4;:53::i;:::-;45727:7;;45610:72;;-1:-1:-1;45701:52:0;;45717:8;;-1:-1:-1;;;;;45727:7:0;45610:72;45701:15;:52::i;:::-;45777:46;;;;;;;;-1:-1:-1;;;;;45777:46:0;;;;;;;;;;;;;45558:630;;;45864:24;45891:54;45896:35;45901:15;45918:12;;45896:4;:35::i;45891:54::-;45991:7;;45864:81;;-1:-1:-1;45964:56:0;;45980:9;;-1:-1:-1;;;;;45991:7:0;45864:81;45964:15;:56::i;:::-;46056:42;46061:15;46078:19;46056:4;:42::i;:::-;46122:50;;;;;;;;46039:59;;-1:-1:-1;;;;;;46122:50:0;;;;;;;;;;;;45558:630;;45445:754;;45182:1024;;;;;;;:::o;44407:347::-;44611:46;;;-1:-1:-1;;;;;44611:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44611:46:0;;;44600:58;;;;44565:12;;44579:17;;44600:10;;;;44611:46;44600:58;;;44611:46;44600:58;;44611:46;44600:58;;;;;;;;;;-1:-1:-1;;44600:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44564:94;;;;44677:7;:57;;;;-1:-1:-1;44689:11:0;;:16;;:44;;;44720:4;44709:24;;;;;;;;;;;;;;;-1:-1:-1;44709:24:0;44689:44;44669:77;;;;;-1:-1:-1;;;44669:77:0;;;;;;;;;;;;-1:-1:-1;;;44669:77:0;;;;;;;;;;;;;;;44407:347;;;;;:::o;52019:809::-;52133:9;;;;52125:26;;;;;-1:-1:-1;;;52125:26:0;;;;;;;;;;;;;;;-1:-1:-1;;;52125:26:0;;;;;;;;;;;;;;;52164:16;52183:13;:11;:13::i;:::-;52164:32;;52207:10;52220:32;52225:13;52240:11;52220:4;:32::i;:::-;52207:45;-1:-1:-1;52271:10:0;52263:29;;;;;-1:-1:-1;;;52263:29:0;;;;;;;;;;;;-1:-1:-1;;;52263:29:0;;;;;;;;;;;;;;;52310:6;52305:476;52326:7;:14;52322:18;;52305:476;;;52362:9;52374:7;52382:1;52374:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52374:10:0;52410:11;;;:8;:11;;;;;;:19;;;52374:10;;-1:-1:-1;52410:19:0;52465:16;52470:5;52410:19;52465:4;:16::i;:::-;52444:37;-1:-1:-1;52504:18:0;;;;;:54;;;52543:12;;52556:1;52543:15;;;;;;;;;;;;;52526:13;:32;;52504:54;52496:81;;;;;-1:-1:-1;;;52496:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52619:11:0;;;;;;:8;:11;;;;;:19;;;52614:40;;52640:13;52614:4;:40::i;:::-;-1:-1:-1;;;;;52592:11:0;;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;52674:35;;;;;;;52592:11;;52674:35;;;;;;;;;;;;;52724:45;52740:1;52743:10;52755:13;52724:15;:45::i;:::-;-1:-1:-1;;;52342:3:0;;52305:476;;;;52791:29;52806:13;52791:14;:29::i;53177:543::-;-1:-1:-1;;;;;53278:18:0;;53254:21;53278:18;;;:8;:18;;;;;53307:23;53287:8;53307:13;:23::i;:::-;53355:11;;:24;;53371:7;53355:15;:24::i;:::-;53341:38;;53421:14;:21;53341:11;53454:170;53482:16;53475:23;;:4;:23;;;53454:170;;;53547:65;53607:4;53547:55;53563:14;53578:4;53563:20;;;;;;;;;53547:65;53523:21;;;;;;;:15;;;;:21;;;;;;:89;;;;53500:6;53454:170;;;-1:-1:-1;53655:15:0;53634:18;;;:36;53686:26;;;;;;;;-1:-1:-1;;;;;53686:26:0;;;;;;;;;;;;;53177:543;;;;:::o;8459:176::-;8530:4;8561:5;;;8585:6;;;;8577:31;;;;;-1:-1:-1;;;8577:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;44990:88;45057:13;45063:6;45057:5;:13::i;44026:373::-;44239:63;;;-1:-1:-1;;;;;44239:63:0;;;;;;;44288:4;44239:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44239:63:0;;;44228:75;;;;44193:12;;44207:17;;44228:10;;;;44239:63;44228:75;;;44239:63;44228:75;;44239:63;44228:75;;;;;;;;;;-1:-1:-1;;44228:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44192:111;;;;44322:7;:57;;;;-1:-1:-1;44334:11:0;;:16;;:44;;;44365:4;44354:24;;;;;;;;;;;;;;;-1:-1:-1;44354:24:0;44334:44;44314:77;;;;;-1:-1:-1;;;44314:77:0;;;;;;;;;;;;-1:-1:-1;;;44314:77:0;;;;;;;;;;;;;;1366:136;1424:7;1451:43;1455:1;1458;1451:43;;;;;;;;;;;;;;;;;:3;:43::i;9405:389::-;9476:4;9506:6;9498:27;;;;;-1:-1:-1;;;9498:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6082:6;9546:15;;9580:6;;;:31;;;6082:6;9595:1;9590:2;:6;;;;;;:21;9580:31;9572:56;;;;;-1:-1:-1;;;9572:56:0;;;;;;;;;;;;-1:-1:-1;;;9572:56:0;;;;;;;;;;;;;;;9676:1;9672:5;;9666:12;;9697:8;;;;9689:33;;;;;-1:-1:-1;;;9689:33:0;;;;;;;;;;;;-1:-1:-1;;;9689:33:0;;;;;;;;;;;;;;;9750:7;9765:1;9760:2;:6;;;;10304:558;10380:4;7239:5;10410:4;:28;;10402:53;;;;;-1:-1:-1;;;10402:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7299:18;10474:28;;;10466:54;;;;;-1:-1:-1;;;10466:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10533:10;10547:11;10554:3;10547:6;:11::i;:::-;10533:25;;10572:11;10586:16;10591:3;10596:5;10586:4;:16::i;:::-;10572:30;;10615:13;10631:24;10637:4;10643:11;10648:5;10643:4;:11::i;:::-;10631:5;:24::i;:::-;10615:40;-1:-1:-1;10672:11:0;10668:59;;10707:8;-1:-1:-1;10700:15:0;;-1:-1:-1;;10700:15:0;10668:59;10739:18;10760:47;10771:4;10777:6;7372:13;10760:10;:47::i;:::-;10739:68;;10825:29;10830:8;10840:13;10825:4;:29::i;:::-;10818:36;10304:558;-1:-1:-1;;;;;;;10304:558:0:o;46262:581::-;46427:12;;46354:23;;46427:16;46423:413;;46496:7;;46486:35;;;-1:-1:-1;;;46486:35:0;;;;46460:23;;-1:-1:-1;;;;;46496:7:0;;46486:33;;:35;;;;;;;;;;;;;;46496:7;46486:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46486:35:0;;-1:-1:-1;;;;;;46540:29:0;;;46536:289;;46611:53;46616:34;46621:14;46637:12;;46616:4;:34::i;46611:53::-;46709:7;;46590:74;;-1:-1:-1;46683:54:0;;46699:8;;-1:-1:-1;;;;;46709:7:0;46590:74;46683:15;:54::i;:::-;46761:48;;;;;;;;-1:-1:-1;;;;;46761:48:0;;;;;;;;;;;;;46536:289;46423:413;46262:581;;;;:::o;8849:223::-;8924:4;8930;8961:1;8956;:6;8952:113;;-1:-1:-1;;8987:5:0;;;8994;8979:21;;8952:113;-1:-1:-1;;9041:5:0;;;9048:4;8952:113;8849: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;14438:94::-;14495:29;14509:4;14516:2;14520:3;14495:5;:29::i;14540:98::-;14599:31;14605:4;14619;14626:3;14599:5;:31::i;13889:276::-;13959:4;13942:8;:23;;;;;;;;;;;:30;-1:-1:-1;13942:30:0;13934:47;;;;;-1:-1:-1;;;13934:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;13934:47:0;;;;;;;;;;;;;;;14040:4;14023:8;:23;;;;;;;;;;;14018:34;;14048:3;14018:4;:34::i;:::-;14009:4;13992:8;:23;;;;;;;;;;:60;14083:12;;14078:23;;14097:3;14078:4;:23::i;:::-;14063:12;:38;14117:40;;;;;;;;14149:1;;14134:4;;14117:40;;;;;;;;;13889:276;:::o;13663:218::-;13756:4;13739:8;:23;;;;;;;;;;;13734:34;;13764:3;13734:4;:34::i;:::-;13725:4;13708:8;:23;;;;;;;;;;:60;13799:12;;13794:23;;13813:3;13794:4;:23::i;:::-;13779:12;:38;13833:40;;;;;;;;13862:4;;13850:1;;13833:40;;;;;;;;;13663: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;8328:123::-;8393:4;6082:6;8422:7;8427:1;8422:4;:7::i;:::-;:21;;8328:123;-1:-1:-1;;8328:123:0:o;8204:116::-;6082:6;8297:15;;;8204:116::o;9822:321::-;9894:4;;9929:1;9925;:5;:28;;6082:6;9925:28;;;9938:1;9925:28;9916:37;-1:-1:-1;9976:1:0;9971:6;;;;9966:151;9979:6;;9966:151;;10014:10;10019:1;10022;10014:4;:10::i;:::-;10010:14;-1:-1:-1;10049:1:0;10045;:5;:10;10041:65;;10080:10;10085:1;10088;10080:4;:10::i;:::-;10076:14;;10041:65;9992:1;9987:6;;;;9966:151;;10870:1108;10968:4;11023:3;10968:4;;11060:27;11069:4;6082:6;11060:8;:27::i;:::-;11037:50;;-1:-1:-1;11037:50:0;-1:-1:-1;6082:6:0;;11098:9;11439:1;11425:523;11450:9;11442:4;:17;11425:523;;11481:9;6082:6;11493:1;:15;11481:27;;11524:6;11532:9;11545:36;11554:1;11557:23;11562:4;6082:6;11557:4;:23::i;:::-;11545:8;:36::i;:::-;11523:58;;;;11603:22;11608:4;11614:10;11619:1;11622;11614:4;:10::i;11603:22::-;11596:29;;11647:16;11652:4;11658;11647;:16::i;:::-;11640:23;-1:-1:-1;11682:9:0;11678:20;;11693:5;;;;;11678:20;11719:4;11715:30;;;11736:9;;;11715:30;11764:4;11760:30;;;11781:9;;;11760:30;11809:8;11805:132;;;11844:15;11849:3;11854:4;11844;:15::i;:::-;11838:21;;11805:132;;;11906:15;11911:3;11916:4;11906;:15::i;:::-;11900:21;;11805:132;-1:-1:-1;;;11461:3:0;;11425:523;;;-1:-1:-1;11967:3:0;;10870:1108;-1:-1:-1;;;;;;;;;10870:1108:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://ed25ab735b494d192255c92c5c826f77a35050dad2cc13156cffa6332de25c32

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Farms-as-a-Service (FaaS) is a project that allow users to create own FaaS pool and let the community stake to it. This is USDC/BSDS Pool with pool weight of 80-20%.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.