ETH Price: $3,132.62 (-0.13%)

Contract

0x63E3Cb8579aE46E640EeE7A2e3741C339aA3C3E3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Exit Pool125759682021-06-05 18:13:211261 days ago1622916801IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0050040817
Exit Pool124022762021-05-09 20:22:241288 days ago1620591744IN
0x63E3Cb85...39aA3C3E3
0 ETH0.03176871102
Exit Pool123327552021-04-29 2:42:211299 days ago1619664141IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0135729549
Exit Pool121753242021-04-04 20:25:501323 days ago1617567950IN
0x63E3Cb85...39aA3C3E3
0 ETH0.02753936101
Exit Pool121473412021-03-31 13:18:481327 days ago1617196728IN
0x63E3Cb85...39aA3C3E3
0 ETH0.03795098157
Exit Pool121440142021-03-31 0:46:381328 days ago1617151598IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0254209123
Exit Pool121189062021-03-27 4:07:031332 days ago1616818023IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0248931386
Exit Pool120923292021-03-23 2:11:581336 days ago1616465518IN
0x63E3Cb85...39aA3C3E3
0 ETH0.04110142135.00000112
Exit Pool120305422021-03-13 13:42:161345 days ago1615642936IN
0x63E3Cb85...39aA3C3E3
0 ETH0.02962756115
Approve120299492021-03-13 11:30:161345 days ago1615635016IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0060949138
Exit Pool120267012021-03-12 23:34:501346 days ago1615592090IN
0x63E3Cb85...39aA3C3E3
0 ETH0.04003411165
Exit Pool120176842021-03-11 13:56:201347 days ago1615470980IN
0x63E3Cb85...39aA3C3E3
0 ETH0.03231625112
Exit Pool120159332021-03-11 7:26:561348 days ago1615447616IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0209425581.00000145
Exit Pool119551692021-03-01 22:57:151357 days ago1614639435IN
0x63E3Cb85...39aA3C3E3
0 ETH0.03631803109
Exit Pool117675382021-02-01 2:01:471386 days ago1612144907IN
0x63E3Cb85...39aA3C3E3
0 ETH0.03280608120
Exit Pool116935832021-01-20 17:10:151397 days ago1611162615IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0203544774.16
Exit Pool116478502021-01-13 16:51:471404 days ago1610556707IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0130260145
Exit Pool116428722021-01-12 22:24:271405 days ago1610490267IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0137314645.1
Exit Pool116022572021-01-06 16:57:191411 days ago1609952239IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0490357169.4
Exit Pool115575572020-12-30 20:26:001418 days ago1609359960IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0164996157
Exit Pool115558242020-12-30 14:11:441418 days ago1609337504IN
0x63E3Cb85...39aA3C3E3
0 ETH0.03647284126
Exit Pool114651472020-12-16 16:12:421432 days ago1608135162IN
0x63E3Cb85...39aA3C3E3
0 ETH0.02669073110
Exit Pool114620842020-12-16 4:54:111433 days ago1608094451IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0121315550
Exit Pool114605092020-12-15 23:02:281433 days ago1608073348IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0095520133
Exit Pool114457842020-12-13 16:36:491435 days ago1607877409IN
0x63E3Cb85...39aA3C3E3
0 ETH0.0248352385.8
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
112595902020-11-15 2:06:011464 days ago1605405961  Contract Creation0 ETH
Loading...
Loading

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

Contract Name:
MPool

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity Multiple files format)

File 1 of 6: MPool.sol
pragma solidity 0.5.12;

import "./MToken.sol";
import "./MMath.sol";

interface IMFactory {
    function isWhiteList(address w) external view returns (bool);
    function getMining() external returns (address lpMiningAdr, address swapMiningAdr);
    function getFeeTo() external view returns (address);
}

interface IMining {
    // pair
    function addLiquidity(bool isGp, address _user, uint256 _amount) external;
    function removeLiquidity(bool isGp, address _user, uint256 _amount) external;
    function updateGPInfo(address[] calldata gps, uint256[] calldata amounts) external;
    // lp mining
    function onTransferLiquidity(address from, address to, uint256 lpAmount) external;
    function claimLiquidityShares(address user, address[] calldata tokens, uint256[] calldata balances, uint256[] calldata weights, uint256 amount, bool _add) external;
    // swap mining
    function claimSwapShare(address user, address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOut) external;
}

contract MPool is MBronze, MToken, MMath {

    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;

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

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

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

    bool private _mutex;

    IMFactory private _factory;    // MFactory address to push token exitFee to and check whitelist from factory
    IMining private _pair;
    address public controller;  // has CONTROL role

    // `setSwapFee` and `finalize` require CONTROL
    // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
    uint private _swapFee;
    bool private _finalized;
    bool private _publicSwap;     // true if PUBLIC can call SWAP functions

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

    constructor() public {
        controller = msg.sender;
        _factory = IMFactory(msg.sender);

        _swapFee = MIN_FEE;
        _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, "ERR_NOT_FINALIZED");
        return _tokens;
    }

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

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

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

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

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

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

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

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

    function getPair()
    external view
    _viewlock_
    returns (address)
    {
        return address(_pair);
    }

    function setSwapFee(uint swapFee)
    external
    _logs_
    _lock_
    {
        require(!_finalized, "ERR_IS_FINALIZED");
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(swapFee >= MIN_FEE, "ERR_MIN_FEE");
        require(swapFee <= MAX_FEE, "ERR_MAX_FEE");
        _swapFee = swapFee;
    }

    function setController(address manager)
    external
    _logs_
    _lock_
    {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        controller = manager;
    }

    function setPair(IMining pair)
    external
    _logs_
    _lock_
    {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        _pair = pair;
    }

    function finalize(address beneficiary, uint fixPoolSupply)
    external
    _logs_
    _lock_
    {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(!_finalized, "ERR_IS_FINALIZED");
        require(_tokens.length >= MIN_BOUND_TOKENS, "ERR_MIN_TOKENS");

        _finalized = true;
        _publicSwap = true;

        uint256 supply = fixPoolSupply == 0 ? INIT_POOL_SUPPLY : fixPoolSupply;

        _mintPoolShare(supply);
        _pushPoolShare(beneficiary, supply);
        _lpChanging(true, beneficiary, supply);
    }


    function bind(address token, uint balance, uint denorm)
    external
    _logs_
        // _lock_  Bind does not lock because it jumps to `rebind`, which does
    {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(!_records[token].bound, "ERR_IS_BOUND");
        require(!_finalized, "ERR_IS_FINALIZED");

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

        _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_
    {

        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(_records[token].bound, "ERR_NOT_BOUND");
        require(!_finalized, "ERR_IS_FINALIZED");

        require(denorm >= MIN_WEIGHT, "ERR_MIN_WEIGHT");
        require(denorm <= MAX_WEIGHT, "ERR_MAX_WEIGHT");
        require(balance >= MIN_BALANCE, "ERR_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, "ERR_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_
    {

        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        require(_records[token].bound, "ERR_NOT_BOUND");
        require(!_finalized, "ERR_IS_FINALIZED");

        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_
    {
        require(_records[token].bound, "ERR_NOT_BOUND");
        _records[token].balance = IERC20(token).balanceOf(address(this));
    }

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

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

    function joinPool(address beneficiary, uint poolAmountOut, uint[] calldata maxAmountsIn)
    external
    _logs_
    _lock_
    {
        require(_finalized, "ERR_NOT_FINALIZED");

        uint poolTotal = totalSupply();
        uint ratio = bdiv(poolAmountOut, poolTotal);
        require(ratio != 0, "ERR_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, "ERR_MATH_APPROX");
            require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN");
            _records[t].balance = badd(_records[t].balance, tokenAmountIn);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
        }
        _mintPoolShare(poolAmountOut);
        _pushPoolShare(beneficiary, poolAmountOut);

        _lpChanging(true, beneficiary, poolAmountOut);
    }

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

        uint poolTotal = totalSupply();
        uint ratio = bdiv(poolAmountIn, poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(poolAmountIn);

        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, "ERR_MATH_APPROX");
            require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT");
            _records[t].balance = bsub(_records[t].balance, tokenAmountOut);
            emit LOG_EXIT(msg.sender, t, tokenAmountOut);
            _pushUnderlying(t, msg.sender, tokenAmountOut);
        }

        _lpChanging(false, msg.sender, poolAmountIn);
    }


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

        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(_publicSwap, "ERR_SWAP_NOT_PUBLIC");

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

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

        uint256 factoryFee = bmul(tokenAmountIn, bmul(bdiv(_swapFee, 6), 1));

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

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

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

        spotPriceAfter = calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            _swapFee
        );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX");

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

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
        _pushUnderlying(tokenIn, _factory.getFeeTo(), factoryFee);

        _swapMining(user, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);

        return (tokenAmountOut, spotPriceAfter);
    }

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

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

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

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

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

        uint256 factoryFee = bmul(tokenAmountIn, bmul(bdiv(_swapFee, 6), 1));

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

        spotPriceAfter = calcSpotPrice(
            inRecord.balance,
            inRecord.denorm,
            outRecord.balance,
            outRecord.denorm,
            _swapFee
        );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX");

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

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);
        _pushUnderlying(tokenIn, _factory.getFeeTo(), factoryFee);

        _swapMining(user, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);
        return (tokenAmountIn, spotPriceAfter);
    }


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

        Record storage inRecord = _records[tokenIn];

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

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

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

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

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(beneficiary, poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        _lpChanging(true, beneficiary, poolAmountOut);

        return poolAmountOut;
    }

    function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut)
    external
    _logs_
    _lock_
    returns (uint tokenAmountOut)
    {
        require(_finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");

        Record storage outRecord = _records[tokenOut];

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

        require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");

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

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

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

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(poolAmountIn);

        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        _lpChanging(false, msg.sender, poolAmountIn);

        return tokenAmountOut;
    }

    function updatePairGPInfo(address[] calldata gps, uint[] calldata shares)
    external
    {
        require(msg.sender == controller, "ERR_NOT_CONTROLLER");
        if (address(_pair) != address(0))
        {
            _pair.updateGPInfo(gps, shares);
        }
    }

    // ==
    // '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
    {
        safeTransferFrom(IERC20(erc20), from, address(this), amount);
    }

    function _pushUnderlying(address erc20, address to, uint amount)
    internal
    {
        safeTransfer(IERC20(erc20), to, amount);
    }

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

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

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

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

    function _lpChanging(bool add, address user, uint256 amount)
    internal
    {
        if (address(_pair) != address(0))
        {
            add == true ? _pair.addLiquidity(false, user, amount) : _pair.removeLiquidity(false, user, amount);
        }

        (address lpMiningAdr, ) = _factory.getMining();
        if (lpMiningAdr != address(0))
        {
            IMining mining = IMining(lpMiningAdr);
            uint256[] memory balances = new uint256[](_tokens.length);
            uint256[] memory weights = new uint256[](_tokens.length);
            for (uint i = 0; i < _tokens.length; i++) {
                balances[i] = _records[_tokens[i]].balance;
                weights[i] = bdiv(_records[_tokens[i]].denorm, _totalWeight);
            }

            mining.claimLiquidityShares(user, _tokens, balances, weights, amount, add);
        }

    }

    function _swapMining(address user, address tokenIn, address tokenOut, uint256 tokenAmountIn, uint256 tokenAmountOut)
    internal
    {
        ( ,address swapMiningAdr) = _factory.getMining();
        if (swapMiningAdr != address(0)){
            IMining mining = IMining(swapMiningAdr);
            mining.claimSwapShare(user, tokenIn, tokenAmountIn, tokenOut, tokenAmountOut);
        }
    }

    function _transferLiquidity(address src, address dst, uint amt) internal {
        (address lpMiningAdr, ) = _factory.getMining();
        if (lpMiningAdr != address(0)){
            IMining mining = IMining(lpMiningAdr);
            mining.onTransferLiquidity(src, dst, amt);
        }
    }

    function transfer(address dst, uint amt) external returns (bool) {
        require(_factory.isWhiteList(msg.sender) || _factory.isWhiteList(dst), "ERR_NOT_WHITELIST");
        _move(msg.sender, dst, amt);
        if(dst != address(this)){
            _transferLiquidity(msg.sender, dst, amt);
        }
        return true;
    }

    function transferFrom(address src, address dst, uint amt) external returns (bool) {
        require(_factory.isWhiteList(msg.sender) || _factory.isWhiteList(dst), "ERR_NOT_WHITELIST");
        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]);
        }
        if(dst != address(this)){
            _transferLiquidity(src, dst, amt);
        }
        return true;
    }
}

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

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

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

pragma solidity 0.5.12;

contract MColor {
    function getColor()
    external view
    returns (bytes32);
}

contract MBronze is MColor {
    function getColor()
    external view
    returns (bytes32) {
        return bytes32("BRONZE");
    }
}

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

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

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

pragma solidity 0.5.12;

import "./MColor.sol";

contract MConst is MBronze {
    uint internal constant BONE              = 10**18;

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

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

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

    uint internal constant INIT_POOL_SUPPLY  = BONE * 100;

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

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

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

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

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

pragma solidity 0.5.12;

import "./MNum.sol";

contract MMath is MBronze, MConst, MNum {
    /**********************************************************************************************
    // 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
    )
    internal 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
    )
    internal 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;
    }

    /**********************************************************************************************
    // calcSingleOutGivenPoolIn                                                                  //
    // tAo = tokenAmountOut            /      /                                             \\   //
    // bO = tokenBalanceOut           /      // pS - (pAi * (1 - eF)) \     /    1    \      \\  //
    // pAi = poolAmountIn            | bO - || ----------------------- | ^ | --------- | * b0 || //
    // ps = poolSupply                \      \\          pS           /     \(wO / tW)/      //  //
    // wI = tokenWeightIn      tAo =   \      \                                             //   //
    // tW = totalWeight                    /     /      wO \       \                             //
    // sF = swapFee                    *  | 1 - |  1 - ---- | * sF  |                            //
    // eF = exitFee                        \     \      tW /       /                             //
    **********************************************************************************************/
    function calcSingleOutGivenPoolIn(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountIn,
        uint swapFee
    )
    internal pure
    returns (uint tokenAmountOut)
    {
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        // charge exit fee on the pool token side
        // pAiAfterExitFee = pAi*(1-exitFee)
        uint poolAmountInAfterExitFee = bmul(poolAmountIn, BONE);
        uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
        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;
    }

}

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

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

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

pragma solidity 0.5.12;

import "./MConst.sol";

contract MNum is MConst {

    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 6 of 6: MToken.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

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

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

pragma solidity 0.5.12;

import "./MNum.sol";

// 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 MTokenBase is MNum {

    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 MToken is MTokenBase, IERC20 {

    string  private _name     = "Mercurity Pool Token";
    string  private _symbol   = "MPT";
    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 view returns (uint) {
        return _allowance[src][dst];
    }

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

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

    function approve(address dst, uint amt) external 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 returns (bool) {
        _move(msg.sender, dst, amt);
        return true;
    }

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

    function safeTransfer(IERC20 token, address to , uint256 amount) internal {
        bytes memory data = abi.encodeWithSelector(token.transfer.selector, to, amount);
        bytes memory returndata = functionCall(address(token), data, "low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "not succeed");
        }
    }

    function safeTransferFrom(IERC20 token, address from, address to , uint256 amount) internal {
        bytes memory data = abi.encodeWithSelector(token.transferFrom.selector, from, to, amount);
        bytes memory returndata = functionCall(address(token), data, "low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "not succeed");
        }
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.call(data);// value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"fixPoolSupply","type":"uint256"}],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getColor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IMining","name":"pair","type":"address"}],"name":"setPair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"gps","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"name":"updatePairGPInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102745760003560e01c8063936c347711610151578063cd2ed8fb116100c3578063e4e1e53811610087578063e4e1e538146109f9578063f1b8a9b714610a2b578063f77c479114610a51578063f8b2cb4f14610a59578063f8d6aed414610a7f578063fde924f714610aba57610274565b8063cd2ed8fb14610969578063cf5e7bd314610971578063d4cadf6814610997578063d73dd6231461099f578063dd62ed3e146109cb57610274565b8063b02f0b7311610115578063b02f0b73146107f9578063ba9530a61461086e578063be3bbd2e146108a9578063c1762b1514610901578063c1f1b1b51461093d578063cc77828d1461096157610274565b8063936c34771461078f578063948d8ce61461079757806395d89b41146107bd5780639a86139b146107c5578063a9059cbb146107cd57610274565b80633fdddaa2116101ea57806370a08231116101ae57806370a082311461066c5780638187f516146106925780638a5c57df146106b85780638c28cbe81461073b5780638d4e40831461076157806392eefe9b1461076957610274565b80633fdddaa2146104d457806346ab38f1146105065780634d128b77146105385780635e7d6c3d14610582578063661884631461064057610274565b806318160ddd1161023c57806318160ddd146103d257806323b872dd146103da578063255de7bb146104105780632f37b62414610473578063313ce5671461049957806334e19907146104b757610274565b80630553e1561461027957806306fdde03146102a7578063095ea7b3146103245780631446a7ff1461036457806315e84af9146103a4575b600080fd5b6102a56004803603604081101561028f57600080fd5b506001600160a01b038135169060200135610ac2565b005b6102af610cc9565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102e95781810151838201526020016102d1565b50505050905090810190601f1680156103165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103506004803603604081101561033a57600080fd5b506001600160a01b038135169060200135610d5f565b604080519115158252519081900360200190f35b6103926004803603604081101561037a57600080fd5b506001600160a01b0381358116916020013516610db4565b60408051918252519081900360200190f35b610392600480360360408110156103ba57600080fd5b506001600160a01b0381358116916020013516610f09565b610392611055565b610350600480360360608110156103f057600080fd5b506001600160a01b0381358116916020810135909116906040013561105b565b61045a600480360360c081101561042657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359091169060808101359060a00135611318565b6040805192835260208301919091528051918290030190f35b6103506004803603602081101561048957600080fd5b50356001600160a01b03166118a2565b6104a16118c0565b6040805160ff9092168252519081900360200190f35b6102a5600480360360208110156104cd57600080fd5b50356118c9565b6102a5600480360360608110156104ea57600080fd5b506001600160a01b038135169060208101359060400135611ac6565b6103926004803603606081101561051c57600080fd5b506001600160a01b038135169060208101359060400135611e9c565b61045a600480360360c081101561054e57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359091169060808101359060a0013561218f565b6102a56004803603604081101561059857600080fd5b810190602081018135600160201b8111156105b257600080fd5b8201836020820111156105c457600080fd5b803590602001918460208302840111600160201b831117156105e557600080fd5b919390929091602081019035600160201b81111561060257600080fd5b82018360208201111561061457600080fd5b803590602001918460208302840111600160201b8311171561063557600080fd5b5090925090506126fb565b6103506004803603604081101561065657600080fd5b506001600160a01b03813516906020013561282c565b6103926004803603602081101561068257600080fd5b50356001600160a01b0316612904565b6102a5600480360360208110156106a857600080fd5b50356001600160a01b031661291f565b6102a5600480360360608110156106ce57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156106fd57600080fd5b82018360208201111561070f57600080fd5b803590602001918460208302840111600160201b8311171561073057600080fd5b509092509050612a5d565b6102a56004803603602081101561075157600080fd5b50356001600160a01b0316612d75565b610350612f29565b6102a56004803603602081101561077f57600080fd5b50356001600160a01b0316612f32565b610392613070565b610392600480360360208110156107ad57600080fd5b50356001600160a01b03166130c5565b6102af61318f565b6103926131f0565b610350600480360360408110156107e357600080fd5b506001600160a01b0381351690602001356131fd565b6102a56004803603604081101561080f57600080fd5b81359190810190604081016020820135600160201b81111561083057600080fd5b82018360208201111561084257600080fd5b803590602001918460208302840111600160201b8311171561086357600080fd5b509092509050613375565b610392600480360360c081101561088457600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561367b565b6108b1613701565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156108ed5781810151838201526020016108d5565b505050509050019250505060405180910390f35b6103926004803603608081101561091757600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356137f9565b610945613ae7565b604080516001600160a01b039092168252519081900360200190f35b6108b1613b45565b610392613b93565b6102a56004803603602081101561098757600080fd5b50356001600160a01b0316613b99565b610392613ee9565b610350600480360360408110156109b557600080fd5b506001600160a01b038135169060200135613f3e565b610392600480360360408110156109e157600080fd5b506001600160a01b0381358116916020013516613fbf565b6102a560048036036060811015610a0f57600080fd5b506001600160a01b038135169060208101359060400135613fea565b61039260048036036020811015610a4157600080fd5b50356001600160a01b0316614241565b610945614316565b61039260048036036020811015610a6f57600080fd5b50356001600160a01b0316614325565b610392600480360360c0811015610a9557600080fd5b5080359060208101359060408101359060608101359060808101359060a001356143ef565b610350614472565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610b6e576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b0390911614610bd3576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60095460ff1615610c1e576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600a5460021115610c67576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d494e5f544f4b454e5360901b604482015290519081900360640190fd5b6009805461ff001960ff199091166001171661010017905560008115610c8d5781610c98565b68056bc75e2d631000005b9050610ca381614480565b610cad838261448c565b610cb96001848361449a565b50506005805461ff001916905550565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d555780601f10610d2a57610100808354040283529160200191610d55565b820191906000526020600020905b815481529060010190602001808311610d3857829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b0387168085529083528184208690558151868152915193949093909260008051602061574d833981519152928290030190a35060015b92915050565b600554600090610100900460ff1615610e02576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205460ff16610e5f576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff16610ebc576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b60205260408082209285168252812060038084015460028086015492840154908401549394610f0094929392906148b4565b95945050505050565b600554600090610100900460ff1615610f57576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205460ff16610fb4576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff16611011576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b6020526040808220928516825290206003808301546002808501549284015490840154600854610f00949291906148b4565b60025490565b6005546040805163f99031a760e01b815233600482015290516000926201000090046001600160a01b03169163f99031a7916024808301926020929190829003018186803b1580156110ac57600080fd5b505afa1580156110c0573d6000803e3d6000fd5b505050506040513d60208110156110d657600080fd5b50518061115f57506005546040805163f99031a760e01b81526001600160a01b0386811660048301529151620100009093049091169163f99031a791602480820192602092909190829003018186803b15801561113257600080fd5b505afa158015611146573d6000803e3d6000fd5b505050506040513d602081101561115c57600080fd5b50515b6111a4576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d5d2125511531254d5607a1b604482015290519081900360640190fd5b336001600160a01b03851614806111de57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b611227576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b611232848484614919565b336001600160a01b0385161480159061127057506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156112f2576001600160a01b03841660009081526001602090815260408083203384529091529020546112a39083614a29565b6001600160a01b038581166000908152600160209081526040808320338085529083529281902085905580519485525192871693919260008051602061574d8339815191529281900390910190a35b6001600160a01b038316301461130d5761130d848484614a8b565b5060015b9392505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156113b5576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff16611421576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff1661147e576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600954610100900460ff166114d0576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b602052604080822092881682529020600382015461150c906002670de0b6b3a76400005b04614b89565b881115611553576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000611575896115706115696008546006614c52565b6001614b89565b614b89565b9050600061159884600301548560020154856003015486600201546008546148b4565b9050868111156115e5576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b61160584600301548560020154856003015486600201548e60085461367b565b95508786101561164c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b60006116588b84614a29565b9050611668856003015482614d5a565b856003018190555061167e846003015488614a29565b6003808601829055860154600280880154908701546008546116a19491906148b4565b9550818610156116ea576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87861115611731576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b61173b8b88614c52565b821115611781576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b896001600160a01b03168c6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788e8b604051808381526020018281526020019250505060405180910390a46117e98c338d614da7565b6117f48a3389614db3565b6118788c600560029054906101000a90046001600160a01b03166001600160a01b0316636611f5286040518163ffffffff1660e01b815260040160206040518083038186803b15801561184657600080fd5b505afa15801561185a573d6000803e3d6000fd5b505050506040513d602081101561187057600080fd5b505185614db3565b6118858d8d8c8e8b614dbe565b50505050506005805461ff00191690559097909650945050505050565b6001600160a01b03166000908152600b602052604090205460ff1690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611975576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560095460ff16156119cf576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6007546001600160a01b03163314611a23576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b64e8d4a51000811015611a6b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d494e5f46454560a81b604482015290519081900360640190fd5b67016345785d8a0000811115611ab6576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d41585f46454560a81b604482015290519081900360640190fd5b6008556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611b72576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b0390911614611bd7576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205460ff16611c34576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60095460ff1615611c7f576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b670de0b6b3a7640000811015611ccd576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d5d15251d21560921b604482015290519081900360640190fd5b6802b5e3af16b1880000811115611d1c576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3505617d5d15251d21560921b604482015290519081900360640190fd5b620f4240821015611d66576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4d494e5f42414c414e434560881b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090206002015480821115611dfd57611d9f600c54611d9a8484614a29565b614d5a565b600c8190556802b5e3af16b18800001015611df8576040805162461bcd60e51b815260206004820152601460248201527311549497d3505617d513d5105317d5d15251d21560621b604482015290519081900360640190fd5b611e1e565b80821015611e1e57611e1a600c54611e158385614a29565b614a29565b600c555b6001600160a01b0384166000908152600b602052604090206002810183905560030180549084905580841115611e6757611e628533611e5d8785614a29565b614da7565b611e8a565b80841015611e8a576000611e7b8286614a29565b9050611e88863383614db3565b505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611f4a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560095460ff16611fa4576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16612001576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600c5460085461203b94939291908990614eb7565b915082821015612082576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090206003908101546120b791670de0b6b3a76400005b04600101614b89565b8211156120ff576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b61210d816003015483614a29565b60038201556040805183815290516001600160a01b0387169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9181900360200190a361215c3385614f7b565b61216584614f85565b612170853384614db3565b61217c6000338661449a565b506005805461ff00191690559392505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561222c576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff16612298576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff166122f5576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600954610100900460ff16612347576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b60205260408082209288168252902060038082015461238091670de0b6b3a76400006120ae565b8611156123c8576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b60006123e983600301548460020154846003015485600201546008546148b4565b905085811115612436576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b61245683600301548460020154846003015485600201548b6008546143ef565b94508885111561249c576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b60006124b2866115706115696008546006614c52565b90506124c2846003015482614d5a565b84600301819055506124d8836003015489614a29565b6003808501829055850154600280870154908601546008546124fb9491906148b4565b945081851015612544576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b8685111561258b576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b6125958689614c52565b8211156125db576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b886001600160a01b03168b6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378898c604051808381526020018281526020019250505060405180910390a46126438b3388614da7565b61264e89338a614db3565b6126d28b600560029054906101000a90046001600160a01b03166001600160a01b0316636611f5286040518163ffffffff1660e01b815260040160206040518083038186803b1580156126a057600080fd5b505afa1580156126b4573d6000803e3d6000fd5b505050506040513d60208110156126ca57600080fd5b505183614db3565b6126df8c8c8b898c614dbe565b505050506005805461ff00191690559097909650945050505050565b6007546001600160a01b0316331461274f576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6006546001600160a01b031615612826576006546040805163694710c760e11b815260048101918252604481018690526001600160a01b039092169163d28e218e9187918791879187919081906024810190606401876020880280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b15801561280d57600080fd5b505af1158015612821573d6000803e3d6000fd5b505050505b50505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115612881573360009081526001602090815260408083206001600160a01b03881684529091528120556128b0565b61288b8184614a29565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b03891680855290835292819020548151908152905192939260008051602061574d833981519152929181900390910190a35060019392505050565b6001600160a01b031660009081526020819052604090205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156129cb576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b0390911614612a30576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612b09576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560095460ff16612b63576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6000612b6d611055565b90506000612b7b8583614c52565b905080612bc1576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600a54811015612d42576000600a8281548110612bdd57fe5b60009182526020808320909101546001600160a01b0316808352600b909152604082206003015490925090612c128583614b89565b905080612c58576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878785818110612c6457fe5b90506020020135811115612cae576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040902060030154612cd49082614d5a565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3612d37833383614da7565b505050600101612bc4565b50612d4c85614480565b612d56868661448c565b612d626001878761449a565b50506005805461ff001916905550505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612e21576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600b602052604090205460ff16612e8d576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015612ed357600080fd5b505afa158015612ee7573d6000803e3d6000fd5b505050506040513d6020811015612efd57600080fd5b50516001600160a01b039091166000908152600b60205260409020600301556005805461ff0019169055565b60095460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612fde576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b0390911614613043576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff16156130be576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b50600c5490565b600554600090610100900460ff1615613113576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff16613170576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600b602052604090206002015490565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d555780601f10610d2a57610100808354040283529160200191610d55565b6542524f4e5a4560d01b90565b6005546040805163f99031a760e01b815233600482015290516000926201000090046001600160a01b03169163f99031a7916024808301926020929190829003018186803b15801561324e57600080fd5b505afa158015613262573d6000803e3d6000fd5b505050506040513d602081101561327857600080fd5b50518061330157506005546040805163f99031a760e01b81526001600160a01b0386811660048301529151620100009093049091169163f99031a791602480820192602092909190829003018186803b1580156132d457600080fd5b505afa1580156132e8573d6000803e3d6000fd5b505050506040513d60208110156132fe57600080fd5b50515b613346576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d5d2125511531254d5607a1b604482015290519081900360640190fd5b613351338484614919565b6001600160a01b038316301461336c5761336c338484614a8b565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613421576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560095460ff1661347b576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6000613485611055565b905060006134938583614c52565b9050806134d9576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b6134e33386614f7b565b6134ec85614f85565b60005b600a5481101561366e576000600a828154811061350857fe5b60009182526020808320909101546001600160a01b0316808352600b90915260408220600301549092509061353d8583614b89565b905080613583576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87878581811061358f57fe5b905060200201358110156135da576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b60205260409020600301546136009082614a29565b6001600160a01b0384166000818152600b60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3613663833383614db3565b5050506001016134ef565b50611e8a6000338761449a565b6000806136888786614c52565b9050600061369e670de0b6b3a764000085614a29565b90506136aa8582614b89565b905060006136c18a6136bc8c85614d5a565b614c52565b905060006136cf8285614f8e565b905060006136e5670de0b6b3a764000083614a29565b90506136f18a82614b89565b9c9b505050505050505050505050565b600554606090610100900460ff161561374f576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60095460ff1661379a576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600a805480602002602001604051908101604052809291908181526020018280548015610d5557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116137d2575050505050905090565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156138a7576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560095460ff16613901576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff1661395e576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090206003015461398e906002670de0b6b3a7640000611506565b8311156139d5576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600c54600854613a0f9493929190899061509c565b915082821015613a56576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b613a64816003015485614d5a565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3613ab282614480565b613abc868361448c565b613ac7853386614da7565b613ad36001878461449a565b506005805461ff0019169055949350505050565b600554600090610100900460ff1615613b35576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b506006546001600160a01b031690565b600554606090610100900460ff161561379a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b600a5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613c45576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600754336001600160a01b0390911614613caa576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0381166000908152600b602052604090205460ff16613d07576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60095460ff1615613d52576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6001600160a01b0381166000908152600b602052604090206003810154600c546002909201549091613d8391614a29565b600c556001600160a01b0382166000908152600b6020526040902060010154600a80546000198101919082908110613db757fe5b600091825260209091200154600a80546001600160a01b039092169184908110613ddd57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600b6000600a8581548110613e1d57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600a805480613e5057fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038b168752600b909552929094209051815460ff19169015151781559251600184015551600283015551600390910155613ed8843385614db3565b50506005805461ff00191690555050565b600554600090610100900460ff1615613f37576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060085490565b3360009081526001602090815260408083206001600160a01b0386168452909152812054613f6c9083614d5a565b3360008181526001602090815260408083206001600160a01b03891680855290835292819020859055805194855251919360008051602061574d833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26007546001600160a01b0316331461409f576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205460ff16156140fc576040805162461bcd60e51b815260206004820152600c60248201526b11549497d254d7d093d5539160a21b604482015290519081900360640190fd5b60095460ff1615614147576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600a5460081161418f576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b604080516080810182526001808252600a805460208085019182526000858701818152606087018281526001600160a01b038c16808452600b9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b031916909117905561423c838383611ac6565b505050565b600554600090610100900460ff161561428f576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166142ec576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b6020526040902060020154600c54611311908290614c52565b6007546001600160a01b031681565b600554600090610100900460ff1615614373576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166143d0576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600b602052604090206003015490565b6000806143fc8588614c52565b9050600061440a8786614a29565b905060006144188883614c52565b905060006144268285614f8e565b905061443a81670de0b6b3a7640000614a29565b905061444e670de0b6b3a764000087614a29565b945061446361445d8c83614b89565b86614c52565b9b9a5050505050505050505050565b600954610100900460ff1690565b61448981615138565b50565b61449682826151ad565b5050565b6006546001600160a01b03161561459d5760018315151461452b5760065460408051633953208d60e21b81526000600482018190526001600160a01b038681166024840152604483018690529251929093169263e54c82349260648084019382900301818387803b15801561450e57600080fd5b505af1158015614522573d6000803e3d6000fd5b5050505061459d565b6006546040805163cf33fc2960e01b81526000600482018190526001600160a01b038681166024840152604483018690529251929093169263cf33fc299260648084019382900301818387803b15801561458457600080fd5b505af1158015614598573d6000803e3d6000fd5b505050505b60055460408051633b736e5160e11b815281516000936201000090046001600160a01b0316926376e6dca2926004808201939182900301818787803b1580156145e557600080fd5b505af11580156145f9573d6000803e3d6000fd5b505050506040513d604081101561460f57600080fd5b505190506001600160a01b0381161561282657600a546040805182815260208084028201019091528291606091908015614653578160200160208202803883390190505b5090506060600a80549050604051908082528060200260200182016040528015614687578160200160208202803883390190505b50905060005b600a5481101561474d57600b6000600a83815481106146a857fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206003015483518490839081106146de57fe5b60200260200101818152505061472e600b6000600a84815481106146fe57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060020154600c54614c52565b82828151811061473a57fe5b602090810291909101015260010161468d565b50826001600160a01b031663eda6851087600a85858a8d6040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b031681526020018060200180602001806020018681526020018515151515815260200184810384528981815481526020019150805480156147f257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116147d4575b50508481038352885181528851602091820191808b01910280838360005b83811015614828578181015183820152602001614810565b50505050905001848103825287818151815260200191508051906020019060200280838360005b8381101561486757818101518382015260200161484f565b505050509050019950505050505050505050600060405180830381600087803b15801561489357600080fd5b505af11580156148a7573d6000803e3d6000fd5b5050505050505050505050565b6000806148c18787614c52565b905060006148cf8686614c52565b905060006148dd8383614c52565b905060006148ff670de0b6b3a76400006136bc670de0b6b3a764000089614a29565b905061490b8282614b89565b9a9950505050505050505050565b6001600160a01b03831660009081526020819052604090205481111561497d576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b0383166000908152602081905260409020546149a09082614a29565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546149cf9082614d5a565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000806000614a3885856151b8565b915091508015614a83576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b60055460408051633b736e5160e11b815281516000936201000090046001600160a01b0316926376e6dca2926004808201939182900301818787803b158015614ad357600080fd5b505af1158015614ae7573d6000803e3d6000fd5b505050506040513d6040811015614afd57600080fd5b505190506001600160a01b038116156128265760408051630a6c953560e01b81526001600160a01b03868116600483015285811660248301526044820185905291518392831691630a6c953591606480830192600092919082900301818387803b158015614b6a57600080fd5b505af1158015614b7e573d6000803e3d6000fd5b505050505050505050565b6000828202831580614ba3575082848281614ba057fe5b04145b614be7576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614c3a576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b600081614c95576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580614cbd5750670de0b6b3a7640000848281614cba57fe5b04145b614d01576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60028304810181811015614d4f576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281614c4757fe5b600082820183811015611311576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b61423c838330846151dd565b61423c8383836152c6565b60055460408051633b736e5160e11b815281516000936201000090046001600160a01b0316926376e6dca2926004808201939182900301818787803b158015614e0657600080fd5b505af1158015614e1a573d6000803e3d6000fd5b505050506040513d6040811015614e3057600080fd5b506020015190506001600160a01b03811615614eaf5760408051635fd8b58560e01b81526001600160a01b03888116600483015287811660248301526044820186905286811660648301526084820185905291518392831691635fd8b5859160a480830192600092919082900301818387803b15801561489357600080fd5b505050505050565b600080614ec48786614c52565b90506000614eda85670de0b6b3a7640000614b89565b90506000614ee88883614a29565b90506000614ef6828a614c52565b90506000614f1582614f10670de0b6b3a764000088614c52565b614f8e565b90506000614f23828e614b89565b90506000614f318e83614a29565b90506000614f50614f4a670de0b6b3a76400008a614a29565b8b614b89565b9050614f6882611570670de0b6b3a764000084614a29565b9f9e505050505050505050505050505050565b61449682826153ae565b614489816153b9565b60006001831015614fde576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff831115615034576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b600061503f83615489565b9050600061504d8483614a29565b905060006150638661505e856154a4565b6154b2565b905081615074579250610dae915050565b600061508587846305f5e100615509565b90506150918282614b89565b979650505050505050565b6000806150a98786614c52565b905060006150c86150c2670de0b6b3a764000084614a29565b85614b89565b905060006150e286611570670de0b6b3a764000085614a29565b905060006150f08b83614d5a565b905060006150fe828d614c52565b9050600061510c8287614f8e565b9050600061511a828d614b89565b9050615126818d614a29565b9e9d5050505050505050505050505050565b306000908152602081905260409020546151529082614d5a565b3060009081526020819052604090205560025461516f9082614d5a565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b614496308383614919565b6000808284106151ce57505080820360006151d6565b505081810360015b9250929050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091018252602081810180516001600160e01b03166323b872dd60e01b179052825180840190935260158352741b1bddcb5b195d995b0818d85b1b0819985a5b1959605a1b908301529060609061526690879084906155e7565b805190915015614eaf5780806020019051602081101561528557600080fd5b5051614eaf576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd58d8d9595960aa1b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091018252602081810180516001600160e01b031663a9059cbb60e01b179052825180840190935260158352741b1bddcb5b195d995b0818d85b1b0819985a5b1959605a1b908301529060609061534790869084906155e7565b8051909150156153a75780806020019051602081101561536657600080fd5b50516153a7576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd58d8d9595960aa1b604482015290519081900360640190fd5b5050505050565b614496823083614919565b30600090815260208190526040902054811115615414576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b3060009081526020819052604090205461542e9082614a29565b3060009081526020819052604090205560025461544b9082614a29565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b6000670de0b6b3a764000061549d836154a4565b0292915050565b670de0b6b3a7640000900490565b600080600283066154cb57670de0b6b3a76400006154cd565b835b90506002830492505b8215611311576154e68485614b89565b935060028306156154fe576154fb8185614b89565b90505b6002830492506154d6565b600082818061552087670de0b6b3a76400006151b8565b9092509050670de0b6b3a764000080600060015b8884106155d8576000670de0b6b3a7640000820290506000806155688a61556385670de0b6b3a7640000614a29565b6151b8565b9150915061557a87611570848c614b89565b96506155868784614c52565b965086615595575050506155d8565b871561559f579315935b80156155a9579315935b84156155c0576155b98688614a29565b95506155cd565b6155ca8688614d5a565b95505b505050600101615534565b50909998505050505050505050565b60606155f48484846155fc565b949350505050565b606060006060856001600160a01b0316856040518082805190602001908083835b6020831061563c5780518252601f19909201916020918201910161561d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461569e576040519150601f19603f3d011682016040523d82523d6000602084013e6156a3565b606091505b509150915081156156b75791506113119050565b8051156156c75780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156157115781810151838201526020016156f9565b50505050905090810190601f16801561573e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820fd21d9371582197fc87c1b381e7d91ba5734722eead574cc377e9823377f998d64736f6c634300050c0032

Deployed Bytecode Sourcemap

1007:21646:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1007:21646:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5408:554;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5408:554:4;;;;;;;;:::i;:::-;;2854:81:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2854:81:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3440:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3440:180:5;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;9638:469:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9638:469:4;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9163;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9163:469:4;;;;;;;;;;:::i;3348:86:5:-;;;:::i;21976:675:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21976:675:4;;;;;;;;;;;;;;;;;:::i;12091:2330::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12091:2330:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3121:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3121:110:4;-1:-1:-1;;;;;3121:110:4;;:::i;3032:80:5:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4718:327:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4718:327:4;;:::i;6663:1354::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6663:1354:4;;;;;;;;;;;;;:::i;17823:1100::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17823:1100:4;;;;;;;;;;;;;:::i;14427:2269::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;14427:2269:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18929:270::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18929:270:4;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;18929:270:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;18929:270:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;18929:270:4;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;18929:270:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;18929:270:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;18929:270:4;;-1:-1:-1;18929:270:4;-1:-1:-1;18929:270:4;:::i;3880:388:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3880:388:5;;;;;;;;:::i;3242:100::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3242:100:5;-1:-1:-1;;;;;3242:100:5;;:::i;5238:164:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5238:164:4;-1:-1:-1;;;;;5238:164:4;;:::i;10113:991::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;10113:991:4;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;10113:991:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10113:991:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;10113:991:4;;-1:-1:-1;10113:991:4;-1:-1:-1;10113:991:4;:::i;8951:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8951:206:4;-1:-1:-1;;;;;8951:206:4;;:::i;3017:98::-;;;:::i;5051:181::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5051:181:4;-1:-1:-1;;;;;5051:181:4;;:::i;3882:130::-;;;:::i;3670:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3670:206:4;-1:-1:-1;;;;;3670:206:4;;:::i;2941:85:5:-;;;:::i;787:101:0:-;;;:::i;21641:329:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21641:329:4;;;;;;;;:::i;11110:974::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11110:974:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;11110:974:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11110:974:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;11110:974:4;;-1:-1:-1;11110:974:4;-1:-1:-1;11110:974:4;:::i;3130:656:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;3130:656:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3482:182:4:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3482:182:4;;;;;;;;;;;;;;;;;16703:1114;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;16703:1114:4;;;;;;;;;;;;;;;;;;;;;;:::i;4596:116::-;;;:::i;:::-;;;;-1:-1:-1;;;;;4596:116:4;;;;;;;;;;;;;;3346:130;;;:::i;3237:103::-;;;:::i;8023:846::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8023:846:4;-1:-1:-1;;;;;8023:846:4;;:::i;4480:110::-;;;:::i;3626:248:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3626:248:5;;;;;;;;:::i;3118:118::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3118:118:5;;;;;;;;;;:::i;5969:688:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5969:688:4;;;;;;;;;;;;;:::i;4018:254::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4018:254:4;-1:-1:-1;;;;;4018:254:4;;:::i;2306:25::-;;;:::i;4278:196::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4278:196:4;-1:-1:-1;;;;;4278:196:4;;:::i;4792:645:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;4792:645:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2911:100:4:-;;;:::i;5408:554::-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;5538:10;;5524;-1:-1:-1;;;;;5538:10:4;;;5524:24;5516:55;;;;;-1:-1:-1;;;5516:55:4;;;;;;;;;;;;-1:-1:-1;;;5516:55:4;;;;;;;;;;;;;;;5590:10;;;;5589:11;5581:40;;;;;-1:-1:-1;;;5581:40:4;;;;;;;;;;;;-1:-1:-1;;;5581:40:4;;;;;;;;;;;;;;;5639:7;:14;824:1:1;-1:-1:-1;5639:34:4;5631:61;;;;;-1:-1:-1;;;5631:61:4;;;;;;;;;;;;-1:-1:-1;;;5631:61:4;;;;;;;;;;;;;;;5703:10;:17;;-1:-1:-1;;;;5703:17:4;;;5716:4;5703:17;5730:18;5703:17;5730:18;;;5703:10;5776:18;;:53;;5816:13;5776:53;;;1277:10:1;5776:53:4;5759:70;;5840:22;5855:6;5840:14;:22::i;:::-;5872:35;5887:11;5900:6;5872:14;:35::i;:::-;5917:38;5929:4;5935:11;5948:6;5917:11;:38::i;:::-;-1:-1:-1;;2026:6:4;:14;;-1:-1:-1;;2026:14:4;;;-1:-1:-1;5408:554:4:o;2854:81:5:-;2923:5;2916:12;;;;;;;;-1:-1:-1;;2916:12:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2891:13;;2916:12;;2923:5;;2916:12;;2923:5;2916:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2854:81;:::o;3440:180::-;3525:10;3498:4;3514:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3514:27:5;;;;;;;;;;;:33;;;3562:30;;;;;;;3498:4;;3514:27;;3525:10;;-1:-1:-1;;;;;;;;;;;3562:30:5;;;;;;;-1:-1:-1;3609:4:5;3440:180;;;;;:::o;9638:469:4:-;2094:6;;9748:14;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9786:17:4;;;;;;:8;:17;;;;;:23;;;9778:49;;;;;-1:-1:-1;;;9778:49:4;;;;;;;;;;;;-1:-1:-1;;;9778:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9845:18:4;;;;;;:8;:18;;;;;:24;;;9837:50;;;;;-1:-1:-1;;;9837:50:4;;;;;;;;;;;;-1:-1:-1;;;9837:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9923:17:4;;;9897:23;9923:17;;;:8;:17;;;;;;9977:18;;;;;;;10026:16;;;;;10044:15;;;;;10061:17;;;;10080:16;;;;9977:18;;10012:88;;10026:16;;10044:15;10080:16;10012:13;:88::i;:::-;10005:95;9638:469;-1:-1:-1;;;;;9638:469:4:o;9163:::-;2094:6;;9266:14;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9304:17:4;;;;;;:8;:17;;;;;:23;;;9296:49;;;;;-1:-1:-1;;;9296:49:4;;;;;;;;;;;;-1:-1:-1;;;9296:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9363:18:4;;;;;;:8;:18;;;;;:24;;;9355:50;;;;;-1:-1:-1;;;9355:50:4;;;;;;;;;;;;-1:-1:-1;;;9355:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;9441:17:4;;;9415:23;9441:17;;;:8;:17;;;;;;9495:18;;;;;;;9544:16;;;;;9562:15;;;;;9579:17;;;;9598:16;;;;9616:8;;9530:95;;9562:15;9579:17;9598:16;9530:13;:95::i;3348:86:5:-;3415:12;;3348:86;:::o;21976:675:4:-;22076:8;;:32;;;-1:-1:-1;;;22076:32:4;;22097:10;22076:32;;;;;;-1:-1:-1;;22076:8:4;;;-1:-1:-1;;;;;22076:8:4;;:20;;:32;;;;;;;;;;;;;;:8;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;22076:32:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22076:32:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22076:32:4;;:61;;-1:-1:-1;22112:8:4;;:25;;;-1:-1:-1;;;22112:25:4;;-1:-1:-1;;;;;22112:25:4;;;;;;;;;:8;;;;;;;;:20;;:25;;;;;;;;;;;;;;;:8;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;22112:25:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22112:25:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22112:25:4;22076:61;22068:91;;;;;-1:-1:-1;;;22068:91:4;;;;;;;;;;;;-1:-1:-1;;;22068:91:4;;;;;;;;;;;;;;;22177:10;-1:-1:-1;;;;;22177:17:4;;;;:55;;-1:-1:-1;;;;;;22205:15:4;;;;;;:10;:15;;;;;;;;22221:10;22205:27;;;;;;;;22198:34;;;22177:55;22169:89;;;;;-1:-1:-1;;;22169:89:4;;;;;;;;;;;;-1:-1:-1;;;22169:89:4;;;;;;;;;;;;;;;22268:20;22274:3;22279;22284;22268:5;:20::i;:::-;22302:10;-1:-1:-1;;;;;22302:17:4;;;;;;:63;;-1:-1:-1;;;;;;22323:15:4;;;;;;:10;:15;;;;;;;;22339:10;22323:27;;;;;;;;-1:-1:-1;;22323:42:4;;22302:63;22298:235;;;-1:-1:-1;;;;;22416:15:4;;;;;;:10;:15;;;;;;;;22432:10;22416:27;;;;;;;;22411:38;;22445:3;22411:4;:38::i;:::-;-1:-1:-1;;;;;22381:15:4;;;;;;;:10;:15;;;;;;;;22397:10;22381:27;;;;;;;;;;:68;;;22468:54;;;;;;;;;;22397:10;;-1:-1:-1;;;;;;;;;;;22468:54:4;;;;;;;;;22298:235;-1:-1:-1;;;;;22545:20:4;;22560:4;22545:20;22542:82;;22580:33;22599:3;22604;22609;22580:18;:33::i;:::-;-1:-1:-1;22640:4:4;21976:675;;;;;;:::o;12091:2330::-;1860:39;;;;;;;1890:8;1860:39;;;;;;12323:19;;;;1878:10;;-1:-1:-1;;;;;;1869:7:4;;;;12323:19;;1860:39;;;;;12323:19;1890:8;;12323:19;1860:39;1:33:-1;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;-1:-1:-1;;;;;12388:17:4;;1992:13;12388:17;;;:8;:17;;;;;:23;1992:13;12388:23;12380:49;;;;;-1:-1:-1;;;12380:49:4;;;;;;;;;;;;-1:-1:-1;;;12380:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;12447:18:4;;;;;;:8;:18;;;;;:24;;;12439:50;;;;;-1:-1:-1;;;12439:50:4;;;;;;;;;;;;-1:-1:-1;;;12439:50:4;;;;;;;;;;;;;;;12507:11;;;;;;;12499:43;;;;;-1:-1:-1;;;12499:43:4;;;;;;;;;;;;-1:-1:-1;;;12499:43:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;12579:26:4;;;12553:23;12579:26;;;:8;:26;;;;;;12642:27;;;;;;;12710:16;;;;12705:36;;1528:1:1;768:6;1521:8;;12705:4:4;:36::i;:::-;12688:13;:53;;12680:82;;;;;-1:-1:-1;;;12680:82:4;;;;;;;;;;;;-1:-1:-1;;;12680:82:4;;;;;;;;;;;;;;;12773:18;12794:47;12799:13;12814:26;12819:17;12824:8;;12834:1;12819:4;:17::i;:::-;12838:1;12814:4;:26::i;:::-;12794:4;:47::i;:::-;12773:68;;12852:20;12875:165;12902:8;:16;;;12932:8;:15;;;12961:9;:17;;;12992:9;:16;;;13022:8;;12875:13;:165::i;:::-;12852:188;;13077:8;13058:15;:27;;13050:59;;;;;-1:-1:-1;;;13050:59:4;;;;;;;;;;;;-1:-1:-1;;;13050:59:4;;;;;;;;;;;;;;;13137:193;13165:8;:16;;;13195:8;:15;;;13224:9;:17;;;13255:9;:16;;;13285:13;13312:8;;13137:14;:193::i;:::-;13120:210;;13366:12;13348:14;:30;;13340:56;;;;;-1:-1:-1;;;13340:56:4;;;;;;;;;;;;-1:-1:-1;;;13340:56:4;;;;;;;;;;;;;;;13407:15;13425:31;13430:13;13445:10;13425:4;:31::i;:::-;13407:49;;13485:34;13490:8;:16;;;13508:10;13485:4;:34::i;:::-;13466:8;:16;;:53;;;;13549:39;13554:9;:17;;;13573:14;13549:4;:39::i;:::-;13529:17;;;;:59;;;13643:16;;;13673:15;;;;;13733:16;;;;13763:8;;13616:165;;13529:59;13733:16;13616:13;:165::i;:::-;13599:182;;13817:15;13799:14;:33;;13791:61;;;;;-1:-1:-1;;;13791:61:4;;;;;;;;;;;;-1:-1:-1;;;13791:61:4;;;;;;;;;;;;;;;13888:8;13870:14;:26;;13862:54;;;;;-1:-1:-1;;;13862:54:4;;;;;;;;;;;;-1:-1:-1;;;13862:54:4;;;;;;;;;;;;;;;13953:35;13958:13;13973:14;13953:4;:35::i;:::-;13934:15;:54;;13926:82;;;;;-1:-1:-1;;;13926:82:4;;;;;;;;;;;;-1:-1:-1;;;13926:82:4;;;;;;;;;;;;;;;14054:8;-1:-1:-1;;;;;14024:70:4;14045:7;-1:-1:-1;;;;;14024:70:4;14033:10;-1:-1:-1;;;;;14024:70:4;;14064:13;14079:14;14024:70;;;;;;;;;;;;;;;;;;;;;;;;14105:51;14121:7;14130:10;14142:13;14105:15;:51::i;:::-;14166:53;14182:8;14192:10;14204:14;14166:15;:53::i;:::-;14229:57;14245:7;14254:8;;;;;;;;;-1:-1:-1;;;;;14254:8:4;-1:-1:-1;;;;;14254:17:4;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14254:19:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14254:19:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14254:19:4;14275:10;14229:15;:57::i;:::-;14297:67;14309:4;14315:7;14324:8;14334:13;14349:14;14297:11;:67::i;:::-;-1:-1:-1;;;;;2026:6:4;:14;;-1:-1:-1;;2026:14:4;;;12091:2330;;;;-1:-1:-1;12091:2330:4;-1:-1:-1;;;;;12091:2330:4:o;3121:110::-;-1:-1:-1;;;;;3207:11:4;3180:4;3207:11;;;:8;:11;;;;;:17;;;;3121:110::o;3032:80:5:-;3096:9;;;;3032:80;:::o;4718:327:4:-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;4810:10;;1992:13;4810:10;4809:11;4801:40;;;;;-1:-1:-1;;;4801:40:4;;;;;;;;;;;;-1:-1:-1;;;4801:40:4;;;;;;;;;;;;;;;4873:10;;-1:-1:-1;;;;;4873:10:4;4859;:24;4851:55;;;;;-1:-1:-1;;;4851:55:4;;;;;;;;;;;;-1:-1:-1;;;4851:55:4;;;;;;;;;;;;;;;925:12:1;4924:18:4;;;4916:42;;;;;-1:-1:-1;;;4916:42:4;;;;;;;;;;;;-1:-1:-1;;;4916:42:4;;;;;;;;;;;;;;;986:9:1;4976:18:4;;;4968:42;;;;;-1:-1:-1;;;4968:42:4;;;;;;;;;;;;-1:-1:-1;;;4968:42:4;;;;;;;;;;;;;;;5020:8;:18;2026:6;:14;;-1:-1:-1;;2026:14:4;;;4718:327::o;6663:1354::-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;6791:10;;6777;-1:-1:-1;;;;;6791:10:4;;;6777:24;6769:55;;;;;-1:-1:-1;;;6769:55:4;;;;;;;;;;;;-1:-1:-1;;;6769:55:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;6842:15:4;;;;;;:8;:15;;;;;:21;;;6834:47;;;;;-1:-1:-1;;;6834:47:4;;;;;;;;;;;;-1:-1:-1;;;6834:47:4;;;;;;;;;;;;;;;6900:10;;;;6899:11;6891:40;;;;;-1:-1:-1;;;6891:40:4;;;;;;;;;;;;-1:-1:-1;;;6891:40:4;;;;;;;;;;;;;;;768:6:1;6950::4;:20;;6942:47;;;;;-1:-1:-1;;;6942:47:4;;;;;;;;;;;;-1:-1:-1;;;6942:47:4;;;;;;;;;;;;;;;1098:9:1;7007:20:4;;;6999:47;;;;;-1:-1:-1;;;6999:47:4;;;;;;;;;;;;-1:-1:-1;;;6999:47:4;;;;;;;;;;;;;;;1214:13:1;7064:22:4;;;7056:50;;;;;-1:-1:-1;;;7056:50:4;;;;;;;;;;;;-1:-1:-1;;;7056:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;7179:15:4;;7162:14;7179:15;;;:8;:15;;;;;:22;;;7215:18;;;7211:299;;;7264:43;7269:12;;7283:23;7288:6;7296:9;7283:4;:23::i;:::-;7264:4;:43::i;:::-;7249:12;:58;;;1156:9:1;-1:-1:-1;7329:32:4;7321:65;;;;;-1:-1:-1;;;7321:65:4;;;;;;;;;;;;-1:-1:-1;;;7321:65:4;;;;;;;;;;;;;;;7211:299;;;7416:9;7407:6;:18;7403:107;;;7456:43;7461:12;;7475:23;7480:9;7491:6;7475:4;:23::i;:::-;7456:4;:43::i;:::-;7441:12;:58;7403:107;-1:-1:-1;;;;;7519:15:4;;;;;;:8;:15;;;;;:22;;;:31;;;7641:23;;;;7674:33;;;;7721:20;;;7717:294;;;7757:61;7773:5;7780:10;7792:25;7797:7;7806:10;7792:4;:25::i;:::-;7757:15;:61::i;:::-;7717:294;;;7849:10;7839:7;:20;7835:176;;;7875:26;7904:25;7909:10;7921:7;7904:4;:25::i;:::-;7875:54;;7943:57;7959:5;7966:10;7978:21;7943:15;:57::i;:::-;7835:176;;-1:-1:-1;;2026:6:4;:14;;-1:-1:-1;;2026:14:4;;;-1:-1:-1;;;6663:1354:4:o;17823:1100::-;17957:19;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;18000:10;;1992:13;18000:10;17992:40;;;;;-1:-1:-1;;;17992:40:4;;;;;;;;;;;;-1:-1:-1;;;17992:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;18050:18:4;;;;;;:8;:18;;;;;:24;;;18042:50;;;;;-1:-1:-1;;;18042:50:4;;;;;;;;;;;;-1:-1:-1;;;18042:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;18130:18:4;;18103:24;18130:18;;;:8;:18;;;;;18214:17;;;;18245:16;;;;;18275:12;;18301;;18353:8;;18176:195;;18214:17;18245:16;18275:12;18301;18327;;18176:24;:195::i;:::-;18159:212;;18408:12;18390:14;:30;;18382:56;;;;;-1:-1:-1;;;18382:56:4;;;;;;;;;;;;-1:-1:-1;;;18382:56:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;18480:18:4;;;;;;:8;:18;;;;;:26;;;;;18475:47;;768:6:1;1579:8;;1591:5;1578:18;18475:4:4;:47::i;:::-;18457:14;:65;;18449:95;;;;;-1:-1:-1;;;18449:95:4;;;;;;;;;;;;-1:-1:-1;;;18449:95:4;;;;;;;;;;;;;;;18575:39;18580:9;:17;;;18599:14;18575:4;:39::i;:::-;18555:17;;;:59;18630:46;;;;;;;;-1:-1:-1;;;;;18630:46:4;;;18639:10;;18630:46;;;;;;;;;18687:40;18702:10;18714:12;18687:14;:40::i;:::-;18737:28;18752:12;18737:14;:28::i;:::-;18776:53;18792:8;18802:10;18814:14;18776:15;:53::i;:::-;18840:44;18852:5;18859:10;18871:12;18840:11;:44::i;:::-;-1:-1:-1;2026:6:4;:14;;-1:-1:-1;;2026:14:4;;;17823:1100;;-1:-1:-1;;;17823:1100:4:o;14427:2269::-;1860:39;;;;;;;1890:8;1860:39;;;;;;14660:18;;;;1878:10;;-1:-1:-1;;;;;;1869:7:4;;;;14660:18;;1860:39;;;;;14660:18;1890:8;;14660:18;1860:39;1:33:-1;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;-1:-1:-1;;;;;14723:17:4;;1992:13;14723:17;;;:8;:17;;;;;:23;1992:13;14723:23;14715:49;;;;;-1:-1:-1;;;14715:49:4;;;;;;;;;;;;-1:-1:-1;;;14715:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;14782:18:4;;;;;;:8;:18;;;;;:24;;;14774:50;;;;;-1:-1:-1;;;14774:50:4;;;;;;;;;;;;-1:-1:-1;;;14774:50:4;;;;;;;;;;;;;;;14842:11;;;;;;;14834:43;;;;;-1:-1:-1;;;14834:43:4;;;;;;;;;;;;-1:-1:-1;;;14834:43:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;14914:26:4;;;14888:23;14914:26;;;:8;:26;;;;;;14977:27;;;;;;;15046:17;;;;;15041:38;;768:6:1;1579:8;;15041:38:4;15023:14;:56;;15015:86;;;;;-1:-1:-1;;;15015:86:4;;;;;;;;;;;;-1:-1:-1;;;15015:86:4;;;;;;;;;;;;;;;15112:20;15135:165;15162:8;:16;;;15192:8;:15;;;15221:9;:17;;;15252:9;:16;;;15282:8;;15135:13;:165::i;:::-;15112:188;;15337:8;15318:15;:27;;15310:59;;;;;-1:-1:-1;;;15310:59:4;;;;;;;;;;;;-1:-1:-1;;;15310:59:4;;;;;;;;;;;;;;;15396:194;15424:8;:16;;;15454:8;:15;;;15483:9;:17;;;15514:9;:16;;;15544:14;15572:8;;15396:14;:194::i;:::-;15380:210;;15625:11;15608:13;:28;;15600:53;;;;;-1:-1:-1;;;15600:53:4;;;;;;;;;;;;-1:-1:-1;;;15600:53:4;;;;;;;;;;;;;;;15664:18;15685:47;15690:13;15705:26;15710:17;15715:8;;15725:1;15710:4;:17::i;15685:47::-;15664:68;;15762:34;15767:8;:16;;;15785:10;15762:4;:34::i;:::-;15743:8;:16;;:53;;;;15826:39;15831:9;:17;;;15850:14;15826:4;:39::i;:::-;15806:17;;;;:59;;;15920:16;;;15950:15;;;;;16010:16;;;;16040:8;;15893:165;;15806:59;16010:16;15893:13;:165::i;:::-;15876:182;;16094:15;16076:14;:33;;16068:61;;;;;-1:-1:-1;;;16068:61:4;;;;;;;;;;;;-1:-1:-1;;;16068:61:4;;;;;;;;;;;;;;;16165:8;16147:14;:26;;16139:54;;;;;-1:-1:-1;;;16139:54:4;;;;;;;;;;;;-1:-1:-1;;;16139:54:4;;;;;;;;;;;;;;;16230:35;16235:13;16250:14;16230:4;:35::i;:::-;16211:15;:54;;16203:82;;;;;-1:-1:-1;;;16203:82:4;;;;;;;;;;;;-1:-1:-1;;;16203:82:4;;;;;;;;;;;;;;;16331:8;-1:-1:-1;;;;;16301:70:4;16322:7;-1:-1:-1;;;;;16301:70:4;16310:10;-1:-1:-1;;;;;16301:70:4;;16341:13;16356:14;16301:70;;;;;;;;;;;;;;;;;;;;;;;;16382:51;16398:7;16407:10;16419:13;16382:15;:51::i;:::-;16443:53;16459:8;16469:10;16481:14;16443:15;:53::i;:::-;16506:57;16522:7;16531:8;;;;;;;;;-1:-1:-1;;;;;16531:8:4;-1:-1:-1;;;;;16531:17:4;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16531:19:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16531:19:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16531:19:4;16552:10;16506:15;:57::i;:::-;16574:67;16586:4;16592:7;16601:8;16611:13;16626:14;16574:11;:67::i;:::-;-1:-1:-1;;;;2026:6:4;:14;;-1:-1:-1;;2026:14:4;;;14427:2269;;;;-1:-1:-1;14427:2269:4;-1:-1:-1;;;;;14427:2269:4:o;18929:270::-;19052:10;;-1:-1:-1;;;;;19052:10:4;19038;:24;19030:55;;;;;-1:-1:-1;;;19030:55:4;;;;;;;;;;;;-1:-1:-1;;;19030:55:4;;;;;;;;;;;;;;;19107:5;;-1:-1:-1;;;;;19107:5:4;19099:28;19095:98;;19151:5;;:31;;;-1:-1:-1;;;19151:31:4;;;;;;;;;;;;;;-1:-1:-1;;;;;19151:5:4;;;;:18;;19170:3;;;;19175:6;;;;19151:31;;;;;;;;;19170:3;19151:31;;;;19170:3;19151:31;1:33:-1;99:1;81:16;;;74:27;137:4;117:14;-1:-1;;113:30;157:16;;;19151:31:4;;;;;;;;;;;;;-1:-1:-1;19151:31:4;;;;;;;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;19151:31:4;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19151:31:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19151:31:4;;;;19095:98;18929:270;;;;:::o;3880:388:5:-;3990:10;3947:4;3979:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3979:27:5;;;;;;;;;;4020:14;;;4016:156;;;4061:10;4080:1;4050:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4050:27:5;;;;;;;;;:31;4016:156;;;4142:19;4147:8;4157:3;4142:4;:19::i;:::-;4123:10;4112:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4112:27:5;;;;;;;;;:49;4016:156;4195:10;4212:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4186:54:5;;4212:27;;;;;;;;;;;4186:54;;;;;;;;;4195:10;-1:-1:-1;;;;;;;;;;;4186:54:5;;;;;;;;;;-1:-1:-1;4257:4:5;;3880:388;-1:-1:-1;;;3880:388:5:o;3242:100::-;-1:-1:-1;;;;;3321:14:5;3298:4;3321:14;;;;;;;;;;;;3242:100::o;5238:164:4:-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;5340:10;;5326;-1:-1:-1;;;;;5340:10:4;;;5326:24;5318:55;;;;;-1:-1:-1;;;5318:55:4;;;;;;;;;;;;-1:-1:-1;;;5318:55:4;;;;;;;;;;;;;;;5383:5;:12;;-1:-1:-1;;;;;;5383:12:4;-1:-1:-1;;;;;5383:12:4;;;;;;;;;;2026:6;:14;;-1:-1:-1;;2026:14:4;;;5238:164::o;10113:991::-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;10259:10;;1992:13;10259:10;10251:40;;;;;-1:-1:-1;;;10251:40:4;;;;;;;;;;;;-1:-1:-1;;;10251:40:4;;;;;;;;;;;;;;;10302:14;10319:13;:11;:13::i;:::-;10302:30;;10342:10;10355:30;10360:13;10375:9;10355:4;:30::i;:::-;10342:43;-1:-1:-1;10403:10:4;10395:38;;;;;-1:-1:-1;;;10395:38:4;;;;;;;;;;;;-1:-1:-1;;;10395:38:4;;;;;;;;;;;;;;;10449:6;10444:507;10465:7;:14;10461:18;;10444:507;;;10500:9;10512:7;10520:1;10512:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10512:10:4;10547:11;;;:8;:11;;;;;;:19;;;10512:10;;-1:-1:-1;10547:19:4;10601:16;10606:5;10547:19;10601:4;:16::i;:::-;10580:37;-1:-1:-1;10639:18:4;10631:46;;;;;-1:-1:-1;;;10631:46:4;;;;;;;;;;;;-1:-1:-1;;;10631:46:4;;;;;;;;;;;;;;;10716:12;;10729:1;10716:15;;;;;;;;;;;;;10699:13;:32;;10691:57;;;;;-1:-1:-1;;;10691:57:4;;;;;;;;;;;;-1:-1:-1;;;10691:57:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10789:11:4;;;;;;:8;:11;;;;;:19;;;10784:40;;10810:13;10784:4;:40::i;:::-;-1:-1:-1;;;;;10762:11:4;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;10843:38;;;;;;;10762:11;;10852:10;;10843:38;;;;;;;;;;10895:45;10911:1;10914:10;10926:13;10895:15;:45::i;:::-;-1:-1:-1;;;10481:3:4;;10444:507;;;;10960:29;10975:13;10960:14;:29::i;:::-;10999:42;11014:11;11027:13;10999:14;:42::i;:::-;11052:45;11064:4;11070:11;11083:13;11052:11;:45::i;:::-;-1:-1:-1;;2026:6:4;:14;;-1:-1:-1;;2026:14:4;;;-1:-1:-1;;;;10113:991:4:o;8951:206::-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;-1:-1:-1;;;;;9037:15:4;;1992:13;9037:15;;;:8;:15;;;;;:21;1992:13;9037:21;9029:47;;;;;-1:-1:-1;;;9029:47:4;;;;;;;;;;;;-1:-1:-1;;;9029:47:4;;;;;;;;;;;;;;;9112:38;;;-1:-1:-1;;;9112:38:4;;9144:4;9112:38;;;;;;-1:-1:-1;;;;;9112:23:4;;;;;:38;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9112:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9112:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9112:38:4;-1:-1:-1;;;;;9086:15:4;;;;;;;:8;9112:38;9086:15;;;;:23;;:64;2026:6;:14;;-1:-1:-1;;2026:14:4;;;8951:206::o;3017:98::-;3098:10;;;;3017:98;:::o;5051:181::-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;5162:10;;5148;-1:-1:-1;;;;;5162:10:4;;;5148:24;5140:55;;;;;-1:-1:-1;;;5140:55:4;;;;;;;;;;;;-1:-1:-1;;;5140:55:4;;;;;;;;;;;;;;;5205:10;:20;;-1:-1:-1;;;;;;5205:20:4;-1:-1:-1;;;;;5205:20:4;;;;;;;;;;2026:6;:14;;-1:-1:-1;;2026:14:4;;;5051:181::o;3882:130::-;2094:6;;3966:4;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;;-1:-1:-1;3993:12:4;;3882:130;:::o;3670:206::-;2094:6;;3762:4;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;3791:15:4;;;;;;:8;:15;;;;;:21;;;3783:47;;;;;-1:-1:-1;;;3783:47:4;;;;;;;;;;;;-1:-1:-1;;;3783:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3847:15:4;;;;;:8;:15;;;;;:22;;;;3670:206::o;2941:85:5:-;3012:7;3005:14;;;;;;;;-1:-1:-1;;3005:14:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2980:13;;3005:14;;3012:7;;3005:14;;3012:7;3005:14;;;;;;;;;;;;;;;;;;;;;;;;787:101:0;-1:-1:-1;;;787:101:0;:::o;21641:329:4:-;21724:8;;:32;;;-1:-1:-1;;;21724:32:4;;21745:10;21724:32;;;;;;-1:-1:-1;;21724:8:4;;;-1:-1:-1;;;;;21724:8:4;;:20;;:32;;;;;;;;;;;;;;:8;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;21724:32:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21724:32:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21724:32:4;;:61;;-1:-1:-1;21760:8:4;;:25;;;-1:-1:-1;;;21760:25:4;;-1:-1:-1;;;;;21760:25:4;;;;;;;;;:8;;;;;;;;:20;;:25;;;;;;;;;;;;;;;:8;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;21760:25:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21760:25:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21760:25:4;21724:61;21716:91;;;;;-1:-1:-1;;;21716:91:4;;;;;;;;;;;;-1:-1:-1;;;21716:91:4;;;;;;;;;;;;;;;21817:27;21823:10;21835:3;21840;21817:5;:27::i;:::-;-1:-1:-1;;;;;21857:20:4;;21872:4;21857:20;21854:89;;21892:40;21911:10;21923:3;21928;21892:18;:40::i;:::-;-1:-1:-1;21959:4:4;21641:329;;;;:::o;11110:974::-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;11235:10;;1992:13;11235:10;11227:40;;;;;-1:-1:-1;;;11227:40:4;;;;;;;;;;;;-1:-1:-1;;;11227:40:4;;;;;;;;;;;;;;;11278:14;11295:13;:11;:13::i;:::-;11278:30;;11318:10;11331:29;11336:12;11350:9;11331:4;:29::i;:::-;11318:42;-1:-1:-1;11378:10:4;11370:38;;;;;-1:-1:-1;;;11370:38:4;;;;;;;;;;;;-1:-1:-1;;;11370:38:4;;;;;;;;;;;;;;;11419:40;11434:10;11446:12;11419:14;:40::i;:::-;11469:28;11484:12;11469:14;:28::i;:::-;11513:6;11508:515;11529:7;:14;11525:18;;11508:515;;;11564:9;11576:7;11584:1;11576:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11576:10:4;11611:11;;;:8;:11;;;;;;:19;;;11576:10;;-1:-1:-1;11611:19:4;11666:16;11671:5;11611:19;11666:4;:16::i;:::-;11644:38;-1:-1:-1;11704:19:4;11696:47;;;;;-1:-1:-1;;;11696:47:4;;;;;;;;;;;;-1:-1:-1;;;11696:47:4;;;;;;;;;;;;;;;11783:13;;11797:1;11783:16;;;;;;;;;;;;;11765:14;:34;;11757:60;;;;;-1:-1:-1;;;11757:60:4;;;;;;;;;;;;-1:-1:-1;;;11757:60:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;11858:11:4;;;;;;:8;:11;;;;;:19;;;11853:41;;11879:14;11853:4;:41::i;:::-;-1:-1:-1;;;;;11831:11:4;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;11913:39;;;;;;;11831:11;;11922:10;;11913:39;;;;;;;;;;11966:46;11982:1;11985:10;11997:14;11966:15;:46::i;:::-;-1:-1:-1;;;11545:3:4;;11508:515;;;;12033:44;12045:5;12052:10;12064:12;12033:11;:44::i;3130:656:2:-;3355:19;3390:16;3409:35;3414:13;3429:14;3409:4;:35::i;:::-;3390:54;;3454:15;3472:19;768:6:1;3483:7:2;3472:4;:19::i;:::-;3454:37;;3514:31;3519:13;3534:10;3514:4;:31::i;:::-;3501:44;;3555:6;3564:54;3569:14;3585:32;3590:14;3606:10;3585:4;:32::i;:::-;3564:4;:54::i;:::-;3555:63;;3628:8;3639:20;3644:1;3647:11;3639:4;:20::i;:::-;3628:31;;3669:8;3680:15;768:6:1;3691:3:2;3680:4;:15::i;:::-;3669:26;;3722;3727:15;3744:3;3722:4;:26::i;:::-;3705:43;3130:656;-1:-1:-1;;;;;;;;;;;;3130:656:2:o;3482:182:4:-;2094:6;;3554:23;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;;3601:10;;;;3593:40;;;;;-1:-1:-1;;;3593:40:4;;;;;;;;;;;;-1:-1:-1;;;3593:40:4;;;;;;;;;;;;;;;3650:7;3643:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3643:14:4;;;;;;;;;;;;;;;;;;;;;;3482:182;:::o;16703:1114::-;16864:18;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;16906:10;;1992:13;16906:10;16898:40;;;;;-1:-1:-1;;;16898:40:4;;;;;;;;;;;;-1:-1:-1;;;16898:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;16956:17:4;;;;;;:8;:17;;;;;:23;;;16948:49;;;;;-1:-1:-1;;;16948:49:4;;;;;;;;;;;;-1:-1:-1;;;16948:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;17037:17:4;;;;;;:8;:17;;;;;:25;;;17032:45;;1528:1:1;768:6;1521:8;;17032:45:4;17015:13;:62;;17007:91;;;;;-1:-1:-1;;;17007:91:4;;;;;;;;;;;;-1:-1:-1;;;17007:91:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;17135:17:4;;17109:23;17135:17;;;:8;:17;;;;;17217:16;;;;17247:15;;;;;17276:12;;17302;;17355:8;;17179:194;;17217:16;17247:15;17276:12;17302;17328:13;;17179:24;:194::i;:::-;17163:210;;17409:16;17392:13;:33;;17384:59;;;;;-1:-1:-1;;;17384:59:4;;;;;;;;;;;;-1:-1:-1;;;17384:59:4;;;;;;;;;;;;;;;17473:37;17478:8;:16;;;17496:13;17473:4;:37::i;:::-;17454:16;;;:56;17526:44;;;;;;;;-1:-1:-1;;;;;17526:44:4;;;17535:10;;17526:44;;;;;;;;;17581:29;17596:13;17581:14;:29::i;:::-;17620:42;17635:11;17648:13;17620:14;:42::i;:::-;17672:51;17688:7;17697:10;17709:13;17672:15;:51::i;:::-;17734:45;17746:4;17752:11;17765:13;17734:11;:45::i;:::-;-1:-1:-1;2026:6:4;:14;;-1:-1:-1;;2026:14:4;;;16703:1114;;-1:-1:-1;;;;16703:1114:4:o;4596:116::-;2094:6;;4661:7;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;;-1:-1:-1;4699:5:4;;-1:-1:-1;;;;;4699:5:4;4596:116;:::o;3346:130::-;2094:6;;3416:23;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;3237:103;3319:7;:14;3237:103;:::o;8023:846::-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;1960:6;;;;;;;1959:7;1951:31;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;-1:-1:-1;;;1951:31:4;;;;;;;;;;;;;;;1992:6;:13;;-1:-1:-1;;1992:13:4;;;;;8126:10;;8112;-1:-1:-1;;;;;8126:10:4;;;8112:24;8104:55;;;;;-1:-1:-1;;;8104:55:4;;;;;;;;;;;;-1:-1:-1;;;8104:55:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;8177:15:4;;;;;;:8;:15;;;;;:21;;;8169:47;;;;;-1:-1:-1;;;8169:47:4;;;;;;;;;;;;-1:-1:-1;;;8169:47:4;;;;;;;;;;;;;;;8235:10;;;;8234:11;8226:40;;;;;-1:-1:-1;;;8226:40:4;;;;;;;;;;;;-1:-1:-1;;;8226:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;8297:15:4;;8277:17;8297:15;;;:8;:15;;;;;:23;;;;8350:12;;8364:22;;;;;8297:23;;8345:42;;:4;:42::i;:::-;8330:12;:57;-1:-1:-1;;;;;8506:15:4;;8493:10;8506:15;;;:8;:15;;;;;:21;;;8549:7;:14;;-1:-1:-1;;8549:18:4;;;:7;:18;;8594:13;;;;;;;;;;;;;;;;8577:7;:14;;-1:-1:-1;;;;;8594:13:4;;;;8585:5;;8577:14;;;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;8577:30:4;;;;;-1:-1:-1;;;;;8577:30:4;;;;;;8650:5;8617:8;:24;8626:7;8634:5;8626:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8626:14:4;8617:24;;;;;;;;;;;;8626:14;8617:30;:38;8665:7;:13;;;;;;;;;;;;;;;-1:-1:-1;;8665:13:4;;;;;;;-1:-1:-1;;;;;;8665:13:4;;;;;;;;;8706:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8688:15:4;;;;:8;:15;;;;;;;:115;;;;-1:-1:-1;;8688:115:4;;;;;;;;;-1:-1:-1;8688:115:4;;;;;;;;;;;;;;8814:48;8688:15;8837:10;8849:12;8814:15;:48::i;:::-;-1:-1:-1;;2026:6:4;:14;;-1:-1:-1;;2026:14:4;;;-1:-1:-1;;8023:846:4:o;4480:110::-;2094:6;;4548:4;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;;-1:-1:-1;4575:8:4;;4480:110;:::o;3626:248:5:-;3755:10;3693:4;3744:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3744:27:5;;;;;;;;;;3739:38;;3773:3;3739:4;:38::i;:::-;3720:10;3709:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3709:27:5;;;;;;;;;;;;:68;;;3792:54;;;;;;3709:27;;-1:-1:-1;;;;;;;;;;;3792:54:5;;;;;;;;;;-1:-1:-1;3863:4:5;3626:248;;;;:::o;3118:118::-;-1:-1:-1;;;;;3209:15:5;;;3186:4;3209:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;3118:118::o;5969:688:4:-;1878:10;-1:-1:-1;;;;;1860:39:4;1869:7;;-1:-1:-1;;;;;;1869:7:4;-1:-1:-1;;;;;1860:39:4;;1890:8;;1860:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1860:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1860:39:4;;;;-1:-1:-1;1860:39:4;;-1:-1:-1;;;;1860:39:4;6164:10;;-1:-1:-1;;;;;6164:10:4;6150;:24;6142:55;;;;;-1:-1:-1;;;6142:55:4;;;;;;;;;;;;-1:-1:-1;;;6142:55:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;6216:15:4;;;;;;:8;:15;;;;;:21;;;6215:22;6207:47;;;;;-1:-1:-1;;;6207:47:4;;;;;;;;;;;;-1:-1:-1;;;6207:47:4;;;;;;;;;;;;;;;6273:10;;;;6272:11;6264:40;;;;;-1:-1:-1;;;6264:40:4;;;;;;;;;;;;-1:-1:-1;;;6264:40:4;;;;;;;;;;;;;;;6323:7;:14;874:1:1;-1:-1:-1;6315:60:4;;;;;-1:-1:-1;;;6315:60:4;;;;;;;;;;;;-1:-1:-1;;;6315:60:4;;;;;;;;;;;;;;;6404:177;;;;;;;;6428:4;6404:177;;;6449:7;:14;;6404:177;;;;;;;-1:-1:-1;6404:177:4;;;;;;;;;;;;-1:-1:-1;;;;;6386:15:4;;;;;:8;:15;;;;;;:195;;;;-1:-1:-1;;6386:195:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;6591:19:4;;;;;;;-1:-1:-1;;;;;;6591:19:4;;;;;;6620:30;6386:15;6634:7;6643:6;6620;:30::i;:::-;5969:688;;;:::o;4018:254::-;2094:6;;4108:4;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4137:15:4;;;;;;:8;:15;;;;;:21;;;4129:47;;;;;-1:-1:-1;;;4129:47:4;;;;;;;;;;;;-1:-1:-1;;;4129:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4200:15:4;;4186:11;4200:15;;;:8;:15;;;;;:22;;;4252:12;;4239:26;;4200:22;;4239:4;:26::i;2306:25::-;;;-1:-1:-1;;;;;2306:25:4;;:::o;4278:196::-;2094:6;;4359:4;;2094:6;;;;;2093:7;2085:31;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;-1:-1:-1;;;2085:31:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4388:15:4;;;;;;:8;:15;;;;;:21;;;4380:47;;;;;-1:-1:-1;;;4380:47:4;;;;;;;;;;;;-1:-1:-1;;;4380:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4444:15:4;;;;;:8;:15;;;;;:23;;;;4278:196::o;4792:645:2:-;5018:18;5052:16;5071:35;5076:14;5092:13;5071:4;:35::i;:::-;5052:54;;5116:9;5128:37;5133:15;5150:14;5128:4;:37::i;:::-;5116:49;;5175:6;5184:27;5189:15;5206:4;5184;:27::i;:::-;5175:36;;5221:8;5232:20;5237:1;5240:11;5232:4;:20::i;:::-;5221:31;;5268:15;5273:3;768:6:1;5268:4:2;:15::i;:::-;5262:21;;5309:19;768:6:1;5320:7:2;5309:4;:19::i;:::-;5293:35;;5354:46;5359:25;5364:14;5380:3;5359:4;:25::i;:::-;5386:13;5354:4;:46::i;:::-;5338:62;4792:645;-1:-1:-1;;;;;;;;;;;4792:645:2:o;2911:100:4:-;2993:11;;;;;;;;2911:100::o;19891:84::-;19955:13;19961:6;19955:5;:13::i;:::-;19891:84;:::o;19785:100::-;19861:17;19867:2;19871:6;19861:5;:17::i;:::-;19785:100;;:::o;20071:865::-;20171:5;;-1:-1:-1;;;;;20171:5:4;20163:28;20159:165;;20222:4;20215:11;;;;:98;;20271:5;;:42;;;-1:-1:-1;;;20271:42:4;;:5;:42;;;;;;-1:-1:-1;;;;;20271:42:4;;;;;;;;;;;;;;;:5;;;;;:21;;:42;;;;;;;;;;:5;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;20271:42:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20271:42:4;;;;20215:98;;;20229:5;;:39;;;-1:-1:-1;;;20229:39:4;;:5;:39;;;;;;-1:-1:-1;;;;;20229:39:4;;;;;;;;;;;;;;;:5;;;;;:18;;:39;;;;;;;;;;:5;;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;20229:39:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20229:39:4;;;;20215:98;20360:8;;:20;;;-1:-1:-1;;;20360:20:4;;;;20335:19;;20360:8;;;-1:-1:-1;;;;;20360:8:4;;:18;;:20;;;;;;;;;;;20335:19;20360:8;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;20360:20:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20360:20:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20360:20:4;;-1:-1:-1;;;;;;20394:25:4;;;20390:539;;20536:7;:14;20522:29;;;;;;;;;;;;;;;;20468:11;;20494:25;;20522:29;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;20522:29:4;;20494:57;;20565:24;20606:7;:14;;;;20592:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;20592:29:4;-1:-1:-1;20565:56:4;-1:-1:-1;20640:6:4;20635:195;20656:7;:14;20652:18;;20635:195;;;20709:8;:20;20718:7;20726:1;20718:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20718:10:4;20709:20;;;;;;;;;;;;:28;;;20695:11;;:8;;20704:1;;20695:11;;;;;;;;;;;:42;;;;;20768:47;20773:8;:20;20782:7;20790:1;20782:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20782:10:4;20773:20;;;;;;;;;;;;:27;;;20802:12;;20768:4;:47::i;:::-;20755:7;20763:1;20755:10;;;;;;;;;;;;;;;;;:60;20672:3;;20635:195;;;;20844:6;-1:-1:-1;;;;;20844:27:4;;20872:4;20878:7;20887:8;20897:7;20906:6;20914:3;20844:74;;;;;;;;;;;;;-1:-1:-1;;;;;20844:74:4;-1:-1:-1;;;;;20844:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20844:74:4;;;;;;;;;;;;;;;;-1:-1:-1;;20844:74:4;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20844:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20844:74:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20844:74:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20844:74:4;;;;20390:539;;;20071:865;;;;:::o;1636:488:2:-;1834:14;1864:10;1877:35;1882:14;1898:13;1877:4;:35::i;:::-;1864:48;;1922:10;1935:37;1940:15;1957:14;1935:4;:37::i;:::-;1922:50;;1982:10;1995:18;2000:5;2007;1995:4;:18::i;:::-;1982:31;;2023:10;2036:31;768:6:1;2047:19:2;768:6:1;2058:7:2;2047:4;:19::i;2036:31::-;2023:44;;2098:18;2103:5;2110;2098:4;:18::i;:::-;2086:30;1636:488;-1:-1:-1;;;;;;;;;;1636:488:2:o;2205:268:5:-;-1:-1:-1;;;;;2283:13:5;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;2283:20:5;2275:53;;;;;-1:-1:-1;;;2275:53:5;;;;;;;;;;;;-1:-1:-1;;;2275:53:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;2359:13:5;;:8;:13;;;;;;;;;;;2354:24;;2374:3;2354:4;:24::i;:::-;-1:-1:-1;;;;;2338:13:5;;;:8;:13;;;;;;;;;;;:40;;;;2409:13;;;;;;;2404:24;;2424:3;2404:4;:24::i;:::-;-1:-1:-1;;;;;2388:13:5;;;:8;:13;;;;;;;;;;;;:40;;;;2443:23;;;;;;;2388:13;;2443:23;;;;;;;;;;;;;2205:268;;;:::o;1104:187:3:-;1165:4;1186:6;1194:9;1207:14;1216:1;1219;1207:8;:14::i;:::-;1185:36;;;;1240:4;1239:5;1231:35;;;;;-1:-1:-1;;;1231:35:3;;;;;;;;;;;;-1:-1:-1;;;1231:35:3;;;;;;;;;;;;;;;-1:-1:-1;1283:1:3;1104:187;-1:-1:-1;;;1104:187:3:o;21343:292:4:-;21452:8;;:20;;;-1:-1:-1;;;21452:20:4;;;;21427:19;;21452:8;;;-1:-1:-1;;;;;21452:8:4;;:18;;:20;;;;;;;;;;;21427:19;21452:8;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;21452:20:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21452:20:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21452:20:4;;-1:-1:-1;;;;;;21486:25:4;;;21482:147;;21577:41;;;-1:-1:-1;;;21577:41:4;;-1:-1:-1;;;;;21577:41:4;;;;;;;;;;;;;;;;;;;;;;21551:11;;21577:26;;;;;:41;;;;;21526:14;;21577:41;;;;;;;21526:14;21577:26;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;21577:41:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21577:41:4;;;;21482:147;21343:292;;;;:::o;1509:293:3:-;1570:4;1600:5;;;1623:6;;;:21;;;1643:1;1638;1633:2;:6;;;;;;:11;1623:21;1615:50;;;;;-1:-1:-1;;;1615:50:3;;;;;;;;;;;;-1:-1:-1;;;1615:50:3;;;;;;;;;;;;;;;1691:8;1685:15;;1718:8;;;;1710:37;;;;;-1:-1:-1;;;1710:37:3;;;;;;;;;;;;-1:-1:-1;;;1710:37:3;;;;;;;;;;;;;;;1757:7;768:6:1;1767:2:3;:9;;;1509:293;-1:-1:-1;;;;;;1509:293:3:o;1808:368::-;1869:4;1897:6;1889:31;;;;;-1:-1:-1;;;1889:31:3;;;;;;;;;;;;-1:-1:-1;;;1889:31:3;;;;;;;;;;;;;;;768:6:1;1940:8:3;;1966:6;;;:24;;;768:6:1;1981:1:3;1976:2;:6;;;;;;:14;1966:24;1958:53;;;;;-1:-1:-1;;;1958:53:3;;;;;;;;;;;;-1:-1:-1;;;1958:53:3;;;;;;;;;;;;;;;2058:1;2054:5;;2048:12;;2078:8;;;;2070:37;;;;;-1:-1:-1;;;2070:37:3;;;;;;;;;;;;-1:-1:-1;;;2070:37:3;;;;;;;;;;;;;;;2134:7;2149:1;2144:2;:6;;;;933:165;994:4;1023:5;;;1046:6;;;;1038:35;;;;;-1:-1:-1;;;1038:35:3;;;;;;;;;;;;-1:-1:-1;;;1038:35:3;;;;;;;;;;;;;;19364:161:4;19458:60;19482:5;19490:4;19504;19511:6;19458:16;:60::i;19531:138::-;19623:39;19643:5;19651:2;19655:6;19623:12;:39::i;20942:395::-;21114:8;;:20;;;-1:-1:-1;;;21114:20:4;;;;21089:21;;21114:8;;;-1:-1:-1;;;;;21114:8:4;;:18;;:20;;;;;;;;;;;21089:21;21114:8;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;21114:20:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21114:20:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21114:20:4;;;;-1:-1:-1;;;;;;21148:27:4;;;21144:187;;21243:77;;;-1:-1:-1;;;21243:77:4;;-1:-1:-1;;;;;21243:77:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21215:13;;21243:21;;;;;:77;;;;;21190:14;;21243:77;;;;;;;21190:14;21243:21;:77;;;5:2:-1;;;;30:1;27;20:12;21144:187:4;20942:395;;;;;;:::o;8682:1205:2:-;8912:19;8947:21;8971:33;8976:14;8992:11;8971:4;:33::i;:::-;8947:57;;9109:29;9141:24;9146:12;768:6:1;9141:4:2;:24::i;:::-;9109:56;;9175:18;9196:42;9201:10;9213:24;9196:4;:42::i;:::-;9175:63;;9248:14;9265:31;9270:13;9285:10;9265:4;:31::i;:::-;9248:48;;9361:18;9382:45;9387:9;9398:28;768:6:1;9409:16:2;9398:4;:28::i;:::-;9382:4;:45::i;:::-;9361:66;;9437:23;9463:36;9468:13;9483:15;9463:4;:36::i;:::-;9437:62;;9510:32;9545:41;9550:15;9567:18;9545:4;:41::i;:::-;9510:76;;9718:8;9729:43;9734:28;768:6:1;9745:16:2;9734:4;:28::i;:::-;9764:7;9729:4;:43::i;:::-;9718:54;;9799:50;9804:27;9833:15;768:6:1;9844:3:2;9833:4;:15::i;9799:50::-;9782:67;8682:1205;-1:-1:-1;;;;;;;;;;;;;;;8682:1205:2:o;19675:104:4:-;19753:19;19759:4;19765:6;19753:5;:19::i;19981:84::-;20045:13;20051:6;20045:5;:13::i;2649:526:3:-;2715:4;1337:5:1;2743:4:3;:21;;2735:55;;;;;-1:-1:-1;;;2735:55:3;;;;;;;;;;;;-1:-1:-1;;;2735:55:3;;;;;;;;;;;;;;;1391:18:1;2808:21:3;;;2800:56;;;;;-1:-1:-1;;;2800:56:3;;;;;;;;;;;;-1:-1:-1;;;2800:56:3;;;;;;;;;;;;;;;2867:10;2881:11;2888:3;2881:6;:11::i;:::-;2867:25;;2902:11;2916:16;2921:3;2926:5;2916:4;:16::i;:::-;2902:30;;2943:13;2959:24;2965:4;2971:11;2976:5;2971:4;:11::i;:::-;2959:5;:24::i;:::-;2943:40;-1:-1:-1;2998:11:3;2994:57;;3032:8;-1:-1:-1;3025:15:3;;-1:-1:-1;;3025:15:3;2994:57;3061:18;3082:40;3093:4;3099:6;1458:13:1;3082:10:3;:40::i;:::-;3061:61;;3139:29;3144:8;3154:13;3139:4;:29::i;:::-;3132:36;2649:526;-1:-1:-1;;;;;;;2649:526:3:o;6443:1133:2:-;6672:18;6950:21;6974:32;6979:13;6994:11;6974:4;:32::i;:::-;6950:56;;7016:8;7027:43;7032:28;768:6:1;7043:16:2;7032:4;:28::i;:::-;7062:7;7027:4;:43::i;:::-;7016:54;;7080:26;7109:36;7114:13;7129:15;768:6:1;7140:3:2;7129:4;:15::i;7109:36::-;7080:65;;7156:22;7181:43;7186:14;7202:21;7181:4;:43::i;:::-;7156:68;;7234:17;7254:39;7259:17;7278:14;7254:4;:39::i;:::-;7234:59;;7371:14;7388:36;7393:12;7407:16;7388:4;:36::i;:::-;7371:53;;7434:18;7455:27;7460:9;7471:10;7455:4;:27::i;:::-;7434:48;;7508:31;7513:13;7528:10;7508:4;:31::i;:::-;7492:47;6443:1133;-1:-1:-1;;;;;;;;;;;;;;6443:1133:2:o;1692:214:5:-;1784:4;1767:8;:23;;;;;;;;;;;1762:34;;1792:3;1762:4;:34::i;:::-;1753:4;1736:8;:23;;;;;;;;;;:60;1826:12;;1821:23;;1840:3;1821:4;:23::i;:::-;1806:12;:38;1859:40;;;;;;;;1888:4;;1876:1;;1859:40;;;;;;;;;1692:214;:::o;2479:92::-;2535:29;2549:4;2556:2;2560:3;2535:5;:29::i;1297:206:3:-;1362:4;1368;1397:1;1392;:6;1388:109;;-1:-1:-1;;1422:5:3;;;1429;1414:21;;1388:109;-1:-1:-1;;1474:5:3;;;1481:4;1388:109;1297:206;;;;;:::o;5285:408:5:-;5407:69;;;-1:-1:-1;;;;;5407:69:5;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;5407:69:5;;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;5512:59:5;;;;;;;;;;;-1:-1:-1;;;5512:59:5;;;;5407:69;5387:17;;5512:59;;5430:5;;5407:69;;5512:12;:59::i;:::-;5585:17;;5486:85;;-1:-1:-1;5585:21:5;5581:106;;5641:10;5630:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5630:30:5;5622:54;;;;;-1:-1:-1;;;5622:54:5;;;;;;;;;;;;-1:-1:-1;;;5622:54:5;;;;;;;;;;;;;;4899:380;5003:59;;;-1:-1:-1;;;;;5003:59:5;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;5003:59:5;;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;5098:59:5;;;;;;;;;;;-1:-1:-1;;;5098:59:5;;;;5003;4983:17;;5098:59;;5026:5;;5003:59;;5098:12;:59::i;:::-;5171:17;;5072:85;;-1:-1:-1;5171:21:5;5167:106;;5227:10;5216:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5216:30:5;5208:54;;;;;-1:-1:-1;;;5208:54:5;;;;;;;;;;;;-1:-1:-1;;;5208:54:5;;;;;;;;;;;;;;;4899:380;;;;;:::o;2577:96::-;2635:31;2641:4;2655;2662:3;2635:5;:31::i;1912:287::-;1981:4;1964:8;:23;;;;;;;;;;;:30;-1:-1:-1;1964:30:5;1956:63;;;;;-1:-1:-1;;;1956:63:5;;;;;;;;;;;;-1:-1:-1;;;1956:63:5;;;;;;;;;;;;;;;2077:4;2060:8;:23;;;;;;;;;;;2055:34;;2085:3;2055:4;:34::i;:::-;2046:4;2029:8;:23;;;;;;;;;;:60;2119:12;;2114:23;;2133:3;2114:4;:23::i;:::-;2099:12;:38;2152:40;;;;;;;;2184:1;;2169:4;;2152:40;;;;;;;;;1912:287;:::o;824:103:3:-;879:4;768:6:1;906:7:3;911:1;906:4;:7::i;:::-;:14;;824:103;-1:-1:-1;;824:103:3:o;723:95::-;768:6:1;803:8:3;;;723:95::o;2201:292::-;2263:4;;2296:1;2292;:5;:21;;768:6:1;2292:21:3;;;2305:1;2292:21;2283:30;-1:-1:-1;2334:1:3;2329:6;;;;2324:145;2337:6;;2324:145;;2371:10;2376:1;2379;2371:4;:10::i;:::-;2367:14;-1:-1:-1;2404:1:3;2400;:5;:10;2396:63;;2434:10;2439:1;2442;2434:4;:10::i;:::-;2430:14;;2396:63;2350:1;2345:6;;;;2324:145;;3181:1039;3269:4;3321:3;3269:4;;3357:20;3366:4;768:6:1;3357:8:3;:20::i;:::-;3334:43;;-1:-1:-1;3334:43:3;-1:-1:-1;768:6:1;;3387:9:3;3712:1;3698:495;3723:9;3715:4;:17;3698:495;;3753:9;768:6:1;3765:1:3;:8;3753:20;;3788:6;3796:9;3809:29;3818:1;3821:16;3826:4;768:6:1;3821:4:3;:16::i;:::-;3809:8;:29::i;:::-;3787:51;;;;3859:22;3864:4;3870:10;3875:1;3878;3870:4;:10::i;3859:22::-;3852:29;;3902:16;3907:4;3913;3902;:16::i;:::-;3895:23;-1:-1:-1;3936:9:3;3932:20;;3947:5;;;;;3932:20;3971:4;3967:30;;;3988:9;;;3967:30;4015:4;4011:30;;;4032:9;;;4011:30;4059:8;4055:128;;;4093:15;4098:3;4103:4;4093;:15::i;:::-;4087:21;;4055:128;;;4153:15;4158:3;4163:4;4153;:15::i;:::-;4147:21;;4055:128;-1:-1:-1;;;3734:3:3;;3698:495;;;-1:-1:-1;4210:3:3;;3181:1039;-1:-1:-1;;;;;;;;;3181:1039:3:o;5699:191:5:-;5802:12;5833:50;5856:6;5864:4;5870:12;5833:22;:50::i;:::-;5826:57;5699:191;-1:-1:-1;;;;5699:191:5:o;5896:819::-;6009:12;6034;6048:23;6075:6;-1:-1:-1;;;;;6075:11:5;6087:4;6075:17;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;6075:17:5;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;6033:59:5;;;;6133:7;6129:580;;;6163:10;-1:-1:-1;6156:17:5;;-1:-1:-1;6156:17:5;6129:580;6274:17;;:21;6270:429;;6532:10;6526:17;6592:15;6579:10;6575:2;6571:19;6564:44;6481:145;6671:12;6664:20;;-1:-1:-1;;;6664:20:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6664:20:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://fd21d9371582197fc87c1b381e7d91ba5734722eead574cc377e9823377f998d

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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