ETH Price: $2,711.42 (+3.95%)

Contract

0x14E5d37d66aac00B47797dd4338475363a680D57
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw129527572021-08-03 14:11:171289 days ago1627999877IN
0x14E5d37d...63a680D57
0 ETH0.0087956842
Withdraw129527402021-08-03 14:08:301289 days ago1627999710IN
0x14E5d37d...63a680D57
0 ETH0.0110107943
Withdraw129129312021-07-28 6:44:091295 days ago1627454649IN
0x14E5d37d...63a680D57
0 ETH0.0073698330
Withdraw129052182021-07-27 1:24:071297 days ago1627349047IN
0x14E5d37d...63a680D57
0 ETH0.0071701528
Withdraw129018902021-07-26 12:46:081297 days ago1627303568IN
0x14E5d37d...63a680D57
0 ETH0.0070498327.000002
Withdraw129005692021-07-26 7:44:181297 days ago1627285458IN
0x14E5d37d...63a680D57
0 ETH0.0008661930.00000145
Withdraw129002192021-07-26 6:29:191297 days ago1627280959IN
0x14E5d37d...63a680D57
0 ETH0.0073310627.00000145
Withdraw128996802021-07-26 4:18:181298 days ago1627273098IN
0x14E5d37d...63a680D57
0 ETH0.005650223.00000145
Withdraw128880772021-07-24 9:03:331299 days ago1627117413IN
0x14E5d37d...63a680D57
0 ETH0.0051215420
Withdraw128875482021-07-24 7:01:251299 days ago1627110085IN
0x14E5d37d...63a680D57
0 ETH0.0034390814
Withdraw128815212021-07-23 8:18:261300 days ago1627028306IN
0x14E5d37d...63a680D57
0 ETH0.0034390814
Withdraw128811782021-07-23 7:01:271300 days ago1627023687IN
0x14E5d37d...63a680D57
0 ETH0.0035618914.00000145
Withdraw128810042021-07-23 6:23:231300 days ago1627021403IN
0x14E5d37d...63a680D57
0 ETH0.0039165715
Withdraw128809262021-07-23 6:06:171300 days ago1627020377IN
0x14E5d37d...63a680D57
0 ETH0.0003751913
Withdraw128809252021-07-23 6:06:121300 days ago1627020372IN
0x14E5d37d...63a680D57
0 ETH0.0033455114
Withdraw128809072021-07-23 6:02:511300 days ago1627020171IN
0x14E5d37d...63a680D57
0 ETH0.0039658514.63
Withdraw128805962021-07-23 4:51:521301 days ago1627015912IN
0x14E5d37d...63a680D57
0 ETH0.0040972316.00000145
Withdraw128796102021-07-23 1:08:061301 days ago1627002486IN
0x14E5d37d...63a680D57
0 ETH0.0040970416
Withdraw128762742021-07-22 12:48:061301 days ago1626958086IN
0x14E5d37d...63a680D57
0 ETH0.005222120
Withdraw128741732021-07-22 4:50:191302 days ago1626929419IN
0x14E5d37d...63a680D57
0 ETH0.0051215420
Withdraw128739832021-07-22 4:05:171302 days ago1626926717IN
0x14E5d37d...63a680D57
0 ETH0.0049609919
Withdraw128738242021-07-22 3:29:271302 days ago1626924567IN
0x14E5d37d...63a680D57
0 ETH0.0048873718
Withdraw128737652021-07-22 3:17:161302 days ago1626923836IN
0x14E5d37d...63a680D57
0 ETH0.0053526520.50000072
Withdraw126752392021-06-21 3:16:371333 days ago1624245397IN
0x14E5d37d...63a680D57
0 ETH0.0036490814.00000145
Deposit126053432021-06-10 7:12:221343 days ago1623309142IN
0x14E5d37d...63a680D57
0 ETH0.0022786912
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527572021-08-03 14:11:171289 days ago1627999877
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129527402021-08-03 14:08:301289 days ago1627999710
0x14E5d37d...63a680D57
0 ETH
129129312021-07-28 6:44:091295 days ago1627454649
0x14E5d37d...63a680D57
0 ETH
129129312021-07-28 6:44:091295 days ago1627454649
0x14E5d37d...63a680D57
0 ETH
View All Internal Transactions
Loading...
Loading

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

Contract Name:
HotPotFund

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-27
*/

pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IUniswapV2Router {
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
}

interface IUniswapV2Pair {
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function token0() external view returns (address);
    function token1() external view returns (address);

    function approve(address spender, uint value) external returns (bool);

    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}

interface IStakingRewards {
    // Views
    function lastTimeRewardApplicable() external view returns (uint256);

    function rewardPerToken() external view returns (uint256);

    function earned(address account) external view returns (uint256);

    function getRewardForDuration() external view returns (uint256);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    // Mutative
    function stake(uint256 amount) external;

    function withdraw(uint256 amount) external;

    function getReward() external;

    function exit() external;
}

interface ICurve {
    function exchange(int128 i, int128 j, uint256 dx, uint256 min_dy) external;
    function coins(uint256) external view returns (address coin);
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

        return c;
    }

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

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has two parts:
        //  1. The call itself is made, and success asserted
        //  2. The return value is decoded, which in turn checks the size of the returned data.

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

contract HotPotFundERC20 {
    using SafeMath for uint;

    string public constant name = 'Hotpot V1';
    string public constant symbol = 'HPT-V1';
    uint8 public constant decimals = 18;
    uint public totalSupply;
    mapping(address => uint) public balanceOf;
    mapping(address => mapping(address => uint)) public allowance;

    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    constructor() public {
    }

    function _mint(address to, uint value) internal {
        require(to != address(0), "ERC20: mint to the zero address");

        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint value) internal {
        require(from != address(0), "ERC20: burn from the zero address");

        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(address owner, address spender, uint value) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(address from, address to, uint value) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function approve(address spender, uint value) external returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint value) external returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint value) external returns (bool) {
        allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
        _transfer(from, to, value);
        return true;
    }
}

contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

contract HotPotFund is ReentrancyGuard, HotPotFundERC20 {
    using SafeMath for uint;
    using SafeERC20 for IERC20;

    address constant UNISWAP_FACTORY = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
    address constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address constant UNI = 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984;

    uint constant DIVISOR = 100;
    uint constant FEE = 20;

    address public token;
    address public controller;
    uint public totalInvestment;
    mapping (address => uint) public investmentOf;

    // UNI mining rewards
    uint public totalDebts;
    mapping(address => uint256) public debtOf;
    // UNI mining pool pair->mining pool
    mapping(address => address) public uniPool;

    address[] public pairs;

    //Curve swap pools
    mapping (address => address) public curvePool;
    mapping (address => int128) CURVE_N_COINS;

    modifier onlyController() {
        require(msg.sender == controller, 'Only called by Controller.');
        _;
    }

    event Deposit(address indexed owner, uint amount, uint share);
    event Withdraw(address indexed owner, uint amount, uint share);

    constructor (address _token, address _controller) public {
        //approve for add liquidity and swap. 2**256-1 never used up.
        IERC20(_token).safeApprove(UNISWAP_V2_ROUTER, 2**256-1);

        token = _token;
        controller = _controller;
    }

    function deposit(uint amount) public nonReentrant returns(uint share) {
        require(amount > 0, 'Are you kidding me?');
        uint _total_assets = totalAssets();
        IERC20(token).safeTransferFrom(msg.sender, address(this), amount);

        if(totalSupply == 0){
            share = amount;
        }
        else{
            share = amount.mul(totalSupply).div(_total_assets);
            // user uni debt
            uint debt = share.mul(totalDebts.add(totalUNIRewards())).div(totalSupply);
            if(debt > 0){
                debtOf[msg.sender] = debtOf[msg.sender].add(debt);
                totalDebts = totalDebts.add(debt);
            }
        }

        investmentOf[msg.sender] = investmentOf[msg.sender].add(amount);
        totalInvestment = totalInvestment.add(amount);
        _mint(msg.sender, share);
        emit Deposit(msg.sender, amount, share);
    }


    function invest(uint amount, uint[] calldata proportions) external onlyController {
        uint len = pairs.length;
        require(len>0, 'Pairs is empty.');
        address token0 = token;
        require(amount <= IERC20(token0).balanceOf(address(this)), "Not enough balance.");
        require(proportions.length == pairs.length, 'Proportions index out of range.');

        uint _whole;
        for(uint i=0; i<len; i++){
            if(proportions[i] == 0) continue;
            _whole = _whole.add(proportions[i]);

            uint amount0 = (amount.mul(proportions[i]).div(DIVISOR)) >> 1;
            if(amount0 == 0) continue;

            address token1 = pairs[i];
            uint amount1 = _swap(token0, token1, amount0);

            (,uint amountB,) = IUniswapV2Router(UNISWAP_V2_ROUTER).addLiquidity(
                token0, token1,
                amount0, amount1,
                0, 0,
                address(this), block.timestamp
            );

            if(amount1 > amountB) _swap(token1, token0, amount1.sub(amountB));
        }
        require(_whole == DIVISOR, 'Error proportion.');
    }

    function setUNIPool(address pair, address _uniPool) external onlyController {
        require(pair!= address(0) && _uniPool!= address(0), "Invalid address.");

        if(uniPool[pair] != address(0)){
            _withdrawStaking(IUniswapV2Pair(pair), totalSupply);
        }
        IERC20(pair).approve(_uniPool, 2**256-1);
        uniPool[pair] = _uniPool;
    }

    function mineUNI(address pair) public onlyController {
        address stakingRewardAddr = uniPool[pair];
        if(stakingRewardAddr != address(0)){
            uint liquidity = IUniswapV2Pair(pair).balanceOf(address(this));
            if(liquidity > 0){
                IStakingRewards(stakingRewardAddr).stake(liquidity);
            }
        }
    }

    function mineUNIAll() external onlyController {
        for(uint i = 0; i < pairs.length; i++){
            IUniswapV2Pair pair = IUniswapV2Pair(IUniswapV2Factory(UNISWAP_FACTORY).getPair(token, pairs[i]));
            address stakingRewardAddr = uniPool[address(pair)];
            if(stakingRewardAddr != address(0)){
                uint liquidity = pair.balanceOf(address(this));
                if(liquidity > 0){
                    IStakingRewards(stakingRewardAddr).stake(liquidity);
                }
            }
        }
    }

    function totalUNIRewards() public view returns(uint amount){
        amount = IERC20(UNI).balanceOf(address(this));
        for(uint i = 0; i < pairs.length; i++){
            IUniswapV2Pair pair = IUniswapV2Pair(IUniswapV2Factory(UNISWAP_FACTORY).getPair(token, pairs[i]));
            address stakingRewardAddr = uniPool[address(pair)];
            if(stakingRewardAddr != address(0)){
                amount = amount.add(IStakingRewards(stakingRewardAddr).earned(address(this)));
            }
        }
    }

    function UNIRewardsOf(address account) public view returns(uint reward){
        if(balanceOf[account] > 0){
            uint uniAmount = totalUNIRewards();
            uint totalAmount = totalDebts.add(uniAmount).mul(balanceOf[account]).div(totalSupply);
            reward = totalAmount.sub(debtOf[account]);
        }
    }

    function stakingLPOf(address pair) public view returns(uint liquidity){
        if(uniPool[pair] != address(0)){
            liquidity = IStakingRewards(uniPool[pair]).balanceOf(address(this));
        }
    }

    function _withdrawStaking(IUniswapV2Pair pair, uint share) internal returns(uint liquidity){
        address stakingRewardAddr = uniPool[address(pair)];
        if(stakingRewardAddr != address(0)){
            liquidity = IStakingRewards(stakingRewardAddr).balanceOf(address(this)).mul(share).div(totalSupply);
            if(liquidity > 0){
                IStakingRewards(stakingRewardAddr).withdraw(liquidity);
                IStakingRewards(stakingRewardAddr).getReward();
            }
        }
    }

    function withdraw(uint share) public nonReentrant returns(uint amount) {
        require(share > 0 && share <= balanceOf[msg.sender], 'Not enough balance.');

        uint _investment;
        (amount, _investment) = _withdraw(msg.sender, share);
        investmentOf[msg.sender] = investmentOf[msg.sender].sub(_investment);
        totalInvestment = totalInvestment.sub(_investment);
        _burn(msg.sender, share);
        IERC20(token).safeTransfer(msg.sender, amount);
        emit Withdraw(msg.sender, amount, share);
    }

    function _withdraw(
        address user,
        uint share
    ) internal returns (uint amount, uint investment) {
        address token0 = token;
        amount = IERC20(token0).balanceOf(address(this)).mul(share).div(totalSupply);
        for(uint i = 0; i < pairs.length; i++) {
            address token1 = pairs[i];
            IUniswapV2Pair pair = IUniswapV2Pair(IUniswapV2Factory(UNISWAP_FACTORY).getPair(token0, token1));
            uint liquidity = pair.balanceOf(address(this)).mul(share).div(totalSupply);
            liquidity  = liquidity.add(_withdrawStaking(pair, share));
            if(liquidity == 0) continue;

            (uint amount0, uint amount1) = IUniswapV2Router(UNISWAP_V2_ROUTER).removeLiquidity(
                token0, token1,
                liquidity,
                0, 0,
                address(this), block.timestamp
            );
            amount = amount.add(amount0).add(_swap(token1, token0, amount1));
        }

        //withdraw UNI reward
        uint uniAmount = IERC20(UNI).balanceOf(address(this));
        uint totalAmount = totalDebts.add(uniAmount).mul(share).div(totalSupply);
        if(totalAmount > 0){
            uint debt = debtOf[user].mul(share).div(balanceOf[user]);
            debtOf[user] = debtOf[user].sub(debt);
            totalDebts = totalDebts.sub(debt);
            uint reward = totalAmount.sub(debt);
            if(reward > uniAmount) reward = uniAmount;
            if(reward > 0) IERC20(UNI).transfer(user, reward);
        }

        investment = investmentOf[user].mul(share).div(balanceOf[user]);
        if(amount > investment){
            uint _fee = (amount.sub(investment)).mul(FEE).div(DIVISOR);
            amount = amount.sub(_fee);
            IERC20(token0).safeTransfer(controller, _fee);
        }
        else {
            investment = amount;
        }
    }

    function assets(uint index) public view returns(uint _assets) {
        require(index < pairs.length, 'Pair index out of range.');
        address token0 = token;
        address token1 = pairs[index];
        IUniswapV2Pair pair = IUniswapV2Pair(IUniswapV2Factory(UNISWAP_FACTORY).getPair(token0, token1));
        (uint reserve0, uint reserve1, ) = pair.getReserves();

        uint liquidity = pair.balanceOf(address(this)).add(stakingLPOf(address(pair)));
        if( pair.token0() == token0 )
            _assets = (reserve0 << 1).mul(liquidity).div(pair.totalSupply());
        else // pair.token1() == token0
            _assets = (reserve1 << 1).mul(liquidity).div(pair.totalSupply());
    }

    function totalAssets() public view returns(uint _assets) {
        address token0 = token;
        for(uint i=0; i<pairs.length; i++){
            address token1 = pairs[i];
            IUniswapV2Pair pair = IUniswapV2Pair(IUniswapV2Factory(UNISWAP_FACTORY).getPair(token0, token1));
            (uint reserve0, uint reserve1, ) = pair.getReserves();
            uint liquidity = pair.balanceOf(address(this)).add(stakingLPOf(address(pair)));
            if( pair.token0() == token0 )
                _assets = _assets.add((reserve0 << 1).mul(liquidity).div(pair.totalSupply()));
            else // pair.token1() == token0
                _assets = _assets.add((reserve1 << 1).mul(liquidity).div(pair.totalSupply()));
        }
        _assets = _assets.add(IERC20(token0).balanceOf(address(this)));
    }

    function pairsLength() public view returns(uint) {
        return pairs.length;
    }

    function setCurvePool(address _token, address _curvePool, int128 N_COINS) external onlyController {
        curvePool[_token] = _curvePool;
        if(_curvePool != address(0)) {
            if(IERC20(token).allowance(address(this), _curvePool) == 0){
                IERC20(token).safeApprove(_curvePool, 2**256-1);
            }
            if(IERC20(_token).allowance(address(this), _curvePool) == 0){
                IERC20(_token).safeApprove(_curvePool, 2**256-1);
            }
            CURVE_N_COINS[_curvePool] = N_COINS;
        }
    }

    function addPair(address _token) external onlyController {
        address pair = IUniswapV2Factory(UNISWAP_FACTORY).getPair(token, _token);
        require(pair != address(0), 'Pair not exist.');

        //approve for add liquidity and swap.
        IERC20(_token).safeApprove(UNISWAP_V2_ROUTER, 2**256-1);
        //approve for remove liquidity
        IUniswapV2Pair(pair).approve(UNISWAP_V2_ROUTER, 2**256-1);

        for(uint i = 0; i < pairs.length; i++) {
            require(pairs[i] != _token, 'Pair existed.');
        }
        pairs.push(_token);
    }

    function reBalance(
        uint add_index,
        uint remove_index,
        uint liquidity
    ) external onlyController {
        require(remove_index < pairs.length, 'Pair index out of range.');

        address token0 = token;
        address token1 = pairs[remove_index];
        IUniswapV2Pair pair = IUniswapV2Pair(IUniswapV2Factory(UNISWAP_FACTORY).getPair(token0, token1));

        uint stakingLP = stakingLPOf(address(pair));
        if(stakingLP > 0) IStakingRewards(uniPool[address(pair)]).exit();

        require(liquidity <= pair.balanceOf(address(this)) && liquidity > 0, 'Not enough liquidity.');

        (uint amount0, uint amount1) = IUniswapV2Router(UNISWAP_V2_ROUTER).removeLiquidity(
            token0, token1,
            liquidity,
            0, 0,
            address(this), block.timestamp
        );
        amount0 = amount0.add(_swap(token1, token0, amount1));

        //Only remove liquidity
        if(add_index >= pairs.length || add_index == remove_index) return;

        token1 = pairs[add_index];
        amount0 = amount0 >> 1;
        amount1 = _swap(token0, token1, amount0);

        (,uint amountB,) = IUniswapV2Router(UNISWAP_V2_ROUTER).addLiquidity(
            token0, token1,
            amount0, amount1,
            0, 0,
            address(this), block.timestamp
        );

        if(amount1 > amountB) _swap(token1, token0, amount1.sub(amountB));
    }

    function removePair(uint index) external onlyController {
        require(index < pairs.length, 'Pair index out of range.');

        address token0 = token;
        address token1 = pairs[index];
        IUniswapV2Pair pair = IUniswapV2Pair(IUniswapV2Factory(UNISWAP_FACTORY).getPair(token0, token1));
        _withdrawStaking(pair, totalSupply);
        uint liquidity = pair.balanceOf(address(this));

        if(liquidity > 0){
            (uint amount0, uint amount1) = IUniswapV2Router(UNISWAP_V2_ROUTER).removeLiquidity(
                token0, token1,
                liquidity,
                0, 0,
                address(this), block.timestamp
            );
            amount0 = amount0.add(_swap(token1, token0, amount1));
        }
        IERC20(token1).safeApprove(UNISWAP_V2_ROUTER, 0);

        for (uint i = index; i < pairs.length-1; i++){
            pairs[i] = pairs[i+1];
        }
        pairs.pop();
    }

    function _swap(address tokenIn, address tokenOut, uint amount)  private returns(uint) {
        address pool = tokenIn == token ? curvePool[tokenOut] : curvePool[tokenIn];
        if(pool != address(0)){
            int128 N_COINS = CURVE_N_COINS[pool];
            int128 idxIn = N_COINS;
            int128 idxOut = N_COINS;
            for(int128 i=0; i<N_COINS; i++){
                address coin = ICurve(pool).coins(uint(i));
                if(coin == tokenIn) {idxIn = i; continue;}
                if(coin == tokenOut) idxOut = i;
            }
            if(idxIn != N_COINS && idxOut != N_COINS){
                uint amountBefore = IERC20(tokenOut).balanceOf(address(this));
                ICurve(pool).exchange(idxIn, idxOut, amount, 0);
                return (IERC20(tokenOut).balanceOf(address(this))).sub(amountBefore);
            }
        }
        address[] memory path = new address[](2);
        path[0] = tokenIn;
        path[1] = tokenOut;
        uint[] memory amounts = IUniswapV2Router(UNISWAP_V2_ROUTER).swapExactTokensForTokens(
            amount, 0, path, address(this), block.timestamp);
        return amounts[1];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_controller","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"Deposit","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"Withdraw","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"UNIRewardsOf","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"addPair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","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":"uint256","name":"index","type":"uint256"}],"name":"assets","outputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"curvePool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"proportions","type":"uint256[]"}],"name":"invest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"investmentOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"mineUNI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"mineUNIAll","outputs":[],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairs","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"add_index","type":"uint256"},{"internalType":"uint256","name":"remove_index","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"reBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removePair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_curvePool","type":"address"},{"internalType":"int128","name":"N_COINS","type":"int128"}],"name":"setCurvePool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"_uniPool","type":"address"}],"name":"setUNIPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"stakingLPOf","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalDebts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalUNIRewards","outputs":[{"internalType":"uint256","name":"amount","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":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"uniPool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c806378d1ce991161011a578063b91ac788116100ad578063dd62ed3e1161007c578063dd62ed3e14610601578063ed8a48441461062f578063f77c4791146106a6578063fc0c546a146106ae578063fedcf1d3146106b657610206565b8063b91ac7881461057b578063c2b7bbb614610598578063cf35bdd0146105be578063d283e75f146105db57610206565b80639b1146d8116100e95780639b1146d814610504578063a1ba46411461052a578063a9059cbb14610532578063b6b55f251461055e57610206565b806378d1ce991461045b57806393b19d681461049457806395c08f92146104d657806395d89b41146104fc57610206565b80632b42dc621161019d5780633268c9bd1161016c5780633268c9bd146103d657806334975748146103fc5780633b0cb86a146104045780634089382d1461042d57806370a082311461043557610206565b80632b42dc62146103565780632e1a7d4d146103755780632fcad52114610392578063313ce567146103b857610206565b806314a1c32d116101d957806314a1c32d146102ea57806318160ddd146102f257806323b872dd146102fa57806329349d961461033057610206565b806301e1d1141461020b57806306fdde0314610225578063095ea7b3146102a257806310ea13df146102e2575b600080fd5b6102136106e4565b60408051918252519081900360200190f35b61022d610b01565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026757818101518382015260200161024f565b50505050905090810190601f1680156102945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ce600480360360408110156102b857600080fd5b506001600160a01b038135169060200135610b26565b604080519115158252519081900360200190f35b610213610b3d565b610213610b43565b610213610b49565b6102ce6004803603606081101561031057600080fd5b506001600160a01b03813581169160208101359091169060400135610b4f565b6102136004803603602081101561034657600080fd5b50356001600160a01b0316610bbd565b6103736004803603602081101561036c57600080fd5b5035610c65565b005b6102136004803603602081101561038b57600080fd5b503561100c565b610213600480360360208110156103a857600080fd5b50356001600160a01b0316611193565b6103c061123e565b6040805160ff9092168252519081900360200190f35b610373600480360360208110156103ec57600080fd5b50356001600160a01b0316611243565b610213611394565b6103736004803603606081101561041a57600080fd5b508035906020810135906040013561139a565b610213611859565b6102136004803603602081101561044b57600080fd5b50356001600160a01b0316611a5e565b6103736004803603606081101561047157600080fd5b506001600160a01b03813581169160208101359091169060400135600f0b611a70565b6104ba600480360360208110156104aa57600080fd5b50356001600160a01b0316611c7c565b604080516001600160a01b039092168252519081900360200190f35b610213600480360360208110156104ec57600080fd5b50356001600160a01b0316611c97565b61022d611ca9565b6104ba6004803603602081101561051a57600080fd5b50356001600160a01b0316611ccb565b610373611ce6565b6102ce6004803603604081101561054857600080fd5b506001600160a01b038135169060200135611f0e565b6102136004803603602081101561057457600080fd5b5035611f1b565b6104ba6004803603602081101561059157600080fd5b503561212f565b610373600480360360208110156105ae57600080fd5b50356001600160a01b0316612156565b610213600480360360208110156105d457600080fd5b5035612423565b610213600480360360208110156105f157600080fd5b50356001600160a01b031661275d565b6102136004803603604081101561061757600080fd5b506001600160a01b038135811691602001351661276f565b6103736004803603604081101561064557600080fd5b8135919081019060408101602082013564010000000081111561066757600080fd5b82018360208201111561067957600080fd5b8035906020019184602083028401116401000000008311171561069b57600080fd5b50909250905061278c565b6104ba612b3c565b6104ba612b4b565b610373600480360360408110156106cc57600080fd5b506001600160a01b0381358116916020013516612b5a565b6004546000906001600160a01b0316815b600b54811015610a76576000600b828154811061070e57fe5b60009182526020808320909101546040805163e6a4390560e01b81526001600160a01b038881166004830152909216602483018190529051909450735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9263e6a439059260448082019391829003018186803b15801561078057600080fd5b505afa158015610794573d6000803e3d6000fd5b505050506040513d60208110156107aa57600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b1580156107f557600080fd5b505afa158015610809573d6000803e3d6000fd5b505050506040513d606081101561081f57600080fd5b5080516020909101516001600160701b03918216935016905060006108c461084685611193565b604080516370a0823160e01b815230600482015290516001600160a01b038816916370a08231916024808301926020929190829003018186803b15801561088c57600080fd5b505afa1580156108a0573d6000803e3d6000fd5b505050506040513d60208110156108b657600080fd5b50519063ffffffff612ce716565b9050866001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561090957600080fd5b505afa15801561091d573d6000803e3d6000fd5b505050506040513d602081101561093357600080fd5b50516001600160a01b031614156109e3576109dc6109cf856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561098357600080fd5b505afa158015610997573d6000803e3d6000fd5b505050506040513d60208110156109ad57600080fd5b50516109c3600187901b8563ffffffff612d4116565b9063ffffffff612d9a16565b899063ffffffff612ce716565b9750610a65565b610a626109cf856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2257600080fd5b505afa158015610a36573d6000803e3d6000fd5b505050506040513d6020811015610a4c57600080fd5b50516109c3600186901b8563ffffffff612d4116565b97505b5050600190930192506106f5915050565b50604080516370a0823160e01b81523060048201529051610afb916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610ac257600080fd5b505afa158015610ad6573d6000803e3d6000fd5b505050506040513d6020811015610aec57600080fd5b5051839063ffffffff612ce716565b91505090565b60405180604001604052806009815260200168486f74706f7420563160b81b81525081565b6000610b33338484612e04565b5060015b92915050565b60065481565b60085481565b60015481565b6001600160a01b0383166000908152600360209081526040808320338452909152812054610b83908363ffffffff612ef016565b6001600160a01b0385166000908152600360209081526040808320338452909152902055610bb2848484612f32565b5060015b9392505050565b6001600160a01b03811660009081526002602052604081205415610c60576000610be5611859565b6001546001600160a01b0385166000908152600260205260408120546008549394509092610c2e92916109c391610c22908763ffffffff612ce716565b9063ffffffff612d4116565b6001600160a01b038516600090815260096020526040902054909150610c5b90829063ffffffff612ef016565b925050505b919050565b6005546001600160a01b03163314610cb2576040805162461bcd60e51b815260206004820152601a6024820152600080516020614173833981519152604482015290519081900360640190fd5b600b548110610d03576040805162461bcd60e51b81526020600482015260186024820152772830b4b91034b73232bc1037baba1037b3103930b733b29760411b604482015290519081900360640190fd5b600454600b80546001600160a01b03909216916000919084908110610d2457fe5b60009182526020808320909101546040805163e6a4390560e01b81526001600160a01b038781166004830152909216602483018190529051909450735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9263e6a439059260448082019391829003018186803b158015610d9657600080fd5b505afa158015610daa573d6000803e3d6000fd5b505050506040513d6020811015610dc057600080fd5b5051600154909150610dd3908290613076565b50604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610e1e57600080fd5b505afa158015610e32573d6000803e3d6000fd5b505050506040513d6020811015610e4857600080fd5b505190508015610f315760408051635d5155ef60e11b81526001600160a01b0386811660048301528516602482015260448101839052600060648201819052608482018190523060a48301524260c4830152825190928392737a250d5630b4cf539739df2c5dacb4c659f2488d9263baa2abde9260e48084019391929182900301818787803b158015610eda57600080fd5b505af1158015610eee573d6000803e3d6000fd5b505050506040513d6040811015610f0457600080fd5b5080516020909101519092509050610f2d610f208688846131f2565b839063ffffffff612ce716565b5050505b610f606001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d600063ffffffff61372616565b845b600b5460001901811015610fd757600b8160010181548110610f8057fe5b600091825260209091200154600b80546001600160a01b039092169183908110610fa657fe5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600101610f62565b50600b805480610fe357fe5b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600060026000541415611066576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005581158015906110895750336000908152600260205260409020548211155b6110d0576040805162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b4103130b630b731b29760691b604482015290519081900360640190fd5b60006110dc3384613778565b336000908152600760205260409020549193509150611101908263ffffffff612ef016565b33600090815260076020526040902055600654611124908263ffffffff612ef016565b6006556111313384613cbb565b60045461114e906001600160a01b0316338463ffffffff613d9d16565b6040805183815260208101859052815133927ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568928290030190a2506001600055919050565b6001600160a01b038181166000908152600a602052604081205490911615610c60576001600160a01b038083166000908152600a60209081526040918290205482516370a0823160e01b815230600482015292519316926370a08231926024808201939291829003018186803b15801561120c57600080fd5b505afa158015611220573d6000803e3d6000fd5b505050506040513d602081101561123657600080fd5b505192915050565b601281565b6005546001600160a01b03163314611290576040805162461bcd60e51b815260206004820152601a6024820152600080516020614173833981519152604482015290519081900360640190fd5b6001600160a01b038082166000908152600a602052604090205416801561139057604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b1580156112fb57600080fd5b505afa15801561130f573d6000803e3d6000fd5b505050506040513d602081101561132557600080fd5b50519050801561138e57816001600160a01b031663a694fc3a826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561137557600080fd5b505af1158015611389573d6000803e3d6000fd5b505050505b505b5050565b600b5490565b6005546001600160a01b031633146113e7576040805162461bcd60e51b815260206004820152601a6024820152600080516020614173833981519152604482015290519081900360640190fd5b600b548210611438576040805162461bcd60e51b81526020600482015260186024820152772830b4b91034b73232bc1037baba1037b3103930b733b29760411b604482015290519081900360640190fd5b600454600b80546001600160a01b0390921691600091908590811061145957fe5b60009182526020808320909101546040805163e6a4390560e01b81526001600160a01b038781166004830152909216602483018190529051909450735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9263e6a439059260448082019391829003018186803b1580156114cb57600080fd5b505afa1580156114df573d6000803e3d6000fd5b505050506040513d60208110156114f557600080fd5b50519050600061150482611193565b90508015611575576001600160a01b038083166000908152600a60205260408082205481516374fd6c7760e11b8152915193169263e9fad8ee9260048084019391929182900301818387803b15801561155c57600080fd5b505af1158015611570573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156115bb57600080fd5b505afa1580156115cf573d6000803e3d6000fd5b505050506040513d60208110156115e557600080fd5b505185118015906115f65750600085115b61163f576040805162461bcd60e51b81526020600482015260156024820152742737ba1032b737bab3b4103634b8bab4b234ba3c9760591b604482015290519081900360640190fd5b60408051635d5155ef60e11b81526001600160a01b0386811660048301528516602482015260448101879052600060648201819052608482018190523060a48301524260c4830152825190928392737a250d5630b4cf539739df2c5dacb4c659f2488d9263baa2abde9260e48084019391929182900301818787803b1580156116c757600080fd5b505af11580156116db573d6000803e3d6000fd5b505050506040513d60408110156116f157600080fd5b508051602090910151909250905061170d610f208688846131f2565b600b549092508910158061172057508789145b156117305750505050505061138e565b600b898154811061173d57fe5b6000918252602090912001546001600160a01b0316945060019190911c906117668686846131f2565b6040805162e8e33760e81b81526001600160a01b03898116600483015288166024820152604481018590526064810183905260006084820181905260a482018190523060c48301524260e483015291519293509091737a250d5630b4cf539739df2c5dacb4c659f2488d9163e8e337009161010480830192606092919082900301818787803b1580156117f857600080fd5b505af115801561180c573d6000803e3d6000fd5b505050506040513d606081101561182257600080fd5b506020015190508082111561184d5761184b8688611846858563ffffffff612ef016565b6131f2565b505b50505050505050505050565b604080516370a0823160e01b81523060048201529051600091731f9840a85d5af5bf1d1762f925bdaddc4201f984916370a0823191602480820192602092909190829003018186803b1580156118ae57600080fd5b505afa1580156118c2573d6000803e3d6000fd5b505050506040513d60208110156118d857600080fd5b5051905060005b600b54811015611a5a57600454600b8054600092735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9263e6a43905926001600160a01b03909216918690811061192557fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b15801561197b57600080fd5b505afa15801561198f573d6000803e3d6000fd5b505050506040513d60208110156119a557600080fd5b50516001600160a01b038082166000908152600a6020526040902054919250168015611a5057604080516246613160e11b81523060048201529051611a4d916001600160a01b03841691628cc26291602480820192602092909190829003018186803b158015611a1457600080fd5b505afa158015611a28573d6000803e3d6000fd5b505050506040513d6020811015611a3e57600080fd5b5051859063ffffffff612ce716565b93505b50506001016118df565b5090565b60026020526000908152604090205481565b6005546001600160a01b03163314611abd576040805162461bcd60e51b815260206004820152601a6024820152600080516020614173833981519152604482015290519081900360640190fd5b6001600160a01b038381166000908152600c6020526040902080546001600160a01b03191691841691821790551561138e576004805460408051636eb1769f60e11b815230938101939093526001600160a01b038581166024850152905191169163dd62ed3e916044808301926020929190829003018186803b158015611b4357600080fd5b505afa158015611b57573d6000803e3d6000fd5b505050506040513d6020811015611b6d57600080fd5b5051611b9257600454611b92906001600160a01b03168360001963ffffffff61372616565b60408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611be257600080fd5b505afa158015611bf6573d6000803e3d6000fd5b505050506040513d6020811015611c0c57600080fd5b5051611c2e57611c2e6001600160a01b0384168360001963ffffffff61372616565b6001600160a01b0382166000908152600d602052604090208054600f83900b6fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff19909116179055505050565b600a602052600090815260409020546001600160a01b031681565b60076020526000908152604090205481565b604051806040016040528060068152602001654850542d563160d01b81525081565b600c602052600090815260409020546001600160a01b031681565b6005546001600160a01b03163314611d33576040805162461bcd60e51b815260206004820152601a6024820152600080516020614173833981519152604482015290519081900360640190fd5b60005b600b54811015611f0b57600454600b8054600092735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9263e6a43905926001600160a01b039092169186908110611d7c57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015611dd257600080fd5b505afa158015611de6573d6000803e3d6000fd5b505050506040513d6020811015611dfc57600080fd5b50516001600160a01b038082166000908152600a6020526040902054919250168015611f0157604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b158015611e6c57600080fd5b505afa158015611e80573d6000803e3d6000fd5b505050506040513d6020811015611e9657600080fd5b505190508015611eff57816001600160a01b031663a694fc3a826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611ee657600080fd5b505af1158015611efa573d6000803e3d6000fd5b505050505b505b5050600101611d36565b50565b6000610b33338484612f32565b600060026000541415611f75576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005581611fc2576040805162461bcd60e51b815260206004820152601360248201527241726520796f75206b696464696e67206d653f60681b604482015290519081900360640190fd5b6000611fcc6106e4565b600454909150611fed906001600160a01b031633308663ffffffff613def16565b600154611ffc5782915061209a565b612015816109c360015486612d4190919063ffffffff16565b915060006120496001546109c361203c61202d611859565b6008549063ffffffff612ce716565b869063ffffffff612d4116565b905080156120985733600090815260096020526040902054612071908263ffffffff612ce716565b33600090815260096020526040902055600854612094908263ffffffff612ce716565b6008555b505b336000908152600760205260409020546120ba908463ffffffff612ce716565b336000908152600760205260409020556006546120dd908463ffffffff612ce716565b6006556120ea3383613e4f565b6040805184815260208101849052815133927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15928290030190a2506001600055919050565b600b818154811061213c57fe5b6000918252602090912001546001600160a01b0316905081565b6005546001600160a01b031633146121a3576040805162461bcd60e51b815260206004820152601a6024820152600080516020614173833981519152604482015290519081900360640190fd5b600480546040805163e6a4390560e01b81526001600160a01b0392831693810193909352908316602483015251600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561220f57600080fd5b505afa158015612223573d6000803e3d6000fd5b505050506040513d602081101561223957600080fd5b505190506001600160a01b03811661228a576040805162461bcd60e51b815260206004820152600f60248201526e2830b4b9103737ba1032bc34b9ba1760891b604482015290519081900360640190fd5b6122ba6001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d60001963ffffffff61372616565b6040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d6004820152600019602482015290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b15801561231e57600080fd5b505af1158015612332573d6000803e3d6000fd5b505050506040513d602081101561234857600080fd5b50600090505b600b548110156123cf57826001600160a01b0316600b828154811061236f57fe5b6000918252602090912001546001600160a01b031614156123c7576040805162461bcd60e51b815260206004820152600d60248201526c2830b4b91032bc34b9ba32b21760991b604482015290519081900360640190fd5b60010161234e565b5050600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0392909216919091179055565b600b546000908210612477576040805162461bcd60e51b81526020600482015260186024820152772830b4b91034b73232bc1037baba1037b3103930b733b29760411b604482015290519081900360640190fd5b600454600b80546001600160a01b0390921691600091908590811061249857fe5b60009182526020808320909101546040805163e6a4390560e01b81526001600160a01b038781166004830152909216602483018190529051909450735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9263e6a439059260448082019391829003018186803b15801561250a57600080fd5b505afa15801561251e573d6000803e3d6000fd5b505050506040513d602081101561253457600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b15801561257f57600080fd5b505afa158015612593573d6000803e3d6000fd5b505050506040513d60608110156125a957600080fd5b5080516020909101516001600160701b03918216935016905060006125d061084685611193565b9050856001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561261557600080fd5b505afa158015612629573d6000803e3d6000fd5b505050506040513d602081101561263f57600080fd5b50516001600160a01b031614156126d3576126cc846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561268c57600080fd5b505afa1580156126a0573d6000803e3d6000fd5b505050506040513d60208110156126b657600080fd5b50516109c3600186901b8463ffffffff612d4116565b9650612752565b61274f846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561270f57600080fd5b505afa158015612723573d6000803e3d6000fd5b505050506040513d602081101561273957600080fd5b50516109c3600185901b8463ffffffff612d4116565b96505b505050505050919050565b60096020526000908152604090205481565b600360209081526000928352604080842090915290825290205481565b6005546001600160a01b031633146127d9576040805162461bcd60e51b815260206004820152601a6024820152600080516020614173833981519152604482015290519081900360640190fd5b600b5480612820576040805162461bcd60e51b815260206004820152600f60248201526e2830b4b9399034b99032b6b83a3c9760891b604482015290519081900360640190fd5b60048054604080516370a0823160e01b81523093810193909352516001600160a01b039091169182916370a0823191602480820192602092909190829003018186803b15801561286f57600080fd5b505afa158015612883573d6000803e3d6000fd5b505050506040513d602081101561289957600080fd5b50518511156128e5576040805162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b4103130b630b731b29760691b604482015290519081900360640190fd5b600b54831461293b576040805162461bcd60e51b815260206004820152601f60248201527f50726f706f7274696f6e7320696e646578206f7574206f662072616e67652e00604482015290519081900360640190fd5b6000805b83811015612aea5785858281811061295357fe5b905060200201356000141561296757612ae2565b61298c86868381811061297657fe5b9050602002013583612ce790919063ffffffff16565b9150600060016129bc60646109c38a8a878181106129a657fe5b905060200201358c612d4190919063ffffffff16565b901c9050806129cb5750612ae2565b6000600b83815481106129da57fe5b60009182526020822001546001600160a01b031691506129fb8683856131f2565b6040805162e8e33760e81b81526001600160a01b03898116600483015285166024820152604481018690526064810183905260006084820181905260a482018190523060c48301524260e483015291519293509091737a250d5630b4cf539739df2c5dacb4c659f2488d9163e8e337009161010480830192606092919082900301818787803b158015612a8d57600080fd5b505af1158015612aa1573d6000803e3d6000fd5b505050506040513d6060811015612ab757600080fd5b5060200151905080821115612add57612adb8388611846858563ffffffff612ef016565b505b505050505b60010161293f565b5060648114612b34576040805162461bcd60e51b815260206004820152601160248201527022b93937b910383937b837b93a34b7b71760791b604482015290519081900360640190fd5b505050505050565b6005546001600160a01b031681565b6004546001600160a01b031681565b6005546001600160a01b03163314612ba7576040805162461bcd60e51b815260206004820152601a6024820152600080516020614173833981519152604482015290519081900360640190fd5b6001600160a01b03821615801590612bc757506001600160a01b03811615155b612c0b576040805162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21030b2323932b9b99760811b604482015290519081900360640190fd5b6001600160a01b038281166000908152600a60205260409020541615612c3957612c3782600154613076565b505b6040805163095ea7b360e01b81526001600160a01b038381166004830152600019602483015291519184169163095ea7b3916044808201926020929091908290030181600087803b158015612c8d57600080fd5b505af1158015612ca1573d6000803e3d6000fd5b505050506040513d6020811015612cb757600080fd5b50506001600160a01b039182166000908152600a6020526040902080546001600160a01b03191691909216179055565b600082820183811015610bb6576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082612d5057506000610b37565b82820282848281612d5d57fe5b0414610bb65760405162461bcd60e51b81526004018080602001828103825260218152602001806141936021913960400191505060405180910390fd5b6000808211612df0576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481612dfb57fe5b04949350505050565b6001600160a01b038316612e495760405162461bcd60e51b81526004018080602001828103825260248152602001806141fa6024913960400191505060405180910390fd5b6001600160a01b038216612e8e5760405162461bcd60e51b81526004018080602001828103825260228152602001806141516022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000610bb683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613f41565b6001600160a01b038316612f775760405162461bcd60e51b81526004018080602001828103825260258152602001806141d56025913960400191505060405180910390fd5b6001600160a01b038216612fbc5760405162461bcd60e51b815260040180806020018281038252602381526020018061412e6023913960400191505060405180910390fd5b6001600160a01b038316600090815260026020526040902054612fe5908263ffffffff612ef016565b6001600160a01b03808516600090815260026020526040808220939093559084168152205461301a908263ffffffff612ce716565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b038083166000908152600a602052604081205490911680156131eb576131316001546109c385846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156130f957600080fd5b505afa15801561310d573d6000803e3d6000fd5b505050506040513d602081101561312357600080fd5b50519063ffffffff612d4116565b915081156131eb57806001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561317f57600080fd5b505af1158015613193573d6000803e3d6000fd5b50505050806001600160a01b0316633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156131d257600080fd5b505af11580156131e6573d6000803e3d6000fd5b505050505b5092915050565b60045460009081906001600160a01b0386811691161461322c576001600160a01b038086166000908152600c602052604090205416613248565b6001600160a01b038085166000908152600c6020526040902054165b90506001600160a01b038116156134f1576001600160a01b0381166000908152600d6020526040812054600f0b90819081905b83600f0b81600f0b1215613345576000856001600160a01b031663c661065783600f0b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156132d257600080fd5b505afa1580156132e6573d6000803e3d6000fd5b505050506040513d60208110156132fc57600080fd5b505190506001600160a01b03808216908b16141561331d578193505061333d565b886001600160a01b0316816001600160a01b0316141561333b578192505b505b60010161327b565b5082600f0b82600f0b14158015613362575082600f0b81600f0b14155b156134ed57604080516370a0823160e01b815230600482015290516000916001600160a01b038a16916370a0823191602480820192602092909190829003018186803b1580156133b157600080fd5b505afa1580156133c5573d6000803e3d6000fd5b505050506040513d60208110156133db57600080fd5b505160408051630f7c084960e21b8152600f86810b810b600483015285810b900b6024820152604481018a905260006064820181905291519293506001600160a01b03881692633df021249260848084019391929182900301818387803b15801561344557600080fd5b505af1158015613459573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516134e193508492506001600160a01b038c16916370a08231916024808301926020929190829003018186803b1580156134a957600080fd5b505afa1580156134bd573d6000803e3d6000fd5b505050506040513d60208110156134d357600080fd5b50519063ffffffff612ef016565b95505050505050610bb6565b5050505b6040805160028082526060808301845292602083019080388339019050509050858160008151811061351f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061354d57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398660008530426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156136115781810151838201526020016135f9565b505050509050019650505050505050600060405180830381600087803b15801561363a57600080fd5b505af115801561364e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561367757600080fd5b810190808051604051939291908464010000000082111561369757600080fd5b9083019060208201858111156136ac57600080fd5b82518660208202830111640100000000821117156136c957600080fd5b82525081516020918201928201910280838360005b838110156136f65781810151838201526020016136de565b5050505090500160405250505090508060018151811061371257fe5b602002602001015193505050509392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261138e908490613fd8565b60048054600154604080516370a0823160e01b815230948101949094525160009384936001600160a01b0316926137d99290916109c391889186916370a0823191602480820192602092909190829003018186803b1580156130f957600080fd5b925060005b600b54811015613a15576000600b82815481106137f757fe5b60009182526020808320909101546040805163e6a4390560e01b81526001600160a01b038881166004830152909216602483018190529051909450735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9263e6a439059260448082019391829003018186803b15801561386957600080fd5b505afa15801561387d573d6000803e3d6000fd5b505050506040513d602081101561389357600080fd5b5051600154604080516370a0823160e01b815230600482015290519293506000926138f092916109c3918c916001600160a01b038816916370a0823191602480820192602092909190829003018186803b1580156130f957600080fd5b905061390c6138ff838a613076565b829063ffffffff612ce716565b90508061391b57505050613a0d565b60408051635d5155ef60e11b81526001600160a01b0387811660048301528516602482015260448101839052600060648201819052608482018190523060a48301524260c4830152825190928392737a250d5630b4cf539739df2c5dacb4c659f2488d9263baa2abde9260e48084019391929182900301818787803b1580156139a357600080fd5b505af11580156139b7573d6000803e3d6000fd5b505050506040513d60408110156139cd57600080fd5b5080516020909101519092509050613a056139e98689846131f2565b6139f98b8563ffffffff612ce716565b9063ffffffff612ce716565b985050505050505b6001016137de565b50604080516370a0823160e01b81523060048201529051600091731f9840a85d5af5bf1d1762f925bdaddc4201f984916370a0823191602480820192602092909190829003018186803b158015613a6b57600080fd5b505afa158015613a7f573d6000803e3d6000fd5b505050506040513d6020811015613a9557600080fd5b5051600154600854919250600091613abe91906109c3908990610c22908763ffffffff612ce716565b90508015613c12576001600160a01b0387166000908152600260209081526040808320546009909252822054613aff91906109c3908a63ffffffff612d4116565b6001600160a01b038916600090815260096020526040902054909150613b2b908263ffffffff612ef016565b6001600160a01b038916600090815260096020526040902055600854613b57908263ffffffff612ef016565b6008556000613b6c838363ffffffff612ef016565b905083811115613b795750825b8015613c0f576040805163a9059cbb60e01b81526001600160a01b038b166004820152602481018390529051731f9840a85d5af5bf1d1762f925bdaddc4201f9849163a9059cbb9160448083019260209291908290030181600087803b158015613be257600080fd5b505af1158015613bf6573d6000803e3d6000fd5b505050506040513d6020811015613c0c57600080fd5b50505b50505b6001600160a01b038716600090815260026020908152604080832054600790925290912054613c4c91906109c3908963ffffffff612d4116565b935083851115613cad576000613c7260646109c36014610c228a8a63ffffffff612ef016565b9050613c84868263ffffffff612ef016565b600554909650613ca7906001600160a01b0386811691168363ffffffff613d9d16565b50613cb1565b8493505b5050509250929050565b6001600160a01b038216613d005760405162461bcd60e51b81526004018080602001828103825260218152602001806141b46021913960400191505060405180910390fd5b6001600160a01b038216600090815260026020526040902054613d29908263ffffffff612ef016565b6001600160a01b038316600090815260026020526040902055600154613d55908263ffffffff612ef016565b6001556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261138e908490613fd8565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613e49908590613fd8565b50505050565b6001600160a01b038216613eaa576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600154613ebd908263ffffffff612ce716565b6001556001600160a01b038216600090815260026020526040902054613ee9908263ffffffff612ce716565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008184841115613fd05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f95578181015183820152602001613f7d565b50505050905090810190601f168015613fc25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60006060836001600160a01b0316836040518082805190602001908083835b602083106140165780518252601f199092019160209182019101613ff7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614078576040519150601f19603f3d011682016040523d82523d6000602084013e61407d565b606091505b5091509150816140d4576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115613e49578080602001905160208110156140f057600080fd5b5051613e495760405162461bcd60e51b815260040180806020018281038252602a81526020018061421e602a913960400191505060405180910390fdfe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734f6e6c792063616c6c656420627920436f6e74726f6c6c65722e000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158201a08d8e3abfaa2696a22890f7a9fc8c1722c9d5f369ab8b5e44a3c6edf37c9e364736f6c63430005110032

Deployed Bytecode Sourcemap

14707:15343:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14707:15343:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24368:819;;;:::i;:::-;;;;;;;;;;;;;;;;10561:41;;;:::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;10561:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12338:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12338:147:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;15203:27;;;:::i;15318:22::-;;;:::i;10698:23::-;;;:::i;12640:230::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12640:230:0;;;;;;;;;;;;;;;;;:::i;20104:332::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20104:332:0;-1:-1:-1;;;;;20104:332:0;;:::i;27903:957::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27903:957:0;;:::i;:::-;;21189:540;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21189:540:0;;:::i;20444:213::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20444:213:0;-1:-1:-1;;;;;20444:213:0;;:::i;10656:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18645:364;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18645:364:0;-1:-1:-1;;;;;18645:364:0;;:::i;25195:87::-;;;:::i;26445:1450::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26445:1450:0;;;;;;;;;;;;:::i;19575:521::-;;;:::i;10728:41::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10728:41:0;-1:-1:-1;;;;;10728:41:0;;:::i;25290:560::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25290:560:0;;;;;;;;;;;;;;;;;;;:::i;15437:42::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15437:42:0;-1:-1:-1;;;;;15437:42:0;;:::i;:::-;;;;-1:-1:-1;;;;;15437:42:0;;;;;;;;;;;;;;15237:45;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15237:45:0;-1:-1:-1;;;;;15237:45:0;;:::i;10609:40::-;;;:::i;15543:45::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15543:45:0;-1:-1:-1;;;;;15543:45:0;;:::i;19017:550::-;;;:::i;12493:139::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12493:139:0;;;;;;;;:::i;16184:913::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16184:913:0;;:::i;15488:22::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15488:22:0;;:::i;25858:579::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25858:579:0;-1:-1:-1;;;;;25858:579:0;;:::i;23649:711::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23649:711:0;;:::i;15347:41::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15347:41:0;-1:-1:-1;;;;;15347:41:0;;:::i;10776:61::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10776:61:0;;;;;;;;;;:::i;17107:1149::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17107:1149:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;17107:1149:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17107:1149:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;17107:1149:0;;-1:-1:-1;17107:1149:0;-1:-1:-1;17107:1149:0;:::i;15171:25::-;;;:::i;15144:20::-;;;:::i;18264:373::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18264:373:0;;;;;;;;;;:::i;24368:819::-;24453:5;;24411:12;;-1:-1:-1;;;;;24453:5:0;24411:12;24469:638;24485:5;:12;24483:14;;24469:638;;;24518:14;24535:5;24541:1;24535:8;;;;;;;;;;;;;;;;;;;;24595:58;;;-1:-1:-1;;;24595:58:0;;-1:-1:-1;;;;;24595:58:0;;;;;;;24535:8;;;24595:58;;;;;;;;24535:8;;-1:-1:-1;14870:42:0;;24595;;:58;;;;;;;;;;;14870:42;24595:58;;;5:2:-1;;;;30:1;27;20:12;5:2;24595:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24595:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24595:58:0;24704:18;;;-1:-1:-1;;;24704:18:0;;;;24595:58;;-1:-1:-1;24670:13:0;;;;-1:-1:-1;;;;;24704:16:0;;;;;:18;;;;;;;;;;;;;;;:16;:18;;;5:2:-1;;;;30:1;27;20:12;5:2;24704:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24704:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24704:18:0;;;;;;;-1:-1:-1;;;;;24669:53:0;;;;-1:-1:-1;24669:53:0;;-1:-1:-1;24737:14:0;24754:61;24788:26;24808:4;24788:11;:26::i;:::-;24754:29;;;-1:-1:-1;;;24754:29:0;;24777:4;24754:29;;;;;;-1:-1:-1;;;;;24754:14:0;;;;;:29;;;;;;;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;24754:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24754:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24754:29:0;;:61;:33;:61;:::i;:::-;24737:78;;24851:6;-1:-1:-1;;;;;24834:23:0;:4;-1:-1:-1;;;;;24834:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24834:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24834:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24834:13:0;-1:-1:-1;;;;;24834:23:0;;24830:265;;;24887:67;24899:54;24934:4;-1:-1:-1;;;;;24934:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24934:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24934:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24934:18:0;24899:30;24912:1;24900:13;;;24919:9;24899:30;:19;:30;:::i;:::-;:34;:54;:34;:54;:::i;:::-;24887:7;;:67;:11;:67;:::i;:::-;24877:77;;24830:265;;;25028:67;25040:54;25075:4;-1:-1:-1;;;;;25075:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25075:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25075:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25075:18:0;25040:30;25053:1;25041:13;;;25060:9;25040:30;:19;:30;:::i;25028:67::-;25018:77;;24830:265;-1:-1:-1;;24499:3:0;;;;;-1:-1:-1;24469:638:0;;-1:-1:-1;;24469:638:0;;-1:-1:-1;25139:39:0;;;-1:-1:-1;;;25139:39:0;;25172:4;25139:39;;;;;;25127:52;;-1:-1:-1;;;;;25139:24:0;;;;;:39;;;;;;;;;;;;;;;:24;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;25139:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25139:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25139:39:0;25127:7;;:52;:11;:52;:::i;:::-;25117:62;;24368:819;;:::o;10561:41::-;;;;;;;;;;;;;;-1:-1:-1;;;10561:41:0;;;;:::o;12338:147::-;12402:4;12419:36;12428:10;12440:7;12449:5;12419:8;:36::i;:::-;-1:-1:-1;12473:4:0;12338:147;;;;;:::o;15203:27::-;;;;:::o;15318:22::-;;;;:::o;10698:23::-;;;;:::o;12640:230::-;-1:-1:-1;;;;;12765:15:0;;12718:4;12765:15;;;:9;:15;;;;;;;;12781:10;12765:27;;;;;;;;:38;;12797:5;12765:38;:31;:38;:::i;:::-;-1:-1:-1;;;;;12735:15:0;;;;;;:9;:15;;;;;;;;12751:10;12735:27;;;;;;;:68;12814:26;12745:4;12830:2;12834:5;12814:9;:26::i;:::-;-1:-1:-1;12858:4:0;12640:230;;;;;;:::o;20104:332::-;-1:-1:-1;;;;;20189:18:0;;20163:11;20189:18;;;:9;:18;;;;;;:22;20186:243;;20227:14;20244:17;:15;:17::i;:::-;20349:11;;-1:-1:-1;;;;;20325:18:0;;20276:16;20325:18;;;:9;:18;;;;;;20295:10;;20227:34;;-1:-1:-1;20276:16:0;;20295:66;;20349:11;20295:49;;:25;;20227:34;20295:25;:14;:25;:::i;:::-;:29;:49;:29;:49;:::i;:66::-;-1:-1:-1;;;;;20401:15:0;;;;;;:6;:15;;;;;;20276:85;;-1:-1:-1;20385:32:0;;20276:85;;20385:32;:15;:32;:::i;:::-;20376:41;;20186:243;;;20104:332;;;:::o;27903:957::-;15704:10;;-1:-1:-1;;;;;15704:10:0;15690;:24;15682:63;;;;;-1:-1:-1;;;15682:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15682:63:0;;;;;;;;;;;;;;;27986:5;:12;27978:20;;27970:57;;;;;-1:-1:-1;;;27970:57:0;;;;;;;;;;;;-1:-1:-1;;;27970:57:0;;;;;;;;;;;;;;;28057:5;;28090;:12;;-1:-1:-1;;;;;28057:5:0;;;;28040:14;;28090:5;28096;;28090:12;;;;;;;;;;;;;;;;;;28150:58;;;-1:-1:-1;;;28150:58:0;;-1:-1:-1;;;;;28150:58:0;;;;;;;28090:12;;;28150:58;;;;;;;;28090:12;;-1:-1:-1;14870:42:0;;28150;;:58;;;;;;;;;;;14870:42;28150:58;;;5:2:-1;;;;30:1;27;20:12;5:2;28150:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28150:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28150:58:0;28243:11;;28150:58;;-1:-1:-1;28220:35:0;;28150:58;;28220:16;:35::i;:::-;-1:-1:-1;28283:29:0;;;-1:-1:-1;;;28283:29:0;;28306:4;28283:29;;;;;;28266:14;;-1:-1:-1;;;;;28283:14:0;;;;;:29;;;;;;;;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;28283:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28283:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28283:29:0;;-1:-1:-1;28328:13:0;;28325:342;;28388:199;;;-1:-1:-1;;;28388:199:0;;-1:-1:-1;;;;;28388:199:0;;;;;;;;;;;;;;;;;;;28358:12;28388:199;;;;;;;;;;;;28550:4;28388:199;;;;28557:15;28388:199;;;;;;28358:12;;;;14956:42;;28388:51;;:199;;;;;;;;;;;;;28358:12;14956:42;28388:199;;;5:2:-1;;;;30:1;27;20:12;5:2;28388:199:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28388:199:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28388:199:0;;;;;;;;;-1:-1:-1;28388:199:0;-1:-1:-1;28612:43:0;28624:30;28630:6;28638;28388:199;28624:5;:30::i;:::-;28612:7;;:43;:11;:43;:::i;:::-;-1:-1:-1;;;28325:342:0;28677:48;-1:-1:-1;;;;;28677:26:0;;14956:42;28723:1;28677:48;:26;:48;:::i;:::-;28752:5;28738:93;28763:5;:12;-1:-1:-1;;28763:14:0;28759:18;;28738:93;;;28809:5;28815:1;28817;28815:3;28809:10;;;;;;;;;;;;;;;;;;28798:5;:8;;-1:-1:-1;;;;;28809:10:0;;;;28804:1;;28798:8;;;;;;;;;;;;;;;:21;;-1:-1:-1;;;;;;28798:21:0;-1:-1:-1;;;;;28798:21:0;;;;;;;;;;-1:-1:-1;28779:3:0;28738:93;;;;28841:5;:11;;;;;;;;;;;;;;;;-1:-1:-1;;28841:11:0;;;;;-1:-1:-1;;;;;;28841:11:0;;;;;;-1:-1:-1;;;;;27903:957:0:o;21189:540::-;21247:11;13752:1;14358:7;;:19;;14350:63;;;;;-1:-1:-1;;;14350:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13752:1;14491:7;:18;21279:9;;;;;:43;;-1:-1:-1;21311:10:0;21301:21;;;;:9;:21;;;;;;21292:30;;;21279:43;21271:75;;;;;-1:-1:-1;;;21271:75:0;;;;;;;;;;;;-1:-1:-1;;;21271:75:0;;;;;;;;;;;;;;;21359:16;21410:28;21420:10;21432:5;21410:9;:28::i;:::-;21489:10;21476:24;;;;:12;:24;;;;;;21386:52;;-1:-1:-1;21386:52:0;-1:-1:-1;21476:41:0;;21386:52;21476:41;:28;:41;:::i;:::-;21462:10;21449:24;;;;:12;:24;;;;;:68;21546:15;;:32;;21566:11;21546:32;:19;:32;:::i;:::-;21528:15;:50;21589:24;21595:10;21607:5;21589;:24::i;:::-;21631:5;;21624:46;;-1:-1:-1;;;;;21631:5:0;21651:10;21663:6;21624:46;:26;:46;:::i;:::-;21686:35;;;;;;;;;;;;;;21695:10;;21686:35;;;;;;;;-1:-1:-1;13708:1:0;14670:7;:22;21189:540;;-1:-1:-1;21189:540:0:o;20444:213::-;-1:-1:-1;;;;;20528:13:0;;;20499:14;20528:13;;;:7;:13;;;;;;20499:14;;20528:13;:27;20525:125;;-1:-1:-1;;;;;20599:13:0;;;;;;;:7;:13;;;;;;;;;;20583:55;;-1:-1:-1;;;20583:55:0;;20632:4;20583:55;;;;;;20599:13;;;20583:40;;:55;;;;;20599:13;20583:55;;;;;;20599:13;20583:55;;;5:2:-1;;;;30:1;27;20:12;5:2;20583:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20583:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20583:55:0;;20444:213;-1:-1:-1;;20444:213:0:o;10656:35::-;10689:2;10656:35;:::o;18645:364::-;15704:10;;-1:-1:-1;;;;;15704:10:0;15690;:24;15682:63;;;;;-1:-1:-1;;;15682:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15682:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18737:13:0;;;18709:25;18737:13;;;:7;:13;;;;;;;18764:31;;18761:241;;18828:45;;;-1:-1:-1;;;18828:45:0;;18867:4;18828:45;;;;;;18811:14;;-1:-1:-1;;;;;18828:30:0;;;;;:45;;;;;;;;;;;;;;;:30;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;18828:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18828:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18828:45:0;;-1:-1:-1;18891:13:0;;18888:103;;18940:17;-1:-1:-1;;;;;18924:40:0;;18965:9;18924:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18924:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18924:51:0;;;;18888:103;18761:241;;15756:1;18645:364;:::o;25195:87::-;25262:5;:12;25195:87;:::o;26445:1450::-;15704:10;;-1:-1:-1;;;;;15704:10:0;15690;:24;15682:63;;;;;-1:-1:-1;;;15682:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15682:63:0;;;;;;;;;;;;;;;26607:5;:12;26592:27;;26584:64;;;;;-1:-1:-1;;;26584:64:0;;;;;;;;;;;;-1:-1:-1;;;26584:64:0;;;;;;;;;;;;;;;26678:5;;26711;:19;;-1:-1:-1;;;;;26678:5:0;;;;26661:14;;26711:5;26717:12;;26711:19;;;;;;;;;;;;;;;;;;26778:58;;;-1:-1:-1;;;26778:58:0;;-1:-1:-1;;;;;26778:58:0;;;;;;;26711:19;;;26778:58;;;;;;;;26711:19;;-1:-1:-1;14870:42:0;;26778;;:58;;;;;;;;;;;14870:42;26778:58;;;5:2:-1;;;;30:1;27;20:12;5:2;26778:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26778:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26778:58:0;;-1:-1:-1;26850:14:0;26867:26;26778:58;26867:11;:26::i;:::-;26850:43;-1:-1:-1;26907:13:0;;26904:64;;-1:-1:-1;;;;;26938:22:0;;;;;;;:7;:22;;;;;;;26922:46;;-1:-1:-1;;;26922:46:0;;;;26938:22;;;26922:44;;:46;;;;;26938:22;;26922:46;;;;;;26938:22;;26922:46;;;5:2:-1;;;;30:1;27;20:12;5:2;26922:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26922:46:0;;;;26904:64;27002:29;;;-1:-1:-1;;;27002:29:0;;27025:4;27002:29;;;;;;-1:-1:-1;;;;;27002:14:0;;;;;:29;;;;;;;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;27002:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27002:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27002:29:0;26989:42;;;;;:59;;;27047:1;27035:9;:13;26989:59;26981:93;;;;;-1:-1:-1;;;26981:93:0;;;;;;;;;;;;-1:-1:-1;;;26981:93:0;;;;;;;;;;;;;;;27118:179;;;-1:-1:-1;;;27118:179:0;;-1:-1:-1;;;;;27118:179:0;;;;;;;;;;;;;;;;;;;27088:12;27118:179;;;;;;;;;;;;27264:4;27118:179;;;;27271:15;27118:179;;;;;;27088:12;;;;14956:42;;27118:51;;:179;;;;;;;;;;;;;27088:12;14956:42;27118:179;;;5:2:-1;;;;30:1;27;20:12;5:2;27118:179:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27118:179:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27118:179:0;;;;;;;;;-1:-1:-1;27118:179:0;-1:-1:-1;27318:43:0;27330:30;27336:6;27344;27118:179;27330:5;:30::i;27318:43::-;27423:5;:12;27308:53;;-1:-1:-1;27410:25:0;;;;:54;;;27452:12;27439:9;:25;27410:54;27407:66;;;27466:7;;;;;;;;27407:66;27494:5;27500:9;27494:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27494:16:0;;-1:-1:-1;27494:16:0;27531:12;;;;;27564:30;27570:6;27494:16;27531:12;27564:5;:30::i;:::-;27626:183;;;-1:-1:-1;;;27626:183:0;;-1:-1:-1;;;;;27626:183:0;;;;;;;;;;;;;;;;;;;;;;;;;27609:12;27626:183;;;;;;;;;;;;27776:4;27626:183;;;;27783:15;27626:183;;;;;;27554:40;;-1:-1:-1;27609:12:0;;14956:42;;27626:48;;:183;;;;;;;;;;;;;;27609:12;14956:42;27626:183;;;5:2:-1;;;;30:1;27;20:12;5:2;27626:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27626:183:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27626:183:0;;;;-1:-1:-1;27825:17:0;;;27822:65;;;27844:43;27850:6;27858;27866:20;:7;27878;27866:20;:11;:20;:::i;:::-;27844:5;:43::i;:::-;;27822:65;15756:1;;;;;;;26445:1450;;;:::o;19575:521::-;19654:36;;;-1:-1:-1;;;19654:36:0;;19684:4;19654:36;;;;;;19622:11;;15028:42;;19654:21;;:36;;;;;;;;;;;;;;;15028:42;19654:36;;;5:2:-1;;;;30:1;27;20:12;5:2;19654:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19654:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19654:36:0;;-1:-1:-1;19705:6:0;19701:388;19721:5;:12;19717:16;;19701:388;;;19834:5;;19841;:8;;19754:19;;14870:42;;19791;;-1:-1:-1;;;;;19834:5:0;;;;19847:1;;19841:8;;;;;;;;;;;;;;;;;19791:59;;;-1:-1:-1;;;;;;19791:59:0;;;;;;;-1:-1:-1;;;;;19791:59:0;;;;;;;19841:8;;;;19791:59;;;;;;;;;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;19791:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19791:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19791:59:0;-1:-1:-1;;;;;19894:22:0;;;19866:25;19894:22;;;:7;19791:59;19894:22;;;;;19791:59;;-1:-1:-1;19894:22:0;19934:31;;19931:147;;20005:56;;;-1:-1:-1;;;20005:56:0;;20055:4;20005:56;;;;;;19994:68;;-1:-1:-1;;;;;20005:41:0;;;;;:56;;;;;;;;;;;;;;;:41;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;20005:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20005:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20005:56:0;19994:6;;:68;:10;:68;:::i;:::-;19985:77;;19931:147;-1:-1:-1;;19735:3:0;;19701:388;;;;19575:521;:::o;10728:41::-;;;;;;;;;;;;;:::o;25290:560::-;15704:10;;-1:-1:-1;;;;;15704:10:0;15690;:24;15682:63;;;;;-1:-1:-1;;;15682:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15682:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25399:17:0;;;;;;;:9;:17;;;;;:30;;-1:-1:-1;;;;;;25399:30:0;;;;;;;;;25443:24;25440:403;;25494:5;;;25487:50;;;-1:-1:-1;;;25487:50:0;;25519:4;25487:50;;;;;;;-1:-1:-1;;;;;25487:50:0;;;;;;;;;25494:5;;;25487:23;;:50;;;;;;;;;;;;;;25494:5;25487:50;;;5:2:-1;;;;30:1;27;20:12;5:2;25487:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25487:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25487:50:0;25484:141;;25569:5;;25562:47;;-1:-1:-1;;;;;25569:5:0;25588:10;-1:-1:-1;;25562:47:0;:25;:47;:::i;:::-;25642:51;;;-1:-1:-1;;;25642:51:0;;25675:4;25642:51;;;;-1:-1:-1;;;;;25642:51:0;;;;;;;;;:24;;;;;;:51;;;;;;;;;;;;;;;:24;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;25642:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25642:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25642:51:0;25639:143;;25718:48;-1:-1:-1;;;;;25718:26:0;;25745:10;-1:-1:-1;;25718:48:0;:26;:48;:::i;:::-;-1:-1:-1;;;;;25796:25:0;;;;;;:13;:25;;;;;:35;;;;;;;;-1:-1:-1;;25796:35:0;;;;;;25290:560;;;:::o;15437:42::-;;;;;;;;;;;;-1:-1:-1;;;;;15437:42:0;;:::o;15237:45::-;;;;;;;;;;;;;:::o;10609:40::-;;;;;;;;;;;;;;-1:-1:-1;;;10609:40:0;;;;:::o;15543:45::-;;;;;;;;;;;;-1:-1:-1;;;;;15543:45:0;;:::o;19017:550::-;15704:10;;-1:-1:-1;;;;;15704:10:0;15690;:24;15682:63;;;;;-1:-1:-1;;;15682:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15682:63:0;;;;;;;;;;;;;;;19078:6;19074:486;19094:5;:12;19090:16;;19074:486;;;19207:5;;19214;:8;;19127:19;;14870:42;;19164;;-1:-1:-1;;;;;19207:5:0;;;;19220:1;;19214:8;;;;;;;;;;;;;;;;;19164:59;;;-1:-1:-1;;;;;;19164:59:0;;;;;;;-1:-1:-1;;;;;19164:59:0;;;;;;;19214:8;;;;19164:59;;;;;;;;;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;19164:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19164:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19164:59:0;-1:-1:-1;;;;;19267:22:0;;;19239:25;19267:22;;;:7;19164:59;19267:22;;;;;19164:59;;-1:-1:-1;19267:22:0;19307:31;;19304:245;;19375:29;;;-1:-1:-1;;;19375:29:0;;19398:4;19375:29;;;;;;19358:14;;-1:-1:-1;;;;;19375:14:0;;;;;:29;;;;;;;;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;19375:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19375:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19375:29:0;;-1:-1:-1;19426:13:0;;19423:111;;19479:17;-1:-1:-1;;;;;19463:40:0;;19504:9;19463:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19463:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19463:51:0;;;;19423:111;19304:245;;-1:-1:-1;;19108:3:0;;19074:486;;;;19017:550::o;12493:139::-;12553:4;12570:32;12580:10;12592:2;12596:5;12570:9;:32::i;16184:913::-;16242:10;13752:1;14358:7;;:19;;14350:63;;;;;-1:-1:-1;;;14350:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13752:1;14491:7;:18;16273:10;16265:42;;;;;-1:-1:-1;;;16265:42:0;;;;;;;;;;;;-1:-1:-1;;;16265:42:0;;;;;;;;;;;;;;;16318:18;16339:13;:11;:13::i;:::-;16370:5;;16318:34;;-1:-1:-1;16363:65:0;;-1:-1:-1;;;;;16370:5:0;16394:10;16414:4;16421:6;16363:65;:30;:65;:::i;:::-;16444:11;;16441:432;;16484:6;16476:14;;16441:432;;;16539:42;16567:13;16539:23;16550:11;;16539:6;:10;;:23;;;;:::i;:42::-;16531:50;;16626:9;16638:61;16687:11;;16638:44;16648:33;16663:17;:15;:17::i;:::-;16648:10;;;:33;:14;:33;:::i;:::-;16638:5;;:44;:9;:44;:::i;:61::-;16626:73;-1:-1:-1;16717:8:0;;16714:148;;16773:10;16766:18;;;;:6;:18;;;;;;:28;;16789:4;16766:28;:22;:28;:::i;:::-;16752:10;16745:18;;;;:6;:18;;;;;:49;16826:10;;:20;;16841:4;16826:20;:14;:20;:::i;:::-;16813:10;:33;16714:148;16441:432;;16925:10;16912:24;;;;:12;:24;;;;;;:36;;16941:6;16912:36;:28;:36;:::i;:::-;16898:10;16885:24;;;;:12;:24;;;;;:63;16977:15;;:27;;16997:6;16977:27;:19;:27;:::i;:::-;16959:15;:45;17015:24;17021:10;17033:5;17015;:24::i;:::-;17055:34;;;;;;;;;;;;;;17063:10;;17055:34;;;;;;;;-1:-1:-1;13708:1:0;14670:7;:22;16184:913;;-1:-1:-1;16184:913:0:o;15488:22::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15488:22:0;;-1:-1:-1;15488:22:0;:::o;25858:579::-;15704:10;;-1:-1:-1;;;;;15704:10:0;15690;:24;15682:63;;;;;-1:-1:-1;;;15682:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15682:63:0;;;;;;;;;;;;;;;25984:5;;;25941:57;;;-1:-1:-1;;;25941:57:0;;-1:-1:-1;;;;;25984:5:0;;;25941:57;;;;;;;;;;;;;;;25926:12;;14870:42;;25941;;:57;;;;;;;;;;;;;;;14870:42;25941:57;;;5:2:-1;;;;30:1;27;20:12;5:2;25941:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25941:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25941:57:0;;-1:-1:-1;;;;;;26017:18:0;;26009:46;;;;;-1:-1:-1;;;26009:46:0;;;;;;;;;;;;-1:-1:-1;;;26009:46:0;;;;;;;;;;;;;;;26115:55;-1:-1:-1;;;;;26115:26:0;;14956:42;-1:-1:-1;;26115:55:0;:26;:55;:::i;:::-;26221:57;;;-1:-1:-1;;;26221:57:0;;14956:42;26221:57;;;;-1:-1:-1;;26221:57:0;;;;;;-1:-1:-1;;;;;26221:28:0;;;;;:57;;;;;;;;;;;;;;-1:-1:-1;26221:28:0;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;26221:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26221:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26295:6:0;;-1:-1:-1;26291:110:0;26311:5;:12;26307:16;;26291:110;;;26365:6;-1:-1:-1;;;;;26353:18:0;:5;26359:1;26353:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26353:8:0;:18;;26345:44;;;;;-1:-1:-1;;;26345:44:0;;;;;;;;;;;;-1:-1:-1;;;26345:44:0;;;;;;;;;;;;;;;26325:3;;26291:110;;;-1:-1:-1;;26411:5:0;27:10:-1;;39:1;23:18;;45:23;;-1:-1;26411:18:0;;;;;;;;-1:-1:-1;;;;;;26411:18:0;-1:-1:-1;;;;;26411:18:0;;;;;;;;;;25858:579::o;23649:711::-;23738:5;:12;23697;;23730:20;;23722:57;;;;;-1:-1:-1;;;23722:57:0;;;;;;;;;;;;-1:-1:-1;;;23722:57:0;;;;;;;;;;;;;;;23807:5;;23840;:12;;-1:-1:-1;;;;;23807:5:0;;;;23790:14;;23840:5;23846;;23840:12;;;;;;;;;;;;;;;;;;23900:58;;;-1:-1:-1;;;23900:58:0;;-1:-1:-1;;;;;23900:58:0;;;;;;;23840:12;;;23900:58;;;;;;;;23840:12;;-1:-1:-1;14870:42:0;;23900;;:58;;;;;;;;;;;14870:42;23900:58;;;5:2:-1;;;;30:1;27;20:12;5:2;23900:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23900:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23900:58:0;24005:18;;;-1:-1:-1;;;24005:18:0;;;;23900:58;;-1:-1:-1;23971:13:0;;;;-1:-1:-1;;;;;24005:16:0;;;;;:18;;;;;;;;;;;;;;;:16;:18;;;5:2:-1;;;;30:1;27;20:12;5:2;24005:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24005:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24005:18:0;;;;;;;-1:-1:-1;;;;;23970:53:0;;;;-1:-1:-1;23970:53:0;;-1:-1:-1;24036:14:0;24053:61;24087:26;24107:4;24087:11;:26::i;24053:61::-;24036:78;;24146:6;-1:-1:-1;;;;;24129:23:0;:4;-1:-1:-1;;;;;24129:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24129:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24129:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24129:13:0;-1:-1:-1;;;;;24129:23:0;;24125:227;;;24178:54;24213:4;-1:-1:-1;;;;;24213:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24213:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24213:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24213:18:0;24178:30;24191:1;24179:13;;;24198:9;24178:30;:19;:30;:::i;:54::-;24168:64;;24125:227;;;24298:54;24333:4;-1:-1:-1;;;;;24333:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24333:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24333:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24333:18:0;24298:30;24311:1;24299:13;;;24318:9;24298:30;:19;:30;:::i;:54::-;24288:64;;24125:227;23649:711;;;;;;;;;:::o;15347:41::-;;;;;;;;;;;;;:::o;10776:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;17107:1149::-;15704:10;;-1:-1:-1;;;;;15704:10:0;15690;:24;15682:63;;;;;-1:-1:-1;;;15682:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15682:63:0;;;;;;;;;;;;;;;17211:5;:12;17242:5;17234:33;;;;;-1:-1:-1;;;17234:33:0;;;;;;;;;;;;-1:-1:-1;;;17234:33:0;;;;;;;;;;;;;;;17295:5;;;17329:39;;;-1:-1:-1;;;17329:39:0;;17362:4;17329:39;;;;;;;;-1:-1:-1;;;;;17295:5:0;;;;;;17329:24;;:39;;;;;;;;;;;;;;;17295:5;17329:39;;;5:2:-1;;;;30:1;27;20:12;5:2;17329:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17329:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17329:39:0;17319:49;;;17311:81;;;;;-1:-1:-1;;;17311:81:0;;;;;;;;;;;;-1:-1:-1;;;17311:81:0;;;;;;;;;;;;;;;17433:5;:12;17411:34;;17403:78;;;;;-1:-1:-1;;;17403:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17494:11;;17516:675;17532:3;17530:1;:5;17516:675;;;17559:11;;17571:1;17559:14;;;;;;;;;;;;;17577:1;17559:19;17556:32;;;17580:8;;17556:32;17612:26;17623:11;;17635:1;17623:14;;;;;;;;;;;;;17612:6;:10;;:26;;;;:::i;:::-;17603:35;;17655:12;17715:1;17671:39;15103:3;17671:26;17682:11;;17694:1;17682:14;;;;;;;;;;;;;17671:6;:10;;:26;;;;:::i;:39::-;17670:46;;;-1:-1:-1;17734:12:0;17731:25;;17748:8;;;17731:25;17773:14;17790:5;17796:1;17790:8;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17790:8:0;;-1:-1:-1;17828:30:0;17834:6;17790:8;17850:7;17828:5;:30::i;:::-;17894:203;;;-1:-1:-1;;;17894:203:0;;-1:-1:-1;;;;;17894:203:0;;;;;;;;;;;;;;;;;;;;;;;;;17877:12;17894:203;;;;;;;;;;;;18060:4;17894:203;;;;18067:15;17894:203;;;;;;17813:45;;-1:-1:-1;17877:12:0;;14956:42;;17894:48;;:203;;;;;;;;;;;;;;17877:12;14956:42;17894:203;;;5:2:-1;;;;30:1;27;20:12;5:2;17894:203:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17894:203:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17894:203:0;;;;-1:-1:-1;18117:17:0;;;18114:65;;;18136:43;18142:6;18150;18158:20;:7;18170;18158:20;:11;:20;:::i;18136:43::-;;18114:65;17516:675;;;;;17537:3;;17516:675;;;;15103:3;18209:6;:17;18201:47;;;;;-1:-1:-1;;;18201:47:0;;;;;;;;;;;;-1:-1:-1;;;18201:47:0;;;;;;;;;;;;;;;15756:1;;;17107:1149;;;:::o;15171:25::-;;;-1:-1:-1;;;;;15171:25:0;;:::o;15144:20::-;;;-1:-1:-1;;;;;15144:20:0;;:::o;18264:373::-;15704:10;;-1:-1:-1;;;;;15704:10:0;15690;:24;15682:63;;;;;-1:-1:-1;;;15682:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15682:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18359:17:0;;;;;;:42;;-1:-1:-1;;;;;;18380:21:0;;;;18359:42;18351:71;;;;;-1:-1:-1;;;18351:71:0;;;;;;;;;;;;-1:-1:-1;;;18351:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18438:13:0;;;18463:1;18438:13;;;:7;:13;;;;;;;:27;18435:109;;18481:51;18513:4;18520:11;;18481:16;:51::i;:::-;;18435:109;18554:40;;;-1:-1:-1;;;18554:40:0;;-1:-1:-1;;;;;18554:40:0;;;;;;;-1:-1:-1;;18554:40:0;;;;;;:20;;;;;;:40;;;;;;;;;;;;;;;-1:-1:-1;18554:20:0;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;18554:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18554:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;;18605:13:0;;;;;;;:7;18554:40;18605:13;;;;:24;;-1:-1:-1;;;;;;18605:24:0;;;;;;;;18264:373::o;4232:181::-;4290:7;4322:5;;;4346:6;;;;4338:46;;;;;-1:-1:-1;;;4338:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5586:471;5644:7;5889:6;5885:47;;-1:-1:-1;5919:1:0;5912:8;;5885:47;5956:5;;;5960:1;5956;:5;:1;5980:5;;;;;:10;5972:56;;;;-1:-1:-1;;;5972:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6533:266;6591:7;6623:1;6619;:5;6611:44;;;;;-1:-1:-1;;;6611:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6666:9;6682:1;6678;:5;;;;;;;6533:266;-1:-1:-1;;;;6533:266:0:o;11617:329::-;-1:-1:-1;;;;;11706:19:0;;11698:68;;;;-1:-1:-1;;;11698:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11785:21:0;;11777:68;;;;-1:-1:-1;;;11777:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11858:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;11907:31;;;;;;;;;;;;;;;;;11617:329;;;:::o;4696:136::-;4754:7;4781:43;4785:1;4788;4781:43;;;;;;;;;;;;;;;;;:3;:43::i;11954:376::-;-1:-1:-1;;;;;12038:18:0;;12030:68;;;;-1:-1:-1;;;12030:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12117:16:0;;12109:64;;;;-1:-1:-1;;;12109:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12204:15:0;;;;;;:9;:15;;;;;;:26;;12224:5;12204:26;:19;:26;:::i;:::-;-1:-1:-1;;;;;12186:15:0;;;;;;;:9;:15;;;;;;:44;;;;12257:13;;;;;;;:24;;12275:5;12257:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;12241:13:0;;;;;;;:9;:13;;;;;;;;;:40;;;;12297:25;;;;;;;12241:13;;12297:25;;;;;;;;;;;;;11954:376;;;:::o;20665:516::-;-1:-1:-1;;;;;20795:22:0;;;20741:14;20795:22;;;:7;:22;;;;;;20741:14;;20795:22;20831:31;;20828:346;;20890:87;20965:11;;20890:70;20954:5;20906:17;-1:-1:-1;;;;;20890:44:0;;20943:4;20890:59;;;;;;;;;;;;;-1:-1:-1;;;;;20890:59:0;-1:-1:-1;;;;;20890:59:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20890:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20890:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20890:59:0;;:70;:63;:70;:::i;:87::-;20878:99;-1:-1:-1;20995:13:0;;20992:171;;21044:17;-1:-1:-1;;;;;21028:43:0;;21072:9;21028:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21028:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21028:54:0;;;;21117:17;-1:-1:-1;;;;;21101:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21101:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21101:46:0;;;;20992:171;20665:516;;;;;:::o;28868:1179::-;28991:5;;28948:4;;;;-1:-1:-1;;;;;28980:16:0;;;28991:5;;28980:16;:59;;-1:-1:-1;;;;;29021:18:0;;;;;;;:9;:18;;;;;;;28980:59;;;-1:-1:-1;;;;;28999:19:0;;;;;;;:9;:19;;;;;;;28980:59;28965:74;-1:-1:-1;;;;;;29053:18:0;;;29050:696;;-1:-1:-1;;;;;29104:19:0;;29087:14;29104:19;;;:13;:19;;;;;;;;;;;;;29213:218;29231:7;29229:9;;:1;:9;;;29213:218;;;29263:12;29285:4;-1:-1:-1;;;;;29278:18:0;;29302:1;29297:7;;29278:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29278:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29278:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29278:27:0;;-1:-1:-1;;;;;;29327:15:0;;;;;;;29324:42;;;29353:1;29345:9;;29356:8;;;29324:42;29395:8;-1:-1:-1;;;;;29387:16:0;:4;-1:-1:-1;;;;;29387:16:0;;29384:31;;;29414:1;29405:10;;29384:31;29213:218;;29240:3;;29213:218;;;;29457:7;29448:16;;:5;:16;;;;:37;;;;;29478:7;29468:17;;:6;:17;;;;29448:37;29445:290;;;29525:41;;;-1:-1:-1;;;29525:41:0;;29560:4;29525:41;;;;;;29505:17;;-1:-1:-1;;;;;29525:26:0;;;;;:41;;;;;;;;;;;;;;;:26;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;29525:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29525:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29525:41:0;29585:47;;;-1:-1:-1;;;29585:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29630:1;29585:47;;;;;;;;29525:41;;-1:-1:-1;;;;;;29585:21:0;;;;;:47;;;;;29630:1;;29585:47;;;;;;29630:1;29585:21;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;29585:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29659:41:0;;;-1:-1:-1;;;29659:41:0;;29694:4;29659:41;;;;;;29658:61;;-1:-1:-1;29706:12:0;;-1:-1:-1;;;;;;29659:26:0;;;;;:41;;;;;;;;;;;;;;:26;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;29659:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29659:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29659:41:0;;29658:61;:47;:61;:::i;:::-;29651:68;;;;;;;;;29445:290;29050:696;;;;29780:16;;;29794:1;29780:16;;;29756:21;29780:16;;;;;29756:21;29780:16;;;;;105:10:-1;29780:16:0;88:34:-1;136:17;;-1:-1;29780:16:0;29756:40;;29817:7;29807:4;29812:1;29807:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;29807:17:0;;;-1:-1:-1;;;;;29807:17:0;;;;;29845:8;29835:4;29840:1;29835:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;29835:18:0;;;-1:-1:-1;;;;;29835:18:0;;;;;29864:21;14956:42;-1:-1:-1;;;;;29888:60:0;;29963:6;29971:1;29974:4;29988;29995:15;29888:123;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29888:123:0;-1:-1:-1;;;;;29888:123: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;29888:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29888:123:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29888:123:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;29888:123: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;29888:123: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;29888:123:0;;421:4:-1;412:14;;;;29888:123:0;;;;;412:14:-1;29888:123: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;29888:123:0;;;;;;;;;;;29864:147;;30029:7;30037:1;30029:10;;;;;;;;;;;;;;30022:17;;;;;28868:1179;;;;;:::o;9021:184::-;9134:62;;;-1:-1:-1;;;;;9134:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;9134:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;9108:89:0;;9127:5;;9108:18;:89::i;21737:1904::-;21883:5;;;;21963:11;21908:39;;;-1:-1:-1;;;21908:39:0;;21941:4;21908:39;;;;;;;;21825:11;;;;-1:-1:-1;;;;;21883:5:0;;21908:67;;21963:11;;21908:50;;21952:5;;21883;;21908:24;;:39;;;;;;;;;;;;;;;21883:5;21908:39;;;5:2:-1;;;;30:1;27;20:12;21908:67:0;21899:76;-1:-1:-1;21990:6:0;21986:731;22006:5;:12;22002:16;;21986:731;;;22040:14;22057:5;22063:1;22057:8;;;;;;;;;;;;;;;;;;;;22117:58;;;-1:-1:-1;;;22117:58:0;;-1:-1:-1;;;;;22117:58:0;;;;;;;22057:8;;;22117:58;;;;;;;;22057:8;;-1:-1:-1;14870:42:0;;22117;;:58;;;;;;;;;;;14870:42;22117:58;;;5:2:-1;;;;30:1;27;20:12;5:2;22117:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22117:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22117:58:0;22253:11;;22208:29;;;-1:-1:-1;;;22208:29:0;;22231:4;22208:29;;;;;;22117:58;;-1:-1:-1;22191:14:0;;22208:57;;22253:11;22208:40;;22242:5;;-1:-1:-1;;;;;22208:14:0;;;;;:29;;;;;22117:58;;22208:29;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;22208:57:0;22191:74;;22293:44;22307:29;22324:4;22330:5;22307:16;:29::i;:::-;22293:9;;:44;:13;:44;:::i;:::-;22280:57;-1:-1:-1;22355:14:0;22352:27;;22371:8;;;;;22352:27;22427:199;;;-1:-1:-1;;;22427:199:0;;-1:-1:-1;;;;;22427:199:0;;;;;;;;;;;;;;;;;;;22397:12;22427:199;;;;;;;;;;;;22589:4;22427:199;;;;22596:15;22427:199;;;;;;22397:12;;;;14956:42;;22427:51;;:199;;;;;;;;;;;;;22397:12;14956:42;22427:199;;;5:2:-1;;;;30:1;27;20:12;5:2;22427:199:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22427:199:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22427:199:0;;;;;;;;;-1:-1:-1;22427:199:0;-1:-1:-1;22650:55:0;22674:30;22680:6;22688;22427:199;22674:5;:30::i;:::-;22650:19;:6;22661:7;22650:19;:10;:19;:::i;:::-;:23;:55;:23;:55;:::i;:::-;22641:64;;21986:731;;;;;;22020:3;;21986:731;;;-1:-1:-1;22777:36:0;;;-1:-1:-1;;;22777:36:0;;22807:4;22777:36;;;;;;22760:14;;15028:42;;22777:21;;:36;;;;;;;;;;;;;;;15028:42;22777:36;;;5:2:-1;;;;30:1;27;20:12;5:2;22777:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22777:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22777:36:0;22884:11;;22843:10;;22777:36;;-1:-1:-1;22824:16:0;;22843:53;;22884:11;22843:36;;22873:5;;22843:25;;22777:36;22843:25;:14;:25;:::i;:53::-;22824:72;-1:-1:-1;22910:15:0;;22907:372;;-1:-1:-1;;;;;22981:15:0;;22941:9;22981:15;;;:9;:15;;;;;;;;;22953:6;:12;;;;;;:44;;22981:15;22953:23;;22970:5;22953:23;:16;:23;:::i;:44::-;-1:-1:-1;;;;;23027:12:0;;;;;;:6;:12;;;;;;22941:56;;-1:-1:-1;23027:22:0;;22941:56;23027:22;:16;:22;:::i;:::-;-1:-1:-1;;;;;23012:12:0;;;;;;:6;:12;;;;;:37;23077:10;;:20;;23092:4;23077:20;:14;:20;:::i;:::-;23064:10;:33;23112:11;23126:21;:11;23142:4;23126:21;:15;:21;:::i;:::-;23112:35;;23174:9;23165:6;:18;23162:41;;;-1:-1:-1;23194:9:0;23162:41;23221:10;;23218:49;;23233:34;;;-1:-1:-1;;;23233:34:0;;-1:-1:-1;;;;;23233:34:0;;;;;;;;;;;;;;15028:42;;23233:20;;:34;;;;;;;;;;;;;;-1:-1:-1;15028:42:0;23233:34;;;5:2:-1;;;;30:1;27;20:12;5:2;23233:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23233:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;23218:49:0;22907:372;;;-1:-1:-1;;;;;23338:15:0;;;;;;:9;:15;;;;;;;;;23304:12;:18;;;;;;;:50;;23338:15;23304:29;;23327:5;23304:29;:22;:29;:::i;:50::-;23291:63;;23377:10;23368:6;:19;23365:269;;;23403:9;23415:46;15103:3;23415:33;15133:2;23416:22;:6;23427:10;23416:22;:10;:22;:::i;23415:46::-;23403:58;-1:-1:-1;23485:16:0;:6;23403:58;23485:16;:10;:16;:::i;:::-;23544:10;;23476:25;;-1:-1:-1;23516:45:0;;-1:-1:-1;;;;;23516:27:0;;;;23544:10;23556:4;23516:45;:27;:45;:::i;:::-;23365:269;;;;23616:6;23603:19;;23365:269;21737:1904;;;;;;;;:::o;11323:286::-;-1:-1:-1;;;;;11392:18:0;;11384:64;;;;-1:-1:-1;;;11384:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11479:15:0;;;;;;:9;:15;;;;;;:26;;11499:5;11479:26;:19;:26;:::i;:::-;-1:-1:-1;;;;;11461:15:0;;;;;;:9;:15;;;;;:44;11530:11;;:22;;11546:5;11530:22;:15;:22;:::i;:::-;11516:11;:36;11568:33;;;;;;;;11591:1;;-1:-1:-1;;;;;11568:33:0;;;;;;;;;;;;11323:286;;:::o;8625:176::-;8734:58;;;-1:-1:-1;;;;;8734:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8734:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;8708:85:0;;8727:5;;8708:18;:85::i;8809:204::-;8936:68;;;-1:-1:-1;;;;;8936:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8936:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;8910:95:0;;8929:5;;8910:18;:95::i;:::-;8809:204;;;;:::o;11041:274::-;-1:-1:-1;;;;;11108:16:0;;11100:60;;;;;-1:-1:-1;;;11100:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11187:11;;:22;;11203:5;11187:22;:15;:22;:::i;:::-;11173:11;:36;-1:-1:-1;;;;;11236:13:0;;;;;;:9;:13;;;;;;:24;;11254:5;11236:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;11220:13:0;;;;;;:9;:13;;;;;;;;:40;;;;11276:31;;;;;;;11220:13;;;;11276:31;;;;;;;;;;11041:274;;:::o;5135:192::-;5221:7;5257:12;5249:6;;;;5241:29;;;;-1:-1:-1;;;5241:29: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;5241:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5293:5:0;;;5135:192::o;9596:894::-;10117:12;10131:23;10166:5;-1:-1:-1;;;;;10158:19:0;10178:4;10158:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10158:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;10116:67:0;;;;10202:7;10194:52;;;;;-1:-1:-1;;;10194:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10263:17;;:21;10259:224;;10405:10;10394:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10394:30:0;10386:85;;;;-1:-1:-1;;;10386:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://1a08d8e3abfaa2696a22890f7a9fc8c1722c9d5f369ab8b5e44a3c6edf37c9e3

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.