ETH Price: $2,629.48 (-0.05%)
Gas: 5 Gwei

Token

Power Index Pool Token (PIPT)
 

Overview

Max Total Supply

10,167.32286610965675454 PIPT

Holders

170 (0.00%)

Market

Price

$3.09 @ 0.001176 ETH (+0.01%)

Onchain Market Cap

$31,448.59

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000231263304678223 PIPT

Value
$0.00 ( ~0 Eth) [0.0000%]
0x87fC1313880d579039aC48dB8B25428ed5F33C4a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The PowerPool is a protocol for pooling governance tokens (GTs), such as COMP, BAL, LEND, YFI, BZRX, AKRO, and many others. It allows the token holders to lend, pool, borrow governance tokens, get income from it, and accumulate governance power in protocols.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 0 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

/*
https://powerpool.finance/

          wrrrw r wrr
         ppwr rrr wppr0       prwwwrp                                 prwwwrp                   wr0
        rr 0rrrwrrprpwp0      pp   pr  prrrr0 pp   0r  prrrr0  0rwrrr pp   pr  prrrr0  prrrr0    r0
        rrp pr   wr00rrp      prwww0  pp   wr pp w00r prwwwpr  0rw    prwww0  pp   wr pp   wr    r0
        r0rprprwrrrp pr0      pp      wr   pr pp rwwr wr       0r     pp      wr   pr wr   pr    r0
         prwr wrr0wpwr        00        www0   0w0ww    www0   0w     00        www0    www0   0www0
          wrr ww0rrrr

*/

// File: contracts/balancer-core/BConst.sol

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

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

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

pragma solidity 0.6.12;

contract BConst {
    uint public constant BONE              = 10**18;

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

    uint public constant MIN_FEE           = BONE / 10**6;
    uint public constant MAX_FEE           = BONE / 10;

    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 INIT_POOL_SUPPLY  = BONE * 100;

    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;
}

// File: contracts/balancer-core/BNum.sol

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

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

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

pragma solidity 0.6.12;


contract BNum is BConst {

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

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

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

    function bsub(uint a, uint b)
        internal pure
        returns (uint)
    {
        (uint c, bool flag) = bsubSign(a, b);
        require(!flag, "ERR_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, "ERR_MUL_OVERFLOW");
        uint c1 = c0 + (BONE / 2);
        require(c1 >= c0, "ERR_MUL_OVERFLOW");
        uint c2 = c1 / BONE;
        return c2;
    }

    function bdiv(uint a, uint b)
        internal pure
        returns (uint)
    {
        require(b != 0, "ERR_DIV_ZERO");
        uint c0 = a * BONE;
        require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow
        uint c1 = c0 + (b / 2);
        require(c1 >= c0, "ERR_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 : 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 >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW");
        require(base <= MAX_BPOW_BASE, "ERR_BPOW_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, 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, BONE);
        uint term = 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 * BONE;
            (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
            term = bmul(term, bmul(c, x));
            term = bdiv(term, bigK);
            if (term == 0) break;

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

        return sum;
    }

}

// File: contracts/balancer-core/BToken.sol

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

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

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

pragma solidity 0.6.12;


// 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, "ERR_INSUFFICIENT_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, "ERR_INSUFFICIENT_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  internal _name;
    string  internal _symbol;
    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) external 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], "ERR_BTOKEN_BAD_CALLER");
        _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;
    }
}

// File: contracts/balancer-core/BMath.sol

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

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

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

pragma solidity 0.6.12;


contract BMath is BConst, BNum {
    /**********************************************************************************************
    // calcSpotPrice                                                                             //
    // sP = spotPrice                                                                            //
    // bI = tokenBalanceIn                ( bI / wI )         1                                  //
    // bO = tokenBalanceOut         sP =  -----------  *  ----------                             //
    // wI = tokenWeightIn                 ( bO / wO )     ( 1 - sF )                             //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    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(BONE, bsub(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                                                                              //
    **********************************************************************************************/
    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(BONE, swapFee);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint foo = bpow(y, weightRatio);
        uint bar = bsub(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                                                                              //
    **********************************************************************************************/
    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, BONE);
        tokenAmountIn = bsub(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                \                                              /              //
    **********************************************************************************************/
    function calcPoolOutGivenSingleIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountIn,
        uint swapFee
    )
        public pure
        returns (uint poolAmountOut)
    {
        // Charge the trading fee for the proportion of tokenAi
        ///  which is implicitly traded to the other pool tokens.
        // That proportion is (1- weightTokenIn)
        // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
        uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
        uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); 
        uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(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;
    }

    /**********************************************************************************************
    // calcSingleInGivenPoolOut                                                                  //
    // tAi = tokenAmountIn              //(pS + pAo)\     /    1    \\                           //
    // pS = poolSupply                 || ---------  | ^ | --------- || * bI - bI                //
    // pAo = poolAmountOut              \\    pS    /     \(wI / tW)//                           //
    // bI = balanceIn          tAi =  --------------------------------------------               //
    // wI = weightIn                              /      wI  \                                   //
    // tW = totalWeight                          |  1 - ----  |  * sF                            //
    // sF = swapFee                               \      tW  /                                   //
    **********************************************************************************************/
    function calcSingleInGivenPoolOut(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountOut,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountIn)
    {
        uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
        uint newPoolSupply = badd(poolSupply, poolAmountOut);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);
      
        //uint newBalTi = poolRatio^(1/weightTi) * balTi;
        uint boo = bdiv(BONE, normalizedWeight); 
        uint tokenInRatio = bpow(poolRatio, boo);
        uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn);
        uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn);
        // Do reverse order of fees charged in joinswap_ExternAmountIn, this way 
        //     ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ```
        //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ;
        uint zar = bmul(bsub(BONE, normalizedWeight), swapFee);
        tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar));
        return tokenAmountIn;
    }

    /**********************************************************************************************
    // calcSingleOutGivenPoolIn                                                                  //
    // tAo = tokenAmountOut            /      /                                             \\   //
    // bO = tokenBalanceOut           /      //       pS - pAi        \     /    1    \      \\  //
    // pAi = poolAmountIn            | bO - || ----------------------- | ^ | --------- | * b0 || //
    // ps = poolSupply                \      \\          pS           /     \(wO / tW)/      //  //
    // wI = tokenWeightIn      tAo =   \      \                                             //   //
    // tW = totalWeight                    /     /      wO \       \                             //
    // sF = swapFee                    *  | 1 - |  1 - ---- | * sF  |                            //
    // eF = exitFee                        \     \      tW /       /                             //
    **********************************************************************************************/
    function calcSingleOutGivenPoolIn(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountIn,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountOut)
    {
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        uint newPoolSupply = bsub(poolSupply, poolAmountIn);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);
     
        // newBalTo = poolRatio^(1/weightTo) * balTo;
        uint tokenOutRatio = bpow(poolRatio, bdiv(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(BONE, normalizedWeight), swapFee); 
        tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz));
        return tokenAmountOut;
    }

    /**********************************************************************************************
    // calcPoolInGivenSingleOut                                                                  //
    // pAi = poolAmountIn               // /               tAo             \\     / wO \     \   //
    // bO = tokenBalanceOut            // | bO - -------------------------- |\   | ---- |     \  //
    // tAo = tokenAmountOut      pS - ||   \     1 - ((1 - (tO / tW)) * sF)/  | ^ \ tW /  * pS | //
    // ps = poolSupply                 \\ -----------------------------------/                /  //
    // wO = tokenWeightOut  pAi =       \\               bO                 /                /   //
    // tW = totalWeight                                                                          //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcPoolInGivenSingleOut(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountOut,
        uint swapFee
    )
        public pure
        returns (uint poolAmountIn)
    {

        // charge swap fee on the output token side 
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        //uint tAoBeforeSwapFee = tAo / (1 - (1-weightTo) * swapFee) ;
        uint zoo = bsub(BONE, normalizedWeight);
        uint zar = bmul(zoo, swapFee); 
        uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar));

        uint newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee);
        uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut);

        //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply;
        uint poolRatio = bpow(tokenOutRatio, normalizedWeight);
        uint newPoolSupply = bmul(poolRatio, poolSupply);
        uint poolAmountIn = bsub(poolSupply, newPoolSupply);
        return poolAmountIn;
    }
}

// File: contracts/IPoolRestrictions.sol

pragma solidity 0.6.12;


interface IPoolRestrictions {
    function getMaxTotalSupply(address _pool) external virtual view returns(uint256);
    function isVotingSignatureAllowed(address _votingAddress, bytes4 _signature) external virtual view returns(bool);
    function isWithoutFee(address _addr) external virtual view returns(bool);
}

// File: contracts/balancer-core/BPool.sol

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

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

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

pragma solidity 0.6.12;




contract BPool is BToken, BMath {

    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_CALL(
        bytes4  indexed sig,
        address indexed caller,
        bytes           data
    ) anonymous;

    event LOG_CALL_VOTING(
        address indexed voting,
        bool    indexed success,
        bytes4  indexed inputSig,
        bytes           inputData,
        bytes           outputData
    );

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

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

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

    bool private _mutex;

    address private _controller; // has CONTROL role
    bool private _publicSwap; // true if PUBLIC can call SWAP functions

    IPoolRestrictions private _restrictions;

    // `setSwapFee` and `finalize` require CONTROL
    // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
    uint private _swapFee;
    uint private _communitySwapFee;
    uint private _communityJoinFee;
    uint private _communityExitFee;
    address private _communityFeeReceiver;
    bool private _finalized;

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

    constructor(string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _controller = msg.sender;
        _swapFee = MIN_FEE;
        _communitySwapFee = 0;
        _communityJoinFee = 0;
        _communityExitFee = 0;
        _publicSwap = false;
        _finalized = false;
    }

    function isPublicSwap()
        external view
        returns (bool)
    {
        return _publicSwap;
    }

    function isFinalized()
        external view
        returns (bool)
    {
        return _finalized;
    }

    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, "NOT_FINALIZED");
        return _tokens;
    }

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

        _checkBound(token);
        return _records[token].denorm;
    }

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

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

        _checkBound(token);
        return bdiv(_records[token].denorm, _totalWeight);
    }

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

        _checkBound(token);
        return _records[token].balance;
    }

    function getSwapFee()
        external view
        _viewlock_
        returns (uint)
    {
        return _swapFee;
    }

    function getCommunityFee()
        external view
        _viewlock_
        returns (uint communitySwapFee, uint communityJoinFee, uint communityExitFee, address communityFeeReceiver)
    {
        return (_communitySwapFee, _communityJoinFee, _communityExitFee, _communityFeeReceiver);
    }

    function getController()
        external view
        _viewlock_
        returns (address)
    {
        return _controller;
    }

    function getRestrictions()
        external view
        _viewlock_
        returns (address)
    {
        return address(_restrictions);
    }

    function setSwapFee(uint swapFee)
        external
        _logs_
        _lock_
    {
        _checkController();
        require(swapFee >= MIN_FEE && swapFee <= MAX_FEE, "FEE_BOUNDS");
        _swapFee = swapFee;
    }

    function setCommunityFeeAndReceiver(
        uint communitySwapFee,
        uint communityJoinFee,
        uint communityExitFee,
        address communityFeeReceiver
    )
        external
        _logs_
        _lock_
    {
        _checkController();
        require(communitySwapFee >= MIN_FEE && communitySwapFee <= MAX_FEE, "FEE_BOUNDS");
        require(communityJoinFee >= MIN_FEE && communityJoinFee <= MAX_FEE, "FEE_BOUNDS");
        require(communityExitFee >= MIN_FEE && communityExitFee <= MAX_FEE, "FEE_BOUNDS");
        _communitySwapFee = communitySwapFee;
        _communityJoinFee = communityJoinFee;
        _communityExitFee = communityExitFee;
        _communityFeeReceiver = communityFeeReceiver;
    }

    function setRestrictions(IPoolRestrictions restrictions)
        external
        _logs_
        _lock_
    {
        _checkController();
        _restrictions = restrictions;
    }

    function setController(address manager)
        external
        _logs_
        _lock_
    {
        _checkController();
        _controller = manager;
    }

    function setPublicSwap(bool public_)
        external
        _logs_
        _lock_
    {
        _checkFinalized();
        _checkController();
        _publicSwap = public_;
    }

    function finalize()
        external
        _logs_
        _lock_
    {
        _checkController();
        _checkFinalized();
        require(_tokens.length >= MIN_BOUND_TOKENS, "MIN_TOKENS");

        _finalized = true;
        _publicSwap = true;

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

    function callVoting(address voting, bytes4 signature, bytes calldata args, uint value)
        external
        _logs_
        _lock_
    {
        require(_restrictions.isVotingSignatureAllowed(voting, signature), "NOT_ALLOWED_SIG");
        _checkController();

        (bool success, bytes memory data) = voting.call{ value: value }(abi.encodePacked(signature, args));
        require(success, "NOT_SUCCESS");
        emit LOG_CALL_VOTING(voting, success, signature, msg.data, data);
    }

    function bind(address token, uint balance, uint denorm)
        external
        _logs_
        // _lock_  Bind does not lock because it jumps to `rebind`, which does
    {
        _checkController();
        require(!_records[token].bound, "IS_BOUND");
        _checkFinalized();

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

        _records[token] = Record({
            bound: true,
            index: _tokens.length,
            denorm: 0,    // balance and denorm will be validated
            balance: 0   // and set by `rebind`
        });
        _tokens.push(token);
        rebind(token, balance, denorm);
    }

    function rebind(address token, uint balance, uint denorm)
        public
        _logs_
        _lock_
    {

        _checkController();
        _checkBound(token);
        _checkFinalized();

        require(denorm >= MIN_WEIGHT && denorm <= MAX_WEIGHT, "WEIGHT_BOUNDS");
        require(balance >= MIN_BALANCE, "MIN_BALANCE");

        // Adjust the denorm and totalWeight
        uint oldWeight = _records[token].denorm;
        if (denorm > oldWeight) {
            _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight));
            require(_totalWeight <= MAX_TOTAL_WEIGHT, "MAX_TOTAL_WEIGHT");
        } else if (denorm < oldWeight) {
            _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm));
        }        
        _records[token].denorm = denorm;

        // Adjust the balance record and actual token balance
        uint oldBalance = _records[token].balance;
        _records[token].balance = balance;
        if (balance > oldBalance) {
            _pullUnderlying(token, msg.sender, bsub(balance, oldBalance));
        } else if (balance < oldBalance) {
            uint tokenBalanceWithdrawn = bsub(oldBalance, balance);
            _pushUnderlying(token, msg.sender, tokenBalanceWithdrawn);
        }
    }

    function unbind(address token)
        external
        _logs_
        _lock_
    {

        _checkController();
        _checkBound(token);
        _checkFinalized();

        uint tokenBalance = _records[token].balance;

        _totalWeight = bsub(_totalWeight, _records[token].denorm);

        // Swap the token-to-unbind with the last token,
        // then delete the last token
        uint index = _records[token].index;
        uint last = _tokens.length - 1;
        _tokens[index] = _tokens[last];
        _records[_tokens[index]].index = index;
        _tokens.pop();
        _records[token] = Record({
            bound: false,
            index: 0,
            denorm: 0,
            balance: 0
        });

        _pushUnderlying(token, msg.sender, tokenBalance);
    }

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

    function getSpotPrice(address tokenIn, address tokenOut)
        external view
        _viewlock_
        returns (uint spotPrice)
    {
        require(_records[tokenIn].bound && _records[tokenOut].bound, "NOT_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)
    {
        _checkBound(tokenIn);
        _checkBound(tokenOut);
        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
        _logs_
        _lock_
    {
        require(_finalized, "NOT_FINALIZED");

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

        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, "MATH_APPROX");
            require(tokenAmountIn <= maxAmountsIn[i], "LIMIT_IN");
            _records[t].balance = badd(_records[t].balance, tokenAmountIn);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
        }

        (uint poolAmountOutAfterFee, uint poolAmountOutFee) = calcAmountWithCommunityFee(
            poolAmountOut,
            _communityJoinFee,
            msg.sender
        );

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOutAfterFee);
        _pushPoolShare(_communityFeeReceiver, poolAmountOutFee);
    }

    function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut)
        external
        _logs_
        _lock_
    {
        require(_finalized, "NOT_FINALIZED");

        (uint poolAmountInAfterFee, uint poolAmountInFee) = calcAmountWithCommunityFee(
            poolAmountIn,
            _communityExitFee,
            msg.sender
        );

        uint poolTotal = totalSupply();
        uint ratio = bdiv(poolAmountInAfterFee, poolTotal);
        require(ratio != 0, "MATH_APPROX");

        _pullPoolShare(msg.sender, poolAmountIn);
        _pushPoolShare(_communityFeeReceiver, poolAmountInFee);
        _burnPoolShare(poolAmountInAfterFee);

        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, "MATH_APPROX");
            require(tokenAmountOut >= minAmountsOut[i], "LIMIT_OUT");
            _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
        _logs_
        _lock_
        returns (uint tokenAmountOut, uint spotPriceAfter)
    {
        _checkBound(tokenIn);
        _checkBound(tokenOut);
        require(_publicSwap, "NOT_PUBLIC");

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

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

        (uint tokenAmountInAfterFee, uint tokenAmountInFee) = calcAmountWithCommunityFee(
                                                                tokenAmountIn,
                                                                _communitySwapFee,
                                                                msg.sender
                                                            );

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

        tokenAmountOut = calcOutGivenIn(
                            inRecord.balance,
                            inRecord.denorm,
                            outRecord.balance,
                            outRecord.denorm,
                            tokenAmountInAfterFee,
                            _swapFee
                        );
        require(tokenAmountOut >= minAmountOut, "LIMIT_OUT");

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

        spotPriceAfter = calcSpotPrice(
                                inRecord.balance,
                                inRecord.denorm,
                                outRecord.balance,
                                outRecord.denorm,
                                _swapFee
                            );
        require(
            spotPriceAfter >= spotPriceBefore &&
            spotPriceBefore <= bdiv(tokenAmountInAfterFee, tokenAmountOut),
            "MATH_APPROX"
        );
        require(spotPriceAfter <= maxPrice, "LIMIT_PRICE");

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

        _pullCommunityFeeUnderlying(tokenIn, msg.sender, tokenAmountInFee);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountInAfterFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return (tokenAmountOut, spotPriceAfter);
    }

    function swapExactAmountOut(
        address tokenIn,
        uint maxAmountIn,
        address tokenOut,
        uint tokenAmountOut,
        uint maxPrice
    )
        external
        _logs_
        _lock_ 
        returns (uint tokenAmountIn, uint spotPriceAfter)
    {
        _checkBound(tokenIn);
        _checkBound(tokenOut);
        require(_publicSwap, "NOT_PUBLIC");

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

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

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

        (uint tokenAmountOutAfterFee, uint tokenAmountOutFee) = calcAmountWithCommunityFee(
            tokenAmountOut,
            _communitySwapFee,
            msg.sender
        );

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

        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 &&
            spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOutAfterFee),
            "MATH_APPROX"
        );
        require(spotPriceAfter <= maxPrice, "LIMIT_PRICE");

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

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOutAfterFee);
        _pushUnderlying(tokenOut, _communityFeeReceiver, tokenAmountOutFee);

        return (tokenAmountIn, spotPriceAfter);
    }


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

    {        
        require(_finalized, "NOT_FINALIZED");
        _checkBound(tokenIn);
        require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "MAX_IN_RATIO");

        (uint tokenAmountInAfterFee, uint tokenAmountInFee) = calcAmountWithCommunityFee(
            tokenAmountIn,
            _communityJoinFee,
            msg.sender
        );

        Record storage inRecord = _records[tokenIn];

        poolAmountOut = calcPoolOutGivenSingleIn(
                            inRecord.balance,
                            inRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountInAfterFee,
                            _swapFee
                        );

        require(poolAmountOut >= minPoolAmountOut, "LIMIT_OUT");

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

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

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        _pullCommunityFeeUnderlying(tokenIn, msg.sender, tokenAmountInFee);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountInAfterFee);

        return poolAmountOut;
    }

    function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn)
        external
        _logs_
        _lock_
        returns (uint tokenAmountIn)
    {
        require(_finalized, "NOT_FINALIZED");
        _checkBound(tokenIn);

        Record storage inRecord = _records[tokenIn];

        (uint poolAmountOutAfterFee, uint poolAmountOutFee) = calcAmountWithCommunityFee(
            poolAmountOut,
            _communityJoinFee,
            msg.sender
        );

        tokenAmountIn = calcSingleInGivenPoolOut(
                            inRecord.balance,
                            inRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            poolAmountOut,
                            _swapFee
                        );

        require(tokenAmountIn != 0, "MATH_APPROX");
        require(tokenAmountIn <= maxAmountIn, "LIMIT_IN");

        require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "MAX_IN_RATIO");

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

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

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOutAfterFee);
        _pushPoolShare(_communityFeeReceiver, poolAmountOutFee);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        return tokenAmountIn;
    }

    function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut)
        external
        _logs_
        _lock_
        returns (uint tokenAmountOut)
    {
        require(_finalized, "NOT_FINALIZED");
        _checkBound(tokenOut);

        Record storage outRecord = _records[tokenOut];

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

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

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

        (uint tokenAmountOutAfterFee, uint tokenAmountOutFee) = calcAmountWithCommunityFee(
            tokenAmountOut,
            _communityExitFee,
            msg.sender
        );

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

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(poolAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOutAfterFee);
        _pushUnderlying(tokenOut, _communityFeeReceiver, tokenAmountOutFee);

        return tokenAmountOut;
    }

    function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn)
        external
        _logs_
        _lock_
        returns (uint poolAmountIn)
    {
        require(_finalized, "NOT_FINALIZED");
        _checkBound(tokenOut);
        require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "OUT_RATIO");

        Record storage outRecord = _records[tokenOut];

        (uint tokenAmountOutAfterFee, uint tokenAmountOutFee) = calcAmountWithCommunityFee(
            tokenAmountOut,
            _communityExitFee,
            msg.sender
        );

        poolAmountIn = calcPoolInGivenSingleOut(
                            outRecord.balance,
                            outRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountOut,
                            _swapFee
                        );

        require(poolAmountIn != 0, "MATH_APPROX");
        require(poolAmountIn <= maxPoolAmountIn, "LIMIT_IN");

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

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

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(poolAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOutAfterFee);
        _pushUnderlying(tokenOut, _communityFeeReceiver, tokenAmountOutFee);

        return poolAmountIn;
    }


    // ==
    // 'Underlying' token-manipulation functions make external calls but are NOT locked
    // You must `_lock_` or otherwise ensure reentry-safety

    function _pullUnderlying(address erc20, address from, uint amount)
        internal
    {
        bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
        require(xfer, "ERC20_FALSE");
    }

    function _pushUnderlying(address erc20, address to, uint amount)
        internal
    {
        bool xfer = IERC20(erc20).transfer(to, amount);
        require(xfer, "ERC20_FALSE");
    }

    function _pullCommunityFeeUnderlying(address erc20, address from, uint amount)
        internal
    {
        bool xfer = IERC20(erc20).transferFrom(from, _communityFeeReceiver, amount);
        require(xfer, "ERC20_FALSE");
    }

    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
    {
        if(address(_restrictions) != address(0)) {
            uint maxTotalSupply = _restrictions.getMaxTotalSupply(address(this));
            require(badd(_totalSupply, amount) <= maxTotalSupply, "MAX_SUPPLY");
        }
        _mint(amount);
    }

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

    function _checkBound(address token)
        internal view
    {
        require(_records[token].bound, "NOT_BOUND");
    }

    function _checkController()
        internal view
    {
        require(msg.sender == _controller, "NOT_CONTROLLER");
    }

    function _checkFinalized()
        internal view
    {
        require(!_finalized, "IS_FINALIZED");
    }

    function calcAmountWithCommunityFee(
        uint tokenAmountIn,
        uint communityFee,
        address operator
    )
        public view
        returns (uint tokenAmountInAfterFee, uint tokenAmountFee)
    {
        if (address(_restrictions) != address(0) && _restrictions.isWithoutFee(operator)) {
            return (tokenAmountIn, 0);
        }
        uint adjustedIn = bsub(BONE, communityFee);
        tokenAmountInAfterFee = bmul(tokenAmountIn, adjustedIn);
        uint tokenAmountFee = bsub(tokenAmountIn, tokenAmountInAfterFee);
        return (tokenAmountInAfterFee, tokenAmountFee);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"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":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voting","type":"address"},{"indexed":true,"internalType":"bool","name":"success","type":"bool"},{"indexed":true,"internalType":"bytes4","name":"inputSig","type":"bytes4"},{"indexed":false,"internalType":"bytes","name":"inputData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"outputData","type":"bytes"}],"name":"LOG_CALL_VOTING","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":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":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"},{"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BPOW_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"communityFee","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"calcAmountWithCommunityFee","outputs":[{"internalType":"uint256","name":"tokenAmountInAfterFee","type":"uint256"},{"internalType":"uint256","name":"tokenAmountFee","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":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","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":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleInGivenPoolOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","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"}],"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":[{"internalType":"address","name":"voting","type":"address"},{"internalType":"bytes4","name":"signature","type":"bytes4"},{"internalType":"bytes","name":"args","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"callVoting","outputs":[],"stateMutability":"nonpayable","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":[{"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":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPoolAmountIn","type":"uint256"}],"name":"exitswapExternAmountOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"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":"finalize","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":"getCommunityFee","outputs":[{"internalType":"uint256","name":"communitySwapFee","type":"uint256"},{"internalType":"uint256","name":"communityJoinFee","type":"uint256"},{"internalType":"uint256","name":"communityExitFee","type":"uint256"},{"internalType":"address","name":"communityFeeReceiver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"getRestrictions","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","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":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSwap","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":"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":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"joinswapPoolAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"communitySwapFee","type":"uint256"},{"internalType":"uint256","name":"communityJoinFee","type":"uint256"},{"internalType":"uint256","name":"communityExitFee","type":"uint256"},{"internalType":"address","name":"communityFeeReceiver","type":"address"}],"name":"setCommunityFeeAndReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"public_","type":"bool"}],"name":"setPublicSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPoolRestrictions","name":"restrictions","type":"address"}],"name":"setRestrictions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","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":"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":"token","type":"address"}],"name":"unbind","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526005805460ff191660121790553480156200001e57600080fd5b50604051620057f4380380620057f4833981810160405260408110156200004457600080fd5b81019080805160405193929190846401000000008211156200006557600080fd5b9083019060208201858111156200007b57600080fd5b82516401000000008111828201881017156200009657600080fd5b82525081516020918201929091019080838360005b83811015620000c5578181015183820152602001620000ab565b50505050905090810190601f168015620000f35780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011757600080fd5b9083019060208201858111156200012d57600080fd5b82516401000000008111828201881017156200014857600080fd5b82525081516020918201929091019080838360005b83811015620001775781810151838201526020016200015d565b50505050905090810190601f168015620001a55780820380516001836020036101000a031916815260200191505b5060405250508251620001c19150600390602085019062000225565b508051620001d790600490602084019062000225565b50506005805464e8d4a51000600755600060088190556009819055600a5562010000600160b01b0319163362010000021760ff60b01b1916905550600b805460ff60a01b19169055620002c1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026857805160ff191683800117855562000298565b8280016001018555821562000298579182015b82811115620002985782518255916020019190600101906200027b565b50620002a6929150620002aa565b5090565b5b80821115620002a65760008155600101620002ab565b61552380620002d16000396000f3fe608060405234801561001057600080fd5b50600436106103175760003560e01c806302c967481461031c57806306fdde0314610360578063095ea7b3146103dd57806309a3bbe41461041d5780630f7b1e3e146104255780631446a7ff1461045f57806315e84af91461048d57806318160ddd146104bb578063189d00ca146104c3578063218b5382146104cb5780632245a08e146104d357806323b872dd1461051e5780632f37b624146105545780633018205f1461057a578063313ce5671461059e57806334e19907146105bc5780633fdddaa2146105d9578063442e21521461060b57806346ab38f11461069857806349b59552146106ca5780634bb278f3146106e95780634f69c0d4146106f15780635c1bbaf7146107665780635db34277146107a157806366188463146107d35780636d06dfa0146107ff57806370a082311461083157806376c7a3c7146108575780637c5e9ea41461085f5780638201aa3f1461089f57806382f652ad146108df5780638656b6531461091a578063867378c514610955578063892980121461095d5780638c28cbe8146109985780638d4e4083146109be57806390ad688b146109c657806392eefe9b146109fd578063936c347714610a235780639381cd2b14610a2b578063948d8ce614610a3357806395d89b4114610a59578063992e2a9214610a61578063a221ee4914610a69578063a9059cbb14610a9e578063b02f0b7314610aca578063b0e0d13614610b3f578063b7b800a414610b47578063ba019dab14610b4f578063ba9530a614610b57578063bc063e1a14610b92578063bc694ea214610b9a578063be3bbd2e14610ba2578063c36596a6146104cb578063c4195cb814610bfa578063c61641cd14610c02578063cc77828d14610c28578063cd2ed8fb14610c30578063cf5e7bd314610c38578063d4cadf6814610c5e578063d73dd62314610c66578063dd62ed3e14610c92578063e4a28a521461041d578063e4e1e53814610cc0578063ec09302114610cf2578063f1b8a9b714610cfa578063f8b2cb4f14610d20578063f8d6aed414610d46578063fde924f714610d81575b600080fd5b61034e6004803603606081101561033257600080fd5b506001600160a01b038135169060208101359060400135610d89565b60408051918252519081900360200190f35b610368611068565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103a257818101518382015260200161038a565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610409600480360360408110156103f357600080fd5b506001600160a01b0381351690602001356110fe565b604080519115158252519081900360200190f35b61034e611153565b61045d6004803603608081101561043b57600080fd5b50803590602081013590604081013590606001356001600160a01b0316611160565b005b61034e6004803603604081101561047557600080fd5b506001600160a01b038135811691602001351661136b565b61034e600480360360408110156104a357600080fd5b506001600160a01b0381358116916020013516611414565b61034e61151f565b61034e611525565b61034e611539565b610505600480360360608110156104e957600080fd5b50803590602081013590604001356001600160a01b0316611545565b6040805192835260208301919091528051918290030190f35b6104096004803603606081101561053457600080fd5b506001600160a01b03813581169160208101359091169060400135611624565b6104096004803603602081101561056a57600080fd5b50356001600160a01b031661177e565b61058261179c565b604080516001600160a01b039092168252519081900360200190f35b6105a66117fc565b6040805160ff9092168252519081900360200190f35b61045d600480360360208110156105d257600080fd5b5035611805565b61045d600480360360608110156105ef57600080fd5b506001600160a01b03813516906020810135906040013561192f565b61045d6004803603608081101561062157600080fd5b6001600160a01b03823516916001600160e01b031960208201351691810190606081016040820135600160201b81111561065a57600080fd5b82018360208201111561066c57600080fd5b803590602001918460018302840111600160201b8311171561068d57600080fd5b919350915035611bd9565b61034e600480360360608110156106ae57600080fd5b506001600160a01b038135169060208101359060400135611f81565b61045d600480360360208110156106e057600080fd5b503515156121f4565b61045d6122de565b61045d6004803603604081101561070757600080fd5b81359190810190604081016020820135600160201b81111561072857600080fd5b82018360208201111561073a57600080fd5b803590602001918460208302840111600160201b8311171561075b57600080fd5b509092509050612442565b61034e600480360360c081101561077c57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561275a565b61034e600480360360608110156107b757600080fd5b506001600160a01b038135169060208101359060400135612812565b610409600480360360408110156107e957600080fd5b506001600160a01b038135169060200135612a9d565b61034e6004803603606081101561081557600080fd5b506001600160a01b038135169060208101359060400135612b75565b61034e6004803603602081101561084757600080fd5b50356001600160a01b0316612e3b565b61034e612e56565b610505600480360360a081101561087557600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612e68565b610505600480360360a08110156108b557600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561323b565b61034e600480360360c08110156108f557600080fd5b5080359060208101359060408101359060608101359060808101359060a001356135f0565b61034e600480360360c081101561093057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613696565b61034e613737565b61034e600480360360c081101561097357600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561374b565b61045d600480360360208110156109ae57600080fd5b50356001600160a01b03166137e6565b610409613942565b6109ce613952565b604080519485526020850193909352838301919091526001600160a01b03166060830152519081900360800190f35b61045d60048036036020811015610a1357600080fd5b50356001600160a01b03166139c7565b61034e613ab5565b61034e613b06565b61034e60048036036020811015610a4957600080fd5b50356001600160a01b0316613b13565b610368613b85565b61034e613be6565b61034e600480360360a0811015610a7f57600080fd5b5080359060208101359060408101359060608101359060800135613bf2565b61040960048036036040811015610ab457600080fd5b506001600160a01b038135169060200135613c57565b61045d60048036036040811015610ae057600080fd5b81359190810190604081016020820135600160201b811115610b0157600080fd5b820183602082011115610b1357600080fd5b803590602001918460208302840111600160201b83111715610b3457600080fd5b509092509050613c6d565b61034e613f86565b61034e613f8b565b61034e613f90565b61034e600480360360c0811015610b6d57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613f95565b61034e614016565b61034e614026565b610baa614032565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610be6578181015183820152602001610bce565b505050509050019250505060405180910390f35b610582614129565b61045d60048036036020811015610c1857600080fd5b50356001600160a01b0316614183565b610baa61426f565b61034e6142b9565b61045d60048036036020811015610c4e57600080fd5b50356001600160a01b03166142bf565b61034e614526565b61040960048036036040811015610c7c57600080fd5b506001600160a01b038135169060200135614577565b61034e60048036036040811015610ca857600080fd5b506001600160a01b03813581169160200135166145f8565b61045d60048036036060811015610cd657600080fd5b506001600160a01b038135169060208101359060400135614623565b61034e6147e3565b61034e60048036036020811015610d1057600080fd5b50356001600160a01b03166147f3565b61034e60048036036020811015610d3657600080fd5b50356001600160a01b031661486f565b61034e600480360360c0811015610d5c57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356148e1565b610409614964565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610e33576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16610e90576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b610e9984614974565b6001600160a01b0384166000908152600d60205260409020600390810154610ece91670de0b6b3a76400005b046001016149d0565b831115610f0e576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b6001600160a01b0384166000908152600d60205260408120600a549091908190610f3a90879033611545565b91509150610f5a83600301548460020154600254600e548a6007546135f0565b935083610f9c576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b84841115610fdc576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b610fea836003015487614a99565b60038401556040805183815290516001600160a01b0389169133916000805160206154ae8339815191529181900360200190a36110273385614afb565b61103084614b09565b61103b873384614b12565b600b546110539088906001600160a01b031683614b12565b5050506005805461ff00191690559392505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f45780601f106110c9576101008083540402835291602001916110f4565b820191906000526020600020905b8154815290600101906020018083116110d757829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390926000805160206154ce833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611208576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561121f614bdf565b64e8d4a51000841080159061123c575067016345785d8a00008411155b61127a576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b64e8d4a510008310801590611297575067016345785d8a00008311155b6112d5576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b64e8d4a5100082108015906112f2575067016345785d8a00008211155b611330576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b600893909355600991909155600a55600b80546001600160a01b0319166001600160a01b039092169190911790556005805461ff0019169055565b600554600090610100900460ff16156113b5576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6113be83614974565b6113c782614974565b6001600160a01b038084166000908152600d6020526040808220928516825281206003808401546002808601549284015490840154939461140b9492939290613bf2565b95945050505050565b600554600090610100900460ff161561145e576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d602052604090205460ff16801561149e57506001600160a01b0382166000908152600d602052604090205460ff165b6114db576040805162461bcd60e51b81526020600482015260096024820152681393d517d093d5539160ba1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600d602052604080822092851682529020600380830154600280850154928401549084015460075461140b94929190613bf2565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b60065460009081906001600160a01b0316158015906115d9575060065460408051630a499ad360e01b81526001600160a01b03868116600483015291519190921691630a499ad3916024808301926020929190829003018186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b50515b156115e95750839050600061161c565b60006115fd670de0b6b3a764000086614a99565b905061160986826149d0565b925060006116178785614a99565b925050505b935093915050565b6000336001600160a01b038516148061166057506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6116a9576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b6116b4848484614c37565b336001600160a01b038516148015906116f257506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611774576001600160a01b03841660009081526001602090815260408083203384529091529020546117259083614a99565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206154ce8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600d602052604090205460ff1690565b600554600090610100900460ff16156117e6576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b506005546201000090046001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118ad576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556118c4614bdf565b64e8d4a5100081108015906118e1575067016345785d8a00008111155b61191f576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156119d7576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556119ee614bdf565b6119f783614974565b6119ff614d35565b670de0b6b3a76400008110158015611a2057506802b5e3af16b18800008111155b611a61576040805162461bcd60e51b815260206004820152600d60248201526c5745494748545f424f554e445360981b604482015290519081900360640190fd5b620f4240821015611aa7576040805162461bcd60e51b815260206004820152600b60248201526a4d494e5f42414c414e434560a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d602052604090206002015480821115611b3a57611ae0600e54611adb8484614a99565b614d83565b600e8190556802b5e3af16b18800001015611b35576040805162461bcd60e51b815260206004820152601060248201526f13505617d513d5105317d5d15251d21560821b604482015290519081900360640190fd5b611b5b565b80821015611b5b57611b57600e54611b528385614a99565b614a99565b600e555b6001600160a01b0384166000908152600d602052604090206002810183905560030180549084905580841115611ba457611b9f8533611b9a8785614a99565b614dd7565b611bc7565b80841015611bc7576000611bb88286614a99565b9050611bc5863383614b12565b505b50506005805461ff0019169055505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611c81576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556006546040805163ea3457b760e01b81526001600160a01b0388811660048301526001600160e01b0319881660248301529151919092169163ea3457b7916044808301926020929190829003018186803b158015611ced57600080fd5b505afa158015611d01573d6000803e3d6000fd5b505050506040513d6020811015611d1757600080fd5b5051611d5c576040805162461bcd60e51b815260206004820152600f60248201526e4e4f545f414c4c4f5745445f53494760881b604482015290519081900360640190fd5b611d64614bdf565b60006060866001600160a01b03168387878760405160200180846001600160e01b03191681526004018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310611ddd5780518252601f199092019160209182019101611dbe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611e3f576040519150601f19603f3d011682016040523d82523d6000602084013e611e44565b606091505b509150915081611e89576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f5355434345535360a81b604482015290519081900360640190fd5b856001600160e01b031916821515886001600160a01b03167f32258dd51d74a04508615e0840c1fc905dff28c96b7335e69d9a41023ecd286e6000368660405180806020018060200183810383528686828181526020019250808284376000838201819052601f909101601f191690920185810384528651815286516020918201939188019250908190849084905b83811015611f30578181015183820152602001611f18565b50505050905090810190601f168015611f5d5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450506005805461ff00191690555050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561202b576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612088576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b61209184614974565b6001600160a01b0384166000908152600d6020526040902060038101546002808301549054600e546007546120cb9493929190899061374b565b91508282101561210e576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600d6020526040902060039081015461213e91670de0b6b3a7640000610ec5565b82111561217e576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b61218c816003015483614a99565b81600301819055506000806121a484600a5433611545565b91509150866001600160a01b0316336001600160a01b03166000805160206154ae833981519152846040518082815260200191505060405180910390a36121eb3387614afb565b61103086614b09565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561229c576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556122b3614d35565b6122bb614bdf565b6005805461ff0019921515600160b01b0260ff60b01b1990911617919091169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612386576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561239d614bdf565b6123a5614d35565b600c54600211156123ea576040805162461bcd60e51b815260206004820152600a6024820152694d494e5f544f4b454e5360b01b604482015290519081900360640190fd5b600b805460ff60a01b1916600160a01b1790556005805460ff60b01b1916600160b01b17905561242268056bc75e2d63100000614e30565b6124353368056bc75e2d63100000614f15565b6005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156124ea576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612547576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600061255161151f565b9050600061255f8583614f1f565b9050806125a1576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b60005b600c54811015612708576000600c82815481106125bd57fe5b60009182526020808320909101546001600160a01b0316808352600d9091526040822060030154909250906125f285836149d0565b905080612634576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b87878581811061264057fe5b90506020020135811115612686576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d60205260409020600301546126ac9082614d83565b6001600160a01b0384166000818152600d602090815260409182902060030193909355805184815290519192339260008051602061544e8339815191529281900390910190a36126fd833383614dd7565b5050506001016125a4565b506000806127198760095433611545565b9150915061272687614e30565b6127303383614f15565b600b54612746906001600160a01b031682614f15565b50506005805461ff00191690555050505050565b6000806127678786614f1f565b905060006127758786614d83565b905060006127838289614f1f565b90506000612799670de0b6b3a764000085614f1f565b905060006127a78383615027565b905060006127b5828e6149d0565b905060006127c3828f614a99565b905060006127e26127dc670de0b6b3a76400008a614a99565b8b6149d0565b90506127ff826127fa670de0b6b3a764000084614a99565b614f1f565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156128bc576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612919576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b61292284614974565b6001600160a01b0384166000908152600d6020526040902060030154612954906002670de0b6b3a76400005b046149d0565b831115612997576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b6000806129a78560095433611545565b915091506000600d6000886001600160a01b03166001600160a01b0316815260200190815260200160002090506129f081600301548260020154600254600e5487600754613696565b935084841015612a33576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b612a41816003015484614d83565b60038201556040805184815290516001600160a01b03891691339160008051602061544e8339815191529181900360200190a3612a7d84614e30565b612a873385614f15565b612a92873384615135565b611053873385614dd7565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612af2573360009081526001602090815260408083206001600160a01b0388168452909152812055612b21565b612afc8184614a99565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293926000805160206154ce833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612c1f576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612c7c576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b612c8584614974565b6001600160a01b0384166000908152600d602052604081206009549091908190612cb190879033611545565b91509150612cd183600301548460020154600254600e548a60075461275a565b935083612d13576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b84841115612d53576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6001600160a01b0387166000908152600d6020526040902060030154612d83906002670de0b6b3a764000061294e565b841115612dc6576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b612dd4836003015485614d83565b60038401556040805185815290516001600160a01b03891691339160008051602061544e8339815191529181900360200190a3612e1086614e30565b612e1a3383614f15565b600b54612e30906001600160a01b031682614f15565b611053873386614dd7565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a7640000611535565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612f01576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055612f1987614974565b612f2285614974565b600554600160b01b900460ff16612f6d576040805162461bcd60e51b815260206004820152600a6024820152694e4f545f5055424c494360b01b604482015290519081900360640190fd5b6001600160a01b038088166000908152600d602052604080822092881682529020600380820154612fa691670de0b6b3a7640000610ec5565b861115612fe6576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b60006130078360030154846002015484600301548560020154600754613bf2565b90508581111561304c576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b60008061305c8960085433611545565b9150915061308085600301548660020154866003015487600201548d6007546148e1565b96508a8711156130c2576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6130d0856003015488614d83565b85600301819055506130e684600301548a614a99565b600380860182905586015460028088015490870154600754613109949190613bf2565b955082861015801561312457506131208783614f1f565b8311155b613163576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b878611156131a6576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b031660008051602061546e8339815191528a86604051808381526020018281526020019250505060405180910390a46131fc8c3389614dd7565b6132078a3384614b12565b600b5461321f908b906001600160a01b031683614b12565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156132d4576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556132ec87614974565b6132f585614974565b600554600160b01b900460ff16613340576040805162461bcd60e51b815260206004820152600a6024820152694e4f545f5055424c494360b01b604482015290519081900360640190fd5b6001600160a01b038088166000908152600d602052604080822092881682528120600380840154600280860154928401549084015460075494959461338794929190613bf2565b9050858111156133cc576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b6000806133dc8b60085433611545565b915091506133fa85600301546002670de0b6b3a76400008161294e57fe5b82111561343d576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b61345d856003015486600201548660030154876002015486600754613f95565b9650888710156134a0576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6134ae856003015483614d83565b85600301819055506134c4846003015488614a99565b6003808601829055860154600280880154908701546007546134e7949190613bf2565b955082861015801561350257506134fe8288614f1f565b8311155b613541576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b87861115613584576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b031660008051602061546e833981519152858b604051808381526020018281526020019250505060405180910390a46135da8c3383615135565b6135e58c3384614dd7565b61321f8a3389614b12565b6000806135fd8786614f1f565b90506000613613670de0b6b3a764000083614a99565b9050600061362182866149d0565b9050600061363b876127fa670de0b6b3a764000085614a99565b905060006136498c83614a99565b90506000613657828e614f1f565b905060006136658288615027565b90506000613673828e6149d0565b905060006136818e83614a99565b99505050505050505050509695505050505050565b6000806136a38786614f1f565b905060006136c26136bc670de0b6b3a764000084614a99565b856149d0565b905060006136e1866136dc670de0b6b3a764000085614a99565b6149d0565b905060006136ef8b83614d83565b905060006136fd828d614f1f565b9050600061370b8287615027565b90506000613719828d6149d0565b9050613725818d614a99565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a7640000611535565b6000806137588786614f1f565b905060006137668786614a99565b905060006137748289614f1f565b905060006137938261378e670de0b6b3a764000087614f1f565b615027565b905060006137a1828d6149d0565b905060006137af8d83614a99565b905060006137ce6137c8670de0b6b3a764000089614a99565b8a6149d0565b9050613725826136dc670de0b6b3a764000084614a99565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561388e576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556138a681614974565b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156138ec57600080fd5b505afa158015613900573d6000803e3d6000fd5b505050506040513d602081101561391657600080fd5b50516001600160a01b039091166000908152600d60205260409020600301556005805461ff0019169055565b600b54600160a01b900460ff1690565b600080600080600560019054906101000a900460ff16156139a4576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b5050600854600954600a54600b54929591945092506001600160a01b0390911690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613a6f576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055613a86614bdf565b6005805461ff00196001600160a01b03909316620100000262010000600160b01b031990911617919091169055565b600554600090610100900460ff1615613aff576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b50600e5490565b68056bc75e2d6310000081565b600554600090610100900460ff1615613b5d576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b613b6682614974565b506001600160a01b03166000908152600d602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f45780601f106110c9576101008083540402835291602001916110f4565b6704a03ce68d21555681565b600080613bff8787614f1f565b90506000613c0d8686614f1f565b90506000613c1b8383614f1f565b90506000613c3d670de0b6b3a76400006127fa670de0b6b3a764000089614a99565b9050613c4982826149d0565b9a9950505050505050505050565b6000613c64338484614c37565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613d15576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16613d72576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600080613d8285600a5433611545565b915091506000613d9061151f565b90506000613d9e8483614f1f565b905080613de0576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b613dea3388614afb565b600b54613e00906001600160a01b031684614f15565b613e0984614b09565b60005b600c54811015613f71576000600c8281548110613e2557fe5b60009182526020808320909101546001600160a01b0316808352600d909152604082206003015490925090613e5a85836149d0565b905080613e9c576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b898985818110613ea857fe5b90506020020135811015613eef576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d6020526040902060030154613f159082614a99565b6001600160a01b0384166000818152600d60209081526040918290206003019390935580518481529051919233926000805160206154ae8339815191529281900390910190a3613f66833383614b12565b505050600101613e0c565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b600080613fa28786614f1f565b90506000613fb8670de0b6b3a764000085614a99565b9050613fc485826149d0565b90506000613fd68a6127fa8c85614d83565b90506000613fe48285615027565b90506000613ffa670de0b6b3a764000083614a99565b90506140068a826149d0565b9c9b505050505050505050505050565b600a670de0b6b3a7640000611535565b671bc16d674ec7ffff81565b600554606090610100900460ff161561407c576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b600b54600160a01b900460ff166140ca576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600c8054806020026020016040519081016040528092919081815260200182805480156110f457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614102575050505050905090565b600554600090610100900460ff1615614173576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b506006546001600160a01b031690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561422b576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055614242614bdf565b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554606090610100900460ff16156140ca576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b600c5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614367576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561437e614bdf565b61438781614974565b61438f614d35565b6001600160a01b0381166000908152600d602052604090206003810154600e5460029092015490916143c091614a99565b600e556001600160a01b0382166000908152600d6020526040902060010154600c805460001981019190829081106143f457fe5b600091825260209091200154600c80546001600160a01b03909216918490811061441a57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600d6000600c858154811061445a57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600c80548061448d57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038b168752600d909552929094209051815460ff19169015151781559251600184015551600283015551600390910155614515843385614b12565b50506005805461ff00191690555050565b600554600090610100900460ff1615614570576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546145a59083614d83565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191936000805160206154ce833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a261468c614bdf565b6001600160a01b0383166000908152600d602052604090205460ff16156146e5576040805162461bcd60e51b81526020600482015260086024820152671254d7d093d5539160c21b604482015290519081900360640190fd5b6146ed614d35565b600c54600811614731576040805162461bcd60e51b815260206004820152600a6024820152694d41585f544f4b454e5360b01b604482015290519081900360640190fd5b604080516080810182526001808252600c805460208085019182526000858701818152606087018281526001600160a01b038c16808452600d9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790556147de83838361192f565b505050565b6002670de0b6b3a7640000611535565b600554600090610100900460ff161561483d576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b61484682614974565b6001600160a01b0382166000908152600d6020526040902060020154600e5461114d9190614f1f565b600554600090610100900460ff16156148b9576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6148c282614974565b506001600160a01b03166000908152600d602052604090206003015490565b6000806148ee8588614f1f565b905060006148fc8786614a99565b9050600061490a8883614f1f565b905060006149188285615027565b905061492c81670de0b6b3a7640000614a99565b9050614940670de0b6b3a764000087614a99565b945061495561494f8c836149d0565b86614f1f565b9b9a5050505050505050505050565b600554600160b01b900460ff1690565b6001600160a01b0381166000908152600d602052604090205460ff166149cd576040805162461bcd60e51b81526020600482015260096024820152681393d517d093d5539160ba1b604482015290519081900360640190fd5b50565b60008282028315806149ea5750828482816149e757fe5b04145b614a2e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614a81576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b6000806000614aa88585615193565b915091508015614af3576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b614b0582826151b8565b5050565b6149cd816151c3565b6000836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015614b6b57600080fd5b505af1158015614b7f573d6000803e3d6000fd5b505050506040513d6020811015614b9557600080fd5b5051905080614bd9576040805162461bcd60e51b815260206004820152600b60248201526a45524332305f46414c534560a81b604482015290519081900360640190fd5b50505050565b6005546201000090046001600160a01b03163314614c35576040805162461bcd60e51b815260206004820152600e60248201526d2727aa2fa1a7a72a2927a62622a960911b604482015290519081900360640190fd5b565b6001600160a01b038316600090815260208190526040902054811115614c9b576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b038316600090815260208190526040902054614cbe9082614a99565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614ced9082614d83565b6001600160a01b0380841660008181526020818152604091829020949094558051858152905191939287169260008051602061548e83398151915292918290030190a3505050565b600b54600160a01b900460ff1615614c35576040805162461bcd60e51b815260206004820152600c60248201526b1254d7d1925390531256915160a21b604482015290519081900360640190fd5b600082820183811015614dd0576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b9392505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614b6b57600080fd5b6006546001600160a01b031615614f0c576006546040805163afff324960e01b815230600482015290516000926001600160a01b03169163afff3249916024808301926020929190829003018186803b158015614e8c57600080fd5b505afa158015614ea0573d6000803e3d6000fd5b505050506040513d6020811015614eb657600080fd5b50516002549091508190614eca9084614d83565b1115614f0a576040805162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b604482015290519081900360640190fd5b505b6149cd81615281565b614b0582826152e4565b600081614f62576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580614f8a5750670de0b6b3a7640000848281614f8757fe5b04145b614fce576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561501c576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281614a8e57fe5b60006001831015615077576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156150cd576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006150d8836152ef565b905060006150e68483614a99565b905060006150fc866150f78561530a565b615318565b90508161510d57925061114d915050565b600061511e87846305f5e10061536f565b905061512a82826149d0565b979650505050505050565b600b54604080516323b872dd60e01b81526001600160a01b03858116600483015292831660248201526044810184905290516000928616916323b872dd91606480830192602092919082900301818787803b158015614b6b57600080fd5b6000808284106151a957505080820360006151b1565b505081810360015b9250929050565b614b05823083614c37565b3060009081526020819052604090205481111561521e576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152602081905260409020546152389082614a99565b306000908152602081905260409020556002546152559082614a99565b600255604080518281529051600091309160008051602061548e8339815191529181900360200190a350565b3060009081526020819052604090205461529b9082614d83565b306000908152602081905260409020556002546152b89082614d83565b600255604080518281529051309160009160008051602061548e8339815191529181900360200190a350565b614b05308383614c37565b6000670de0b6b3a76400006153038361530a565b0292915050565b670de0b6b3a7640000900490565b6000806002830661533157670de0b6b3a7640000615333565b835b90506002830492505b8215614dd05761534c84856149d0565b935060028306156153645761536181856149d0565b90505b60028304925061533c565b600082818061538687670de0b6b3a7640000615193565b9092509050670de0b6b3a764000080600060015b88841061543e576000670de0b6b3a7640000820290506000806153ce8a6153c985670de0b6b3a7640000614a99565b615193565b915091506153e0876136dc848c6149d0565b96506153ec8784614f1f565b9650866153fb5750505061543e565b8715615405579315935b801561540f579315935b84156154265761541f8688614a99565b9550615433565b6154308688614d83565b95505b50505060010161539a565b5090999850505050505050505056fe63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212209b278121a252bf1c9391a32b6106c1fb8fe23502162893b8dc9cb649c33c82f364736f6c634300060c0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000016506f77657220496e64657820506f6f6c20546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000045049505400000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103175760003560e01c806302c967481461031c57806306fdde0314610360578063095ea7b3146103dd57806309a3bbe41461041d5780630f7b1e3e146104255780631446a7ff1461045f57806315e84af91461048d57806318160ddd146104bb578063189d00ca146104c3578063218b5382146104cb5780632245a08e146104d357806323b872dd1461051e5780632f37b624146105545780633018205f1461057a578063313ce5671461059e57806334e19907146105bc5780633fdddaa2146105d9578063442e21521461060b57806346ab38f11461069857806349b59552146106ca5780634bb278f3146106e95780634f69c0d4146106f15780635c1bbaf7146107665780635db34277146107a157806366188463146107d35780636d06dfa0146107ff57806370a082311461083157806376c7a3c7146108575780637c5e9ea41461085f5780638201aa3f1461089f57806382f652ad146108df5780638656b6531461091a578063867378c514610955578063892980121461095d5780638c28cbe8146109985780638d4e4083146109be57806390ad688b146109c657806392eefe9b146109fd578063936c347714610a235780639381cd2b14610a2b578063948d8ce614610a3357806395d89b4114610a59578063992e2a9214610a61578063a221ee4914610a69578063a9059cbb14610a9e578063b02f0b7314610aca578063b0e0d13614610b3f578063b7b800a414610b47578063ba019dab14610b4f578063ba9530a614610b57578063bc063e1a14610b92578063bc694ea214610b9a578063be3bbd2e14610ba2578063c36596a6146104cb578063c4195cb814610bfa578063c61641cd14610c02578063cc77828d14610c28578063cd2ed8fb14610c30578063cf5e7bd314610c38578063d4cadf6814610c5e578063d73dd62314610c66578063dd62ed3e14610c92578063e4a28a521461041d578063e4e1e53814610cc0578063ec09302114610cf2578063f1b8a9b714610cfa578063f8b2cb4f14610d20578063f8d6aed414610d46578063fde924f714610d81575b600080fd5b61034e6004803603606081101561033257600080fd5b506001600160a01b038135169060208101359060400135610d89565b60408051918252519081900360200190f35b610368611068565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103a257818101518382015260200161038a565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610409600480360360408110156103f357600080fd5b506001600160a01b0381351690602001356110fe565b604080519115158252519081900360200190f35b61034e611153565b61045d6004803603608081101561043b57600080fd5b50803590602081013590604081013590606001356001600160a01b0316611160565b005b61034e6004803603604081101561047557600080fd5b506001600160a01b038135811691602001351661136b565b61034e600480360360408110156104a357600080fd5b506001600160a01b0381358116916020013516611414565b61034e61151f565b61034e611525565b61034e611539565b610505600480360360608110156104e957600080fd5b50803590602081013590604001356001600160a01b0316611545565b6040805192835260208301919091528051918290030190f35b6104096004803603606081101561053457600080fd5b506001600160a01b03813581169160208101359091169060400135611624565b6104096004803603602081101561056a57600080fd5b50356001600160a01b031661177e565b61058261179c565b604080516001600160a01b039092168252519081900360200190f35b6105a66117fc565b6040805160ff9092168252519081900360200190f35b61045d600480360360208110156105d257600080fd5b5035611805565b61045d600480360360608110156105ef57600080fd5b506001600160a01b03813516906020810135906040013561192f565b61045d6004803603608081101561062157600080fd5b6001600160a01b03823516916001600160e01b031960208201351691810190606081016040820135600160201b81111561065a57600080fd5b82018360208201111561066c57600080fd5b803590602001918460018302840111600160201b8311171561068d57600080fd5b919350915035611bd9565b61034e600480360360608110156106ae57600080fd5b506001600160a01b038135169060208101359060400135611f81565b61045d600480360360208110156106e057600080fd5b503515156121f4565b61045d6122de565b61045d6004803603604081101561070757600080fd5b81359190810190604081016020820135600160201b81111561072857600080fd5b82018360208201111561073a57600080fd5b803590602001918460208302840111600160201b8311171561075b57600080fd5b509092509050612442565b61034e600480360360c081101561077c57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561275a565b61034e600480360360608110156107b757600080fd5b506001600160a01b038135169060208101359060400135612812565b610409600480360360408110156107e957600080fd5b506001600160a01b038135169060200135612a9d565b61034e6004803603606081101561081557600080fd5b506001600160a01b038135169060208101359060400135612b75565b61034e6004803603602081101561084757600080fd5b50356001600160a01b0316612e3b565b61034e612e56565b610505600480360360a081101561087557600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612e68565b610505600480360360a08110156108b557600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561323b565b61034e600480360360c08110156108f557600080fd5b5080359060208101359060408101359060608101359060808101359060a001356135f0565b61034e600480360360c081101561093057600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613696565b61034e613737565b61034e600480360360c081101561097357600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561374b565b61045d600480360360208110156109ae57600080fd5b50356001600160a01b03166137e6565b610409613942565b6109ce613952565b604080519485526020850193909352838301919091526001600160a01b03166060830152519081900360800190f35b61045d60048036036020811015610a1357600080fd5b50356001600160a01b03166139c7565b61034e613ab5565b61034e613b06565b61034e60048036036020811015610a4957600080fd5b50356001600160a01b0316613b13565b610368613b85565b61034e613be6565b61034e600480360360a0811015610a7f57600080fd5b5080359060208101359060408101359060608101359060800135613bf2565b61040960048036036040811015610ab457600080fd5b506001600160a01b038135169060200135613c57565b61045d60048036036040811015610ae057600080fd5b81359190810190604081016020820135600160201b811115610b0157600080fd5b820183602082011115610b1357600080fd5b803590602001918460208302840111600160201b83111715610b3457600080fd5b509092509050613c6d565b61034e613f86565b61034e613f8b565b61034e613f90565b61034e600480360360c0811015610b6d57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613f95565b61034e614016565b61034e614026565b610baa614032565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610be6578181015183820152602001610bce565b505050509050019250505060405180910390f35b610582614129565b61045d60048036036020811015610c1857600080fd5b50356001600160a01b0316614183565b610baa61426f565b61034e6142b9565b61045d60048036036020811015610c4e57600080fd5b50356001600160a01b03166142bf565b61034e614526565b61040960048036036040811015610c7c57600080fd5b506001600160a01b038135169060200135614577565b61034e60048036036040811015610ca857600080fd5b506001600160a01b03813581169160200135166145f8565b61045d60048036036060811015610cd657600080fd5b506001600160a01b038135169060208101359060400135614623565b61034e6147e3565b61034e60048036036020811015610d1057600080fd5b50356001600160a01b03166147f3565b61034e60048036036020811015610d3657600080fd5b50356001600160a01b031661486f565b61034e600480360360c0811015610d5c57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356148e1565b610409614964565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610e33576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16610e90576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b610e9984614974565b6001600160a01b0384166000908152600d60205260409020600390810154610ece91670de0b6b3a76400005b046001016149d0565b831115610f0e576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b6001600160a01b0384166000908152600d60205260408120600a549091908190610f3a90879033611545565b91509150610f5a83600301548460020154600254600e548a6007546135f0565b935083610f9c576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b84841115610fdc576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b610fea836003015487614a99565b60038401556040805183815290516001600160a01b0389169133916000805160206154ae8339815191529181900360200190a36110273385614afb565b61103084614b09565b61103b873384614b12565b600b546110539088906001600160a01b031683614b12565b5050506005805461ff00191690559392505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f45780601f106110c9576101008083540402835291602001916110f4565b820191906000526020600020905b8154815290600101906020018083116110d757829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390926000805160206154ce833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611208576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561121f614bdf565b64e8d4a51000841080159061123c575067016345785d8a00008411155b61127a576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b64e8d4a510008310801590611297575067016345785d8a00008311155b6112d5576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b64e8d4a5100082108015906112f2575067016345785d8a00008211155b611330576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b600893909355600991909155600a55600b80546001600160a01b0319166001600160a01b039092169190911790556005805461ff0019169055565b600554600090610100900460ff16156113b5576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6113be83614974565b6113c782614974565b6001600160a01b038084166000908152600d6020526040808220928516825281206003808401546002808601549284015490840154939461140b9492939290613bf2565b95945050505050565b600554600090610100900460ff161561145e576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d602052604090205460ff16801561149e57506001600160a01b0382166000908152600d602052604090205460ff165b6114db576040805162461bcd60e51b81526020600482015260096024820152681393d517d093d5539160ba1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600d602052604080822092851682529020600380830154600280850154928401549084015460075461140b94929190613bf2565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b60065460009081906001600160a01b0316158015906115d9575060065460408051630a499ad360e01b81526001600160a01b03868116600483015291519190921691630a499ad3916024808301926020929190829003018186803b1580156115ac57600080fd5b505afa1580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b50515b156115e95750839050600061161c565b60006115fd670de0b6b3a764000086614a99565b905061160986826149d0565b925060006116178785614a99565b925050505b935093915050565b6000336001600160a01b038516148061166057506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6116a9576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b6116b4848484614c37565b336001600160a01b038516148015906116f257506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611774576001600160a01b03841660009081526001602090815260408083203384529091529020546117259083614a99565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206154ce8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600d602052604090205460ff1690565b600554600090610100900460ff16156117e6576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b506005546201000090046001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118ad576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556118c4614bdf565b64e8d4a5100081108015906118e1575067016345785d8a00008111155b61191f576040805162461bcd60e51b815260206004820152600a6024820152694645455f424f554e445360b01b604482015290519081900360640190fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156119d7576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556119ee614bdf565b6119f783614974565b6119ff614d35565b670de0b6b3a76400008110158015611a2057506802b5e3af16b18800008111155b611a61576040805162461bcd60e51b815260206004820152600d60248201526c5745494748545f424f554e445360981b604482015290519081900360640190fd5b620f4240821015611aa7576040805162461bcd60e51b815260206004820152600b60248201526a4d494e5f42414c414e434560a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d602052604090206002015480821115611b3a57611ae0600e54611adb8484614a99565b614d83565b600e8190556802b5e3af16b18800001015611b35576040805162461bcd60e51b815260206004820152601060248201526f13505617d513d5105317d5d15251d21560821b604482015290519081900360640190fd5b611b5b565b80821015611b5b57611b57600e54611b528385614a99565b614a99565b600e555b6001600160a01b0384166000908152600d602052604090206002810183905560030180549084905580841115611ba457611b9f8533611b9a8785614a99565b614dd7565b611bc7565b80841015611bc7576000611bb88286614a99565b9050611bc5863383614b12565b505b50506005805461ff0019169055505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611c81576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556006546040805163ea3457b760e01b81526001600160a01b0388811660048301526001600160e01b0319881660248301529151919092169163ea3457b7916044808301926020929190829003018186803b158015611ced57600080fd5b505afa158015611d01573d6000803e3d6000fd5b505050506040513d6020811015611d1757600080fd5b5051611d5c576040805162461bcd60e51b815260206004820152600f60248201526e4e4f545f414c4c4f5745445f53494760881b604482015290519081900360640190fd5b611d64614bdf565b60006060866001600160a01b03168387878760405160200180846001600160e01b03191681526004018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310611ddd5780518252601f199092019160209182019101611dbe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611e3f576040519150601f19603f3d011682016040523d82523d6000602084013e611e44565b606091505b509150915081611e89576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f5355434345535360a81b604482015290519081900360640190fd5b856001600160e01b031916821515886001600160a01b03167f32258dd51d74a04508615e0840c1fc905dff28c96b7335e69d9a41023ecd286e6000368660405180806020018060200183810383528686828181526020019250808284376000838201819052601f909101601f191690920185810384528651815286516020918201939188019250908190849084905b83811015611f30578181015183820152602001611f18565b50505050905090810190601f168015611f5d5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450506005805461ff00191690555050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561202b576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612088576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b61209184614974565b6001600160a01b0384166000908152600d6020526040902060038101546002808301549054600e546007546120cb9493929190899061374b565b91508282101561210e576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600d6020526040902060039081015461213e91670de0b6b3a7640000610ec5565b82111561217e576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b61218c816003015483614a99565b81600301819055506000806121a484600a5433611545565b91509150866001600160a01b0316336001600160a01b03166000805160206154ae833981519152846040518082815260200191505060405180910390a36121eb3387614afb565b61103086614b09565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561229c576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556122b3614d35565b6122bb614bdf565b6005805461ff0019921515600160b01b0260ff60b01b1990911617919091169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612386576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561239d614bdf565b6123a5614d35565b600c54600211156123ea576040805162461bcd60e51b815260206004820152600a6024820152694d494e5f544f4b454e5360b01b604482015290519081900360640190fd5b600b805460ff60a01b1916600160a01b1790556005805460ff60b01b1916600160b01b17905561242268056bc75e2d63100000614e30565b6124353368056bc75e2d63100000614f15565b6005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156124ea576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612547576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600061255161151f565b9050600061255f8583614f1f565b9050806125a1576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b60005b600c54811015612708576000600c82815481106125bd57fe5b60009182526020808320909101546001600160a01b0316808352600d9091526040822060030154909250906125f285836149d0565b905080612634576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b87878581811061264057fe5b90506020020135811115612686576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d60205260409020600301546126ac9082614d83565b6001600160a01b0384166000818152600d602090815260409182902060030193909355805184815290519192339260008051602061544e8339815191529281900390910190a36126fd833383614dd7565b5050506001016125a4565b506000806127198760095433611545565b9150915061272687614e30565b6127303383614f15565b600b54612746906001600160a01b031682614f15565b50506005805461ff00191690555050505050565b6000806127678786614f1f565b905060006127758786614d83565b905060006127838289614f1f565b90506000612799670de0b6b3a764000085614f1f565b905060006127a78383615027565b905060006127b5828e6149d0565b905060006127c3828f614a99565b905060006127e26127dc670de0b6b3a76400008a614a99565b8b6149d0565b90506127ff826127fa670de0b6b3a764000084614a99565b614f1f565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156128bc576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612919576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b61292284614974565b6001600160a01b0384166000908152600d6020526040902060030154612954906002670de0b6b3a76400005b046149d0565b831115612997576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b6000806129a78560095433611545565b915091506000600d6000886001600160a01b03166001600160a01b0316815260200190815260200160002090506129f081600301548260020154600254600e5487600754613696565b935084841015612a33576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b612a41816003015484614d83565b60038201556040805184815290516001600160a01b03891691339160008051602061544e8339815191529181900360200190a3612a7d84614e30565b612a873385614f15565b612a92873384615135565b611053873385614dd7565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612af2573360009081526001602090815260408083206001600160a01b0388168452909152812055612b21565b612afc8184614a99565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293926000805160206154ce833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612c1f576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16612c7c576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b612c8584614974565b6001600160a01b0384166000908152600d602052604081206009549091908190612cb190879033611545565b91509150612cd183600301548460020154600254600e548a60075461275a565b935083612d13576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b84841115612d53576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6001600160a01b0387166000908152600d6020526040902060030154612d83906002670de0b6b3a764000061294e565b841115612dc6576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b612dd4836003015485614d83565b60038401556040805185815290516001600160a01b03891691339160008051602061544e8339815191529181900360200190a3612e1086614e30565b612e1a3383614f15565b600b54612e30906001600160a01b031682614f15565b611053873386614dd7565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a7640000611535565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612f01576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055612f1987614974565b612f2285614974565b600554600160b01b900460ff16612f6d576040805162461bcd60e51b815260206004820152600a6024820152694e4f545f5055424c494360b01b604482015290519081900360640190fd5b6001600160a01b038088166000908152600d602052604080822092881682529020600380820154612fa691670de0b6b3a7640000610ec5565b861115612fe6576040805162461bcd60e51b81526020600482015260096024820152684f55545f524154494f60b81b604482015290519081900360640190fd5b60006130078360030154846002015484600301548560020154600754613bf2565b90508581111561304c576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b60008061305c8960085433611545565b9150915061308085600301548660020154866003015487600201548d6007546148e1565b96508a8711156130c2576040805162461bcd60e51b81526020600482015260086024820152672624a6a4aa2fa4a760c11b604482015290519081900360640190fd5b6130d0856003015488614d83565b85600301819055506130e684600301548a614a99565b600380860182905586015460028088015490870154600754613109949190613bf2565b955082861015801561312457506131208783614f1f565b8311155b613163576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b878611156131a6576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b031660008051602061546e8339815191528a86604051808381526020018281526020019250505060405180910390a46131fc8c3389614dd7565b6132078a3384614b12565b600b5461321f908b906001600160a01b031683614b12565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156132d4576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556132ec87614974565b6132f585614974565b600554600160b01b900460ff16613340576040805162461bcd60e51b815260206004820152600a6024820152694e4f545f5055424c494360b01b604482015290519081900360640190fd5b6001600160a01b038088166000908152600d602052604080822092881682528120600380840154600280860154928401549084015460075494959461338794929190613bf2565b9050858111156133cc576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b6000806133dc8b60085433611545565b915091506133fa85600301546002670de0b6b3a76400008161294e57fe5b82111561343d576040805162461bcd60e51b815260206004820152600c60248201526b4d41585f494e5f524154494f60a01b604482015290519081900360640190fd5b61345d856003015486600201548660030154876002015486600754613f95565b9650888710156134a0576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6134ae856003015483614d83565b85600301819055506134c4846003015488614a99565b6003808601829055860154600280880154908701546007546134e7949190613bf2565b955082861015801561350257506134fe8288614f1f565b8311155b613541576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b87861115613584576040805162461bcd60e51b815260206004820152600b60248201526a4c494d49545f505249434560a81b604482015290519081900360640190fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b031660008051602061546e833981519152858b604051808381526020018281526020019250505060405180910390a46135da8c3383615135565b6135e58c3384614dd7565b61321f8a3389614b12565b6000806135fd8786614f1f565b90506000613613670de0b6b3a764000083614a99565b9050600061362182866149d0565b9050600061363b876127fa670de0b6b3a764000085614a99565b905060006136498c83614a99565b90506000613657828e614f1f565b905060006136658288615027565b90506000613673828e6149d0565b905060006136818e83614a99565b99505050505050505050509695505050505050565b6000806136a38786614f1f565b905060006136c26136bc670de0b6b3a764000084614a99565b856149d0565b905060006136e1866136dc670de0b6b3a764000085614a99565b6149d0565b905060006136ef8b83614d83565b905060006136fd828d614f1f565b9050600061370b8287615027565b90506000613719828d6149d0565b9050613725818d614a99565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a7640000611535565b6000806137588786614f1f565b905060006137668786614a99565b905060006137748289614f1f565b905060006137938261378e670de0b6b3a764000087614f1f565b615027565b905060006137a1828d6149d0565b905060006137af8d83614a99565b905060006137ce6137c8670de0b6b3a764000089614a99565b8a6149d0565b9050613725826136dc670de0b6b3a764000084614a99565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561388e576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556138a681614974565b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156138ec57600080fd5b505afa158015613900573d6000803e3d6000fd5b505050506040513d602081101561391657600080fd5b50516001600160a01b039091166000908152600d60205260409020600301556005805461ff0019169055565b600b54600160a01b900460ff1690565b600080600080600560019054906101000a900460ff16156139a4576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b5050600854600954600a54600b54929591945092506001600160a01b0390911690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613a6f576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055613a86614bdf565b6005805461ff00196001600160a01b03909316620100000262010000600160b01b031990911617919091169055565b600554600090610100900460ff1615613aff576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b50600e5490565b68056bc75e2d6310000081565b600554600090610100900460ff1615613b5d576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b613b6682614974565b506001600160a01b03166000908152600d602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f45780601f106110c9576101008083540402835291602001916110f4565b6704a03ce68d21555681565b600080613bff8787614f1f565b90506000613c0d8686614f1f565b90506000613c1b8383614f1f565b90506000613c3d670de0b6b3a76400006127fa670de0b6b3a764000089614a99565b9050613c4982826149d0565b9a9950505050505050505050565b6000613c64338484614c37565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613d15576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600b54600160a01b900460ff16613d72576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600080613d8285600a5433611545565b915091506000613d9061151f565b90506000613d9e8483614f1f565b905080613de0576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b613dea3388614afb565b600b54613e00906001600160a01b031684614f15565b613e0984614b09565b60005b600c54811015613f71576000600c8281548110613e2557fe5b60009182526020808320909101546001600160a01b0316808352600d909152604082206003015490925090613e5a85836149d0565b905080613e9c576040805162461bcd60e51b815260206004820152600b60248201526a09a82a890be82a0a0a49eb60ab1b604482015290519081900360640190fd5b898985818110613ea857fe5b90506020020135811015613eef576040805162461bcd60e51b8152602060048201526009602482015268131253525517d3d55560ba1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600d6020526040902060030154613f159082614a99565b6001600160a01b0384166000818152600d60209081526040918290206003019390935580518481529051919233926000805160206154ae8339815191529281900390910190a3613f66833383614b12565b505050600101613e0c565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b600080613fa28786614f1f565b90506000613fb8670de0b6b3a764000085614a99565b9050613fc485826149d0565b90506000613fd68a6127fa8c85614d83565b90506000613fe48285615027565b90506000613ffa670de0b6b3a764000083614a99565b90506140068a826149d0565b9c9b505050505050505050505050565b600a670de0b6b3a7640000611535565b671bc16d674ec7ffff81565b600554606090610100900460ff161561407c576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b600b54600160a01b900460ff166140ca576040805162461bcd60e51b815260206004820152600d60248201526c1393d517d19253905312569151609a1b604482015290519081900360640190fd5b600c8054806020026020016040519081016040528092919081815260200182805480156110f457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614102575050505050905090565b600554600090610100900460ff1615614173576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b506006546001600160a01b031690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561422b576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055614242614bdf565b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554606090610100900460ff16156140ca576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b600c5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615614367576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561437e614bdf565b61438781614974565b61438f614d35565b6001600160a01b0381166000908152600d602052604090206003810154600e5460029092015490916143c091614a99565b600e556001600160a01b0382166000908152600d6020526040902060010154600c805460001981019190829081106143f457fe5b600091825260209091200154600c80546001600160a01b03909216918490811061441a57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600d6000600c858154811061445a57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600c80548061448d57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038b168752600d909552929094209051815460ff19169015151781559251600184015551600283015551600390910155614515843385614b12565b50506005805461ff00191690555050565b600554600090610100900460ff1615614570576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546145a59083614d83565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191936000805160206154ce833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a261468c614bdf565b6001600160a01b0383166000908152600d602052604090205460ff16156146e5576040805162461bcd60e51b81526020600482015260086024820152671254d7d093d5539160c21b604482015290519081900360640190fd5b6146ed614d35565b600c54600811614731576040805162461bcd60e51b815260206004820152600a6024820152694d41585f544f4b454e5360b01b604482015290519081900360640190fd5b604080516080810182526001808252600c805460208085019182526000858701818152606087018281526001600160a01b038c16808452600d9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790556147de83838361192f565b505050565b6002670de0b6b3a7640000611535565b600554600090610100900460ff161561483d576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b61484682614974565b6001600160a01b0382166000908152600d6020526040902060020154600e5461114d9190614f1f565b600554600090610100900460ff16156148b9576040805162461bcd60e51b81526020600482015260076024820152665245454e54525960c81b604482015290519081900360640190fd5b6148c282614974565b506001600160a01b03166000908152600d602052604090206003015490565b6000806148ee8588614f1f565b905060006148fc8786614a99565b9050600061490a8883614f1f565b905060006149188285615027565b905061492c81670de0b6b3a7640000614a99565b9050614940670de0b6b3a764000087614a99565b945061495561494f8c836149d0565b86614f1f565b9b9a5050505050505050505050565b600554600160b01b900460ff1690565b6001600160a01b0381166000908152600d602052604090205460ff166149cd576040805162461bcd60e51b81526020600482015260096024820152681393d517d093d5539160ba1b604482015290519081900360640190fd5b50565b60008282028315806149ea5750828482816149e757fe5b04145b614a2e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614a81576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b6000806000614aa88585615193565b915091508015614af3576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b614b0582826151b8565b5050565b6149cd816151c3565b6000836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015614b6b57600080fd5b505af1158015614b7f573d6000803e3d6000fd5b505050506040513d6020811015614b9557600080fd5b5051905080614bd9576040805162461bcd60e51b815260206004820152600b60248201526a45524332305f46414c534560a81b604482015290519081900360640190fd5b50505050565b6005546201000090046001600160a01b03163314614c35576040805162461bcd60e51b815260206004820152600e60248201526d2727aa2fa1a7a72a2927a62622a960911b604482015290519081900360640190fd5b565b6001600160a01b038316600090815260208190526040902054811115614c9b576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b038316600090815260208190526040902054614cbe9082614a99565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614ced9082614d83565b6001600160a01b0380841660008181526020818152604091829020949094558051858152905191939287169260008051602061548e83398151915292918290030190a3505050565b600b54600160a01b900460ff1615614c35576040805162461bcd60e51b815260206004820152600c60248201526b1254d7d1925390531256915160a21b604482015290519081900360640190fd5b600082820183811015614dd0576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b9392505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614b6b57600080fd5b6006546001600160a01b031615614f0c576006546040805163afff324960e01b815230600482015290516000926001600160a01b03169163afff3249916024808301926020929190829003018186803b158015614e8c57600080fd5b505afa158015614ea0573d6000803e3d6000fd5b505050506040513d6020811015614eb657600080fd5b50516002549091508190614eca9084614d83565b1115614f0a576040805162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b604482015290519081900360640190fd5b505b6149cd81615281565b614b0582826152e4565b600081614f62576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580614f8a5750670de0b6b3a7640000848281614f8757fe5b04145b614fce576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561501c576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281614a8e57fe5b60006001831015615077576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156150cd576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006150d8836152ef565b905060006150e68483614a99565b905060006150fc866150f78561530a565b615318565b90508161510d57925061114d915050565b600061511e87846305f5e10061536f565b905061512a82826149d0565b979650505050505050565b600b54604080516323b872dd60e01b81526001600160a01b03858116600483015292831660248201526044810184905290516000928616916323b872dd91606480830192602092919082900301818787803b158015614b6b57600080fd5b6000808284106151a957505080820360006151b1565b505081810360015b9250929050565b614b05823083614c37565b3060009081526020819052604090205481111561521e576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152602081905260409020546152389082614a99565b306000908152602081905260409020556002546152559082614a99565b600255604080518281529051600091309160008051602061548e8339815191529181900360200190a350565b3060009081526020819052604090205461529b9082614d83565b306000908152602081905260409020556002546152b89082614d83565b600255604080518281529051309160009160008051602061548e8339815191529181900360200190a350565b614b05308383614c37565b6000670de0b6b3a76400006153038361530a565b0292915050565b670de0b6b3a7640000900490565b6000806002830661533157670de0b6b3a7640000615333565b835b90506002830492505b8215614dd05761534c84856149d0565b935060028306156153645761536181856149d0565b90505b60028304925061533c565b600082818061538687670de0b6b3a7640000615193565b9092509050670de0b6b3a764000080600060015b88841061543e576000670de0b6b3a7640000820290506000806153ce8a6153c985670de0b6b3a7640000614a99565b615193565b915091506153e0876136dc848c6149d0565b96506153ec8784614f1f565b9650866153fb5750505061543e565b8715615405579315935b801561540f579315935b84156154265761541f8688614a99565b9550615433565b6154308688614d83565b95505b50505060010161539a565b5090999850505050505050505056fe63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212209b278121a252bf1c9391a32b6106c1fb8fe23502162893b8dc9cb649c33c82f364736f6c634300060c0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000016506f77657220496e64657820506f6f6c20546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000045049505400000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Power Index Pool Token
Arg [1] : symbol (string): PIPT

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [3] : 506f77657220496e64657820506f6f6c20546f6b656e00000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 5049505400000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

27204:27627:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50815:1500;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50815:1500:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9630:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10267:193;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10267:193:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1731:50;;;:::i;32191:742::-;;;;;;;;;;;;;;;;-1:-1:-1;32191:742:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32191:742:0;;:::i;:::-;;37912:433;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37912:433:0;;;;;;;;;;:::i;37450:454::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37450:454:0;;;;;;;;;;:::i;10162:97::-;;;:::i;2030:54::-;;;:::i;1622:45::-;;;:::i;54205:623::-;;;;;;;;;;;;;;;;-1:-1:-1;54205:623:0;;;;;;;;;;;-1:-1:-1;;;;;54205:623:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11283:500;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11283:500:0;;;;;;;;;;;;;;;;;:::i;29818:123::-;;;;;;;;;;;;;;;;-1:-1:-1;29818:123:0;-1:-1:-1;;;;;29818:123:0;;:::i;31651:137::-;;;:::i;:::-;;;;-1:-1:-1;;;;;31651:137:0;;;;;;;;;;;;;;9816:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31954:229;;;;;;;;;;;;;;;;-1:-1:-1;31954:229:0;;:::i;35063:1275::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35063:1275:0;;;;;;;;;;;;;:::i;33881:503::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33881:503:0;;;;-1:-1:-1;;;;;;33881:503:0;;;;;;;;;;;;;;;;-1:-1:-1;;;33881:503:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33881:503:0;;;;;;;;;;;;-1:-1:-1;33881:503:0;-1:-1:-1;33881:503:0;;:::i;49353:1454::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49353:1454:0;;;;;;;;;;;;;:::i;33309:189::-;;;;;;;;;;;;;;;;-1:-1:-1;33309:189:0;;;;:::i;33506:367::-;;;:::i;38353:1197::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38353:1197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38353:1197:0;;;;;;;;;;-1:-1:-1;38353:1197:0;;-1:-1:-1;38353:1197:0;-1:-1:-1;38353:1197:0;:::i;20571:1193::-;;;;;;;;;;;;;;;;-1:-1:-1;20571:1193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46413:1463::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46413:1463:0;;;;;;;;;;;;;:::i;10728:397::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10728:397:0;;;;;;;;:::i;47884:1461::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47884:1461:0;;;;;;;;;;;;;:::i;10043:111::-;;;;;;;;;;;;;;;;-1:-1:-1;10043:111:0;-1:-1:-1;;;;;10043:111:0;;:::i;1503:53::-;;;:::i;43709:2694::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43709:2694:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40776:2925::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40776:2925:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24972:1096::-;;;;;;;;;;;;;;;;-1:-1:-1;24972:1096:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18386:1167::-;;;;;;;;;;;;;;;;-1:-1:-1;18386:1167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1788:54::-;;;:::i;22883:1071::-;;;;;;;;;;;;;;;;-1:-1:-1;22883:1071:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37246:196::-;;;;;;;;;;;;;;;;-1:-1:-1;37246:196:0;-1:-1:-1;;;;;37246:196:0;;:::i;29699:111::-;;;:::i;31345:298::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31345:298:0;;;;;;;;;;;;;;33137:164;;;;;;;;;;;;;;;;-1:-1:-1;33137:164:0;-1:-1:-1;;;;;33137:164:0;;:::i;30635:148::-;;;:::i;1851:51::-;;;:::i;30430:197::-;;;;;;;;;;;;;;;;-1:-1:-1;30430:197:0;-1:-1:-1;;;;;30430:197:0;;:::i;9721:87::-;;;:::i;2149:59::-;;;:::i;13468:509::-;;;;;;;;;;;;;;;;-1:-1:-1;13468:509:0;;;;;;;;;;;;;;;;;;;;;;:::i;11133:142::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11133:142:0;;;;;;;;:::i;39558:1208::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39558:1208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39558:1208:0;;;;;;;;;;-1:-1:-1;39558:1208:0;;-1:-1:-1;39558:1208:0;-1:-1:-1;39558:1208:0;:::i;1452:42::-;;;:::i;1403:::-;;;:::i;1911:46::-;;;:::i;14995:683::-;;;;;;;;;;;;;;;;-1:-1:-1;14995:683:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1563:50::-;;;:::i;1964:59::-;;;:::i;30225:197::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31796:150;;;:::i;32941:188::-;;;;;;;;;;;;;;;;-1:-1:-1;32941:188:0;-1:-1:-1;;;;;32941:188:0;;:::i;30074:143::-;;;:::i;29949:117::-;;;:::i;36346:815::-;;;;;;;;;;;;;;;;-1:-1:-1;36346:815:0;-1:-1:-1;;;;;36346:815:0;;:::i;31209:128::-;;;:::i;10468:252::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10468:252:0;;;;;;;;:::i;9906:129::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9906:129:0;;;;;;;;;;:::i;34392:663::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34392:663:0;;;;;;;;;;;;;:::i;2093:49::-;;;:::i;30791:215::-;;;;;;;;;;;;;;;;-1:-1:-1;30791:215:0;-1:-1:-1;;;;;30791:215:0;;:::i;31014:187::-;;;;;;;;;;;;;;;;-1:-1:-1;31014:187:0;-1:-1:-1;;;;;31014:187:0;;:::i;16696:672::-;;;;;;;;;;;;;;;;-1:-1:-1;16696:672:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29578:113::-;;;:::i;50815:1500::-;50977:17;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;51020:10:::2;::::0;-1:-1:-1;;;51020:10:0;::::2;28430:13:::1;51020:10:::2;51012:36;;;::::0;;-1:-1:-1;;;51012:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;51012:36:0;;;;;;;;;;;;;::::2;;51059:21;51071:8;51059:11;:21::i;:::-;-1:-1:-1::0;;;;;51122:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:26:::2;::::0;;::::2;::::0;51117:47:::2;::::0;1388:6:::2;2191:8;;2203:5;2190:18;51117:4;:47::i;:::-;51099:14;:65;;51091:87;;;::::0;;-1:-1:-1;;;51091:87:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;51091:87:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;51218:18:0;::::2;51191:24;51218:18:::0;;;:8:::2;:18;::::0;;;;51375:17:::2;::::0;51218:18;;51191:24;;;51305:123:::2;::::0;51346:14;;51407:10:::2;51305:26;:123::i;:::-;51249:179;;;;51456:316;51511:9;:17;;;51559:9;:16;;;51606:12;;51649;;51692:14;51737:8;;51456:24;:316::i;:::-;51441:331:::0;-1:-1:-1;51793:17:0;51785:41:::2;;;::::0;;-1:-1:-1;;;51785:41:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;51785:41:0;;;;;;;;;;;;;::::2;;51861:15;51845:12;:31;;51837:52;;;::::0;;-1:-1:-1;;;51837:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;51837:52:0;;;;;;;;;;;;;::::2;;51922:39;51927:9;:17;;;51946:14;51922:4;:39::i;:::-;51902:17;::::0;::::2;:59:::0;51979:54:::2;::::0;;;;;;;-1:-1:-1;;;;;51979:54:0;::::2;::::0;51988:10:::2;::::0;-1:-1:-1;;;;;;;;;;;51979:54:0;;;;::::2;::::0;;::::2;52046:40;52061:10;52073:12;52046:14;:40::i;:::-;52097:28;52112:12;52097:14;:28::i;:::-;52136:61;52152:8;52162:10;52174:22;52136:15;:61::i;:::-;52234:21;::::0;52208:67:::2;::::0;52224:8;;-1:-1:-1;;;;;52234:21:0::2;52257:17:::0;52208:15:::2;:67::i;:::-;52288:19;;;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;50815:1500;;-1:-1:-1;;;50815:1500:0:o;9630:83::-;9700:5;9693:12;;;;;;;;-1:-1:-1;;9693:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9667:13;;9693:12;;9700:5;;9693:12;;9700:5;9693:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9630:83;:::o;10267:193::-;10362:10;10334:4;10351:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10351:27:0;;;;;;;;;;;:33;;;10400:30;;;;;;;10334:4;;10351:27;;10362:10;;-1:-1:-1;;;;;;;;;;;10400:30:0;;;;;;;-1:-1:-1;10448:4:0;10267:193;;;;;:::o;1731:50::-;1772:9;1731:50;:::o;32191:742::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;32435:18:::2;:16;:18::i;:::-;1544:12:::0;32472:27;::::2;::::0;::::2;::::0;:58:::2;;-1:-1:-1::0;1604:9:0;32503:27;::::2;;32472:58;32464:81;;;::::0;;-1:-1:-1;;;32464:81:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32464:81:0;;;;;;;;;;;;;::::2;;1544:12:::0;32564:27;::::2;::::0;::::2;::::0;:58:::2;;-1:-1:-1::0;1604:9:0;32595:27;::::2;;32564:58;32556:81;;;::::0;;-1:-1:-1;;;32556:81:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32556:81:0;;;;;;;;;;;;;::::2;;1544:12:::0;32656:27;::::2;::::0;::::2;::::0;:58:::2;;-1:-1:-1::0;1604:9:0;32687:27;::::2;;32656:58;32648:81;;;::::0;;-1:-1:-1;;;32648:81:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32648:81:0;;;;;;;;;;;;;::::2;;32740:17;:36:::0;;;;32787:17:::2;:36:::0;;;;32834:17:::2;:36:::0;32881:21:::2;:44:::0;;-1:-1:-1;;;;;;32881:44:0::2;-1:-1:-1::0;;;;;32881:44:0;;::::2;::::0;;;::::2;::::0;;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;32191:742::o;37912:433::-;28538:6;;38037:14;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;38069:20:::1;38081:7;38069:11;:20::i;:::-;38100:21;38112:8;38100:11;:21::i;:::-;-1:-1:-1::0;;;;;38158:17:0;;::::1;38132:23;38158:17:::0;;;:8:::1;:17;::::0;;;;;38213:18;;::::1;::::0;;;;38263:16:::1;::::0;;::::1;::::0;38281:15:::1;::::0;;::::1;::::0;38298:17;;::::1;::::0;38317:16;;::::1;::::0;38213:18;;38249:88:::1;::::0;38263:16;;38281:15;38317:16;38249:13:::1;:88::i;:::-;38242:95:::0;37912:433;-1:-1:-1;;;;;37912:433:0:o;37450:454::-;28538:6;;37568:14;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37608:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;:51:::0;::::1;;;-1:-1:-1::0;;;;;;37635:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;37608:51;37600:73;;;::::0;;-1:-1:-1;;;37600:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37600:73:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37710:17:0;;::::1;37684:23;37710:17:::0;;;:8:::1;:17;::::0;;;;;37765:18;;::::1;::::0;;;;37815:16:::1;::::0;;::::1;::::0;37833:15:::1;::::0;;::::1;::::0;37850:17;;::::1;::::0;37869:16;;::::1;::::0;37887:8:::1;::::0;37801:95:::1;::::0;37833:15;37850:17;37869:16;37801:13:::1;:95::i;10162:97::-:0;10239:12;;10162:97;:::o;2030:54::-;2078:6;1388;2071:13;;2030:54;:::o;1622:45::-;1388:6;1622:45;:::o;54205:623::-;54448:13;;54371:26;;;;-1:-1:-1;;;;;54448:13:0;54440:36;;;;:76;;-1:-1:-1;54480:13:0;;:36;;;-1:-1:-1;;;54480:36:0;;-1:-1:-1;;;;;54480:36:0;;;;;;;;;:13;;;;;:26;;:36;;;;;;;;;;;;;;:13;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54480:36:0;54440:76;54436:134;;;-1:-1:-1;54541:13:0;;-1:-1:-1;54556:1:0;54533:25;;54436:134;54580:15;54598:24;1388:6;54609:12;54598:4;:24::i;:::-;54580:42;;54657:31;54662:13;54677:10;54657:4;:31::i;:::-;54633:55;;54699:19;54721:42;54726:13;54741:21;54721:4;:42::i;:::-;54699:64;-1:-1:-1;;;54205:623:0;;;;;;;:::o;11283:500::-;11368:4;11393:10;-1:-1:-1;;;;;11393:17:0;;;;:55;;-1:-1:-1;;;;;;11421:15:0;;;;;;:10;:15;;;;;;;;11437:10;11421:27;;;;;;;;11414:34;;;11393:55;11385:89;;;;;-1:-1:-1;;;11385:89:0;;;;;;;;;;;;-1:-1:-1;;;11385:89:0;;;;;;;;;;;;;;;11485:20;11491:3;11496;11501;11485:5;:20::i;:::-;11520:10;-1:-1:-1;;;;;11520:17:0;;;;;;:63;;-1:-1:-1;;;;;;11541:15:0;;;;;;:10;:15;;;;;;;;11557:10;11541:27;;;;;;;;-1:-1:-1;;11541:42:0;;11520:63;11516:238;;;-1:-1:-1;;;;;11635:15:0;;;;;;:10;:15;;;;;;;;11651:10;11635:27;;;;;;;;11630:38;;11664:3;11630:4;:38::i;:::-;-1:-1:-1;;;;;11600:15:0;;;;;;;:10;:15;;;;;;;;11616:10;11600:27;;;;;;;;;;:68;;;11688:54;;;;;;;;;;11616:10;;-1:-1:-1;;;;;;;;;;;11688:54:0;;;;;;;;;11516:238;-1:-1:-1;11771:4:0;11283:500;;;;;:::o;29818:123::-;-1:-1:-1;;;;;29916:11:0;29887:4;29916:11;;;:8;:11;;;;;:17;;;;29818:123::o;31651:137::-;28538:6;;31737:7;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;31769:11:0::1;::::0;;;::::1;-1:-1:-1::0;;;;;31769:11:0::1;::::0;31651:137::o;9816:82::-;9881:9;;;;9816:82;:::o;31954:229::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;32054:18:::2;:16;:18::i;:::-;1544:12:::0;32091:18;::::2;::::0;::::2;::::0;:40:::2;;-1:-1:-1::0;1604:9:0;32113:18;::::2;;32091:40;32083:63;;;::::0;;-1:-1:-1;;;32083:63:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;32083:63:0;;;;;;;;;;;;;::::2;;32157:8;:18:::0;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;31954:229::o;35063:1275::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;35187:18:::2;:16;:18::i;:::-;35216;35228:5;35216:11;:18::i;:::-;35245:17;:15;:17::i;:::-;1388:6;35283;:20;;:44;;;;-1:-1:-1::0;1715:9:0;35307:20;::::2;;35283:44;35275:70;;;::::0;;-1:-1:-1;;;35275:70:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35275:70:0;;;;;;;;;;;;;::::2;;1829:13:::0;35364:22;::::2;;35356:46;;;::::0;;-1:-1:-1;;;35356:46:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35356:46:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;35478:15:0;::::2;35461:14;35478:15:::0;;;:8:::2;:15;::::0;;;;:22:::2;;::::0;35515:18;;::::2;35511:300;;;35565:43;35570:12;;35584:23;35589:6;35597:9;35584:4;:23::i;:::-;35565:4;:43::i;:::-;35550:12;:58:::0;;;1772:9;-1:-1:-1;35631:32:0::2;35623:61;;;::::0;;-1:-1:-1;;;35623:61:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;35623:61:0;;;;;;;;;;;;;::::2;;35511:300;;;35715:9;35706:6;:18;35702:109;;;35756:43;35761:12;;35775:23;35780:9;35791:6;35775:4;:23::i;:::-;35756:4;:43::i;:::-;35741:12;:58:::0;35702:109:::2;-1:-1:-1::0;;;;;35829:15:0;::::2;;::::0;;;:8:::2;:15;::::0;;;;:22:::2;::::0;::::2;:31:::0;;;35954:23:::2;;::::0;;35988:33;;;;36036:20;;::::2;36032:299;;;36073:61;36089:5;36096:10;36108:25;36113:7;36122:10;36108:4;:25::i;:::-;36073:15;:61::i;:::-;36032:299;;;36166:10;36156:7;:20;36152:179;;;36193:26;36222:25;36227:10;36239:7;36222:4;:25::i;:::-;36193:54;;36262:57;36278:5;36285:10;36297:21;36262:15;:57::i;:::-;36152:179;;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;;35063:1275:0:o;33881:503::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;34042::::2;::::0;:57:::2;::::0;;-1:-1:-1;;;34042:57:0;;-1:-1:-1;;;;;34042:57:0;;::::2;;::::0;::::2;::::0;-1:-1:-1;;;;;;34042:57:0;::::2;::::0;;;;;;:13;;;::::2;::::0;:38:::2;::::0;:57;;;;;::::2;::::0;;;;;;;;:13;:57;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34042:57:0;34034:85:::2;;;::::0;;-1:-1:-1;;;34034:85:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34034:85:0;;;;;;;;;;;;;::::2;;34130:18;:16;:18::i;:::-;34162:12;34176:17;34197:6;-1:-1:-1::0;;;;;34197:11:0::2;34217:5;34242:9;34253:4;;34225:33;;;;;;-1:-1:-1::0;;;;;34225:33:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34197:62;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;34197:62:0;;;;::::2;::::0;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34161:98;;;;34278:7;34270:31;;;::::0;;-1:-1:-1;;;34270:31:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;34270:31:0;;;;;;;;;;;;;::::2;;34350:9;-1:-1:-1::0;;;;;34317:59:0::2;;34341:7;34317:59;;34333:6;-1:-1:-1::0;;;;;34317:59:0::2;;34361:8;;34371:4;34317:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;;::::2;-1:-1:-1::0;;34317:59:0::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;-1:-1:-1;34317:59:0;;;;;;;::::2;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;;;;33881:503:0:o;49353:1454::-;49507:19;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;49552:10:::2;::::0;-1:-1:-1;;;49552:10:0;::::2;28430:13:::1;49552:10:::2;49544:36;;;::::0;;-1:-1:-1;;;49544:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49544:36:0;;;;;;;;;;;;;::::2;;49591:21;49603:8;49591:11;:21::i;:::-;-1:-1:-1::0;;;;;49652:18:0;::::2;49625:24;49652:18:::0;;;:8:::2;:18;::::0;;;;49755:17:::2;::::0;::::2;::::0;49803:16:::2;::::0;;::::2;::::0;49850:12;;49893::::2;::::0;49979:8:::2;::::0;49700:314:::2;::::0;49755:17;49803:16;49850:12;49893;49936;;49700:24:::2;:314::i;:::-;49683:331;;50053:12;50035:14;:30;;50027:52;;;::::0;;-1:-1:-1;;;50027:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;50027:52:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;50131:18:0;::::2;;::::0;;;:8:::2;:18;::::0;;;;:26:::2;::::0;;::::2;::::0;50126:47:::2;::::0;1388:6:::2;2191:8;::::0;50126:47:::2;50108:14;:65;;50100:87;;;::::0;;-1:-1:-1;;;50100:87:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;50100:87:0;;;;;;;;;;;;;::::2;;50220:39;50225:9;:17;;;50244:14;50220:4;:39::i;:::-;50200:9;:17;;:59;;;;50273:27;50302:22:::0;50328:123:::2;50369:14;50398:17;;50430:10;50328:26;:123::i;:::-;50272:179;;;;50490:8;-1:-1:-1::0;;;;;50469:54:0::2;50478:10;-1:-1:-1::0;;;;;50469:54:0::2;-1:-1:-1::0;;;;;;;;;;;50500:22:0::2;50469:54;;;;;;;;;;;;;;;;;;50536:40;50551:10;50563:12;50536:14;:40::i;:::-;50587:28;50602:12;50587:14;:28::i;33309:189::-:0;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;33412:17:::2;:15;:17::i;:::-;33440:18;:16;:18::i;:::-;33469:11;:21:::0;;-1:-1:-1;;33469:21:0;::::2;;-1:-1:-1::0;;;33469:21:0::2;-1:-1:-1::0;;;;33469:21:0;;::::2;;28466:14:::0;;;::::1;::::0;;33309:189::o;33506:367::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;33592:18:::2;:16;:18::i;:::-;33621:17;:15;:17::i;:::-;33657:7;:14:::0;1444:1:::2;-1:-1:-1::0;33657:34:0::2;33649:57;;;::::0;;-1:-1:-1;;;33649:57:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;33649:57:0;;;;;;;;;;;;;::::2;;33719:10;:17:::0;;-1:-1:-1;;;;33719:17:0::2;-1:-1:-1::0;;;33719:17:0::2;::::0;;33747:11:::2;:18:::0;;-1:-1:-1;;;;33747:18:0::2;-1:-1:-1::0;;;33747:18:0::2;::::0;;33778:32:::2;1892:10:::0;33778:14:::2;:32::i;:::-;33821:44;33836:10;1892::::0;33821:14:::2;:44::i;:::-;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;33506:367::o;38353:1197::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;38495:10:::2;::::0;-1:-1:-1;;;38495:10:0;::::2;28430:13:::1;38495:10:::2;38487:36;;;::::0;;-1:-1:-1;;;38487:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38487:36:0;;;;;;;;;;;;;::::2;;38536:14;38553:13;:11;:13::i;:::-;38536:30;;38577:10;38590:30;38595:13;38610:9;38590:4;:30::i;:::-;38577:43:::0;-1:-1:-1;38639:10:0;38631:34:::2;;;::::0;;-1:-1:-1;;;38631:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38631:34:0;;;;;;;;;;;;;::::2;;38683:6;38678:508;38699:7;:14:::0;38695:18;::::2;38678:508;;;38735:9;38747:7;38755:1;38747:10;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;38747:10:0::2;38783:11:::0;;;:8:::2;:11:::0;;;;;;:19:::2;;::::0;38747:10;;-1:-1:-1;38783:19:0;38838:16:::2;38843:5:::0;38783:19;38838:4:::2;:16::i;:::-;38817:37:::0;-1:-1:-1;38877:18:0;38869:42:::2;;;::::0;;-1:-1:-1;;;38869:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38869:42:0;;;;;;;;;;;;;::::2;;38951:12;;38964:1;38951:15;;;;;;;;;;;;;38934:13;:32;;38926:53;;;::::0;;-1:-1:-1;;;38926:53:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38926:53:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;39021:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;:19:::2;;::::0;39016:40:::2;::::0;39042:13;39016:4:::2;:40::i;:::-;-1:-1:-1::0;;;;;38994:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;;;;;:19:::2;;:62:::0;;;;39076:38;;;;;;;38994:11;;39085:10:::2;::::0;-1:-1:-1;;;;;;;;;;;39076:38:0;;;;;;;;::::2;39129:45;39145:1;39148:10;39160:13;39129:15;:45::i;:::-;-1:-1:-1::0;;;38715:3:0::2;;38678:508;;;;39199:26;39227:21:::0;39252:122:::2;39293:13;39321:17;;39353:10;39252:26;:122::i;:::-;39198:176;;;;39387:29;39402:13;39387:14;:29::i;:::-;39427:49;39442:10;39454:21;39427:14;:49::i;:::-;39502:21;::::0;39487:55:::2;::::0;-1:-1:-1;;;;;39502:21:0::2;39525:16:::0;39487:14:::2;:55::i;:::-;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;;;;38353:1197:0:o;20571:1193::-;20815:18;20851:21;20875:32;20880:13;20895:11;20875:4;:32::i;:::-;20851:56;;20918:18;20939:31;20944:10;20956:13;20939:4;:31::i;:::-;20918:52;;20981:14;20998:31;21003:13;21018:10;20998:4;:31::i;:::-;20981:48;;21107:8;21118:28;1388:6;21129:16;21118:4;:28::i;:::-;21107:39;;21158:17;21178:20;21183:9;21194:3;21178:4;:20::i;:::-;21158:40;;21209:22;21234:34;21239:12;21253:14;21234:4;:34::i;:::-;21209:59;;21279:26;21308:39;21313:17;21332:14;21308:4;:39::i;:::-;21279:68;;21600:8;21611:43;21616:28;1388:6;21627:16;21616:4;:28::i;:::-;21646:7;21611:4;:43::i;:::-;21600:54;;21681:44;21686:21;21709:15;1388:6;21720:3;21709:4;:15::i;:::-;21681:4;:44::i;:::-;21665:60;20571:1193;-1:-1:-1;;;;;;;;;;;;;;;20571:1193:0:o;46413:1463::-;46573:18;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;46627:10:::2;::::0;-1:-1:-1;;;46627:10:0;::::2;28430:13:::1;46627:10:::2;46619:36;;;::::0;;-1:-1:-1;;;46619:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46619:36:0;;;;;;;;;;;;;::::2;;46666:20;46678:7;46666:11;:20::i;:::-;-1:-1:-1::0;;;;;46727:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:25:::2;;::::0;46722:45:::2;::::0;2141:1:::2;1388:6;2134:8;;46722:4;:45::i;:::-;46705:13;:62;;46697:87;;;::::0;;-1:-1:-1;;;46697:87:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46697:87:0;;;;;;;;;;;;;::::2;;46798:26;46826:21:::0;46851:122:::2;46892:13;46920:17;;46952:10;46851:26;:122::i;:::-;46797:176;;;;46986:23;47012:8;:17;47021:7;-1:-1:-1::0;;;;;47012:17:0::2;-1:-1:-1::0;;;;;47012:17:0::2;;;;;;;;;;;;46986:43;;47058:321;47113:8;:16;;;47160:8;:15;;;47206:12;;47249;;47292:21;47344:8;;47058:24;:321::i;:::-;47042:337;;47417:16;47400:13;:33;;47392:55;;;::::0;;-1:-1:-1;;;47392:55:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47392:55:0;;;;;;;;;;;;;::::2;;47479:45;47484:8;:16;;;47502:21;47479:4;:45::i;:::-;47460:16;::::0;::::2;:64:::0;47542:52:::2;::::0;;;;;;;-1:-1:-1;;;;;47542:52:0;::::2;::::0;47551:10:::2;::::0;-1:-1:-1;;;;;;;;;;;47542:52:0;;;;::::2;::::0;;::::2;47607:29;47622:13;47607:14;:29::i;:::-;47647:41;47662:10;47674:13;47647:14;:41::i;:::-;47699:66;47727:7;47736:10;47748:16;47699:27;:66::i;:::-;47776:59;47792:7;47801:10;47813:21;47776:15;:59::i;10728:397::-:0;10839:10;10795:4;10828:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10828:27:0;;;;;;;;;;10870:14;;;10866:160;;;10912:10;10931:1;10901:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10901:27:0;;;;;;;;;:31;10866:160;;;10995:19;11000:8;11010:3;10995:4;:19::i;:::-;10976:10;10965:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10965:27:0;;;;;;;;;:49;10866:160;11050:10;11067:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11041:54:0;;11067:27;;;;;;;;;;;11041:54;;;;;;;;;11050:10;-1:-1:-1;;;;;;;;;;;11041:54:0;;;;;;;;;;-1:-1:-1;11113:4:0;;10728:397;-1:-1:-1;;;10728:397:0:o;47884:1461::-;48038:18;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;48082:10:::2;::::0;-1:-1:-1;;;48082:10:0;::::2;28430:13:::1;48082:10:::2;48074:36;;;::::0;;-1:-1:-1;;;48074:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48074:36:0;;;;;;;;;;;;;::::2;;48121:20;48133:7;48121:11;:20::i;:::-;-1:-1:-1::0;;;;;48180:17:0;::::2;48154:23;48180:17:::0;;;:8:::2;:17;::::0;;;;48333::::2;::::0;48180;;48154:23;;;48264:122:::2;::::0;48305:13;;48365:10:::2;48264:26;:122::i;:::-;48210:176;;;;48415:313;48470:8;:16;;;48517:8;:15;;;48563:12;;48606;;48649:13;48693:8;;48415:24;:313::i;:::-;48399:329:::0;-1:-1:-1;48749:18:0;48741:42:::2;;;::::0;;-1:-1:-1;;;48741:42:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48741:42:0;;;;;;;;;;;;;::::2;;48819:11;48802:13;:28;;48794:49;;;::::0;;-1:-1:-1;;;48794:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48794:49:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;48886:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;:25:::2;;::::0;48881:45:::2;::::0;2141:1:::2;1388:6;2134:8;::::0;48881:45:::2;48864:13;:62;;48856:87;;;::::0;;-1:-1:-1;;;48856:87:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;48856:87:0;;;;;;;;;;;;;::::2;;48975:37;48980:8;:16;;;48998:13;48975:4;:37::i;:::-;48956:16;::::0;::::2;:56:::0;49030:44:::2;::::0;;;;;;;-1:-1:-1;;;;;49030:44:0;::::2;::::0;49039:10:::2;::::0;-1:-1:-1;;;;;;;;;;;49030:44:0;;;;::::2;::::0;;::::2;49087:29;49102:13;49087:14;:29::i;:::-;49127:49;49142:10;49154:21;49127:14;:49::i;:::-;49202:21;::::0;49187:55:::2;::::0;-1:-1:-1;;;;;49202:21:0::2;49225:16:::0;49187:14:::2;:55::i;:::-;49253:51;49269:7;49278:10;49290:13;49253:15;:51::i;10043:111::-:0;-1:-1:-1;;;;;10132:14:0;10108:4;10132:14;;;;;;;;;;;;10043:111::o;1503:53::-;1551:5;1388:6;1544:12;;43709:2694;28296:39;;;;;;;28326:8;28296:39;;;;;;43947:18;;;;28314:10;;-1:-1:-1;;;;;;28305:7:0;;;;43947:18;;28296:39;;;;;43947:18;28326:8;;43947:18;28296:39;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;44004:20:::2;44016:7:::0;44004:11:::2;:20::i;:::-;44035:21;44047:8;44035:11;:21::i;:::-;44075:11;::::0;-1:-1:-1;;;44075:11:0;::::2;;;44067:34;;;::::0;;-1:-1:-1;;;44067:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44067:34:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;44140:26:0;;::::2;44114:23;44140:26:::0;;;:8:::2;:26;::::0;;;;;44204:27;;::::2;::::0;;;;44275:17:::2;::::0;;::::2;::::0;44270:38:::2;::::0;1388:6:::2;2191:8;::::0;44270:38:::2;44252:14;:56;;44244:78;;;::::0;;-1:-1:-1;;;44244:78:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44244:78:0;;;;;;;;;;;;;::::2;;44335:20;44358:315;44410:8;:16;;;44465:8;:15;;;44519:9;:17;;;44575:9;:16;;;44630:8;;44358:13;:315::i;:::-;44335:338;;44711:8;44692:15;:27;;44684:51;;;::::0;;-1:-1:-1;;;44684:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;44684:51:0;;;;;;;;;;;;;::::2;;44749:27;44778:22:::0;44804:123:::2;44845:14;44874:17;;44906:10;44804:26;:123::i;:::-;44748:179;;;;44956:313;45001:8;:16;;;45048:8;:15;;;45094:9;:17;;;45142:9;:16;;;45189:14;45234:8;;44956:14;:313::i;:::-;44940:329;;45305:11;45288:13;:28;;45280:49;;;::::0;;-1:-1:-1;;;45280:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45280:49:0;;;;;;;;;;;;;::::2;;45361:37;45366:8;:16;;;45384:13;45361:4;:37::i;:::-;45342:8;:16;;:56;;;;45429:39;45434:9;:17;;;45453:14;45429:4;:39::i;:::-;45409:17;::::0;;::::2;:59:::0;;;45546:16;::::2;::::0;45597:15:::2;::::0;;::::2;::::0;45699:16;;::::2;::::0;45750:8:::2;::::0;45498:291:::2;::::0;45409:59;45699:16;45498:13:::2;:291::i;:::-;45481:308;;45840:15;45822:14;:33;;:112;;;;;45891:43;45896:13;45911:22;45891:4;:43::i;:::-;45872:15;:62;;45822:112;45800:173;;;::::0;;-1:-1:-1;;;45800:173:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45800:173:0;;;;;;;;;;;;;::::2;;46010:8;45992:14;:26;;45984:50;;;::::0;;-1:-1:-1;;;45984:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;45984:50:0;;;;;;;;;;;;;::::2;;46082:8;-1:-1:-1::0;;;;;46052:78:0::2;46073:7;-1:-1:-1::0;;;;;46052:78:0::2;46061:10;-1:-1:-1::0;;;;;46052:78:0::2;-1:-1:-1::0;;;;;;;;;;;46092:13:0::2;46107:22;46052:78;;;;;;;;;;;;;;;;;;;;;;;;46143:51;46159:7;46168:10;46180:13;46143:15;:51::i;:::-;46205:61;46221:8;46231:10;46243:22;46205:15;:61::i;:::-;46303:21;::::0;46277:67:::2;::::0;46293:8;;-1:-1:-1;;;;;46303:21:0::2;46326:17:::0;46277:15:::2;:67::i;:::-;46357:38;;;;;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;43709:2694;;;;-1:-1:-1;43709:2694:0;-1:-1:-1;;;;43709:2694:0:o;40776:2925::-;28296:39;;;;;;;28326:8;28296:39;;;;;;41012:19;;;;28314:10;;-1:-1:-1;;;;;;28305:7:0;;;;41012:19;;28296:39;;;;;41012:19;28326:8;;41012:19;28296:39;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;41070:20:::2;41082:7:::0;41070:11:::2;:20::i;:::-;41101:21;41113:8;41101:11;:21::i;:::-;41141:11;::::0;-1:-1:-1;;;41141:11:0;::::2;;;41133:34;;;::::0;;-1:-1:-1;;;41133:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41133:34:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;41206:26:0;;::::2;41180:23;41206:26:::0;;;:8:::2;:26;::::0;;;;;41270:27;;::::2;::::0;;;;41385:16:::2;::::0;;::::2;::::0;41440:15:::2;::::0;;::::2;::::0;41494:17;;::::2;::::0;41550:16;;::::2;::::0;41605:8:::2;::::0;41270:27;;41180:23;41333:315:::2;::::0;41440:15;41494:17;41550:16;41333:13:::2;:315::i;:::-;41310:338;;41686:8;41667:15;:27;;41659:51;;;::::0;;-1:-1:-1;;;41659:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;41659:51:0;;;;;;;;;;;;;::::2;;41724:26;41752:21:::0;41777:330:::2;41870:13;41950:17;;42034:10;41777:26;:330::i;:::-;41723:384;;;;42153:36;42158:8;:16;;;2141:1;1388:6;2134:8;;;;42153:36;42128:21;:61;;42120:86;;;::::0;;-1:-1:-1;;;42120:86:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;42120:86:0;;;;;;;;;;;;;::::2;;42236:320;42281:8;:16;;;42328:8;:15;;;42374:9;:17;;;42422:9;:16;;;42469:21;42521:8;;42236:14;:320::i;:::-;42219:337;;42593:12;42575:14;:30;;42567:52;;;::::0;;-1:-1:-1;;;42567:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;42567:52:0;;;;;;;;;;;;;::::2;;42651:45;42656:8;:16;;;42674:21;42651:4;:45::i;:::-;42632:8;:16;;:64;;;;42727:39;42732:9;:17;;;42751:14;42727:4;:39::i;:::-;42707:17;::::0;;::::2;:59:::0;;;42844:16;::::2;::::0;42895:15:::2;::::0;;::::2;::::0;42997:16;;::::2;::::0;43048:8:::2;::::0;42796:291:::2;::::0;42707:59;42997:16;42796:13:::2;:291::i;:::-;42779:308;;43138:15;43120:14;:33;;:112;;;;;43189:43;43194:21;43217:14;43189:4;:43::i;:::-;43170:15;:62;;43120:112;43098:173;;;::::0;;-1:-1:-1;;;43098:173:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43098:173:0;;;;;;;;;;;;;::::2;;43308:8;43290:14;:26;;43282:50;;;::::0;;-1:-1:-1;;;43282:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;43282:50:0;;;;;;;;;;;;;::::2;;43380:8;-1:-1:-1::0;;;;;43350:78:0::2;43371:7;-1:-1:-1::0;;;;;43350:78:0::2;43359:10;-1:-1:-1::0;;;;;43350:78:0::2;-1:-1:-1::0;;;;;;;;;;;43390:21:0::2;43413:14;43350:78;;;;;;;;;;;;;;;;;;;;;;;;43441:66;43469:7;43478:10;43490:16;43441:27;:66::i;:::-;43518:59;43534:7;43543:10;43555:21;43518:15;:59::i;:::-;43588:53;43604:8;43614:10;43626:14;43588:15;:53::i;24972:1096::-:0;25219:17;25310:21;25334:33;25339:14;25355:11;25334:4;:33::i;:::-;25310:57;;25450:8;25461:28;1388:6;25472:16;25461:4;:28::i;:::-;25450:39;;25500:8;25511:18;25516:3;25521:7;25511:4;:18::i;:::-;25500:29;;25541:32;25576:37;25581:14;25597:15;1388:6;25608:3;25597:4;:15::i;25576:37::-;25541:72;;25626:23;25652:50;25657:15;25674:27;25652:4;:50::i;:::-;25626:76;;25713:18;25734:41;25739:18;25759:15;25734:4;:41::i;:::-;25713:62;;25855:14;25872:37;25877:13;25892:16;25872:4;:37::i;:::-;25855:54;;25920:18;25941:27;25946:9;25957:10;25941:4;:27::i;:::-;25920:48;;25979:17;25999:31;26004:10;26016:13;25999:4;:31::i;:::-;25979:51;-1:-1:-1;;;;;;;;;;24972:1096:0;;;;;;;;:::o;18386:1167::-;18630:18;18914:21;18938:32;18943:13;18958:11;18938:4;:32::i;:::-;18914:56;;18981:8;18992:43;18997:28;1388:6;19008:16;18997:4;:28::i;:::-;19027:7;18992:4;:43::i;:::-;18981:54;;19047:26;19076:36;19081:13;19096:15;1388:6;19107:3;19096:4;:15::i;:::-;19076:4;:36::i;:::-;19047:65;;19125:22;19150:43;19155:14;19171:21;19150:4;:43::i;:::-;19125:68;;19204:17;19224:39;19229:17;19248:14;19224:4;:39::i;:::-;19204:59;;19344:14;19361:36;19366:12;19380:16;19361:4;:36::i;:::-;19344:53;;19408:18;19429:27;19434:9;19445:10;19429:4;:27::i;:::-;19408:48;;19483:31;19488:13;19503:10;19483:4;:31::i;:::-;19467:47;18386:1167;-1:-1:-1;;;;;;;;;;;;;;18386:1167:0:o;1788:54::-;1836:6;1388;1829:13;;22883:1071;23128:19;23165:21;23189:33;23194:14;23210:11;23189:4;:33::i;:::-;23165:57;;23233:18;23254:30;23259:10;23271:12;23254:4;:30::i;:::-;23233:51;;23295:14;23312:31;23317:13;23332:10;23312:4;:31::i;:::-;23295:48;;23416:18;23437:45;23442:9;23453:28;1388:6;23464:16;23453:4;:28::i;:::-;23437:4;:45::i;:::-;23416:66;;23493:23;23519:36;23524:13;23539:15;23519:4;:36::i;:::-;23493:62;;23568:32;23603:41;23608:15;23625:18;23603:4;:41::i;:::-;23568:76;;23781:8;23792:43;23797:28;1388:6;23808:16;23797:4;:28::i;:::-;23827:7;23792:4;:43::i;:::-;23781:54;;23864:50;23869:27;23898:15;1388:6;23909:3;23898:4;:15::i;37246:196::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;37341:18:::2;37353:5:::0;37341:11:::2;:18::i;:::-;37396:38;::::0;;-1:-1:-1;;;37396:38:0;;37428:4:::2;37396:38;::::0;::::2;::::0;;;-1:-1:-1;;;;;37396:23:0;::::2;::::0;::::2;::::0;:38;;;;;::::2;::::0;;;;;;;;:23;:38;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37396:38:0;-1:-1:-1;;;;;37370:15:0;;::::2;;::::0;;;:8:::2;37396:38;37370:15:::0;;;;:23:::2;;:64:::0;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;37246:196::o;29699:111::-;29792:10;;-1:-1:-1;;;29792:10:0;;;;;29699:111::o;31345:298::-;31433:21;31456;31479;31502:28;28538:6;;;;;;;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;;31556:17:0::1;::::0;31575::::1;::::0;31594::::1;::::0;31613:21:::1;::::0;31556:17;;31575;;-1:-1:-1;31594:17:0;-1:-1:-1;;;;;;31613:21:0;;::::1;::::0;31345:298::o;33137:164::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;33243:18:::2;:16;:18::i;:::-;33272:11;:21:::0;;-1:-1:-1;;;;;;;33272:21:0;;::::2;::::0;::::2;-1:-1:-1::0;;;;;;33272:21:0;;::::2;;28466:14:::0;;;::::1;::::0;;33137:164::o;30635:148::-;28538:6;;30734:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;30763:12:0::1;::::0;30635:148;:::o;1851:51::-;1892:10;1851:51;:::o;30430:197::-;28538:6;;30537:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;30561:18:::1;30573:5;30561:11;:18::i;:::-;-1:-1:-1::0;;;;;;30597:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;;30430:197::o;9721:87::-;9793:7;9786:14;;;;;;;;-1:-1:-1;;9786:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9760:13;;9786:14;;9793:7;;9786:14;;9793:7;9786:14;;;;;;;;;;;;;;;;;;;;;;;;2149:59;2190:18;2149:59;:::o;13468:509::-;13680:14;13712:10;13725:35;13730:14;13746:13;13725:4;:35::i;:::-;13712:48;;13771:10;13784:37;13789:15;13806:14;13784:4;:37::i;:::-;13771:50;;13832:10;13845:18;13850:5;13857;13845:4;:18::i;:::-;13832:31;;13874:10;13887:31;1388:6;13898:19;1388:6;13909:7;13898:4;:19::i;13887:31::-;13874:44;;13950:18;13955:5;13962;13950:4;:18::i;:::-;13938:30;13468:509;-1:-1:-1;;;;;;;;;;13468:509:0:o;11133:142::-;11201:4;11218:27;11224:10;11236:3;11241;11218:5;:27::i;:::-;-1:-1:-1;11263:4:0;11133:142;;;;:::o;39558:1208::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;39700:10:::2;::::0;-1:-1:-1;;;39700:10:0;::::2;28430:13:::1;39700:10:::2;39692:36;;;::::0;;-1:-1:-1;;;39692:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;39692:36:0;;;;;;;;;;;;;::::2;;39742:25;39769:20:::0;39793:121:::2;39834:12;39861:17;;39893:10;39793:26;:121::i;:::-;39741:173;;;;39927:14;39944:13;:11;:13::i;:::-;39927:30;;39968:10;39981:37;39986:20;40008:9;39981:4;:37::i;:::-;39968:50:::0;-1:-1:-1;40037:10:0;40029:34:::2;;;::::0;;-1:-1:-1;;;40029:34:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40029:34:0;;;;;;;;;;;;;::::2;;40076:40;40091:10;40103:12;40076:14;:40::i;:::-;40142:21;::::0;40127:54:::2;::::0;-1:-1:-1;;;;;40142:21:0::2;40165:15:::0;40127:14:::2;:54::i;:::-;40192:36;40207:20;40192:14;:36::i;:::-;40246:6;40241:516;40262:7;:14:::0;40258:18;::::2;40241:516;;;40298:9;40310:7;40318:1;40310:10;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;40310:10:0::2;40346:11:::0;;;:8:::2;:11:::0;;;;;;:19:::2;;::::0;40310:10;;-1:-1:-1;40346:19:0;40402:16:::2;40407:5:::0;40346:19;40402:4:::2;:16::i;:::-;40380:38:::0;-1:-1:-1;40441:19:0;40433:43:::2;;;::::0;;-1:-1:-1;;;40433:43:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40433:43:0;;;;;;;;;;;;;::::2;;40517:13;;40531:1;40517:16;;;;;;;;;;;;;40499:14;:34;;40491:56;;;::::0;;-1:-1:-1;;;40491:56:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40491:56:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;40589:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;:19:::2;;::::0;40584:41:::2;::::0;40610:14;40584:4:::2;:41::i;:::-;-1:-1:-1::0;;;;;40562:11:0;::::2;;::::0;;;:8:::2;:11;::::0;;;;;;;;:19:::2;;:63:::0;;;;40645:39;;;;;;;40562:11;;40654:10:::2;::::0;-1:-1:-1;;;;;;;;;;;40645:39:0;;;;;;;;::::2;40699:46;40715:1;40718:10;40730:14;40699:15;:46::i;:::-;-1:-1:-1::0;;;40278:3:0::2;;40241:516;;;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;;;;;39558:1208:0:o;1452:42::-;1493:1;1452:42;:::o;1403:::-;1444:1;1403:42;:::o;1911:46::-;1952:5;1911:46;:::o;14995:683::-;15237:19;15274:16;15293:35;15298:13;15313:14;15293:4;:35::i;:::-;15274:54;;15339:15;15357:19;1388:6;15368:7;15357:4;:19::i;:::-;15339:37;;15400:31;15405:13;15420:10;15400:4;:31::i;:::-;15387:44;;15442:6;15451:54;15456:14;15472:32;15477:14;15493:10;15472:4;:32::i;15451:54::-;15442:63;;15516:8;15527:20;15532:1;15535:11;15527:4;:20::i;:::-;15516:31;;15558:8;15569:15;1388:6;15580:3;15569:4;:15::i;:::-;15558:26;;15612;15617:15;15634:3;15612:4;:26::i;:::-;15595:43;14995:683;-1:-1:-1;;;;;;;;;;;;14995:683:0:o;1563:50::-;1611:2;1388:6;1604:9;;1964:59;2005:18;1964:59;:::o;30225:197::-;28538:6;;30312:23;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;30361:10:::1;::::0;-1:-1:-1;;;30361:10:0;::::1;;;30353:36;;;::::0;;-1:-1:-1;;;30353:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30353:36:0;;;;;;;;;;;;;::::1;;30407:7;30400:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;30400:14:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;30225:197:::0;:::o;31796:150::-;28538:6;;31884:7;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;31924:13:0::1;::::0;-1:-1:-1;;;;;31924:13:0::1;31796:150:::0;:::o;32941:188::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;33064:18:::2;:16;:18::i;:::-;33093:13;:28:::0;;-1:-1:-1;;;;;;33093:28:0::2;-1:-1:-1::0;;;;;33093:28:0;;;::::2;::::0;;;::::2;::::0;;28466:6:::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;32941:188::o;30074:143::-;28538:6;;30154:23;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;29949:117;30044:7;:14;29949:117;:::o;36346:815::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;28401:6:::1;::::0;::::1;::::0;::::1;;;28400:7;28392:27;;;::::0;;-1:-1:-1;;;28392:27:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28392:27:0;;;;;;;;;;;;;::::1;;28430:6;:13:::0;;-1:-1:-1;;28430:13:0::1;;;::::0;;36445:18:::2;:16;:18::i;:::-;36474;36486:5;36474:11;:18::i;:::-;36503:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;36553:15:0;::::2;36533:17;36553:15:::0;;;:8:::2;:15;::::0;;;;:23:::2;::::0;::::2;::::0;36609:12:::2;::::0;36623:22:::2;::::0;;::::2;::::0;36553:23;;36604:42:::2;::::0;:4:::2;:42::i;:::-;36589:12;:57:::0;-1:-1:-1;;;;;36769:15:0;::::2;36756:10;36769:15:::0;;;:8:::2;:15;::::0;;;;:21:::2;;::::0;36813:7:::2;:14:::0;;-1:-1:-1;;36813:18:0;;;:7;:18;;36859:13;::::2;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;36842:7:::2;:14:::0;;-1:-1:-1;;;;;36859:13:0;;::::2;::::0;36850:5;;36842:14;::::2;;;;;;;;;;;;;:30;;;;;-1:-1:-1::0;;;;;36842:30:0::2;;;;;-1:-1:-1::0;;;;;36842:30:0::2;;;;;;36916:5;36883:8;:24;36892:7;36900:5;36892:14;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;-1:-1:-1;;;;;36892:14:0::2;36883:24:::0;;;::::2;::::0;;;;;;;;36892:14;36883:30:::2;:38:::0;36932:7:::2;:13:::0;;;::::2;;;;;::::0;;;::::2;::::0;;;-1:-1:-1;;36932:13:0;;;;;;;-1:-1:-1;;;;;;36932:13:0::2;::::0;;;;;;;;36974:118:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36956:15:0;::::2;::::0;;:8:::2;:15:::0;;;;;;;:136;;;;-1:-1:-1;;36956:136:0::2;::::0;::::2;;;::::0;;;;-1:-1:-1;36956:136:0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;37105:48:::2;36956:15:::0;37128:10:::2;37140:12:::0;37105:15:::2;:48::i;:::-;-1:-1:-1::0;;28466:6:0::1;:14:::0;;-1:-1:-1;;28466:14:0::1;::::0;;-1:-1:-1;;36346:815:0:o;31209:128::-;28538:6;;31292:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;-1:-1:-1;31321:8:0::1;::::0;31209:128;:::o;10468:252::-;10598:10;10535:4;10587:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10587:27:0;;;;;;;;;;10582:38;;10616:3;10582:4;:38::i;:::-;10563:10;10552:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10552:27:0;;;;;;;;;;;;:68;;;10636:54;;;;;;10552:27;;-1:-1:-1;;;;;;;;;;;10636:54:0;;;;;;;;;;-1:-1:-1;10708:4:0;10468:252;;;;:::o;9906:129::-;-1:-1:-1;;;;;10007:15:0;;;9983:4;10007:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;9906:129::o;34392:663::-;28314:10;-1:-1:-1;;;;;28296:39:0;28305:7;;-1:-1:-1;;;;;;28305:7:0;-1:-1:-1;;;;;28296:39:0;;28326:8;;28296:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28296:39:0;;;;;;;;-1:-1:-1;28296:39:0;;-1:-1:-1;;;;28296:39:0;34578:18:::1;:16;:18::i;:::-;-1:-1:-1::0;;;;;34616:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;34615:22;34607:43;;;::::0;;-1:-1:-1;;;34607:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34607:43:0;;;;;;;;;;;;;::::1;;34661:17;:15;:17::i;:::-;34699:7;:14:::0;1493:1:::1;-1:-1:-1::0;34691:56:0::1;;;::::0;;-1:-1:-1;;;34691:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34691:56:0;;;;;;;;;;;;;::::1;;34778:198;::::0;;::::1;::::0;::::1;::::0;;34807:4:::1;34778:198:::0;;;34833:7:::1;:14:::0;;34778:198:::1;::::0;;::::1;::::0;;;-1:-1:-1;34778:198:0;;;;;;;;;;;;-1:-1:-1;;;;;34760:15:0;::::1;::::0;;;:8:::1;:15:::0;;;;;;:216;;;;-1:-1:-1;;34760:216:0::1;::::0;::::1;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;34987:19;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;34987:19:0::1;::::0;;::::1;::::0;;35017:30:::1;34760:15:::0;35031:7;35040:6;35017::::1;:30::i;:::-;34392:663:::0;;;:::o;2093:49::-;2141:1;1388:6;2134:8;;30791:215;28538:6;;30896:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;30920:18:::1;30932:5;30920:11;:18::i;:::-;-1:-1:-1::0;;;;;30961:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;30985:12:::1;::::0;30956:42:::1;::::0;30961:22;30956:4:::1;:42::i;31014:187::-:0;28538:6;;31110:4;;28538:6;;;;;28537:7;28529:27;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;-1:-1:-1;;;28529:27:0;;;;;;;;;;;;;;;31134:18:::1;31146:5;31134:11;:18::i;:::-;-1:-1:-1::0;;;;;;31170:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:23:::1;;::::0;;31014:187::o;16696:672::-;16939:18;16975:16;16994:35;16999:14;17015:13;16994:4;:35::i;:::-;16975:54;;17040:9;17052:37;17057:15;17074:14;17052:4;:37::i;:::-;17040:49;;17100:6;17109:27;17114:15;17131:4;17109;:27::i;:::-;17100:36;;17147:8;17158:20;17163:1;17166:11;17158:4;:20::i;:::-;17147:31;;17195:15;17200:3;1388:6;17195:4;:15::i;:::-;17189:21;;17237:19;1388:6;17248:7;17237:4;:19::i;:::-;17221:35;;17283:46;17288:25;17293:14;17309:3;17288:4;:25::i;:::-;17315:13;17283:4;:46::i;:::-;17267:62;16696:672;-1:-1:-1;;;;;;;;;;;16696:672:0:o;29578:113::-;29672:11;;-1:-1:-1;;;29672:11:0;;;;;29578:113::o;53818:126::-;-1:-1:-1;;;;;53901:15:0;;;;;;:8;:15;;;;;:21;;;53893:43;;;;;-1:-1:-1;;;53893:43:0;;;;;;;;;;;;-1:-1:-1;;;53893:43:0;;;;;;;;;;;;;;;53818:126;:::o;3849:311::-;3920:4;3952:5;;;3976:6;;;:21;;;3996:1;3991;3986:2;:6;;;;;;:11;3976:21;3968:50;;;;;-1:-1:-1;;;3968:50:0;;;;;;;;;;;;-1:-1:-1;;;3968:50:0;;;;;;;;;;;;;;;4045:8;4039:15;;4073:8;;;;4065:37;;;;;-1:-1:-1;;;4065:37:0;;;;;;;;;;;;-1:-1:-1;;;4065:37:0;;;;;;;;;;;;;;;4113:7;1388:6;4123:2;:9;;;3849:311;-1:-1:-1;;;;;;3849:311:0:o;3408:202::-;3479:4;3502:6;3510:9;3523:14;3532:1;3535;3523:8;:14::i;:::-;3501:36;;;;3557:4;3556:5;3548:35;;;;;-1:-1:-1;;;3548:35:0;;;;;;;;;;;;-1:-1:-1;;;3548:35:0;;;;;;;;;;;;;;;-1:-1:-1;3601:1:0;3408:202;-1:-1:-1;;;3408:202:0:o;53154:112::-;53239:19;53245:4;53251:6;53239:5;:19::i;:::-;53154:112;;:::o;53718:92::-;53789:13;53795:6;53789:5;:13::i;52711:192::-;52810:9;52829:5;-1:-1:-1;;;;;52822:22:0;;52845:2;52849:6;52822:34;;;;;;;;;;;;;-1:-1:-1;;;;;52822:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52822:34:0;;-1:-1:-1;52822:34:0;52867:28;;;;;-1:-1:-1;;;52867:28:0;;;;;;;;;;;;-1:-1:-1;;;52867:28:0;;;;;;;;;;;;;;;52711:192;;;;:::o;53952:127::-;54041:11;;;;;-1:-1:-1;;;;;54041:11:0;54027:10;:25;54019:52;;;;;-1:-1:-1;;;54019:52:0;;;;;;;;;;;;-1:-1:-1;;;54019:52:0;;;;;;;;;;;;;;;53952:127::o;8996:273::-;-1:-1:-1;;;;;9075:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;9075:20:0;9067:53;;;;;-1:-1:-1;;;9067:53:0;;;;;;;;;;;;-1:-1:-1;;;9067:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;9152:13:0;;:8;:13;;;;;;;;;;;9147:24;;9167:3;9147:4;:24::i;:::-;-1:-1:-1;;;;;9131:13:0;;;:8;:13;;;;;;;;;;;:40;;;;9203:13;;;;;;;9198:24;;9218:3;9198:4;:24::i;:::-;-1:-1:-1;;;;;9182:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;9238:23;;;;;;;9182:13;;9238:23;;;;-1:-1:-1;;;;;;;;;;;9238:23:0;;;;;;;;8996:273;;;:::o;54087:110::-;54162:10;;-1:-1:-1;;;54162:10:0;;;;54161:11;54153:36;;;;;-1:-1:-1;;;54153:36:0;;;;;;;;;;;;-1:-1:-1;;;54153:36:0;;;;;;;;;;;;;;3220:180;3291:4;3322:5;;;3346:6;;;;3338:35;;;;;-1:-1:-1;;;3338:35:0;;;;;;;;;;;;-1:-1:-1;;;3338:35:0;;;;;;;;;;;;;;;3391:1;3220:180;-1:-1:-1;;;3220:180:0:o;52488:215::-;52601:55;;;-1:-1:-1;;;52601:55:0;;-1:-1:-1;;;;;52601:55:0;;;;;;;52642:4;52601:55;;;;;;;;;;;;52589:9;;52601:26;;;;;:55;;;;;;;;;;;;;;52589:9;52601:26;:55;;;;;;;;;;53390:320;53472:13;;-1:-1:-1;;;;;53472:13:0;53464:36;53461:218;;53539:13;;:46;;;-1:-1:-1;;;53539:46:0;;53579:4;53539:46;;;;;;53517:19;;-1:-1:-1;;;;;53539:13:0;;:31;;:46;;;;;;;;;;;;;;:13;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53539:46:0;53613:12;;53539:46;;-1:-1:-1;53539:46:0;;53608:26;;53627:6;53608:4;:26::i;:::-;:44;;53600:67;;;;;-1:-1:-1;;;53600:67:0;;;;;;;;;;;;-1:-1:-1;;;53600:67:0;;;;;;;;;;;;;;;53461:218;;53689:13;53695:6;53689:5;:13::i;53274:108::-;53357:17;53363:2;53367:6;53357:5;:17::i;4168:387::-;4239:4;4269:6;4261:31;;;;;-1:-1:-1;;;4261:31:0;;;;;;;;;;;;-1:-1:-1;;;4261:31:0;;;;;;;;;;;;;;;1388:6;4313:8;;4340:6;;;:24;;;1388:6;4355:1;4350:2;:6;;;;;;:14;4340:24;4332:53;;;;;-1:-1:-1;;;4332:53:0;;;;;;;;;;;;-1:-1:-1;;;4332:53:0;;;;;;;;;;;;;;;4433:1;4429:5;;4423:12;;4454:8;;;;4446:37;;;;;-1:-1:-1;;;4446:37:0;;;;;;;;;;;;-1:-1:-1;;;4446:37:0;;;;;;;;;;;;;;;4511:7;4526:1;4521:2;:6;;;;5058:555;5134:4;1952:5;5164:4;:21;;5156:55;;;;;-1:-1:-1;;;5156:55:0;;;;;;;;;;;;-1:-1:-1;;;5156:55:0;;;;;;;;;;;;;;;2005:18;5230:21;;;5222:56;;;;;-1:-1:-1;;;5222:56:0;;;;;;;;;;;;-1:-1:-1;;;5222:56:0;;;;;;;;;;;;;;;5291:10;5305:11;5312:3;5305:6;:11::i;:::-;5291:25;;5330:11;5344:16;5349:3;5354:5;5344:4;:16::i;:::-;5330:30;;5373:13;5389:24;5395:4;5401:11;5406:5;5401:4;:11::i;:::-;5389:5;:24::i;:::-;5373:40;-1:-1:-1;5430:11:0;5426:59;;5465:8;-1:-1:-1;5458:15:0;;-1:-1:-1;;5458:15:0;5426:59;5497:18;5518:40;5529:4;5535:6;2071:13;5518:10;:40::i;:::-;5497:61;;5576:29;5581:8;5591:13;5576:4;:29::i;:::-;5569:36;5058:555;-1:-1:-1;;;;;;;5058:555:0:o;52911:235::-;53069:21;;53036:63;;;-1:-1:-1;;;53036:63:0;;-1:-1:-1;;;;;53036:63:0;;;;;;;53069:21;;;53036:63;;;;;;;;;;;;53024:9;;53036:26;;;;;:63;;;;;;;;;;;;;;53024:9;53036:26;:63;;;;;;;;;;3618:223;3693:4;3699;3730:1;3725;:6;3721:113;;-1:-1:-1;;3756:5:0;;;3763;3748:21;;3721:113;-1:-1:-1;;3810:5:0;;;3817:4;3721:113;3618:223;;;;;:::o;9379:98::-;9438:31;9444:4;9458;9465:3;9438:5;:31::i;8696:292::-;8766:4;8749:8;:23;;;;;;;;;;;:30;-1:-1:-1;8749:30:0;8741:63;;;;;-1:-1:-1;;;8741:63:0;;;;;;;;;;;;-1:-1:-1;;;8741:63:0;;;;;;;;;;;;;;;8863:4;8846:8;:23;;;;;;;;;;;8841:34;;8871:3;8841:4;:34::i;:::-;8832:4;8815:8;:23;;;;;;;;;;:60;8906:12;;8901:23;;8920:3;8901:4;:23::i;:::-;8886:12;:38;8940:40;;;;;;;;8972:1;;8957:4;;-1:-1:-1;;;;;;;;;;;8940:40:0;;;;;;;;8696:292;:::o;8470:218::-;8563:4;8546:8;:23;;;;;;;;;;;8541:34;;8571:3;8541:4;:34::i;:::-;8532:4;8515:8;:23;;;;;;;;;;:60;8606:12;;8601:23;;8620:3;8601:4;:23::i;:::-;8586:12;:38;8640:40;;;;;;;;8669:4;;8657:1;;-1:-1:-1;;;;;;;;;;;8640:40:0;;;;;;;;8470:218;:::o;9277:94::-;9334:29;9348:4;9355:2;9359:3;9334:5;:29::i;3096:116::-;3161:4;1388:6;3190:7;3195:1;3190:4;:7::i;:::-;:14;;3096:116;-1:-1:-1;;3096:116:0:o;2979:109::-;1388:6;3072:8;;;2979:109::o;4583:314::-;4655:4;;4690:1;4686;:5;:21;;1388:6;4686:21;;;4699:1;4686:21;4677:30;-1:-1:-1;4730:1:0;4725:6;;;;4720:151;4733:6;;4720:151;;4768:10;4773:1;4776;4768:4;:10::i;:::-;4764:14;-1:-1:-1;4803:1:0;4799;:5;:10;4795:65;;4834:10;4839:1;4842;4834:4;:10::i;:::-;4830:14;;4795:65;4746:1;4741:6;;;;4720:151;;5621:1080;5719:4;5774:3;5719:4;;5811:20;5820:4;1388:6;5811:8;:20::i;:::-;5788:43;;-1:-1:-1;5788:43:0;-1:-1:-1;1388:6:0;;5842:9;6176:1;6162:509;6187:9;6179:4;:17;6162:509;;6218:9;1388:6;6230:1;:8;6218:20;;6254:6;6262:9;6275:29;6284:1;6287:16;6292:4;1388:6;6287:4;:16::i;:::-;6275:8;:29::i;:::-;6253:51;;;;6326:22;6331:4;6337:10;6342:1;6345;6337:4;:10::i;6326:22::-;6319:29;;6370:16;6375:4;6381;6370;:16::i;:::-;6363:23;-1:-1:-1;6405:9:0;6401:20;;6416:5;;;;;6401:20;6442:4;6438:30;;;6459:9;;;6438:30;6487:4;6483:30;;;6504:9;;;6483:30;6532:8;6528:132;;;6567:15;6572:3;6577:4;6567;:15::i;:::-;6561:21;;6528:132;;;6629:15;6634:3;6639:4;6629;:15::i;:::-;6623:21;;6528:132;-1:-1:-1;;;6198:3:0;;6162:509;;;-1:-1:-1;6690:3:0;;5621:1080;-1:-1:-1;;;;;;;;;5621:1080:0:o

Swarm Source

ipfs://9b278121a252bf1c9391a32b6106c1fb8fe23502162893b8dc9cb649c33c82f3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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