ETH Price: $3,109.39 (-0.93%)

Contract

0x35101c731b1548B5e48bb23F99eDBc2f5c341935
 
Transaction Hash
Method
Block
From
To
Remove Liquidity207031072024-09-08 3:08:3571 days ago1725764915IN
Hakka Finance: BHSc$ Token
0 ETH0.000443520.99525507
Remove Liquidity207030922024-09-08 3:05:3571 days ago1725764735IN
Hakka Finance: BHSc$ Token
0 ETH0.00049331.10695237
Approve206071842024-08-25 17:46:3584 days ago1724607995IN
Hakka Finance: BHSc$ Token
0 ETH0.000052351.13579924
Approve206071522024-08-25 17:40:1184 days ago1724607611IN
Hakka Finance: BHSc$ Token
0 ETH0.000060551.313732
Add Liquidity206069882024-08-25 17:07:1184 days ago1724605631IN
Hakka Finance: BHSc$ Token
0 ETH0.000872582.15224219
Approve205395202024-08-16 6:52:4794 days ago1723791167IN
Hakka Finance: BHSc$ Token
0 ETH0.00003541.46869648
Remove Liquidity204657002024-08-05 23:38:35104 days ago1722901115IN
Hakka Finance: BHSc$ Token
0 ETH0.000682331.56293016
Approve202817162024-07-11 7:17:47130 days ago1720682267IN
Hakka Finance: BHSc$ Token
0 ETH0.000095253.95147305
Approve200084672024-06-03 2:59:23168 days ago1717383563IN
Hakka Finance: BHSc$ Token
0 ETH0.0006068213.08057547
Remove Liquidity197462502024-04-27 11:04:23204 days ago1714215863IN
Hakka Finance: BHSc$ Token
0 ETH0.003281076.85566398
Approve196867312024-04-19 3:12:23213 days ago1713496343IN
Hakka Finance: BHSc$ Token
0 ETH0.0004014215.37620185
Approve196867152024-04-19 3:08:59213 days ago1713496139IN
Hakka Finance: BHSc$ Token
0 ETH0.0004893620.29967592
Add Liquidity193951492024-03-09 4:26:47254 days ago1709958407IN
Hakka Finance: BHSc$ Token
0 ETH0.0168482540.9058277
Add Liquidity193677402024-03-05 8:22:23258 days ago1709626943IN
Hakka Finance: BHSc$ Token
0 ETH0.0253934764.32325628
Approve192779822024-02-21 19:02:23270 days ago1708542143IN
Hakka Finance: BHSc$ Token
0 ETH0.0009427439.10668599
Approve192158902024-02-13 1:43:35279 days ago1707788615IN
Hakka Finance: BHSc$ Token
0 ETH0.001837139.82708308
Add Liquidity192158772024-02-13 1:40:59279 days ago1707788459IN
Hakka Finance: BHSc$ Token
0 ETH0.0127340931.14011876
Approve190101742024-01-15 5:23:59308 days ago1705296239IN
Hakka Finance: BHSc$ Token
0 ETH0.0007800116.81388709
Add Liquidity189942672024-01-13 0:02:59310 days ago1705104179IN
Hakka Finance: BHSc$ Token
0 ETH0.0079367119.13698235
Approve187203252023-12-05 13:05:23348 days ago1701781523IN
Hakka Finance: BHSc$ Token
0 ETH0.0012908853.54804395
Approve185376302023-11-09 23:20:35374 days ago1699572035IN
Hakka Finance: BHSc$ Token
0 ETH0.001955342.14837982
Transfer185376122023-11-09 23:16:59374 days ago1699571819IN
Hakka Finance: BHSc$ Token
0 ETH0.0012090740.74944907
Transfer185375772023-11-09 23:09:59374 days ago1699571399IN
Hakka Finance: BHSc$ Token
0 ETH0.0012804843.15599685
Approve183331042023-10-12 8:20:35403 days ago1697098835IN
Hakka Finance: BHSc$ Token
0 ETH0.000282766.13342151
Transfer183330952023-10-12 8:18:47403 days ago1697098727IN
Hakka Finance: BHSc$ Token
0 ETH0.00032726.99955531
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
blackholeswap

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license, Audited

Contract Source Code (Solidity)Audit Report

/**
 *Submitted for verification at Etherscan.io on 2020-08-17
*/

pragma solidity 0.5.16;

library SafeMath {

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) 
            return 0;
        uint256 c = a * b;
        require(c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0);
        uint256 c = a / b;
        return c;
    }

    function divCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0);
        uint256 c = a / b;
        if(a % b != 0)
            c = c + 1;
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;
        return c;
    }

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

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }

    int256 constant private INT256_MIN = -2^255;

    function mul(int256 a, int256 b) internal pure returns (int256) {
        if (a == 0) 
            return 0;
        int256 c = a * b;
        require(c / a == b && (a != -1 || b != INT256_MIN));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0 && (b != -1 || a != INT256_MIN));
        int256 c = a / b;
        return c;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function sqrt(int256 x) internal pure returns (int256) {
        int256 z = add(x / 2, 1);
        int256 y = x;
        while (z < y)
        {
            y = z;
            z = ((add((x / z), z)) / 2);
        }
        return y;
    }
}


contract ERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowed;
    
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    uint256 internal _totalSupply;

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param owner The address to query the balance of.
    * @return A uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address owner) public view returns (uint256) {
        return _balances[owner];
    }

    /**
    * @dev Function to check the amount of tokens that an owner allowed to a spender.
    * @param owner address The address which owns the funds.
    * @param spender address The address which will spend the funds.
    * @return A uint256 specifying the amount of tokens still available for the spender.
    */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowed[owner][spender];
    }

    /**
    * @dev Transfer token to a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function transfer(address to, uint256 value) public returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
    * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
    * Beware that changing an allowance with this method brings the risk that someone may use both the old
    * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
    * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
    * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    * @param spender The address which will spend the funds.
    * @param value The amount of tokens to be spent.
    */
    function approve(address spender, uint256 value) public returns (bool) {
        _allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
    * @dev Transfer tokens from one address to another.
    * Note that while this function emits an Approval event, this is not required as per the specification,
    * and other compliant implementations may not emit the event.
    * @param from address The address which you want to send tokens from
    * @param to address The address which you want to transfer to
    * @param value uint256 the amount of tokens to be transferred
    */
    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
        _transfer(from, to, value);
        return true;
    }

    function _transfer(address from, address to, uint256 value) internal {
        require(to != address(0));
        _balances[from] = _balances[from].sub(value);
        _balances[to] = _balances[to].add(value);
        emit Transfer(from, to, value);
    }

}

contract ERC20Mintable is ERC20 {
    string public name;
    string public symbol;
    uint8 public decimals;

    function _mint(address to, uint256 amount) internal {
        _balances[to] = _balances[to].add(amount);
        _totalSupply = _totalSupply.add(amount);
        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal {
        _balances[from] = _balances[from].sub(amount);
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(from, address(0), amount);
    }
}

contract CERC20 is ERC20 {
    function borrow(uint256) external returns (uint256);
    function borrowBalanceCurrent(address) external returns (uint256);
    function repayBorrow(uint256) external returns (uint256);
    function mint(uint256) external returns (uint256);
    function redeemUnderlying(uint256) external returns (uint256);
    function balanceOfUnderlying(address) external returns (uint256);
}


interface Comptroller {
    function enterMarkets(address[] calldata) external returns (uint256[] memory);
}

contract UniswapV2Router02 {
    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
}

contract blackholeswap is ERC20Mintable {
    using SafeMath for *;

    /***********************************|
    |        Variables && Events        |
    |__________________________________*/

    Comptroller constant comptroller = Comptroller(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B);
    UniswapV2Router02 constant uniswap = UniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    ERC20 constant Comp = ERC20(0xc00e94Cb662C3520282E6f5717214004A7f26888);
    ERC20 constant Dai = ERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F);
    ERC20 constant USDC = ERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48);
    CERC20 constant cDai = CERC20(0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643);
    CERC20 constant cUSDC = CERC20(0x39AA39c021dfbaE8faC545936693aC917d5E7563);

    event Purchases(address indexed buyer, address indexed sell_token, uint256 inputs, address indexed buy_token, uint256 outputs);
    event AddLiquidity(address indexed provider, uint256 share, int256 DAIAmount, int256 USDCAmount);
    event RemoveLiquidity(address indexed provider, uint256 share, int256 DAIAmount, int256 USDCAmount);

    /***********************************|
    |            Constsructor           |
    |__________________________________*/

    constructor() public {
        symbol = "BHSc$";
        name = "BlackHoleSwap-Compound DAI/USDC v1";
        decimals = 18;

        Dai.approve(address(cDai), uint256(-1));
        USDC.approve(address(cUSDC), uint256(-1));
        Comp.approve(address(uniswap), uint256(-1));

        address[] memory cTokens = new address[](2);
        cTokens[0] = address(cDai);
        cTokens[1] = address(cUSDC);
        uint256[] memory errors = comptroller.enterMarkets(cTokens);
        require(errors[0] == 0 && errors[1] == 0, "Comptroller.enterMarkets failed.");

        admin = msg.sender;
    }

    /***********************************|
    |        Governmence & Params       |
    |__________________________________*/

    uint256 public fee = 0.99985e18;
    uint256 public protocolFee = 0;
    uint256 public constant amplifier = 0.75e18;

    address private admin;
    address private vault;

    function setAdmin(address _admin) external {
        require(msg.sender == admin);
        admin = _admin;
    }

    function setParams(uint256 _fee, uint256 _protocolFee) external {
        require(msg.sender == admin);
        require(_fee < 1e18 && _fee >= 0.99e18); //0 < fee <= 1%
        if(_protocolFee > 0)
            require(uint256(1e18).sub(_fee).div(_protocolFee) >= 3); //protocolFee < 33.3% fee
        fee = _fee;
        protocolFee = _protocolFee;
    }

    function setVault(address _vault) external {
        require(msg.sender == admin);
        vault = _vault;
    }

    /***********************************|
    |         Getter Functions          |
    |__________________________________*/

    function getDaiBalance() public returns (uint256, uint256) {
        if (cDai.balanceOf(address(this)) <= 10)
            return (0, cDai.borrowBalanceCurrent(address(this)));
        else
            return (cDai.balanceOfUnderlying(address(this)), cDai.borrowBalanceCurrent(address(this)));
    }

    function getUSDCBalance() public returns (uint256, uint256) {
        if (cUSDC.balanceOf(address(this)) <= 10)
            return (0, cUSDC.borrowBalanceCurrent(address(this)).mul(rate()) );
        else
            return (cUSDC.balanceOfUnderlying(address(this)).mul(rate()), cUSDC.borrowBalanceCurrent(address(this)).mul(rate()));
    }

    // DAI + USDC
    function S() external returns (uint256) {
        (uint256 a, uint256 b) = getDaiBalance();
        (uint256 c, uint256 d) = getUSDCBalance();
        return(a.add(c).sub(b).sub(d));
    }

    function F(int256 _x, int256 x, int256 y) internal pure returns (int256 _y) {
        int256 k;
        int256 c;
        {
            // u = x + ay, v = y + ax
            int256 u = x.add(y.mul(int256(amplifier)).div(1e18));
            int256 v = y.add(x.mul(int256(amplifier)).div(1e18));
            k = u.mul(v); // k = u * v
            c = _x.mul(_x).sub( k.mul(1e18).div(int256(amplifier)) ); // c = x^2 - k/a
        }
        
        int256 cst = int256(amplifier).add(1e36.div(int256(amplifier))); // a + 1/a
        int256 b = _x.mul(cst).div(1e18); 

        // y^2 + by + c = 0
        // D = b^2 - 4c
        // _y = (-b + sqrt(D)) / 2

        int256 D = b.mul(b).sub(c.mul(4));

        require(D >= 0, "no root");

        _y = (-b).add(D.sqrt()).div(2);

    }

    function getInputPrice(uint256 input, uint256 a, uint256 b, uint256 c, uint256 d) public pure returns (uint256) {
        int256 x = int256(a).sub(int256(b));
        int256 y = int256(c).sub(int256(d));
        int256 _x = x.add(int256(input));

        int256 _y = F(_x, x, y);

        return uint256(y.sub(_y));
    }

    function getOutputPrice(uint256 output, uint256 a, uint256 b, uint256 c, uint256 d) public pure returns (uint256) {
        int256 x = int256(a).sub(int256(b));
        int256 y = int256(c).sub(int256(d));
        int256 _y = y.sub(int256(output));

        int256 _x = F(_y, y, x);

        return uint256(_x.sub(x));
    }

    function rate() public pure returns (uint256) {
        return 1e12;
    }

    /***********************************|
    |        Exchange Functions         |
    |__________________________________*/
    
    function calcFee(uint256 input, uint256 a, uint256 b, uint256 c, uint256 d) internal {
        if(protocolFee > 0) {
            uint256 _fee = input.mul(protocolFee).mul(_totalSupply).div(1e18).div( a.add(c).sub(b).sub(d) );
            _mint(vault, _fee);
        }
    }

    function dai2usdcIn(uint256 input, uint256 min_output, uint256 deadline) external returns (uint256) {
        require(block.timestamp <= deadline, "EXPIRED");
        (uint256 a, uint256 b) = getDaiBalance();
        (uint256 c, uint256 d) = getUSDCBalance();

        uint256 output = getInputPrice(input.mul(fee).div(1e18), a, b, c, d);
        securityCheck(input, output, a, b, c, d);
        output = output.div(rate());
        require(output >= min_output, "SLIPPAGE_DETECTED");

        calcFee(input, a, b, c, d);

        doTransferIn(Dai, cDai, b, msg.sender, input);
        doTransferOut(USDC, cUSDC, c.div(rate()), msg.sender, output);

        emit Purchases(msg.sender, address(Dai), input, address(USDC), output);

        return output;
    }
    
    function usdc2daiIn(uint256 input, uint256 min_output, uint256 deadline) external returns (uint256) {
        require(block.timestamp <= deadline, "EXPIRED");
        (uint256 a, uint256 b) = getDaiBalance();
        (uint256 c, uint256 d) = getUSDCBalance();

        uint256 output = getInputPrice(input.mul(fee).div(1e6), c, d, a, b); // input * rate() * fee / 1e18
        securityCheck(input.mul(rate()), output, c, d, a, b);
        require(output >= min_output, "SLIPPAGE_DETECTED");
        
        calcFee(input.mul(rate()), a, b, c, d);
        
        doTransferIn(USDC, cUSDC, d.div(rate()), msg.sender, input);
        doTransferOut(Dai, cDai, a, msg.sender, output);

        emit Purchases(msg.sender, address(USDC), input, address(Dai), output);

        return output;
    }

    function dai2usdcOut(uint256 max_input, uint256 output, uint256 deadline) external returns (uint256) {
        require(block.timestamp <= deadline, "EXPIRED");
        (uint256 a, uint256 b) = getDaiBalance();
        (uint256 c, uint256 d) = getUSDCBalance();

        uint256 input = getOutputPrice(output.mul(rate()), a, b, c, d);
        securityCheck(input, output.mul(rate()), a, b, c, d);
        input = input.mul(1e18).divCeil(fee);
        require(input <= max_input, "SLIPPAGE_DETECTED");

        calcFee(input, a, b, c, d);

        doTransferIn(Dai, cDai, b, msg.sender, input);
        doTransferOut(USDC, cUSDC, c.div(rate()), msg.sender, output);

        emit Purchases(msg.sender, address(Dai), input, address(USDC), output);

        return input;
    }
    
    function usdc2daiOut(uint256 max_input, uint256 output, uint256 deadline) external returns (uint256) {
        require(block.timestamp <= deadline, "EXPIRED");
        (uint256 a, uint256 b) = getDaiBalance();
        (uint256 c, uint256 d) = getUSDCBalance();

        uint256 input = getOutputPrice(output, c, d, a, b);
        securityCheck(input, output, c, d, a, b);
        input = input.mul(1e6).divCeil(fee); // input * 1e18 / fee / 1e12
        require(input <= max_input, "SLIPPAGE_DETECTED");

        calcFee(input.mul(rate()), a, b, c, d);

        doTransferIn(USDC, cUSDC, d.div(rate()), msg.sender, input);
        doTransferOut(Dai, cDai, a, msg.sender, output);

        emit Purchases(msg.sender, address(USDC), input, address(Dai), output);

        return input;
    }
    
    function doTransferIn(ERC20 token, CERC20 ctoken, uint256 debt, address from, uint256 amount) internal {
        require(token.transferFrom(from, address(this), amount));

        if(debt > 0) {
            if(debt >= amount) {
                require(ctoken.repayBorrow(amount) == 0, "ctoken.repayBorrow failed");
            }
            else {
                require(ctoken.repayBorrow(debt) == 0, "ctoken.repayBorrow failed");
                require(ctoken.mint(amount.sub(debt)) == 0, "ctoken.mint failed");
            }
        }
        else {
            require(ctoken.mint(amount) == 0, "ctoken.mint failed");
        }
    }

    function doTransferOut(ERC20 token, CERC20 ctoken, uint256 balance, address to, uint256 amount) internal {
        if(balance >= amount) {
            require(ctoken.redeemUnderlying(amount) == 0, "ctoken.redeemUnderlying failed");
        }
        else {
            if(balance == 0) {
                require(ctoken.borrow(amount) == 0, "ctoken.borrow failed");
            }
            else {
                require(ctoken.redeemUnderlying(balance) == 0, "ctoken.redeemUnderlying failed");
                require(ctoken.borrow(amount.sub(balance)) == 0, "ctoken.borrow failed");
            }
        }

        require(token.transfer(to, amount));
    }

    function securityCheck(uint256 input, uint256 output, uint256 a, uint256 b, uint256 c, uint256 d) internal pure {
        if(c < output.add(d))
            require(output.add(d).sub(c).mul(100) < input.add(a).sub(b).mul(62), "DEBT_TOO_MUCH"); // debt/collateral < 62%
    }

    /***********************************|
    |        Liquidity Functions        |
    |__________________________________*/

    function addLiquidity(uint256 share, uint256[4] calldata tokens) external returns (uint256 dai_in, uint256 dai_out, uint256 usdc_in, uint256 usdc_out) {
        require(share >= 1e15, 'INVALID_ARGUMENT'); // 1000 * rate()

        collectComp();

        if (_totalSupply > 0) {
            (uint256 a, uint256 b) = getDaiBalance();
            (uint256 c, uint256 d) = getUSDCBalance();

            dai_in = share.mul(a).divCeil(_totalSupply);
            dai_out = share.mul(b).div(_totalSupply);
            usdc_in = share.mul(c).divCeil(_totalSupply.mul(rate()));
            usdc_out = share.mul(d).div(_totalSupply.mul(rate()));
            require(dai_in <= tokens[0] && dai_out >= tokens[1] && usdc_in <= tokens[2] && usdc_out >= tokens[3], "SLIPPAGE_DETECTED");
            
            _mint(msg.sender, share);

            if(dai_in > 0)
                doTransferIn(Dai, cDai, b, msg.sender, dai_in);
            if(usdc_in > 0)
                doTransferIn(USDC, cUSDC, d.div(rate()), msg.sender, usdc_in);
            if(dai_out > 0)
                doTransferOut(Dai, cDai, a, msg.sender, dai_out);
            if(usdc_out > 0)
                doTransferOut(USDC, cUSDC, c.div(rate()), msg.sender, usdc_out);

            int256 dai_amount = int256(dai_in).sub(int256(dai_out));
            int256 usdc_amount = int256(usdc_in).sub(int256(usdc_out));

            emit AddLiquidity(msg.sender, share, dai_amount, usdc_amount);
            return (dai_in, dai_out, usdc_in, usdc_out);
        } else {
            uint256 dai_amount = share.divCeil(2);
            uint256 usdc_amount = share.divCeil(rate().mul(2));

            _mint(msg.sender, share);
            doTransferIn(Dai, cDai, 0, msg.sender, dai_amount);
            doTransferIn(USDC, cUSDC, 0, msg.sender, usdc_amount);
            
            emit AddLiquidity(msg.sender, share, int256(dai_amount), int256(usdc_amount));
            return (dai_amount, 0, usdc_amount, 0);
        }
    }

    function removeLiquidity(uint256 share, uint256[4] calldata tokens) external returns (uint256 dai_in, uint256 dai_out, uint256 usdc_in, uint256 usdc_out) {
        require(share > 0, 'INVALID_ARGUMENT');

        collectComp();

        (uint256 a, uint256 b) = getDaiBalance();
        (uint256 c, uint256 d) = getUSDCBalance();

        dai_out = share.mul(a).div(_totalSupply);
        dai_in = share.mul(b).divCeil(_totalSupply);
        usdc_out = share.mul(c).div(_totalSupply.mul(rate()));
        usdc_in = share.mul(d).divCeil(_totalSupply.mul(rate()));
        require(dai_in <= tokens[0] && dai_out >= tokens[1] && usdc_in <= tokens[2] && usdc_out >= tokens[3], "SLIPPAGE_DETECTED");

        _burn(msg.sender, share);

        if(dai_in > 0)
            doTransferIn(Dai, cDai, b, msg.sender, dai_in);
        if(usdc_in > 0)
            doTransferIn(USDC, cUSDC, d.div(rate()), msg.sender, usdc_in);
        if(dai_out > 0)
            doTransferOut(Dai, cDai, a, msg.sender, dai_out);
        if(usdc_out > 0)
            doTransferOut(USDC, cUSDC, c.div(rate()), msg.sender, usdc_out);

        int256 dai_amount = int256(dai_out).sub(int256(dai_in));
        int256 usdc_amount = int256(usdc_out).sub(int256(usdc_in));

        emit RemoveLiquidity(msg.sender, share, dai_amount, usdc_amount);

        return(dai_in, dai_out, usdc_in, usdc_out);
    }

    /***********************************|
    |           Collect Comp            |
    |__________________________________*/

    function collectComp() public {
        uint256 _comp = Comp.balanceOf(address(this));
        if(_comp == 0) return;

        (uint256 a, uint256 b) = getDaiBalance();
        (uint256 c, uint256 d) = getUSDCBalance();

        bool isDai = a.add(d) > c.add(b);

        address[] memory path = new address[](3);
        path[0] = address(Comp);
        path[1] = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; //weth
        path[2] = isDai ? address(Dai) : address(USDC);
        uint256[] memory amounts = uniswap.swapExactTokensForTokens(_comp, 0, path, address(this), now);

        if(isDai)
            require(cDai.mint(amounts[2]) == 0, "ctoken.mint failed");
        else
            require(cUSDC.mint(amounts[2]) == 0, "ctoken.mint failed");

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"},{"indexed":false,"internalType":"int256","name":"DAIAmount","type":"int256"},{"indexed":false,"internalType":"int256","name":"USDCAmount","type":"int256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"sell_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"inputs","type":"uint256"},{"indexed":true,"internalType":"address","name":"buy_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"outputs","type":"uint256"}],"name":"Purchases","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"},{"indexed":false,"internalType":"int256","name":"DAIAmount","type":"int256"},{"indexed":false,"internalType":"int256","name":"USDCAmount","type":"int256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[],"name":"S","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"share","type":"uint256"},{"internalType":"uint256[4]","name":"tokens","type":"uint256[4]"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"dai_in","type":"uint256"},{"internalType":"uint256","name":"dai_out","type":"uint256"},{"internalType":"uint256","name":"usdc_in","type":"uint256"},{"internalType":"uint256","name":"usdc_out","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"amplifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"collectComp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"min_output","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"dai2usdcIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"max_input","type":"uint256"},{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"dai2usdcOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getDaiBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"},{"internalType":"uint256","name":"c","type":"uint256"},{"internalType":"uint256","name":"d","type":"uint256"}],"name":"getInputPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"},{"internalType":"uint256","name":"c","type":"uint256"},{"internalType":"uint256","name":"d","type":"uint256"}],"name":"getOutputPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"getUSDCBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"protocolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"share","type":"uint256"},{"internalType":"uint256[4]","name":"tokens","type":"uint256[4]"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"dai_in","type":"uint256"},{"internalType":"uint256","name":"dai_out","type":"uint256"},{"internalType":"uint256","name":"usdc_in","type":"uint256"},{"internalType":"uint256","name":"usdc_out","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_protocolFee","type":"uint256"}],"name":"setParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"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":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"min_output","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"usdc2daiIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"max_input","type":"uint256"},{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"usdc2daiOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052670de02e470eaca00060065560006007553480156200002257600080fd5b5060408051808201909152600580825264109214d8c960da1b6020909201918252620000519160049162000511565b50604051806060016040528060228152602001620034d0602291398051620000829160039160209091019062000511565b506005805460ff191660121790556040805163095ea7b360e01b8152735d3a536e4d6dbd6114cc1ead35777bab948e3643600482015260001960248201529051736b175474e89094c44da98b954eedeac495271d0f9163095ea7b39160448083019260209291908290030181600087803b1580156200010057600080fd5b505af115801562000115573d6000803e3d6000fd5b505050506040513d60208110156200012c57600080fd5b50506040805163095ea7b360e01b81527339aa39c021dfbae8fac545936693ac917d5e756360048201526000196024820152905173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489163095ea7b39160448083019260209291908290030181600087803b1580156200019e57600080fd5b505af1158015620001b3573d6000803e3d6000fd5b505050506040513d6020811015620001ca57600080fd5b50506040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526000196024820152905173c00e94cb662c3520282e6f5717214004a7f268889163095ea7b39160448083019260209291908290030181600087803b1580156200023c57600080fd5b505af115801562000251573d6000803e3d6000fd5b505050506040513d60208110156200026857600080fd5b50506040805160028082526060808301845292602083019080388339019050509050735d3a536e4d6dbd6114cc1ead35777bab948e364381600081518110620002ad57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507339aa39c021dfbae8fac545936693ac917d5e756381600181518110620002f057fe5b6001600160a01b03909216602092830291909101820152604051631853304760e31b815260048101828152835160248301528351606093733d9819210a31b4961b30ef54be2aed79b9c9cd3b9363c29982389387939092839260440191858201910280838360005b838110156200037257818101518382015260200162000358565b5050505090500192505050600060405180830381600087803b1580156200039857600080fd5b505af1158015620003ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015620003d757600080fd5b8101908080516040519392919084640100000000821115620003f857600080fd5b9083019060208201858111156200040e57600080fd5b82518660208202830111640100000000821117156200042c57600080fd5b82525081516020918201928201910280838360005b838110156200045b57818101518382015260200162000441565b505050509050016040525050509050806000815181106200047857fe5b60200260200101516000148015620004a55750806001815181106200049957fe5b60200260200101516000145b620004f7576040805162461bcd60e51b815260206004820181905260248201527f436f6d7074726f6c6c65722e656e7465724d61726b657473206661696c65642e604482015290519081900360640190fd5b5050600880546001600160a01b03191633179055620005b6565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200055457805160ff191683800117855562000584565b8280016001018555821562000584579182015b828111156200058457825182559160200191906001019062000567565b506200059292915062000596565b5090565b620005b391905b808211156200059257600081556001016200059d565b90565b612f0a80620005c66000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063704b6c02116100f9578063bf1ab21411610097578063dd62ed3e11610071578063dd62ed3e1461052a578063ddca3f4314610558578063e1c3d3a414610560578063f5f5de0514610589576101c4565b8063bf1ab214146104d6578063c0324c77146104ff578063cb4a785e14610522576101c4565b806395d89b41116100d357806395d89b41146104655780639eb120c01461046d578063a9059cbb146104a2578063b0e21e8a146104ce576101c4565b8063704b6c02146103f057806370a0823114610416578063909003561461043c576101c4565b8063313ce567116101665780634be1c796116101405780634be1c796146103b05780635ddc916a146103b8578063671d1c06146103c05780636817031b146103c8576101c4565b8063313ce5671461034f5780633cfd1ccc1461036d57806347b42fe61461038e576101c4565b806323b872dd116101a257806323b872dd146102a057806326882737146102d657806327b25fa9146102ff5780632c4e722e14610347576101c4565b806306fdde03146101c9578063095ea7b31461024657806318160ddd14610286575b600080fd5b6101d16105be565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561020b5781810151838201526020016101f3565b50505050905090810190601f1680156102385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102726004803603604081101561025c57600080fd5b506001600160a01b03813516906020013561064c565b604080519115158252519081900360200190f35b61028e6106b3565b60408051918252519081900360200190f35b610272600480360360608110156102b657600080fd5b506001600160a01b038135811691602081013590911690604001356106b9565b61028e600480360360608110156102ec57600080fd5b5080359060208101359060400135610726565b610321600480360360a081101561031557600080fd5b50803590602001610902565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61028e610be1565b610357610bea565b6040805160ff9092168252519081900360200190f35b610375610bf3565b6040805192835260208301919091528051918290030190f35b610321600480360360a08110156103a457600080fd5b50803590602001610d80565b61028e611128565b610375611174565b61028e611345565b6103ee600480360360208110156103de57600080fd5b50356001600160a01b0316611351565b005b6103ee6004803603602081101561040657600080fd5b50356001600160a01b031661138a565b61028e6004803603602081101561042c57600080fd5b50356001600160a01b03166113c3565b61028e6004803603606081101561045257600080fd5b50803590602081013590604001356113de565b6101d161158f565b61028e600480360360a081101561048357600080fd5b50803590602081013590604081013590606081013590608001356115ea565b610272600480360360408110156104b857600080fd5b506001600160a01b038135169060200135611654565b61028e61166a565b61028e600480360360608110156104ec57600080fd5b5080359060208101359060400135611670565b6103ee6004803603604081101561051557600080fd5b508035906020013561183e565b6103ee6118b7565b61028e6004803603604081101561054057600080fd5b506001600160a01b0381358116916020013516611ded565b61028e611e18565b61028e6004803603606081101561057657600080fd5b5080359060208101359060400135611e1e565b61028e600480360360a081101561059f57600080fd5b5080359060208101359060408101359060608101359060800135611fe7565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106445780601f1061061957610100808354040283529160200191610644565b820191906000526020600020905b81548152906001019060200180831161062757829003601f168201915b505050505081565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b60025490565b6001600160a01b03831660009081526001602090815260408083203384529091528120546106ed908363ffffffff61204316565b6001600160a01b038516600090815260016020908152604080832033845290915290205561071c848484612058565b5060019392505050565b600081421115610767576040805162461bcd60e51b81526020600482015260076024820152661156141254915160ca1b604482015290519081900360640190fd5b600080610772611174565b91509150600080610781610bf3565b9150915060006107bb6107b2620f42406107a66006548d61212390919063ffffffff16565b9063ffffffff61215116565b848488886115ea565b90506107e26107d86107cb610be1565b8b9063ffffffff61212316565b8285858989612173565b8781101561082b576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b6108426108396107cb610be1565b86868686612206565b610882600080516020612e96833981519152600080516020612eb683398151915261087b61086e610be1565b869063ffffffff61215116565b338d612270565b6108ab600080516020612e56833981519152600080516020612e36833981519152873385612616565b604080518a8152602081018390528151600080516020612e5683398151915292600080516020612e96833981519152923392600080516020612e76833981519152929181900390910190a498975050505050505050565b60008060008060008611610950576040805162461bcd60e51b815260206004820152601060248201526f1253959053125117d05491d55351539560821b604482015290519081900360640190fd5b6109586118b7565b600080610963611174565b91509150600080610972610bf3565b600254919350915061098e906107a68c8763ffffffff61212316565b6002549097506109b4906109a88c8663ffffffff61212316565b9063ffffffff6129c916565b97506109e36109d36109c4610be1565b6002549063ffffffff61212316565b6107a68c8563ffffffff61212316565b9450610a036109f36109c4610be1565b6109a88c8463ffffffff61212316565b955088358811801590610a1a575060208901358710155b8015610a2a575060408901358611155b8015610a3a575060608901358510155b610a7f576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b610a89338b6129fe565b8715610ab857610ab8600080516020612e56833981519152600080516020612e3683398151915285338c612270565b8515610afe57610afe600080516020612e96833981519152600080516020612eb6833981519152610af7610aea610be1565b859063ffffffff61215116565b338a612270565b8615610b2d57610b2d600080516020612e56833981519152600080516020612e3683398151915286338b612616565b8415610b6657610b66600080516020612e96833981519152600080516020612eb6833981519152610b5f61086e610be1565b3389612616565b6000610b78888a63ffffffff612a9b16565b90506000610b8c878963ffffffff612a9b16565b604080518e815260208101859052808201839052905191925033917f71765b8c4a03d1ecf12e77843fa413741c67c34eacd238703f2af221d034420d9181900360600190a25050505050505b92959194509250565b64e8d4a5100090565b60055460ff1681565b604080516370a0823160e01b815230600482015290516000918291600a91600080516020612eb6833981519152916370a0823191602480820192602092909190829003018186803b158015610c4757600080fd5b505afa158015610c5b573d6000803e3d6000fd5b505050506040513d6020811015610c7157600080fd5b505111610d14576000610d0a610c85610be1565b604080516305eff7ef60e21b81523060048201529051600080516020612eb6833981519152916317bfdfbc9160248083019260209291908290030181600087803b158015610cd257600080fd5b505af1158015610ce6573d6000803e3d6000fd5b505050506040513d6020811015610cfc57600080fd5b50519063ffffffff61212316565b9092509050610d7c565b610d6c610d1f610be1565b60408051633af9e66960e01b81523060048201529051600080516020612eb683398151915291633af9e6699160248083019260209291908290030181600087803b158015610cd257600080fd5b610d77610c85610be1565b915091505b9091565b60008060008066038d7ea4c68000861015610dd5576040805162461bcd60e51b815260206004820152601060248201526f1253959053125117d05491d55351539560821b604482015290519081900360640190fd5b610ddd6118b7565b6002541561103457600080610df0611174565b91509150600080610dff610bf3565b6002549193509150610e1b906109a88c8763ffffffff61212316565b600254909850610e35906107a68c8663ffffffff61212316565b9650610e55610e456109c4610be1565b6109a88c8563ffffffff61212316565b9550610e75610e656109c4610be1565b6107a68c8463ffffffff61212316565b945088358811801590610e8c575060208901358710155b8015610e9c575060408901358611155b8015610eac575060608901358510155b610ef1576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b610efb338b612ace565b8715610f2a57610f2a600080516020612e56833981519152600080516020612e3683398151915285338c612270565b8515610f5c57610f5c600080516020612e96833981519152600080516020612eb6833981519152610af7610aea610be1565b8615610f8b57610f8b600080516020612e56833981519152600080516020612e3683398151915286338b612616565b8415610fbd57610fbd600080516020612e96833981519152600080516020612eb6833981519152610b5f61086e610be1565b6000610fcf898963ffffffff612a9b16565b90506000610fe3888863ffffffff612a9b16565b604080518e815260208101859052808201839052905191925033917f3294ef2f50b415b7d460332536cc5009c85337f255f220b93fcd5476c89fe0cd9181900360600190a250610bd8945050505050565b600061104787600263ffffffff6129c916565b90506000611074611067600261105b610be1565b9063ffffffff61212316565b899063ffffffff6129c916565b90506110803389612ace565b6110aa600080516020612e56833981519152600080516020612e3683398151915260003386612270565b6110d4600080516020612e96833981519152600080516020612eb683398151915260003385612270565b6040805189815260208101849052808201839052905133917f3294ef2f50b415b7d460332536cc5009c85337f255f220b93fcd5476c89fe0cd919081900360600190a2909450600093509150829050610bd8565b6000806000611135611174565b91509150600080611144610bf3565b909250905061116b8161115f8581888763ffffffff612b6b16565b9063ffffffff61204316565b94505050505090565b604080516370a0823160e01b815230600482015290516000918291600a91600080516020612e36833981519152916370a0823191602480820192602092909190829003018186803b1580156111c857600080fd5b505afa1580156111dc573d6000803e3d6000fd5b505050506040513d60208110156111f257600080fd5b50511161127f57604080516305eff7ef60e21b81523060048201529051600091600080516020612e36833981519152916317bfdfbc9160248082019260209290919082900301818787803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506040513d602081101561127357600080fd5b50519092509050610d7c565b60408051633af9e66960e01b81523060048201529051600080516020612e3683398151915291633af9e6699160248083019260209291908290030181600087803b1580156112cc57600080fd5b505af11580156112e0573d6000803e3d6000fd5b505050506040513d60208110156112f657600080fd5b5051604080516305eff7ef60e21b81523060048201529051600080516020612e36833981519152916317bfdfbc9160248083019260209291908290030181600087803b15801561124957600080fd5b670a688906bd8b000081565b6008546001600160a01b0316331461136857600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146113a157600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b60008142111561141f576040805162461bcd60e51b81526020600482015260076024820152661156141254915160ca1b604482015290519081900360640190fd5b60008061142a611174565b91509150600080611439610bf3565b91509150600061144c8884848888611fe7565b905061145c818985858989612173565b600654611476906109a883620f424063ffffffff61212316565b9050888111156114c1576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b6114dc6108396114cf610be1565b839063ffffffff61212316565b61150f600080516020612e96833981519152600080516020612eb683398151915261150861086e610be1565b3385612270565b611538600080516020612e56833981519152600080516020612e3683398151915287338c612616565b60408051828152602081018a90528151600080516020612e5683398151915292600080516020612e96833981519152923392600080516020612e76833981519152929181900390910190a498975050505050505050565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106445780601f1061061957610100808354040283529160200191610644565b6000806115fd868663ffffffff612a9b16565b90506000611611858563ffffffff612a9b16565b90506000611625838a63ffffffff612b7d16565b90506000611634828585612baf565b9050611646838263ffffffff612a9b16565b9a9950505050505050505050565b6000611661338484612058565b50600192915050565b60075481565b6000814211156116b1576040805162461bcd60e51b81526020600482015260076024820152661156141254915160ca1b604482015290519081900360640190fd5b6000806116bc611174565b915091506000806116cb610bf3565b9150915060006116fe6116f5670de0b6b3a76400006107a66006548d61212390919063ffffffff16565b868686866115ea565b905061170e898287878787612173565b611726611719610be1565b829063ffffffff61215116565b905087811015611771576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b61177e8986868686612206565b6117a7600080516020612e56833981519152600080516020612e3683398151915286338d612270565b6117e7600080516020612e96833981519152600080516020612eb68339815191526117e06117d3610be1565b879063ffffffff61215116565b3385612616565b604080518a8152602081018390528151600080516020612e9683398151915292600080516020612e56833981519152923392600080516020612e76833981519152929181900390910190a498975050505050505050565b6008546001600160a01b0316331461185557600080fd5b670de0b6b3a7640000821080156118745750670dbd2fc137a300008210155b61187d57600080fd5b80156118ac5760036118a1826107a6670de0b6b3a76400008663ffffffff61204316565b10156118ac57600080fd5b600691909155600755565b604080516370a0823160e01b8152306004820152905160009173c00e94cb662c3520282e6f5717214004a7f26888916370a0823191602480820192602092909190829003018186803b15801561190c57600080fd5b505afa158015611920573d6000803e3d6000fd5b505050506040513d602081101561193657600080fd5b50519050806119455750611deb565b600080611950611174565b9150915060008061195f610bf3565b90925090506000611976838563ffffffff612b6b16565b611986868463ffffffff612b6b16565b604080516003808252608082019092529290911192506060919060208201838038833901905050905073c00e94cb662c3520282e6f5717214004a7f26888816000815181106119d157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611a1357fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081611a4c57600080516020612e96833981519152611a5c565b600080516020612e568339815191525b81600281518110611a6957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398960008530426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611b2d578181015183820152602001611b15565b505050509050019650505050505050600060405180830381600087803b158015611b5657600080fd5b505af1158015611b6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611b9357600080fd5b8101908080516040519392919084640100000000821115611bb357600080fd5b908301906020820185811115611bc857600080fd5b8251866020820283011164010000000082111715611be557600080fd5b82525081516020918201928201910280838360005b83811015611c12578181015183820152602001611bfa565b5050505090500160405250505090508215611d0757600080516020612e368339815191526001600160a01b031663a0712d6882600281518110611c5157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611c8f57600080fd5b505af1158015611ca3573d6000803e3d6000fd5b505050506040513d6020811015611cb957600080fd5b505115611d02576040805162461bcd60e51b815260206004820152601260248201527118dd1bdad95b8b9b5a5b9d0819985a5b195960721b604482015290519081900360640190fd5b611de2565b600080516020612eb68339815191526001600160a01b031663a0712d6882600281518110611d3157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611d6f57600080fd5b505af1158015611d83573d6000803e3d6000fd5b505050506040513d6020811015611d9957600080fd5b505115611de2576040805162461bcd60e51b815260206004820152601260248201527118dd1bdad95b8b9b5a5b9d0819985a5b195960721b604482015290519081900360640190fd5b50505050505050505b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60065481565b600081421115611e5f576040805162461bcd60e51b81526020600482015260076024820152661156141254915160ca1b604482015290519081900360640190fd5b600080611e6a611174565b91509150600080611e79610bf3565b915091506000611ea3611e9a611e8d610be1565b8a9063ffffffff61212316565b86868686611fe7565b9050611ebd81611eb46107cb610be1565b87878787612173565b600654611edc906109a883670de0b6b3a764000063ffffffff61212316565b905088811115611f27576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b611f348186868686612206565b611f5d600080516020612e56833981519152600080516020612e36833981519152863385612270565b611f90600080516020612e96833981519152600080516020612eb6833981519152611f896117d3610be1565b338c612616565b60408051828152602081018a90528151600080516020612e9683398151915292600080516020612e56833981519152923392600080516020612e76833981519152929181900390910190a498975050505050505050565b600080611ffa868663ffffffff612a9b16565b9050600061200e858563ffffffff612a9b16565b90506000612022828a63ffffffff612a9b16565b90506000612031828486612baf565b9050611646818563ffffffff612a9b16565b60008282111561205257600080fd5b50900390565b6001600160a01b03821661206b57600080fd5b6001600160a01b038316600090815260208190526040902054612094908263ffffffff61204316565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546120c9908263ffffffff612b6b16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082612132575060006106ad565b8282028284828161213f57fe5b041461214a57600080fd5b9392505050565b600080821161215f57600080fd5b600082848161216a57fe5b04949350505050565b612183858263ffffffff612b6b16565b8210156121fe576121a3603e61105b8561115f8a8963ffffffff612b6b16565b6121bc606461105b8561115f8a8763ffffffff612b6b16565b106121fe576040805162461bcd60e51b815260206004820152600d60248201526c0888a84a8bea89e9ebe9aaa869609b1b604482015290519081900360640190fd5b505050505050565b600754156122695760006122506122298361115f87818a8963ffffffff612b6b16565b6107a6670de0b6b3a76400006107a660025461105b6007548d61212390919063ffffffff16565b6009549091506121fe906001600160a01b031682612ace565b5050505050565b604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918716916323b872dd916064808201926020929091908290030181600087803b1580156122c957600080fd5b505af11580156122dd573d6000803e3d6000fd5b505050506040513d60208110156122f357600080fd5b50516122fe57600080fd5b821561255d578083106123d057836001600160a01b0316630e752702826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561235157600080fd5b505af1158015612365573d6000803e3d6000fd5b505050506040513d602081101561237b57600080fd5b5051156123cb576040805162461bcd60e51b815260206004820152601960248201527818dd1bdad95b8b9c995c185e509bdc9c9bddc819985a5b1959603a1b604482015290519081900360640190fd5b612558565b836001600160a01b0316630e752702846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561241657600080fd5b505af115801561242a573d6000803e3d6000fd5b505050506040513d602081101561244057600080fd5b505115612490576040805162461bcd60e51b815260206004820152601960248201527818dd1bdad95b8b9c995c185e509bdc9c9bddc819985a5b1959603a1b604482015290519081900360640190fd5b6001600160a01b03841663a0712d686124af838663ffffffff61204316565b6040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156124e557600080fd5b505af11580156124f9573d6000803e3d6000fd5b505050506040513d602081101561250f57600080fd5b505115612558576040805162461bcd60e51b815260206004820152601260248201527118dd1bdad95b8b9b5a5b9d0819985a5b195960721b604482015290519081900360640190fd5b612269565b836001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156125a357600080fd5b505af11580156125b7573d6000803e3d6000fd5b505050506040513d60208110156125cd57600080fd5b505115612269576040805162461bcd60e51b815260206004820152601260248201527118dd1bdad95b8b9b5a5b9d0819985a5b195960721b604482015290519081900360640190fd5b8083106126e657836001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561266357600080fd5b505af1158015612677573d6000803e3d6000fd5b505050506040513d602081101561268d57600080fd5b5051156126e1576040805162461bcd60e51b815260206004820152601e60248201527f63746f6b656e2e72656465656d556e6465726c79696e67206661696c65640000604482015290519081900360640190fd5b612934565b826127a657836001600160a01b031663c5ebeaec826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561273157600080fd5b505af1158015612745573d6000803e3d6000fd5b505050506040513d602081101561275b57600080fd5b5051156126e1576040805162461bcd60e51b815260206004820152601460248201527318dd1bdad95b8b989bdc9c9bddc819985a5b195960621b604482015290519081900360640190fd5b836001600160a01b031663852a12e3846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156127ec57600080fd5b505af1158015612800573d6000803e3d6000fd5b505050506040513d602081101561281657600080fd5b50511561286a576040805162461bcd60e51b815260206004820152601e60248201527f63746f6b656e2e72656465656d556e6465726c79696e67206661696c65640000604482015290519081900360640190fd5b6001600160a01b03841663c5ebeaec612889838663ffffffff61204316565b6040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156128bf57600080fd5b505af11580156128d3573d6000803e3d6000fd5b505050506040513d60208110156128e957600080fd5b505115612934576040805162461bcd60e51b815260206004820152601460248201527318dd1bdad95b8b989bdc9c9bddc819985a5b195960621b604482015290519081900360640190fd5b846001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561299457600080fd5b505af11580156129a8573d6000803e3d6000fd5b505050506040513d60208110156129be57600080fd5b505161226957600080fd5b60008082116129d757600080fd5b60008284816129e257fe5b0490508284816129ee57fe5b061561214a576001019392505050565b6001600160a01b038216600090815260208190526040902054612a27908263ffffffff61204316565b6001600160a01b038316600090815260208190526040902055600254612a53908263ffffffff61204316565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000818303818312801590612ab05750838113155b80612ac55750600083128015612ac557508381135b61214a57600080fd5b6001600160a01b038216600090815260208190526040902054612af7908263ffffffff612b6b16565b6001600160a01b038316600090815260208190526040902055600254612b23908263ffffffff612b6b16565b6002556040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60008282018381101561214a57600080fd5b6000828201818312801590612b925750838112155b80612ac55750600083128015612ac5575083811261214a57600080fd5b6000808080612bf4612be7670de0b6b3a7640000612bdb88670a688906bd8b000063ffffffff612d7616565b9063ffffffff612db616565b879063ffffffff612b7d16565b90506000612c1f612be7670de0b6b3a7640000612bdb8a670a688906bd8b000063ffffffff612d7616565b9050612c31828263ffffffff612d7616565b9350612c76612c5a670a688906bd8b0000612bdb87670de0b6b3a764000063ffffffff612d7616565b612c6a8a8063ffffffff612d7616565b9063ffffffff612a9b16565b925060009150612cbd9050612ca86ec097ce7bc90715b34b9f1000000000670a688906bd8b000063ffffffff612db616565b670a688906bd8b00009063ffffffff612b7d16565b90506000612cdd670de0b6b3a7640000612bdb8a8563ffffffff612d7616565b90506000612d05612cf585600463ffffffff612d7616565b612c6a848063ffffffff612d7616565b90506000811215612d47576040805162461bcd60e51b81526020600482015260076024820152661b9bc81c9bdbdd60ca1b604482015290519081900360640190fd5b612d696002612bdb612d5884612df2565b60008690039063ffffffff612b7d16565b9998505050505050505050565b600082612d85575060006106ad565b82820282848281612d9257fe5b05148015612ac5575083600019141580612ac5575060fe1983141561214a57600080fd5b60008115801590612dd5575081600019141580612dd5575060fe198314155b612dde57600080fd5b6000828481612de957fe5b05949350505050565b600080612e03600284056001612b7d565b9050825b8082121561214a5750806002612e26828681612e1f57fe5b0584612b7d565b81612e2d57fe5b059150612e0756fe0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36430000000000000000000000006b175474e89094c44da98b954eedeac495271d0f981c435297345a1ac10e12ee208ec3dc700f2d854c0e88dc8683fa4ae0fb28d3000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563a265627a7a723158206f46ae2156366e1c101963ad99fdfa8969e97c9f1472e689a4e091eee287bbeb64736f6c63430005100032426c61636b486f6c65537761702d436f6d706f756e64204441492f55534443207631

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063704b6c02116100f9578063bf1ab21411610097578063dd62ed3e11610071578063dd62ed3e1461052a578063ddca3f4314610558578063e1c3d3a414610560578063f5f5de0514610589576101c4565b8063bf1ab214146104d6578063c0324c77146104ff578063cb4a785e14610522576101c4565b806395d89b41116100d357806395d89b41146104655780639eb120c01461046d578063a9059cbb146104a2578063b0e21e8a146104ce576101c4565b8063704b6c02146103f057806370a0823114610416578063909003561461043c576101c4565b8063313ce567116101665780634be1c796116101405780634be1c796146103b05780635ddc916a146103b8578063671d1c06146103c05780636817031b146103c8576101c4565b8063313ce5671461034f5780633cfd1ccc1461036d57806347b42fe61461038e576101c4565b806323b872dd116101a257806323b872dd146102a057806326882737146102d657806327b25fa9146102ff5780632c4e722e14610347576101c4565b806306fdde03146101c9578063095ea7b31461024657806318160ddd14610286575b600080fd5b6101d16105be565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561020b5781810151838201526020016101f3565b50505050905090810190601f1680156102385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102726004803603604081101561025c57600080fd5b506001600160a01b03813516906020013561064c565b604080519115158252519081900360200190f35b61028e6106b3565b60408051918252519081900360200190f35b610272600480360360608110156102b657600080fd5b506001600160a01b038135811691602081013590911690604001356106b9565b61028e600480360360608110156102ec57600080fd5b5080359060208101359060400135610726565b610321600480360360a081101561031557600080fd5b50803590602001610902565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61028e610be1565b610357610bea565b6040805160ff9092168252519081900360200190f35b610375610bf3565b6040805192835260208301919091528051918290030190f35b610321600480360360a08110156103a457600080fd5b50803590602001610d80565b61028e611128565b610375611174565b61028e611345565b6103ee600480360360208110156103de57600080fd5b50356001600160a01b0316611351565b005b6103ee6004803603602081101561040657600080fd5b50356001600160a01b031661138a565b61028e6004803603602081101561042c57600080fd5b50356001600160a01b03166113c3565b61028e6004803603606081101561045257600080fd5b50803590602081013590604001356113de565b6101d161158f565b61028e600480360360a081101561048357600080fd5b50803590602081013590604081013590606081013590608001356115ea565b610272600480360360408110156104b857600080fd5b506001600160a01b038135169060200135611654565b61028e61166a565b61028e600480360360608110156104ec57600080fd5b5080359060208101359060400135611670565b6103ee6004803603604081101561051557600080fd5b508035906020013561183e565b6103ee6118b7565b61028e6004803603604081101561054057600080fd5b506001600160a01b0381358116916020013516611ded565b61028e611e18565b61028e6004803603606081101561057657600080fd5b5080359060208101359060400135611e1e565b61028e600480360360a081101561059f57600080fd5b5080359060208101359060408101359060608101359060800135611fe7565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106445780601f1061061957610100808354040283529160200191610644565b820191906000526020600020905b81548152906001019060200180831161062757829003601f168201915b505050505081565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b60025490565b6001600160a01b03831660009081526001602090815260408083203384529091528120546106ed908363ffffffff61204316565b6001600160a01b038516600090815260016020908152604080832033845290915290205561071c848484612058565b5060019392505050565b600081421115610767576040805162461bcd60e51b81526020600482015260076024820152661156141254915160ca1b604482015290519081900360640190fd5b600080610772611174565b91509150600080610781610bf3565b9150915060006107bb6107b2620f42406107a66006548d61212390919063ffffffff16565b9063ffffffff61215116565b848488886115ea565b90506107e26107d86107cb610be1565b8b9063ffffffff61212316565b8285858989612173565b8781101561082b576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b6108426108396107cb610be1565b86868686612206565b610882600080516020612e96833981519152600080516020612eb683398151915261087b61086e610be1565b869063ffffffff61215116565b338d612270565b6108ab600080516020612e56833981519152600080516020612e36833981519152873385612616565b604080518a8152602081018390528151600080516020612e5683398151915292600080516020612e96833981519152923392600080516020612e76833981519152929181900390910190a498975050505050505050565b60008060008060008611610950576040805162461bcd60e51b815260206004820152601060248201526f1253959053125117d05491d55351539560821b604482015290519081900360640190fd5b6109586118b7565b600080610963611174565b91509150600080610972610bf3565b600254919350915061098e906107a68c8763ffffffff61212316565b6002549097506109b4906109a88c8663ffffffff61212316565b9063ffffffff6129c916565b97506109e36109d36109c4610be1565b6002549063ffffffff61212316565b6107a68c8563ffffffff61212316565b9450610a036109f36109c4610be1565b6109a88c8463ffffffff61212316565b955088358811801590610a1a575060208901358710155b8015610a2a575060408901358611155b8015610a3a575060608901358510155b610a7f576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b610a89338b6129fe565b8715610ab857610ab8600080516020612e56833981519152600080516020612e3683398151915285338c612270565b8515610afe57610afe600080516020612e96833981519152600080516020612eb6833981519152610af7610aea610be1565b859063ffffffff61215116565b338a612270565b8615610b2d57610b2d600080516020612e56833981519152600080516020612e3683398151915286338b612616565b8415610b6657610b66600080516020612e96833981519152600080516020612eb6833981519152610b5f61086e610be1565b3389612616565b6000610b78888a63ffffffff612a9b16565b90506000610b8c878963ffffffff612a9b16565b604080518e815260208101859052808201839052905191925033917f71765b8c4a03d1ecf12e77843fa413741c67c34eacd238703f2af221d034420d9181900360600190a25050505050505b92959194509250565b64e8d4a5100090565b60055460ff1681565b604080516370a0823160e01b815230600482015290516000918291600a91600080516020612eb6833981519152916370a0823191602480820192602092909190829003018186803b158015610c4757600080fd5b505afa158015610c5b573d6000803e3d6000fd5b505050506040513d6020811015610c7157600080fd5b505111610d14576000610d0a610c85610be1565b604080516305eff7ef60e21b81523060048201529051600080516020612eb6833981519152916317bfdfbc9160248083019260209291908290030181600087803b158015610cd257600080fd5b505af1158015610ce6573d6000803e3d6000fd5b505050506040513d6020811015610cfc57600080fd5b50519063ffffffff61212316565b9092509050610d7c565b610d6c610d1f610be1565b60408051633af9e66960e01b81523060048201529051600080516020612eb683398151915291633af9e6699160248083019260209291908290030181600087803b158015610cd257600080fd5b610d77610c85610be1565b915091505b9091565b60008060008066038d7ea4c68000861015610dd5576040805162461bcd60e51b815260206004820152601060248201526f1253959053125117d05491d55351539560821b604482015290519081900360640190fd5b610ddd6118b7565b6002541561103457600080610df0611174565b91509150600080610dff610bf3565b6002549193509150610e1b906109a88c8763ffffffff61212316565b600254909850610e35906107a68c8663ffffffff61212316565b9650610e55610e456109c4610be1565b6109a88c8563ffffffff61212316565b9550610e75610e656109c4610be1565b6107a68c8463ffffffff61212316565b945088358811801590610e8c575060208901358710155b8015610e9c575060408901358611155b8015610eac575060608901358510155b610ef1576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b610efb338b612ace565b8715610f2a57610f2a600080516020612e56833981519152600080516020612e3683398151915285338c612270565b8515610f5c57610f5c600080516020612e96833981519152600080516020612eb6833981519152610af7610aea610be1565b8615610f8b57610f8b600080516020612e56833981519152600080516020612e3683398151915286338b612616565b8415610fbd57610fbd600080516020612e96833981519152600080516020612eb6833981519152610b5f61086e610be1565b6000610fcf898963ffffffff612a9b16565b90506000610fe3888863ffffffff612a9b16565b604080518e815260208101859052808201839052905191925033917f3294ef2f50b415b7d460332536cc5009c85337f255f220b93fcd5476c89fe0cd9181900360600190a250610bd8945050505050565b600061104787600263ffffffff6129c916565b90506000611074611067600261105b610be1565b9063ffffffff61212316565b899063ffffffff6129c916565b90506110803389612ace565b6110aa600080516020612e56833981519152600080516020612e3683398151915260003386612270565b6110d4600080516020612e96833981519152600080516020612eb683398151915260003385612270565b6040805189815260208101849052808201839052905133917f3294ef2f50b415b7d460332536cc5009c85337f255f220b93fcd5476c89fe0cd919081900360600190a2909450600093509150829050610bd8565b6000806000611135611174565b91509150600080611144610bf3565b909250905061116b8161115f8581888763ffffffff612b6b16565b9063ffffffff61204316565b94505050505090565b604080516370a0823160e01b815230600482015290516000918291600a91600080516020612e36833981519152916370a0823191602480820192602092909190829003018186803b1580156111c857600080fd5b505afa1580156111dc573d6000803e3d6000fd5b505050506040513d60208110156111f257600080fd5b50511161127f57604080516305eff7ef60e21b81523060048201529051600091600080516020612e36833981519152916317bfdfbc9160248082019260209290919082900301818787803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506040513d602081101561127357600080fd5b50519092509050610d7c565b60408051633af9e66960e01b81523060048201529051600080516020612e3683398151915291633af9e6699160248083019260209291908290030181600087803b1580156112cc57600080fd5b505af11580156112e0573d6000803e3d6000fd5b505050506040513d60208110156112f657600080fd5b5051604080516305eff7ef60e21b81523060048201529051600080516020612e36833981519152916317bfdfbc9160248083019260209291908290030181600087803b15801561124957600080fd5b670a688906bd8b000081565b6008546001600160a01b0316331461136857600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146113a157600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b60008142111561141f576040805162461bcd60e51b81526020600482015260076024820152661156141254915160ca1b604482015290519081900360640190fd5b60008061142a611174565b91509150600080611439610bf3565b91509150600061144c8884848888611fe7565b905061145c818985858989612173565b600654611476906109a883620f424063ffffffff61212316565b9050888111156114c1576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b6114dc6108396114cf610be1565b839063ffffffff61212316565b61150f600080516020612e96833981519152600080516020612eb683398151915261150861086e610be1565b3385612270565b611538600080516020612e56833981519152600080516020612e3683398151915287338c612616565b60408051828152602081018a90528151600080516020612e5683398151915292600080516020612e96833981519152923392600080516020612e76833981519152929181900390910190a498975050505050505050565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106445780601f1061061957610100808354040283529160200191610644565b6000806115fd868663ffffffff612a9b16565b90506000611611858563ffffffff612a9b16565b90506000611625838a63ffffffff612b7d16565b90506000611634828585612baf565b9050611646838263ffffffff612a9b16565b9a9950505050505050505050565b6000611661338484612058565b50600192915050565b60075481565b6000814211156116b1576040805162461bcd60e51b81526020600482015260076024820152661156141254915160ca1b604482015290519081900360640190fd5b6000806116bc611174565b915091506000806116cb610bf3565b9150915060006116fe6116f5670de0b6b3a76400006107a66006548d61212390919063ffffffff16565b868686866115ea565b905061170e898287878787612173565b611726611719610be1565b829063ffffffff61215116565b905087811015611771576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b61177e8986868686612206565b6117a7600080516020612e56833981519152600080516020612e3683398151915286338d612270565b6117e7600080516020612e96833981519152600080516020612eb68339815191526117e06117d3610be1565b879063ffffffff61215116565b3385612616565b604080518a8152602081018390528151600080516020612e9683398151915292600080516020612e56833981519152923392600080516020612e76833981519152929181900390910190a498975050505050505050565b6008546001600160a01b0316331461185557600080fd5b670de0b6b3a7640000821080156118745750670dbd2fc137a300008210155b61187d57600080fd5b80156118ac5760036118a1826107a6670de0b6b3a76400008663ffffffff61204316565b10156118ac57600080fd5b600691909155600755565b604080516370a0823160e01b8152306004820152905160009173c00e94cb662c3520282e6f5717214004a7f26888916370a0823191602480820192602092909190829003018186803b15801561190c57600080fd5b505afa158015611920573d6000803e3d6000fd5b505050506040513d602081101561193657600080fd5b50519050806119455750611deb565b600080611950611174565b9150915060008061195f610bf3565b90925090506000611976838563ffffffff612b6b16565b611986868463ffffffff612b6b16565b604080516003808252608082019092529290911192506060919060208201838038833901905050905073c00e94cb662c3520282e6f5717214004a7f26888816000815181106119d157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611a1357fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081611a4c57600080516020612e96833981519152611a5c565b600080516020612e568339815191525b81600281518110611a6957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398960008530426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611b2d578181015183820152602001611b15565b505050509050019650505050505050600060405180830381600087803b158015611b5657600080fd5b505af1158015611b6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611b9357600080fd5b8101908080516040519392919084640100000000821115611bb357600080fd5b908301906020820185811115611bc857600080fd5b8251866020820283011164010000000082111715611be557600080fd5b82525081516020918201928201910280838360005b83811015611c12578181015183820152602001611bfa565b5050505090500160405250505090508215611d0757600080516020612e368339815191526001600160a01b031663a0712d6882600281518110611c5157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611c8f57600080fd5b505af1158015611ca3573d6000803e3d6000fd5b505050506040513d6020811015611cb957600080fd5b505115611d02576040805162461bcd60e51b815260206004820152601260248201527118dd1bdad95b8b9b5a5b9d0819985a5b195960721b604482015290519081900360640190fd5b611de2565b600080516020612eb68339815191526001600160a01b031663a0712d6882600281518110611d3157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611d6f57600080fd5b505af1158015611d83573d6000803e3d6000fd5b505050506040513d6020811015611d9957600080fd5b505115611de2576040805162461bcd60e51b815260206004820152601260248201527118dd1bdad95b8b9b5a5b9d0819985a5b195960721b604482015290519081900360640190fd5b50505050505050505b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60065481565b600081421115611e5f576040805162461bcd60e51b81526020600482015260076024820152661156141254915160ca1b604482015290519081900360640190fd5b600080611e6a611174565b91509150600080611e79610bf3565b915091506000611ea3611e9a611e8d610be1565b8a9063ffffffff61212316565b86868686611fe7565b9050611ebd81611eb46107cb610be1565b87878787612173565b600654611edc906109a883670de0b6b3a764000063ffffffff61212316565b905088811115611f27576040805162461bcd60e51b815260206004820152601160248201527014d31254141051d157d111551150d51151607a1b604482015290519081900360640190fd5b611f348186868686612206565b611f5d600080516020612e56833981519152600080516020612e36833981519152863385612270565b611f90600080516020612e96833981519152600080516020612eb6833981519152611f896117d3610be1565b338c612616565b60408051828152602081018a90528151600080516020612e9683398151915292600080516020612e56833981519152923392600080516020612e76833981519152929181900390910190a498975050505050505050565b600080611ffa868663ffffffff612a9b16565b9050600061200e858563ffffffff612a9b16565b90506000612022828a63ffffffff612a9b16565b90506000612031828486612baf565b9050611646818563ffffffff612a9b16565b60008282111561205257600080fd5b50900390565b6001600160a01b03821661206b57600080fd5b6001600160a01b038316600090815260208190526040902054612094908263ffffffff61204316565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546120c9908263ffffffff612b6b16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082612132575060006106ad565b8282028284828161213f57fe5b041461214a57600080fd5b9392505050565b600080821161215f57600080fd5b600082848161216a57fe5b04949350505050565b612183858263ffffffff612b6b16565b8210156121fe576121a3603e61105b8561115f8a8963ffffffff612b6b16565b6121bc606461105b8561115f8a8763ffffffff612b6b16565b106121fe576040805162461bcd60e51b815260206004820152600d60248201526c0888a84a8bea89e9ebe9aaa869609b1b604482015290519081900360640190fd5b505050505050565b600754156122695760006122506122298361115f87818a8963ffffffff612b6b16565b6107a6670de0b6b3a76400006107a660025461105b6007548d61212390919063ffffffff16565b6009549091506121fe906001600160a01b031682612ace565b5050505050565b604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918716916323b872dd916064808201926020929091908290030181600087803b1580156122c957600080fd5b505af11580156122dd573d6000803e3d6000fd5b505050506040513d60208110156122f357600080fd5b50516122fe57600080fd5b821561255d578083106123d057836001600160a01b0316630e752702826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561235157600080fd5b505af1158015612365573d6000803e3d6000fd5b505050506040513d602081101561237b57600080fd5b5051156123cb576040805162461bcd60e51b815260206004820152601960248201527818dd1bdad95b8b9c995c185e509bdc9c9bddc819985a5b1959603a1b604482015290519081900360640190fd5b612558565b836001600160a01b0316630e752702846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561241657600080fd5b505af115801561242a573d6000803e3d6000fd5b505050506040513d602081101561244057600080fd5b505115612490576040805162461bcd60e51b815260206004820152601960248201527818dd1bdad95b8b9c995c185e509bdc9c9bddc819985a5b1959603a1b604482015290519081900360640190fd5b6001600160a01b03841663a0712d686124af838663ffffffff61204316565b6040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156124e557600080fd5b505af11580156124f9573d6000803e3d6000fd5b505050506040513d602081101561250f57600080fd5b505115612558576040805162461bcd60e51b815260206004820152601260248201527118dd1bdad95b8b9b5a5b9d0819985a5b195960721b604482015290519081900360640190fd5b612269565b836001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156125a357600080fd5b505af11580156125b7573d6000803e3d6000fd5b505050506040513d60208110156125cd57600080fd5b505115612269576040805162461bcd60e51b815260206004820152601260248201527118dd1bdad95b8b9b5a5b9d0819985a5b195960721b604482015290519081900360640190fd5b8083106126e657836001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561266357600080fd5b505af1158015612677573d6000803e3d6000fd5b505050506040513d602081101561268d57600080fd5b5051156126e1576040805162461bcd60e51b815260206004820152601e60248201527f63746f6b656e2e72656465656d556e6465726c79696e67206661696c65640000604482015290519081900360640190fd5b612934565b826127a657836001600160a01b031663c5ebeaec826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561273157600080fd5b505af1158015612745573d6000803e3d6000fd5b505050506040513d602081101561275b57600080fd5b5051156126e1576040805162461bcd60e51b815260206004820152601460248201527318dd1bdad95b8b989bdc9c9bddc819985a5b195960621b604482015290519081900360640190fd5b836001600160a01b031663852a12e3846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156127ec57600080fd5b505af1158015612800573d6000803e3d6000fd5b505050506040513d602081101561281657600080fd5b50511561286a576040805162461bcd60e51b815260206004820152601e60248201527f63746f6b656e2e72656465656d556e6465726c79696e67206661696c65640000604482015290519081900360640190fd5b6001600160a01b03841663c5ebeaec612889838663ffffffff61204316565b6040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156128bf57600080fd5b505af11580156128d3573d6000803e3d6000fd5b505050506040513d60208110156128e957600080fd5b505115612934576040805162461bcd60e51b815260206004820152601460248201527318dd1bdad95b8b989bdc9c9bddc819985a5b195960621b604482015290519081900360640190fd5b846001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561299457600080fd5b505af11580156129a8573d6000803e3d6000fd5b505050506040513d60208110156129be57600080fd5b505161226957600080fd5b60008082116129d757600080fd5b60008284816129e257fe5b0490508284816129ee57fe5b061561214a576001019392505050565b6001600160a01b038216600090815260208190526040902054612a27908263ffffffff61204316565b6001600160a01b038316600090815260208190526040902055600254612a53908263ffffffff61204316565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000818303818312801590612ab05750838113155b80612ac55750600083128015612ac557508381135b61214a57600080fd5b6001600160a01b038216600090815260208190526040902054612af7908263ffffffff612b6b16565b6001600160a01b038316600090815260208190526040902055600254612b23908263ffffffff612b6b16565b6002556040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60008282018381101561214a57600080fd5b6000828201818312801590612b925750838112155b80612ac55750600083128015612ac5575083811261214a57600080fd5b6000808080612bf4612be7670de0b6b3a7640000612bdb88670a688906bd8b000063ffffffff612d7616565b9063ffffffff612db616565b879063ffffffff612b7d16565b90506000612c1f612be7670de0b6b3a7640000612bdb8a670a688906bd8b000063ffffffff612d7616565b9050612c31828263ffffffff612d7616565b9350612c76612c5a670a688906bd8b0000612bdb87670de0b6b3a764000063ffffffff612d7616565b612c6a8a8063ffffffff612d7616565b9063ffffffff612a9b16565b925060009150612cbd9050612ca86ec097ce7bc90715b34b9f1000000000670a688906bd8b000063ffffffff612db616565b670a688906bd8b00009063ffffffff612b7d16565b90506000612cdd670de0b6b3a7640000612bdb8a8563ffffffff612d7616565b90506000612d05612cf585600463ffffffff612d7616565b612c6a848063ffffffff612d7616565b90506000811215612d47576040805162461bcd60e51b81526020600482015260076024820152661b9bc81c9bdbdd60ca1b604482015290519081900360640190fd5b612d696002612bdb612d5884612df2565b60008690039063ffffffff612b7d16565b9998505050505050505050565b600082612d85575060006106ad565b82820282848281612d9257fe5b05148015612ac5575083600019141580612ac5575060fe1983141561214a57600080fd5b60008115801590612dd5575081600019141580612dd5575060fe198314155b612dde57600080fd5b6000828481612de957fe5b05949350505050565b600080612e03600284056001612b7d565b9050825b8082121561214a5750806002612e26828681612e1f57fe5b0584612b7d565b81612e2d57fe5b059150612e0756fe0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36430000000000000000000000006b175474e89094c44da98b954eedeac495271d0f981c435297345a1ac10e12ee208ec3dc700f2d854c0e88dc8683fa4ae0fb28d3000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563a265627a7a723158206f46ae2156366e1c101963ad99fdfa8969e97c9f1472e689a4e091eee287bbeb64736f6c63430005100032

Deployed Bytecode Sourcemap

6917:15180:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6917:15180:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5653:18;;;:::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;5653:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4441:201;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4441:201:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2615:91;;;:::i;:::-;;;;;;;;;;;;;;;;5108:229;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5108:229:0;;;;;;;;;;;;;;;;;:::i;13550:810::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13550:810:0;;;;;;;;;;;;:::i;19776:1399::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;19776:1399:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12255:76;;;:::i;5705:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10192:345;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17751:2017;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;17751:2017:0;;;;;;:::i;10564:192::-;;;:::i;9881:303::-;;;:::i;9025:43::-;;;:::i;9627:115::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9627:115:0;-1:-1:-1;;;;;9627:115:0;;:::i;:::-;;9135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9135:115:0;-1:-1:-1;;;;;9135:115:0;;:::i;2921:106::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2921:106:0;-1:-1:-1;;;;;2921:106:0;;:::i;15171:807::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15171:807:0;;;;;;;;;;;;:::i;5678:20::-;;;:::i;11578:329::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;11578:329:0;;;;;;;;;;;;;;;;;;;;;;:::i;3662:140::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3662:140:0;;;;;;;;:::i;8988:30::-;;;:::i;12760:778::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12760:778:0;;;;;;;;;;;;:::i;9258:361::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9258:361:0;;;;;;;:::i;21314:778::-;;;:::i;3361:131::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3361:131:0;;;;;;;;;;:::i;8950:31::-;;;:::i;14368:791::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14368:791:0;;;;;;;;;;;;:::i;11915:332::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;11915:332:0;;;;;;;;;;;;;;;;;;;;;;:::i;5653:18::-;;;;;;;;;;;;;;;-1:-1:-1;;5653:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4441:201::-;4532:10;4506:4;4523:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;4523:29:0;;;;;;;;;;;:37;;;4576:36;;;;;;;4506:4;;4523:29;;4532:10;;4576:36;;;;;;;;-1:-1:-1;4630:4:0;4441:201;;;;;:::o;2615:91::-;2686:12;;2615:91;:::o;5108:229::-;-1:-1:-1;;;;;5233:14:0;;5187:4;5233:14;;;:8;:14;;;;;;;;5248:10;5233:26;;;;;;;;:37;;5264:5;5233:37;:30;:37;:::i;:::-;-1:-1:-1;;;;;5204:14:0;;;;;;:8;:14;;;;;;;;5219:10;5204:26;;;;;;;:66;5281:26;5213:4;5297:2;5301:5;5281:9;:26::i;:::-;-1:-1:-1;5325:4:0;5108:229;;;;;:::o;13550:810::-;13641:7;13688:8;13669:15;:27;;13661:47;;;;;-1:-1:-1;;;13661:47:0;;;;;;;;;;;;-1:-1:-1;;;13661:47:0;;;;;;;;;;;;;;;13720:9;13731;13744:15;:13;:15::i;:::-;13719:40;;;;13771:9;13782;13795:16;:14;:16::i;:::-;13770:41;;;;13824:14;13841:50;13855:23;13874:3;13855:14;13865:3;;13855:5;:9;;:14;;;;:::i;:::-;:18;:23;:18;:23;:::i;:::-;13880:1;13883;13886;13889;13841:13;:50::i;:::-;13824:67;;13933:52;13947:17;13957:6;:4;:6::i;:::-;13947:5;;:17;:9;:17;:::i;:::-;13966:6;13974:1;13977;13980;13983;13933:13;:52::i;:::-;14014:10;14004:6;:20;;13996:50;;;;;-1:-1:-1;;;13996:50:0;;;;;;;;;;;;-1:-1:-1;;;13996:50:0;;;;;;;;;;;;;;;14067:38;14075:17;14085:6;:4;:6::i;14075:17::-;14094:1;14097;14100;14103;14067:7;:38::i;:::-;14126:59;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;14152:13:0;14158:6;:4;:6::i;:::-;14152:1;;:13;:5;:13;:::i;:::-;14167:10;14179:5;14126:12;:59::i;:::-;14196:47;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;14221:1:0;14224:10;14236:6;14196:13;:47::i;:::-;14261:65;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7433:42:0;-1:-1:-1;;;;;;;;;;;7511:42:0;14271:10;;-1:-1:-1;;;;;;;;;;;14261:65:0;;;;;;;;;;14346:6;13550:810;-1:-1:-1;;;;;;;;13550:810:0:o;19776:1399::-;19862:14;19878:15;19895;19912:16;19957:1;19949:5;:9;19941:38;;;;;-1:-1:-1;;;19941:38:0;;;;;;;;;;;;-1:-1:-1;;;19941:38:0;;;;;;;;;;;;;;;19992:13;:11;:13::i;:::-;20019:9;20030;20043:15;:13;:15::i;:::-;20018:40;;;;20070:9;20081;20094:16;:14;:16::i;:::-;20150:12;;20069:41;;-1:-1:-1;20069:41:0;-1:-1:-1;20133:30:0;;:12;:5;20143:1;20133:12;:9;:12;:::i;:30::-;20204:12;;20123:40;;-1:-1:-1;20183:34:0;;:12;:5;20193:1;20183:12;:9;:12;:::i;:::-;:20;:34;:20;:34;:::i;:::-;20174:43;;20239:42;20256:24;20273:6;:4;:6::i;:::-;20256:12;;;:24;:16;:24;:::i;:::-;20239:12;:5;20249:1;20239:12;:9;:12;:::i;:42::-;20228:53;;20302:46;20323:24;20340:6;:4;:6::i;20323:24::-;20302:12;:5;20312:1;20302:12;:9;:12;:::i;:46::-;20292:56;-1:-1:-1;20377:9:0;;20367:19;;;;;:43;;-1:-1:-1;20401:9:0;;;;20390:20;;;20367:43;:67;;;;-1:-1:-1;20425:9:0;;;;20414:20;;;20367:67;:92;;;;-1:-1:-1;20450:9:0;;;;20438:21;;;20367:92;20359:122;;;;;-1:-1:-1;;;20359:122:0;;;;;;;;;;;;-1:-1:-1;;;20359:122:0;;;;;;;;;;;;;;;20494:24;20500:10;20512:5;20494;:24::i;:::-;20534:10;;20531:74;;20559:46;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;20583:1:0;20586:10;20598:6;20559:12;:46::i;:::-;20619:11;;20616:90;;20645:61;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;20671:13:0;20677:6;:4;:6::i;:::-;20671:1;;:13;:5;:13;:::i;:::-;20686:10;20698:7;20645:12;:61::i;:::-;20720:11;;20717:77;;20746:48;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;20771:1:0;20774:10;20786:7;20746:13;:48::i;:::-;20808:12;;20805:93;;20835:63;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;20862:13:0;20868:6;:4;:6::i;20862:13::-;20877:10;20889:8;20835:13;:63::i;:::-;20911:17;20931:35;20938:7;20958:6;20931:35;:19;:35;:::i;:::-;20911:55;-1:-1:-1;20977:18:0;20998:37;21005:8;21026:7;20998:37;:20;:37;:::i;:::-;21053:59;;;;;;;;;;;;;;;;;;;;20977:58;;-1:-1:-1;21069:10:0;;21053:59;;;;;;;;;-1:-1:-1;;;;;;19776:1399:0;;;;;;;;:::o;12255:76::-;12319:4;12255:76;:::o;5705:21::-;;;;;;:::o;10192:345::-;10267:30;;;-1:-1:-1;;;10267:30:0;;10291:4;10267:30;;;;;;10234:7;;;;10301:2;;-1:-1:-1;;;;;;;;;;;7672:42:0;10267:15;;:30;;;;;;;;;;;;;;;7672:42;10267:30;;;5:2:-1;;;;30:1;27;20:12;5:2;10267:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10267:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10267:30:0;:36;10263:266;;10326:1;10329:53;10375:6;:4;:6::i;:::-;10329:41;;;-1:-1:-1;;;10329:41:0;;10364:4;10329:41;;;;;;-1:-1:-1;;;;;;;;;;;7672:42:0;10329:26;;:41;;;;;;;;;;;;;;-1:-1:-1;7672:42:0;10329:41;;;5:2:-1;;;;30:1;27;20:12;5:2;10329:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10329:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10329:41:0;;:53;:45;:53;:::i;:::-;10318:66;;-1:-1:-1;10318:66:0;-1:-1:-1;10318:66:0;;10263:266;10421:52;10466:6;:4;:6::i;:::-;10421:40;;;-1:-1:-1;;;10421:40:0;;10455:4;10421:40;;;;;;-1:-1:-1;;;;;;;;;;;7672:42:0;10421:25;;:40;;;;;;;;;;;;;;-1:-1:-1;7672:42:0;10421:40;;;5:2:-1;;;;30:1;27;20:12;10421:52:0;10475:53;10521:6;:4;:6::i;10475:53::-;10413:116;;;;10263:266;10192:345;;:::o;17751:2017::-;17834:14;17850:15;17867;17884:16;17930:4;17921:5;:13;;17913:42;;;;;-1:-1:-1;;;17913:42:0;;;;;;;;;;;;-1:-1:-1;;;17913:42:0;;;;;;;;;;;;;;;17985:13;:11;:13::i;:::-;18015:12;;:16;18011:1750;;18049:9;18060;18073:15;:13;:15::i;:::-;18048:40;;;;18104:9;18115;18128:16;:14;:16::i;:::-;18191:12;;18103:41;;-1:-1:-1;18103:41:0;-1:-1:-1;18170:34:0;;:12;:5;18180:1;18170:12;:9;:12;:::i;:34::-;18246:12;;18161:43;;-1:-1:-1;18229:30:0;;:12;:5;18239:1;18229:12;:9;:12;:::i;:30::-;18219:40;;18284:46;18305:24;18322:6;:4;:6::i;18305:24::-;18284:12;:5;18294:1;18284:12;:9;:12;:::i;:46::-;18274:56;;18356:42;18373:24;18390:6;:4;:6::i;18373:24::-;18356:12;:5;18366:1;18356:12;:9;:12;:::i;:42::-;18345:53;-1:-1:-1;18431:9:0;;18421:19;;;;;:43;;-1:-1:-1;18455:9:0;;;;18444:20;;;18421:43;:67;;;;-1:-1:-1;18479:9:0;;;;18468:20;;;18421:67;:92;;;;-1:-1:-1;18504:9:0;;;;18492:21;;;18421:92;18413:122;;;;;-1:-1:-1;;;18413:122:0;;;;;;;;;;;;-1:-1:-1;;;18413:122:0;;;;;;;;;;;;;;;18564:24;18570:10;18582:5;18564;:24::i;:::-;18608:10;;18605:78;;18637:46;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;18661:1:0;18664:10;18676:6;18637:12;:46::i;:::-;18701:11;;18698:94;;18731:61;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;18757:13:0;18763:6;:4;:6::i;18731:61::-;18810:11;;18807:81;;18840:48;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;18865:1:0;18868:10;18880:7;18840:13;:48::i;:::-;18906:12;;18903:97;;18937:63;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;18964:13:0;18970:6;:4;:6::i;18937:63::-;19017:17;19037:35;19044:6;19063:7;19037:35;:18;:35;:::i;:::-;19017:55;-1:-1:-1;19087:18:0;19108:37;19115:7;19135:8;19108:37;:19;:37;:::i;:::-;19167:56;;;;;;;;;;;;;;;;;;;;19087:58;;-1:-1:-1;19180:10:0;;19167:56;;;;;;;;;-1:-1:-1;19238:43:0;;-1:-1:-1;;;;;19238:43:0;18011:1750;19314:18;19335:16;:5;19349:1;19335:16;:13;:16;:::i;:::-;19314:37;;19366:19;19388:28;19402:13;19413:1;19402:6;:4;:6::i;:::-;:10;:13;:10;:13;:::i;:::-;19388:5;;:28;:13;:28;:::i;:::-;19366:50;;19433:24;19439:10;19451:5;19433;:24::i;:::-;19472:50;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;19496:1:0;19499:10;19511;19472:12;:50::i;:::-;19537:53;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;19563:1:0;19566:10;19578:11;19537:12;:53::i;:::-;19624:72;;;;;;;;;;;;;;;;;;;;19637:10;;19624:72;;;;;;;;;;19719:10;;-1:-1:-1;19731:1:0;;-1:-1:-1;19734:11:0;-1:-1:-1;19731:1:0;;-1:-1:-1;19711:38:0;;10564:192;10595:7;10616:9;10627;10640:15;:13;:15::i;:::-;10615:40;;;;10667:9;10678;10691:16;:14;:16::i;:::-;10666:41;;-1:-1:-1;10666:41:0;-1:-1:-1;10725:22:0;10666:41;10725:15;10738:1;10725:15;:1;10666:41;10725:8;:5;:8;:::i;:::-;:12;:15;:12;:15;:::i;:22::-;10718:30;;;;;;10564:192;:::o;9881:303::-;9955:29;;;-1:-1:-1;;;9955:29:0;;9978:4;9955:29;;;;;;9922:7;;;;9988:2;;-1:-1:-1;;;;;;;;;;;7591:42:0;9955:14;;:29;;;;;;;;;;;;;;;7591:42;9955:29;;;5:2:-1;;;;30:1;27;20:12;5:2;9955:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9955:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9955:29:0;:35;9951:225;;10016:40;;;-1:-1:-1;;;10016:40:0;;10050:4;10016:40;;;;;;10013:1;;-1:-1:-1;;;;;;;;;;;7591:42:0;10016:25;;:40;;;;;;;;;;;;;;;10013:1;7591:42;10016:40;;;5:2:-1;;;;30:1;27;20:12;5:2;10016:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10016:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10016:40:0;10005:52;;-1:-1:-1;10016:40:0;-1:-1:-1;10005:52:0;;9951:225;10094:39;;;-1:-1:-1;;;10094:39:0;;10127:4;10094:39;;;;;;-1:-1:-1;;;;;;;;;;;7591:42:0;10094:24;;:39;;;;;;;;;;;;;;-1:-1:-1;7591:42:0;10094:39;;;5:2:-1;;;;30:1;27;20:12;5:2;10094:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10094:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10094:39:0;10135:40;;;-1:-1:-1;;;10135:40:0;;10169:4;10135:40;;;;;;-1:-1:-1;;;;;;;;;;;7591:42:0;10135:25;;:40;;;;;10094:39;;10135:40;;;;;;;-1:-1:-1;7591:42:0;10135:40;;;5:2:-1;;;;30:1;27;20:12;9025:43:0;9061:7;9025:43;:::o;9627:115::-;9703:5;;-1:-1:-1;;;;;9703:5:0;9689:10;:19;9681:28;;;;;;9720:5;:14;;-1:-1:-1;;;;;;9720:14:0;-1:-1:-1;;;;;9720:14:0;;;;;;;;;;9627:115::o;9135:::-;9211:5;;-1:-1:-1;;;;;9211:5:0;9197:10;:19;9189:28;;;;;;9228:5;:14;;-1:-1:-1;;;;;;9228:14:0;-1:-1:-1;;;;;9228:14:0;;;;;;;;;;9135:115::o;2921:106::-;-1:-1:-1;;;;;3003:16:0;2976:7;3003:16;;;;;;;;;;;;2921:106::o;15171:807::-;15263:7;15310:8;15291:15;:27;;15283:47;;;;;-1:-1:-1;;;15283:47:0;;;;;;;;;;;;-1:-1:-1;;;15283:47:0;;;;;;;;;;;;;;;15342:9;15353;15366:15;:13;:15::i;:::-;15341:40;;;;15393:9;15404;15417:16;:14;:16::i;:::-;15392:41;;;;15446:13;15462:34;15477:6;15485:1;15488;15491;15494;15462:14;:34::i;:::-;15446:50;;15507:40;15521:5;15528:6;15536:1;15539;15542;15545;15507:13;:40::i;:::-;15589:3;;15566:27;;:14;:5;15576:3;15566:14;:9;:14;:::i;:27::-;15558:35;;15650:9;15641:5;:18;;15633:48;;;;;-1:-1:-1;;;15633:48:0;;;;;;;;;;;;-1:-1:-1;;;15633:48:0;;;;;;;;;;;;;;;15694:38;15702:17;15712:6;:4;:6::i;:::-;15702:5;;:17;:9;:17;:::i;15694:38::-;15745:59;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;15771:13:0;15777:6;:4;:6::i;15771:13::-;15786:10;15798:5;15745:12;:59::i;:::-;15815:47;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;15840:1:0;15843:10;15855:6;15815:13;:47::i;:::-;15880:65;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7433:42:0;-1:-1:-1;;;;;;;;;;;7511:42:0;15890:10;;-1:-1:-1;;;;;;;;;;;15880:65:0;;;;;;;;;;15965:5;15171:807;-1:-1:-1;;;;;;;;15171:807:0:o;5678:20::-;;;;;;;;;;;;;;;-1:-1:-1;;5678:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11578:329;11681:7;;11712:24;11719:1;11733;11712:24;:13;:24;:::i;:::-;11701:35;-1:-1:-1;11747:8:0;11758:24;11765:1;11779;11758:24;:13;:24;:::i;:::-;11747:35;-1:-1:-1;11793:9:0;11805:20;:1;11818:5;11805:20;:5;:20;:::i;:::-;11793:32;;11838:9;11850:11;11852:2;11856:1;11859;11850;:11::i;:::-;11838:23;-1:-1:-1;11889:9:0;:1;11838:23;11889:9;:5;:9;:::i;:::-;11874:25;11578:329;-1:-1:-1;;;;;;;;;;11578:329:0:o;3662:140::-;3723:4;3740:32;3750:10;3762:2;3766:5;3740:9;:32::i;:::-;-1:-1:-1;3790:4:0;3662:140;;;;:::o;8988:30::-;;;;:::o;12760:778::-;12851:7;12898:8;12879:15;:27;;12871:47;;;;;-1:-1:-1;;;12871:47:0;;;;;;;;;;;;-1:-1:-1;;;12871:47:0;;;;;;;;;;;;;;;12930:9;12941;12954:15;:13;:15::i;:::-;12929:40;;;;12981:9;12992;13005:16;:14;:16::i;:::-;12980:41;;;;13034:14;13051:51;13065:24;13084:4;13065:14;13075:3;;13065:5;:9;;:14;;;;:::i;:24::-;13091:1;13094;13097;13100;13051:13;:51::i;:::-;13034:68;;13113:40;13127:5;13134:6;13142:1;13145;13148;13151;13113:13;:40::i;:::-;13173:18;13184:6;:4;:6::i;:::-;13173;;:18;:10;:18;:::i;:::-;13164:27;;13220:10;13210:6;:20;;13202:50;;;;;-1:-1:-1;;;13202:50:0;;;;;;;;;;;;-1:-1:-1;;;13202:50:0;;;;;;;;;;;;;;;13265:26;13273:5;13280:1;13283;13286;13289;13265:7;:26::i;:::-;13304:45;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;13328:1:0;13331:10;13343:5;13304:12;:45::i;:::-;13360:61;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;13387:13:0;13393:6;:4;:6::i;:::-;13387:1;;:13;:5;:13;:::i;:::-;13402:10;13414:6;13360:13;:61::i;:::-;13439:65;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7511:42:0;-1:-1:-1;;;;;;;;;;;7433:42:0;13449:10;;-1:-1:-1;;;;;;;;;;;13439:65:0;;;;;;;;;;13524:6;12760:778;-1:-1:-1;;;;;;;;12760:778:0:o;9258:361::-;9355:5;;-1:-1:-1;;;;;9355:5:0;9341:10;:19;9333:28;;;;;;9387:4;9380;:11;:30;;;;;9403:7;9395:4;:15;;9380:30;9372:39;;;;;;9441:16;;9438:89;;9525:1;9480:41;9508:12;9480:23;9488:4;9498;9480:23;:17;:23;:::i;:41::-;:46;;9472:55;;;;;;9564:3;:10;;;;9585:11;:26;9258:361::o;21314:778::-;21371:29;;;-1:-1:-1;;;21371:29:0;;21394:4;21371:29;;;;;;21355:13;;7356:42;;21371:14;;:29;;;;;;;;;;;;;;;7356:42;21371:29;;;5:2:-1;;;;30:1;27;20:12;5:2;21371:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21371:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21371:29:0;;-1:-1:-1;21414:10:0;21411:22;;21426:7;;;21411:22;21446:9;21457;21470:15;:13;:15::i;:::-;21445:40;;;;21497:9;21508;21521:16;:14;:16::i;:::-;21496:41;;-1:-1:-1;21496:41:0;-1:-1:-1;21550:10:0;21574:8;21496:41;21580:1;21574:8;:5;:8;:::i;:::-;21563;:1;21569;21563:8;:5;:8;:::i;:::-;21619:16;;;21633:1;21619:16;;;;;;;;;21563:19;;;;;-1:-1:-1;21595:21:0;;21619:16;;;;21595:21;;105:10:-1;21619:16:0;88:34:-1;136:17;;-1:-1;21619:16:0;21595:40;;7356:42;21646:4;21651:1;21646:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;21646:23:0;;;-1:-1:-1;;;;;21646:23:0;;;;;21690:42;21680:4;21685:1;21680:7;;;;;;;;;;;;;:52;-1:-1:-1;;;;;21680:52:0;;;-1:-1:-1;;;;;21680:52:0;;;;;21760:5;:36;;-1:-1:-1;;;;;;;;;;;21760:36:0;;;-1:-1:-1;;;;;;;;;;;21760:36:0;21750:4;21755:1;21750:7;;;;;;;;;;;;;:46;-1:-1:-1;;;;;21750:46:0;;;-1:-1:-1;;;;;21750:46:0;;;;;21807:24;7276:42;-1:-1:-1;;;;;21834:32:0;;21867:5;21874:1;21877:4;21891;21898:3;21834:68;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21834:68:0;-1:-1:-1;;;;;21834:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;21834:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21834:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21834:68:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;21834:68:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;21834:68:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;21834:68:0;;421:4:-1;412:14;;;;21834:68:0;;;;;412:14:-1;21834:68:0;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;21834:68:0;;;;;;;;;;;21807:95;;21918:5;21915:167;;;-1:-1:-1;;;;;;;;;;;;;;;;21946:9:0;;21956:7;21964:1;21956:10;;;;;;;;;;;;;;21946:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21946:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21946:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21946:21:0;:26;21938:57;;;;;-1:-1:-1;;;21938:57:0;;;;;;;;;;;;-1:-1:-1;;;21938:57:0;;;;;;;;;;;;;;;21915:167;;;-1:-1:-1;;;;;;;;;;;;;;;;22032:10:0;;22043:7;22051:1;22043:10;;;;;;;;;;;;;;22032:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22032:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22032:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22032:22:0;:27;22024:58;;;;;-1:-1:-1;;;22024:58:0;;;;;;;;;;;;-1:-1:-1;;;22024:58:0;;;;;;;;;;;;;;;21314:778;;;;;;;;;:::o;3361:131::-;-1:-1:-1;;;;;3460:15:0;;;3433:7;3460:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;3361:131::o;8950:31::-;;;;:::o;14368:791::-;14460:7;14507:8;14488:15;:27;;14480:47;;;;;-1:-1:-1;;;14480:47:0;;;;;;;;;;;;-1:-1:-1;;;14480:47:0;;;;;;;;;;;;;;;14539:9;14550;14563:15;:13;:15::i;:::-;14538:40;;;;14590:9;14601;14614:16;:14;:16::i;:::-;14589:41;;;;14643:13;14659:46;14674:18;14685:6;:4;:6::i;:::-;14674;;:18;:10;:18;:::i;:::-;14694:1;14697;14700;14703;14659:14;:46::i;:::-;14643:62;;14716:52;14730:5;14737:18;14748:6;:4;:6::i;14737:18::-;14757:1;14760;14763;14766;14716:13;:52::i;:::-;14811:3;;14787:28;;:15;:5;14797:4;14787:15;:9;:15;:::i;:28::-;14779:36;;14843:9;14834:5;:18;;14826:48;;;;;-1:-1:-1;;;14826:48:0;;;;;;;;;;;;-1:-1:-1;;;14826:48:0;;;;;;;;;;;;;;;14887:26;14895:5;14902:1;14905;14908;14911;14887:7;:26::i;:::-;14926:45;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;14950:1:0;14953:10;14965:5;14926:12;:45::i;:::-;14982:61;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;15009:13:0;15015:6;:4;:6::i;15009:13::-;15024:10;15036:6;14982:13;:61::i;:::-;15061:65;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7511:42:0;-1:-1:-1;;;;;;;;;;;7433:42:0;15071:10;;-1:-1:-1;;;;;;;;;;;15061:65:0;;;;;;;;;;15146:5;14368:791;-1:-1:-1;;;;;;;;14368:791:0:o;11915:332::-;12020:7;;12051:24;12058:1;12072;12051:24;:13;:24;:::i;:::-;12040:35;-1:-1:-1;12086:8:0;12097:24;12104:1;12118;12097:24;:13;:24;:::i;:::-;12086:35;-1:-1:-1;12132:9:0;12144:21;12086:35;12157:6;12144:21;:5;:21;:::i;:::-;12132:33;;12178:9;12190:11;12192:2;12196:1;12199;12190;:11::i;:::-;12178:23;-1:-1:-1;12229:9:0;12178:23;12236:1;12229:9;:6;:9;:::i;620:148::-;678:7;711:1;706;:6;;698:15;;;;;;-1:-1:-1;736:5:0;;;620:148::o;5345:260::-;-1:-1:-1;;;;;5433:16:0;;5425:25;;;;;;-1:-1:-1;;;;;5479:15:0;;:9;:15;;;;;;;;;;;:26;;5499:5;5479:26;:19;:26;:::i;:::-;-1:-1:-1;;;;;5461:15:0;;;:9;:15;;;;;;;;;;;:44;;;;5532:13;;;;;;;:24;;5550:5;5532:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;5516:13:0;;;:9;:13;;;;;;;;;;;;:40;;;;5572:25;;;;;;;5516:13;;5572:25;;;;;;;;;;;;;5345:260;;;:::o;53:197::-;111:7;135:6;131:34;;-1:-1:-1;164:1:0;157:8;;131:34;188:5;;;192:1;188;:5;:1;212:5;;;;;:10;204:19;;;;;;241:1;53:197;-1:-1:-1;;;53:197:0:o;258:147::-;316:7;348:1;344;:5;336:14;;;;;;361:9;377:1;373;:5;;;;;;;258:147;-1:-1:-1;;;;258:147:0:o;17336:276::-;17466:13;:6;17477:1;17466:13;:10;:13;:::i;:::-;17462:1;:17;17459:120;;;17534:27;17558:2;17534:19;17551:1;17534:12;:5;17544:1;17534:12;:9;:12;:::i;:27::-;17502:29;17527:3;17502:20;17520:1;17502:13;:6;17513:1;17502:13;:10;:13;:::i;:29::-;:59;17494:85;;;;;-1:-1:-1;;;17494:85:0;;;;;;;;;;;;-1:-1:-1;;;17494:85:0;;;;;;;;;;;;;;;17336:276;;;;;;:::o;12474:278::-;12573:11;;:15;12570:175;;12605:12;12620:80;12676:22;12696:1;12676:15;12689:1;12676:15;:1;12682;12676:8;:5;:8;:::i;:22::-;12620:50;12665:4;12620:40;12647:12;;12620:22;12630:11;;12620:5;:9;;:22;;;;:::i;:80::-;12721:5;;12605:95;;-1:-1:-1;12715:18:0;;-1:-1:-1;;;;;12721:5:0;12605:95;12715:5;:18::i;12570:175::-;12474:278;;;;;:::o;15990:654::-;16112:47;;;-1:-1:-1;;;16112:47:0;;-1:-1:-1;;;;;16112:47:0;;;;;;;16145:4;16112:47;;;;;;;;;;;;:18;;;;;;:47;;;;;;;;;;;;;;;-1:-1:-1;16112:18:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;16112:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16112:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16112:47:0;16104:56;;;;;;16176:8;;16173:464;;16212:6;16204:4;:14;16201:328;;16247:6;-1:-1:-1;;;;;16247:18:0;;16266:6;16247:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16247:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16247:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16247:26:0;:31;16239:69;;;;;-1:-1:-1;;;16239:69:0;;;;;;;;;;;;-1:-1:-1;;;16239:69:0;;;;;;;;;;;;;;;16201:328;;;16370:6;-1:-1:-1;;;;;16370:18:0;;16389:4;16370:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16370:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16370:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16370:24:0;:29;16362:67;;;;;-1:-1:-1;;;16362:67:0;;;;;;;;;;;;-1:-1:-1;;;16362:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;16456:11:0;;;16468:16;:6;16479:4;16468:16;:10;:16;:::i;:::-;16456:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16456:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16456:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16456:29:0;:34;16448:65;;;;;-1:-1:-1;;;16448:65:0;;;;;;;;;;;;-1:-1:-1;;;16448:65:0;;;;;;;;;;;;;;;16173:464;;;16578:6;-1:-1:-1;;;;;16578:11:0;;16590:6;16578:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16578:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16578:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16578:19:0;:24;16570:55;;;;;-1:-1:-1;;;16570:55:0;;;;;;;;;;;;-1:-1:-1;;;16570:55:0;;;;;;;;;;;;;;16652:676;16782:6;16771:7;:17;16768:505;;16813:6;-1:-1:-1;;;;;16813:23:0;;16837:6;16813:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16813:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16813:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16813:31:0;:36;16805:79;;;;;-1:-1:-1;;;16805:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16768:505;;;16929:12;16926:336;;16970:6;-1:-1:-1;;;;;16970:13:0;;16984:6;16970:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16970:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16970:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16970:21:0;:26;16962:59;;;;;-1:-1:-1;;;16962:59:0;;;;;;;;;;;;-1:-1:-1;;;16962:59:0;;;;;;;;;;;;;;16926:336;17083:6;-1:-1:-1;;;;;17083:23:0;;17107:7;17083:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17083:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17083:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17083:32:0;:37;17075:80;;;;;-1:-1:-1;;;17075:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17182:13:0;;;17196:19;:6;17207:7;17196:19;:10;:19;:::i;:::-;17182:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17182:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17182:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17182:34:0;:39;17174:72;;;;;-1:-1:-1;;;17174:72:0;;;;;;;;;;;;-1:-1:-1;;;17174:72:0;;;;;;;;;;;;;;;17293:5;-1:-1:-1;;;;;17293:14:0;;17308:2;17312:6;17293:26;;;;;;;;;;;;;-1:-1:-1;;;;;17293:26:0;-1:-1:-1;;;;;17293:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17293:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17293:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17293:26:0;17285:35;;;;;413:199;475:7;507:1;503;:5;495:14;;;;;;520:9;536:1;532;:5;;;;;;520:17;;555:1;551;:5;;;;;;:10;548:37;;584:1;580:5;;413:199;-1:-1:-1;;;413:199:0:o;5953:218::-;-1:-1:-1;;;;;6036:15:0;;:9;:15;;;;;;;;;;;:27;;6056:6;6036:27;:19;:27;:::i;:::-;-1:-1:-1;;;;;6018:15:0;;:9;:15;;;;;;;;;;:45;6089:12;;:24;;6106:6;6089:24;:16;:24;:::i;:::-;6074:12;:39;6129:34;;;;;;;;6152:1;;-1:-1:-1;;;;;6129:34:0;;;;;;;;;;;;5953:218;;:::o;1533:176::-;1589:6;1619:5;;;1644:6;;;;;;:16;;;1659:1;1654;:6;;1644:16;1643:38;;;;1670:1;1666;:5;:14;;;;;1679:1;1675;:5;1666:14;1635:47;;;;;5735:210;-1:-1:-1;;;;;5814:13:0;;:9;:13;;;;;;;;;;;:25;;5832:6;5814:25;:17;:25;:::i;:::-;-1:-1:-1;;;;;5798:13:0;;:9;:13;;;;;;;;;;:41;5865:12;;:24;;5882:6;5865:24;:16;:24;:::i;:::-;5850:12;:39;5905:32;;;;;;;;-1:-1:-1;;;;;5905:32:0;;;5922:1;;5905:32;;;;;;;;;5735:210;;:::o;776:148::-;834:7;866:5;;;890:6;;;;882:15;;;;;1717:176;1773:6;1803:5;;;1828:6;;;;;;:16;;;1843:1;1838;:6;;1828:16;1827:38;;;;1854:1;1850;:5;:14;;;;;1863:1;1859;:5;1819:47;;;;;10764:806;10829:9;;;;10954:41;10960:34;10989:4;10960:24;:1;9061:7;10960:24;:5;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;10954:1;;:41;:5;:41;:::i;:::-;10943:52;-1:-1:-1;11010:8:0;11021:41;11027:34;11056:4;11027:24;:1;9061:7;11027:24;:5;:24;:::i;11021:41::-;11010:52;-1:-1:-1;11081:8:0;:1;11010:52;11081:8;:5;:8;:::i;:::-;11077:12;-1:-1:-1;11121:52:0;11137:34;9061:7;11137:11;11077:12;11143:4;11137:11;:5;:11;:::i;:34::-;11121:10;11128:2;;11121:10;:6;:10;:::i;:::-;:14;:52;:14;:52;:::i;:::-;11117:56;-1:-1:-1;11222:10:0;;-1:-1:-1;11235:50:0;;-1:-1:-1;11257:27:0;:4;9061:7;11257:27;:8;:27;:::i;:::-;9061:7;;11235:50;:21;:50;:::i;:::-;11222:63;-1:-1:-1;11307:8:0;11318:21;11334:4;11318:11;:2;11222:63;11318:11;:6;:11;:::i;:21::-;11307:32;-1:-1:-1;11445:8:0;11456:22;11469:8;:1;11475;11469:8;:5;:8;:::i;:::-;11456;11462:1;;11456:8;:5;:8;:::i;:22::-;11445:33;;11504:1;11499;:6;;11491:26;;;;;-1:-1:-1;;;11491:26:0;;;;;;;;;;;;-1:-1:-1;;;11491:26:0;;;;;;;;;;;;;;;11535:25;11558:1;11535:18;11544:8;:1;:6;:8::i;:::-;11536:2;;;;;11535:18;:8;:18;:::i;:25::-;11530:30;10764:806;-1:-1:-1;;;;;;;;;10764:806:0:o;1116:225::-;1172:6;1195;1191:34;;-1:-1:-1;1224:1:0;1217:8;;1191:34;1247:5;;;1251:1;1247;:5;:1;1271:5;;;;;:10;:42;;;;;1286:1;-1:-1:-1;;1286:7:0;;:26;;;;-1:-1:-1;;1297:1:0;:15;;1263:51;;;;;1349:176;1405:6;1432;;;;;:38;;;1443:1;-1:-1:-1;;1443:7:0;;:26;;;;-1:-1:-1;;1454:1:0;:15;;1443:26;1424:47;;;;;;1482:8;1497:1;1493;:5;;;;;;;1349:176;-1:-1:-1;;;;1349:176:0:o;1901:247::-;1948:6;;1978:13;1986:1;1982;:5;1989:1;1978:3;:13::i;:::-;1967:24;-1:-1:-1;2013:1:0;2025:97;2036:1;2032;:5;2025:97;;;-1:-1:-1;2067:1:0;2108;2089:15;2067:1;2094;2067;2094:5;;;;;2102:1;2089:3;:15::i;:::-;2088:21;;;;;;2083:27;;2025:97;

Swarm Source

bzzr://6f46ae2156366e1c101963ad99fdfa8969e97c9f1472e689a4e091eee287bbeb

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  ]

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.