ETH Price: $2,420.14 (-2.06%)
 

Overview

Max Total Supply

375,312.622471799639503559 yDAI

Holders

3,401 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000010418661026025 yDAI

Value
$0.00
0x61a94bd03562bef44093bd38b26f148b61aa7f01
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Simple auto interest rate switching tokens for Compound, Fulcrum, Aave, and dYdX.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
yDAI

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-02-12
*/

pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Context {
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 _totalSupply;
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }
    function name() public view returns (string memory) {
        return _name;
    }
    function symbol() public view returns (string memory) {
        return _symbol;
    }
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

contract ReentrancyGuard {
    uint256 private _guardCounter;

    constructor () internal {
        _guardCounter = 1;
    }

    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

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

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

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    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 {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // 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");
        }
    }
}

interface Compound {
    function mint ( uint256 mintAmount ) external returns ( uint256 );
    function redeem(uint256 redeemTokens) external returns (uint256);
    function exchangeRateStored() external view returns (uint);
}

interface Fulcrum {
    function mint(address receiver, uint256 amount) external payable returns (uint256 mintAmount);
    function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid);
    function assetBalanceOf(address _owner) external view returns (uint256 balance);
}

interface ILendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
}

interface Aave {
    function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external;
}

interface AToken {
    function redeem(uint256 amount) external;
}

interface IIEarnManager {
    function recommend(address _token) external view returns (
      string memory choice,
      uint256 capr,
      uint256 iapr,
      uint256 aapr,
      uint256 dapr
    );
}

contract Structs {
    struct Val {
        uint256 value;
    }

    enum ActionType {
        Deposit,   // supply tokens
        Withdraw  // borrow tokens
    }

    enum AssetDenomination {
        Wei // the amount is denominated in wei
    }

    enum AssetReference {
        Delta // the amount is given as a delta from the current value
    }

    struct AssetAmount {
        bool sign; // true if positive
        AssetDenomination denomination;
        AssetReference ref;
        uint256 value;
    }

    struct ActionArgs {
        ActionType actionType;
        uint256 accountId;
        AssetAmount amount;
        uint256 primaryMarketId;
        uint256 secondaryMarketId;
        address otherAddress;
        uint256 otherAccountId;
        bytes data;
    }

    struct Info {
        address owner;  // The address that owns the account
        uint256 number; // A nonce that allows a single address to control many accounts
    }

    struct Wei {
        bool sign; // true if positive
        uint256 value;
    }
}

contract DyDx is Structs {
    function getAccountWei(Info memory account, uint256 marketId) public view returns (Wei memory);
    function operate(Info[] memory, ActionArgs[] memory) public;
}

interface LendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
    function getLendingPoolCore() external view returns (address);
}

contract yDAI is ERC20, ERC20Detailed, ReentrancyGuard, Structs {
  using SafeERC20 for IERC20;
  using Address for address;
  using SafeMath for uint256;

  uint256 public pool;
  address public token;
  address public compound;
  address public fulcrum;
  address public aave;
  address public aaveToken;
  address public dydx;
  uint256 public dToken;
  address public apr;

  enum Lender {
      NONE,
      DYDX,
      COMPOUND,
      AAVE,
      FULCRUM
  }

  Lender public provider = Lender.NONE;

  constructor () public ERC20Detailed("iearn DAI", "yDAI", 18) {
    token = address(0x6B175474E89094C44Da98b954EedeAC495271d0F);
    apr = address(0xdD6d648C991f7d47454354f4Ef326b04025a48A8);
    dydx = address(0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e);
    aave = address(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
    fulcrum = address(0x493C57C4763932315A328269E1ADaD09653B9081);
    aaveToken = address(0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d);
    compound = address(0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643);
    dToken = 3;
    approveToken();
  }

  // Quick swap low gas method for pool swaps
  function deposit(uint256 _amount)
      external
      nonReentrant
  {
      require(_amount > 0, "deposit must be greater than 0");
      pool = _calcPoolValueInToken();

      IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);

      // Calculate pool shares
      uint256 shares = 0;
      if (pool == 0) {
        shares = _amount;
        pool = _amount;
      } else {
        shares = (_amount.mul(_totalSupply)).div(pool);
      }
      pool = _calcPoolValueInToken();
      _mint(msg.sender, shares);
  }

  // No rebalance implementation for lower fees and faster swaps
  function withdraw(uint256 _shares)
      external
      nonReentrant
  {
      require(_shares > 0, "withdraw must be greater than 0");

      uint256 ibalance = balanceOf(msg.sender);
      require(_shares <= ibalance, "insufficient balance");

      // Could have over value from cTokens
      pool = _calcPoolValueInToken();
      // Calc to redeem before updating balances
      uint256 r = (pool.mul(_shares)).div(_totalSupply);


      _balances[msg.sender] = _balances[msg.sender].sub(_shares, "redeem amount exceeds balance");
      _totalSupply = _totalSupply.sub(_shares);

      emit Transfer(msg.sender, address(0), _shares);

      // Check balance
      uint256 b = IERC20(token).balanceOf(address(this));
      if (b < r) {
        _withdrawSome(r.sub(b));
      }

      IERC20(token).transfer(msg.sender, r);
      pool = _calcPoolValueInToken();
  }

  function() external payable {

  }

  function recommend() public view returns (Lender) {
    (,uint256 capr,uint256 iapr,uint256 aapr,uint256 dapr) = IIEarnManager(apr).recommend(token);
    uint256 max = 0;
    if (capr > max) {
      max = capr;
    }
    if (iapr > max) {
      max = iapr;
    }
    if (aapr > max) {
      max = aapr;
    }
    if (dapr > max) {
      max = dapr;
    }

    Lender newProvider = Lender.NONE;
    if (max == capr) {
      newProvider = Lender.COMPOUND;
    } else if (max == iapr) {
      newProvider = Lender.FULCRUM;
    } else if (max == aapr) {
      newProvider = Lender.AAVE;
    } else if (max == dapr) {
      newProvider = Lender.DYDX;
    }
    return newProvider;
  }

  function supplyDydx(uint256 amount) public returns(uint) {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(true, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Deposit;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function _withdrawDydx(uint256 amount) internal {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(false, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Withdraw;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function getAave() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPool();
  }
  function getAaveCore() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPoolCore();
  }

  function approveToken() public {
      IERC20(token).safeApprove(compound, uint(-1)); //also add to constructor
      IERC20(token).safeApprove(dydx, uint(-1));
      IERC20(token).safeApprove(getAaveCore(), uint(-1));
      IERC20(token).safeApprove(fulcrum, uint(-1));
  }

  function balance() public view returns (uint256) {
    return IERC20(token).balanceOf(address(this));
  }

  function balanceDydx() public view returns (uint256) {
      Wei memory bal = DyDx(dydx).getAccountWei(Info(address(this), 0), dToken);
      return bal.value;
  }
  function balanceCompound() public view returns (uint256) {
      return IERC20(compound).balanceOf(address(this));
  }
  function balanceCompoundInToken() public view returns (uint256) {
    // Mantisa 1e18 to decimals
    uint256 b = balanceCompound();
    if (b > 0) {
      b = b.mul(Compound(compound).exchangeRateStored()).div(1e18);
    }
    return b;
  }
  function balanceFulcrumInToken() public view returns (uint256) {
    uint256 b = balanceFulcrum();
    if (b > 0) {
      b = Fulcrum(fulcrum).assetBalanceOf(address(this));
    }
    return b;
  }
  function balanceFulcrum() public view returns (uint256) {
    return IERC20(fulcrum).balanceOf(address(this));
  }
  function balanceAave() public view returns (uint256) {
    return IERC20(aaveToken).balanceOf(address(this));
  }

  function _balance() internal view returns (uint256) {
    return IERC20(token).balanceOf(address(this));
  }

  function _balanceDydx() internal view returns (uint256) {
      Wei memory bal = DyDx(dydx).getAccountWei(Info(address(this), 0), dToken);
      return bal.value;
  }
  function _balanceCompound() internal view returns (uint256) {
      return IERC20(compound).balanceOf(address(this));
  }
  function _balanceCompoundInToken() internal view returns (uint256) {
    // Mantisa 1e18 to decimals
    uint256 b = balanceCompound();
    if (b > 0) {
      b = b.mul(Compound(compound).exchangeRateStored()).div(1e18);
    }
    return b;
  }
  function _balanceFulcrumInToken() internal view returns (uint256) {
    uint256 b = balanceFulcrum();
    if (b > 0) {
      b = Fulcrum(fulcrum).assetBalanceOf(address(this));
    }
    return b;
  }
  function _balanceFulcrum() internal view returns (uint256) {
    return IERC20(fulcrum).balanceOf(address(this));
  }
  function _balanceAave() internal view returns (uint256) {
    return IERC20(aaveToken).balanceOf(address(this));
  }

  function _withdrawAll() internal {
    uint256 amount = _balanceCompound();
    if (amount > 0) {
      _withdrawCompound(amount);
    }
    amount = _balanceDydx();
    if (amount > 0) {
      _withdrawDydx(amount);
    }
    amount = _balanceFulcrum();
    if (amount > 0) {
      _withdrawFulcrum(amount);
    }
    amount = _balanceAave();
    if (amount > 0) {
      _withdrawAave(amount);
    }
  }

  function _withdrawSomeCompound(uint256 _amount) internal {
    uint256 b = balanceCompound();
    uint256 bT = balanceCompoundInToken();
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawCompound(amount);
  }

  // 1999999614570950845
  function _withdrawSomeFulcrum(uint256 _amount) internal {
    // Balance of fulcrum tokens, 1 iDAI = 1.00x DAI
    uint256 b = balanceFulcrum(); // 1970469086655766652
    // Balance of token in fulcrum
    uint256 bT = balanceFulcrumInToken(); // 2000000803224344406
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawFulcrum(amount);
  }

  function _withdrawSome(uint256 _amount) internal {
    if (provider == Lender.COMPOUND) {
      _withdrawSomeCompound(_amount);
    }
    if (provider == Lender.AAVE) {
      require(balanceAave() >= _amount, "insufficient funds");
      _withdrawAave(_amount);
    }
    if (provider == Lender.DYDX) {
      require(balanceDydx() >= _amount, "insufficient funds");
      _withdrawDydx(_amount);
    }
    if (provider == Lender.FULCRUM) {
      _withdrawSomeFulcrum(_amount);
    }
  }

  function rebalance() public {
    Lender newProvider = recommend();

    if (newProvider != provider) {
      _withdrawAll();
    }

    if (balance() > 0) {
      if (newProvider == Lender.DYDX) {
        supplyDydx(balance());
      } else if (newProvider == Lender.FULCRUM) {
        supplyFulcrum(balance());
      } else if (newProvider == Lender.COMPOUND) {
        supplyCompound(balance());
      } else if (newProvider == Lender.AAVE) {
        supplyAave(balance());
      }
    }

    provider = newProvider;
  }

  // Internal only rebalance for better gas in redeem
  function _rebalance(Lender newProvider) internal {
    if (_balance() > 0) {
      if (newProvider == Lender.DYDX) {
        supplyDydx(_balance());
      } else if (newProvider == Lender.FULCRUM) {
        supplyFulcrum(_balance());
      } else if (newProvider == Lender.COMPOUND) {
        supplyCompound(_balance());
      } else if (newProvider == Lender.AAVE) {
        supplyAave(_balance());
      }
    }
    provider = newProvider;
  }

  function supplyAave(uint amount) public {
      Aave(getAave()).deposit(token, amount, 0);
  }
  function supplyFulcrum(uint amount) public {
      require(Fulcrum(fulcrum).mint(address(this), amount) > 0, "FULCRUM: supply failed");
  }
  function supplyCompound(uint amount) public {
      require(Compound(compound).mint(amount) == 0, "COMPOUND: supply failed");
  }
  function _withdrawAave(uint amount) internal {
      AToken(aaveToken).redeem(amount);
  }
  function _withdrawFulcrum(uint amount) internal {
      require(Fulcrum(fulcrum).burn(address(this), amount) > 0, "FULCRUM: withdraw failed");
  }
  function _withdrawCompound(uint amount) internal {
      require(Compound(compound).redeem(amount) == 0, "COMPOUND: withdraw failed");
  }

  function invest(uint256 _amount)
      external
      nonReentrant
  {
      require(_amount > 0, "deposit must be greater than 0");
      pool = calcPoolValueInToken();

      IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);

      rebalance();

      // Calculate pool shares
      uint256 shares = 0;
      if (pool == 0) {
        shares = _amount;
        pool = _amount;
      } else {
        shares = (_amount.mul(_totalSupply)).div(pool);
      }
      pool = calcPoolValueInToken();
      _mint(msg.sender, shares);
  }

  function _calcPoolValueInToken() internal view returns (uint) {
    return _balanceCompoundInToken()
      .add(_balanceFulcrumInToken())
      .add(_balanceDydx())
      .add(_balanceAave())
      .add(_balance());
  }

  function calcPoolValueInToken() public view returns (uint) {
    return balanceCompoundInToken()
      .add(balanceFulcrumInToken())
      .add(balanceDydx())
      .add(balanceAave())
      .add(balance());
  }

  function getPricePerFullShare() public view returns (uint) {
    uint _pool = calcPoolValueInToken();
    return _pool.mul(1e18).div(_totalSupply);
  }

  // Redeem any invested tokens from the pool
  function redeem(uint256 _shares)
      external
      nonReentrant
  {
      require(_shares > 0, "withdraw must be greater than 0");

      uint256 ibalance = balanceOf(msg.sender);
      require(_shares <= ibalance, "insufficient balance");

      // Could have over value from cTokens
      pool = calcPoolValueInToken();
      // Calc to redeem before updating balances
      uint256 r = (pool.mul(_shares)).div(_totalSupply);


      _balances[msg.sender] = _balances[msg.sender].sub(_shares, "redeem amount exceeds balance");
      _totalSupply = _totalSupply.sub(_shares);

      emit Transfer(msg.sender, address(0), _shares);

      // Check ETH balance
      uint256 b = IERC20(token).balanceOf(address(this));
      Lender newProvider = provider;
      if (b < r) {
        newProvider = recommend();
        if (newProvider != provider) {
          _withdrawAll();
        } else {
          _withdrawSome(r.sub(b));
        }
      }

      IERC20(token).safeTransfer(msg.sender, r);

      if (newProvider != provider) {
        _rebalance(newProvider);
      }
      pool = calcPoolValueInToken();
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"aave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aaveToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"apr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceAave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompoundInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceDydx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrumInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"calcPoolValueInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"compound","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dToken","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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dydx","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fulcrum","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAaveCore","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"invest","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":[],"name":"pool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"provider","outputs":[{"internalType":"enum yDAI.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"recommend","outputs":[{"internalType":"enum yDAI.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyAave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyCompound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyDydx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyFulcrum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000600f60146101000a81548160ff021916908360048111156200002457fe5b02179055503480156200003657600080fd5b506040518060400160405280600981526020017f696561726e2044414900000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f794441490000000000000000000000000000000000000000000000000000000081525060128260039080519060200190620000bd929190620009c6565b508160049080519060200190620000d6929190620009c6565b5080600560006101000a81548160ff021916908360ff1602179055505050506001600681905550736b175474e89094c44da98b954eedeac495271d0f600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dd6d648c991f7d47454354f4ef326b04025a48a8600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731e0447b19bb6ecfdae1e4ae1694b0c3659614e4e600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507324a42fd28c976a61df5d00d0599c34c4f90748c8600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073493c57c4763932315a328269e1adad09653b9081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fc1e690f61efd961294b3e1ce3313fbd8aa4f85d600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735d3a536e4d6dbd6114cc1ead35777bab948e3643600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600e81905550620003686200036e60201b60201c565b62000edb565b62000404600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620005b560201b6200369e179092919060201c565b6200049a600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620005b560201b6200369e179092919060201c565b6200051d620004ae6200074060201b60201c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620005b560201b6200369e179092919060201c565b620005b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620005b560201b6200369e179092919060201c565b565b600081148062000655575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401620005ff92919062000d04565b60206040518083038186803b1580156200061857600080fd5b505afa1580156200062d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000653919081019062000b12565b145b62000697576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068e9062000da2565b60405180910390fd5b6200073b838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401620006d292919062000d31565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620007eb60201b60201c565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015620007ab57600080fd5b505afa158015620007c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620007e6919081019062000aba565b905090565b620008178273ffffffffffffffffffffffffffffffffffffffff166200097a60201b620046f81760201c565b62000859576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008509062000dc4565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff168360405162000884919062000ceb565b6000604051808303816000865af19150503d8060008114620008c3576040519150601f19603f3d011682016040523d82523d6000602084013e620008c8565b606091505b50915091508162000910576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009079062000d5e565b60405180910390fd5b60008151111562000974578080602001905162000931919081019062000ae6565b62000973576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200096a9062000d80565b60405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015620009bd5750808214155b92505050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a0957805160ff191683800117855562000a3a565b8280016001018555821562000a3a579182015b8281111562000a3957825182559160200191906001019062000a1c565b5b50905062000a49919062000a4d565b5090565b62000a7291905b8082111562000a6e57600081600090555060010162000a54565b5090565b90565b60008151905062000a868162000e8d565b92915050565b60008151905062000a9d8162000ea7565b92915050565b60008151905062000ab48162000ec1565b92915050565b60006020828403121562000acd57600080fd5b600062000add8482850162000a75565b91505092915050565b60006020828403121562000af957600080fd5b600062000b098482850162000a8c565b91505092915050565b60006020828403121562000b2557600080fd5b600062000b358482850162000aa3565b91505092915050565b62000b498162000e0d565b82525050565b600062000b5c8262000de6565b62000b68818562000df1565b935062000b7a81856020860162000e57565b80840191505092915050565b600062000b9560208362000dfc565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b600062000bd7602a8362000dfc565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600062000c3f60368362000dfc565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b600062000ca7601f8362000dfc565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b62000ce58162000e4d565b82525050565b600062000cf9828462000b4f565b915081905092915050565b600060408201905062000d1b600083018562000b3e565b62000d2a602083018462000b3e565b9392505050565b600060408201905062000d48600083018562000b3e565b62000d57602083018462000cda565b9392505050565b6000602082019050818103600083015262000d798162000b86565b9050919050565b6000602082019050818103600083015262000d9b8162000bc8565b9050919050565b6000602082019050818103600083015262000dbd8162000c30565b9050919050565b6000602082019050818103600083015262000ddf8162000c98565b9050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600062000e1a8262000e2d565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000e7757808201518184015260208101905062000e5a565b8381111562000e87576000848401525b50505050565b62000e988162000e0d565b811462000ea457600080fd5b50565b62000eb28162000e21565b811462000ebe57600080fd5b50565b62000ecc8162000e4d565b811462000ed857600080fd5b50565b615e7c8062000eeb6000396000f3fe60806040526004361061025c5760003560e01c80637d7c2a1c11610144578063b6b55f25116100b6578063e849d6591161007a578063e849d659146108f1578063f5a41dea1461091a578063f69e204614610945578063f7c1ec7714610970578063f82ce27d1461099b578063fc0c546a146109c65761025c565b8063b6b55f251461080c578063cf8ca42614610835578063d9d7858a14610860578063db006a751461088b578063dd62ed3e146108b45761025c565b806399b71d5c1161010857806399b71d5c146106fa578063a160176d14610711578063a457c2d71461073c578063a728797114610779578063a9059cbb146107a4578063b69ef8a8146107e15761025c565b80637d7c2a1c146106395780638124955c14610650578063819faf7b146106795780638e4ec6ef146106a457806395d89b41146106cf5761025c565b80632e1a7d4d116101dd57806358782c21116101a157806358782c211461052757806361c1ec551461055257806365aab7491461057d57806370a08231146105a65780637137ef99146105e357806377c7b8fc1461060e5761025c565b80632e1a7d4d14610440578063313ce56714610469578063395093511461049457806339c0a7e1146104d157806357ded9c9146104fc5761025c565b80630eb2a267116102245780630eb2a2671461035957806316f0115b1461038457806318160ddd146103af57806323b872dd146103da5780632afcf480146104175761025c565b806306636c1c1461025e57806306a3fe591461029b57806306fdde03146102c6578063085d4883146102f1578063095ea7b31461031c575b005b34801561026a57600080fd5b5061028560048036036102809190810190614be6565b6109f1565b6040516102929190615a7b565b60405180910390f35b3480156102a757600080fd5b506102b0610c2f565b6040516102bd9190615624565b60405180910390f35b3480156102d257600080fd5b506102db610c55565b6040516102e891906157b0565b60405180910390f35b3480156102fd57600080fd5b50610306610cf7565b6040516103139190615795565b60405180910390f35b34801561032857600080fd5b50610343600480360361033e9190810190614ac9565b610d0a565b604051610350919061577a565b60405180910390f35b34801561036557600080fd5b5061036e610d28565b60405161037b9190615a7b565b60405180910390f35b34801561039057600080fd5b50610399610dda565b6040516103a69190615a7b565b60405180910390f35b3480156103bb57600080fd5b506103c4610de0565b6040516103d19190615a7b565b60405180910390f35b3480156103e657600080fd5b5061040160048036036103fc9190810190614a7a565b610dea565b60405161040e919061577a565b60405180910390f35b34801561042357600080fd5b5061043e60048036036104399190810190614be6565b610ec3565b005b34801561044c57600080fd5b5061046760048036036104629190810190614be6565b61102f565b005b34801561047557600080fd5b5061047e61143c565b60405161048b9190615a96565b60405180910390f35b3480156104a057600080fd5b506104bb60048036036104b69190810190614ac9565b611453565b6040516104c8919061577a565b60405180910390f35b3480156104dd57600080fd5b506104e6611506565b6040516104f39190615a7b565b60405180910390f35b34801561050857600080fd5b506105116115f6565b60405161051e9190615624565b60405180910390f35b34801561053357600080fd5b5061053c61161c565b6040516105499190615624565b60405180910390f35b34801561055e57600080fd5b50610567611642565b6040516105749190615a7b565b60405180910390f35b34801561058957600080fd5b506105a4600480360361059f9190810190614be6565b6116f4565b005b3480156105b257600080fd5b506105cd60048036036105c891908101906149ec565b611790565b6040516105da9190615a7b565b60405180910390f35b3480156105ef57600080fd5b506105f86117d8565b6040516106059190615a7b565b60405180910390f35b34801561061a57600080fd5b5061062361184b565b6040516106309190615a7b565b60405180910390f35b34801561064557600080fd5b5061064e61188d565b005b34801561065c57600080fd5b5061067760048036036106729190810190614be6565b6119d4565b005b34801561068557600080fd5b5061068e611ac8565b60405161069b9190615624565b60405180910390f35b3480156106b057600080fd5b506106b9611aee565b6040516106c69190615624565b60405180910390f35b3480156106db57600080fd5b506106e4611b14565b6040516106f191906157b0565b60405180910390f35b34801561070657600080fd5b5061070f611bb6565b005b34801561071d57600080fd5b50610726611dd9565b6040516107339190615795565b60405180910390f35b34801561074857600080fd5b50610763600480360361075e9190810190614ac9565b611f45565b604051610770919061577a565b60405180910390f35b34801561078557600080fd5b5061078e612012565b60405161079b9190615a7b565b60405180910390f35b3480156107b057600080fd5b506107cb60048036036107c69190810190614ac9565b6120fe565b6040516107d8919061577a565b60405180910390f35b3480156107ed57600080fd5b506107f661211c565b6040516108039190615a7b565b60405180910390f35b34801561081857600080fd5b50610833600480360361082e9190810190614be6565b6121ce565b005b34801561084157600080fd5b5061084a612332565b6040516108579190615a7b565b60405180910390f35b34801561086c57600080fd5b506108756123e4565b6040516108829190615a7b565b60405180910390f35b34801561089757600080fd5b506108b260048036036108ad9190810190614be6565b6123ea565b005b3480156108c057600080fd5b506108db60048036036108d69190810190614a3e565b612823565b6040516108e89190615a7b565b60405180910390f35b3480156108fd57600080fd5b5061091860048036036109139190810190614be6565b6128aa565b005b34801561092657600080fd5b5061092f61299c565b60405161093c9190615a7b565b60405180910390f35b34801561095157600080fd5b5061095a612a67565b6040516109679190615624565b60405180910390f35b34801561097c57600080fd5b50610985612a8d565b6040516109929190615624565b60405180910390f35b3480156109a757600080fd5b506109b0612b34565b6040516109bd9190615624565b60405180910390f35b3480156109d257600080fd5b506109db612bdb565b6040516109e89190615624565b60405180910390f35b600060606001604051908082528060200260200182016040528015610a3057816020015b610a1d614743565b815260200190600190039081610a155790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110610a6c57fe5b6020026020010181905250610a7f614773565b6040518060800160405280600115158152602001600080811115610a9f57fe5b8152602001600080811115610ab057fe5b8152602001858152509050610ac36147b1565b600081600001906001811115610ad557fe5b90816001811115610ae257fe5b815250506000816020018181525050818160400181905250600e54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015610b7b57816020015b610b6861481d565b815260200190600190039081610b605790505b5090508181600081518110610b8c57fe5b6020026020010181905250600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401610bf4929190615743565b600060405180830381600087803b158015610c0e57600080fd5b505af1158015610c22573d6000803e3d6000fd5b5050505050505050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ced5780601f10610cc257610100808354040283529160200191610ced565b820191906000526020600020905b815481529060010190602001808311610cd057829003601f168201915b5050505050905090565b600f60149054906101000a900460ff1681565b6000610d1e610d17612c01565b8484612c09565b6001905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d85919061563f565b60206040518083038186803b158015610d9d57600080fd5b505afa158015610db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dd59190810190614c0f565b905090565b60075481565b6000600254905090565b6000610df7848484612dd4565b610eb884610e03612c01565b610eb385604051806060016040528060288152602001615ded60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e69612c01565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b612c09565b600190509392505050565b60016006600082825401925050819055506000600654905060008211610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590615972565b60405180910390fd5b610f266117d8565b600781905550610f7b333084600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130b9909392919063ffffffff16565b610f8361188d565b600080905060006007541415610fa25782905082600781905550610fce565b610fcb600754610fbd6002548661315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b610fd66117d8565b600781905550610fe63382613215565b50600654811461102b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611022906159d2565b60405180910390fd5b5050565b6001600660008282540192505081905550600060065490506000821161108a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611081906158f2565b60405180910390fd5b600061109533611790565b9050808311156110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d1906158d2565b60405180910390fd5b6110e261339d565b60078190555060006111136002546111058660075461315b90919063ffffffff16565b6131cb90919063ffffffff16565b905061119d846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111f48460025461341090919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516112589190615a7b565b60405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112bd919061563f565b60206040518083038186803b1580156112d557600080fd5b505afa1580156112e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061130d9190810190614c0f565b9050818110156113335761133261132d828461341090919063ffffffff16565b61345a565b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b815260040161139092919061565a565b602060405180830381600087803b1580156113aa57600080fd5b505af11580156113be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113e29190810190614b05565b506113eb61339d565b6007819055505050506006548114611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f906159d2565b60405180910390fd5b5050565b6000600560009054906101000a900460ff16905090565b60006114fc611460612c01565b846114f78560016000611471612c01565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d090919063ffffffff16565b612c09565b6001905092915050565b6000611510614889565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600e546040518363ffffffff1660e01b815260040161159a929190615a52565b604080518083038186803b1580156115b157600080fd5b505afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115e99190810190614bbd565b9050806020015191505090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161169f919061563f565b60206040518083038186803b1580156116b757600080fd5b505afa1580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116ef9190810190614c0f565b905090565b6116fc612a8d565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b815260040161175b9392919061570c565b600060405180830381600087803b15801561177557600080fd5b505af1158015611789573d6000803e3d6000fd5b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006118466117e561211c565b6118386117f0612332565b61182a6117fb611506565b61181c61180661299c565b61180e612012565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b905090565b6000806118566117d8565b9050611887600254611879670de0b6b3a76400008461315b90919063ffffffff16565b6131cb90919063ffffffff16565b91505090565b6000611897611dd9565b9050600f60149054906101000a900460ff1660048111156118b457fe5b8160048111156118c057fe5b146118ce576118cd613625565b5b60006118d861211c565b11156119ae57600160048111156118eb57fe5b8160048111156118f757fe5b14156119135761190d61190861211c565b6109f1565b506119ad565b60048081111561191f57fe5b81600481111561192b57fe5b14156119465761194161193c61211c565b6119d4565b6119ac565b6002600481111561195357fe5b81600481111561195f57fe5b141561197a5761197561197061211c565b6128aa565b6119ab565b6003600481111561198757fe5b81600481111561199357fe5b14156119aa576119a96119a461211c565b6116f4565b5b5b5b5b5b80600f60146101000a81548160ff021916908360048111156119cc57fe5b021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401611a3392919061565a565b602060405180830381600087803b158015611a4d57600080fd5b505af1158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a859190810190614c0f565b11611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc90615992565b60405180910390fd5b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bac5780601f10611b8157610100808354040283529160200191611bac565b820191906000526020600020905b815481529060010190602001808311611b8f57829003601f168201915b5050505050905090565b611c45600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b611cd4600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b611d48611cdf612b34565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b611dd7600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b565b6000806000806000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611e5e9190615624565b60006040518083038186803b158015611e7657600080fd5b505afa158015611e8a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250611eb39190810190614b2e565b945094509450945050600080905080851115611ecd578490505b80841115611ed9578390505b80831115611ee5578290505b80821115611ef1578190505b600080905085821415611f075760029050611f39565b84821415611f185760049050611f38565b83821415611f295760039050611f37565b82821415611f3657600190505b5b5b5b80965050505050505090565b6000612008611f52612c01565b8461200385604051806060016040528060258152602001615e156025913960016000611f7c612c01565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b612c09565b6001905092915050565b60008061201d611642565b905060008111156120f7576120f4670de0b6b3a76400006120e6600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561209f57600080fd5b505afa1580156120b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120d79190810190614c0f565b8461315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b8091505090565b600061211261210b612c01565b8484612dd4565b6001905092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612179919061563f565b60206040518083038186803b15801561219157600080fd5b505afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121c99190810190614c0f565b905090565b60016006600082825401925050819055506000600654905060008211612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090615972565b60405180910390fd5b61223161339d565b600781905550612286333084600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130b9909392919063ffffffff16565b6000809050600060075414156122a557829050826007819055506122d1565b6122ce6007546122c06002548661315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b6122d961339d565b6007819055506122e93382613215565b50600654811461232e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612325906159d2565b60405180910390fd5b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161238f919061563f565b60206040518083038186803b1580156123a757600080fd5b505afa1580156123bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123df9190810190614c0f565b905090565b600e5481565b60016006600082825401925050819055506000600654905060008211612445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243c906158f2565b60405180910390fd5b600061245033611790565b905080831115612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906158d2565b60405180910390fd5b61249d6117d8565b60078190555060006124ce6002546124c08660075461315b90919063ffffffff16565b6131cb90919063ffffffff16565b9050612558846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125af8460025461341090919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516126139190615a7b565b60405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612678919061563f565b60206040518083038186803b15801561269057600080fd5b505afa1580156126a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126c89190810190614c0f565b90506000600f60149054906101000a900460ff16905082821015612746576126ee611dd9565b9050600f60149054906101000a900460ff16600481111561270b57fe5b81600481111561271757fe5b1461272957612724613625565b612745565b61274461273f838561341090919063ffffffff16565b61345a565b5b5b6127933384600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138159092919063ffffffff16565b600f60149054906101000a900460ff1660048111156127ae57fe5b8160048111156127ba57fe5b146127c9576127c8816138b4565b5b6127d16117d8565b60078190555050505050600654811461281f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612816906159d2565b60405180910390fd5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016129079190615a7b565b602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129599190810190614c0f565b14612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090615832565b60405180910390fd5b50565b6000806129a7610d28565b90506000811115612a6057600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401612a0d919061563f565b60206040518083038186803b158015612a2557600080fd5b505afa158015612a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a5d9190810190614c0f565b90505b8091505090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b2f9190810190614a15565b905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9e57600080fd5b505afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612bd69190810190614a15565b905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7090615952565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce090615812565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612dc79190615a7b565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3b90615912565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eab906157d2565b60405180910390fd5b612f1f81604051806060016040528060268152602001615dc7602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612fb2816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130519190615a7b565b60405180910390a3505050565b60008383111582906130a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309d91906157b0565b60405180910390fd5b5060008385039050809150509392505050565b613155848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b8585856040516024016130f3939291906156ac565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139ba565b50505050565b60008083141561316e57600090506131c5565b600082840290508284828161317f57fe5b04146131c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b790615892565b60405180910390fd5b809150505b92915050565b600061320d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b2c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327c90615a32565b60405180910390fd5b61329a816002546135d090919063ffffffff16565b6002819055506132f1816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133919190615a7b565b60405180910390a35050565b600061340b6133aa613b8d565b6133fd6133b5613c3f565b6133ef6133c0613cf1565b6133e16133cb613de1565b6133d3613eac565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b905090565b600061345283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061305e565b905092915050565b6002600481111561346757fe5b600f60149054906101000a900460ff16600481111561348257fe5b14156134925761349181613f98565b5b6003600481111561349f57fe5b600f60149054906101000a900460ff1660048111156134ba57fe5b141561351457806134c9612332565b101561350a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350190615932565b60405180910390fd5b6135138161403e565b5b6001600481111561352157fe5b600f60149054906101000a900460ff16600481111561353c57fe5b1415613596578061354b611506565b101561358c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358390615932565b60405180910390fd5b613595816140ce565b5b6004808111156135a257fe5b600f60149054906101000a900460ff1660048111156135bd57fe5b14156135cd576135cc81614308565b5b50565b60008082840190508381101561361b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361290615852565b60405180910390fd5b8091505092915050565b600061362f6143ae565b905060008111156136445761364381614460565b5b61364c613cf1565b9050600081111561366157613660816140ce565b5b613669614552565b9050600081111561367e5761367d81614604565b5b613686613c3f565b9050600081111561369b5761369a8161403e565b5b50565b6000811480613737575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016136e5929190615683565b60206040518083038186803b1580156136fd57600080fd5b505afa158015613711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137359190810190614c0f565b145b613776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376d906159f2565b60405180910390fd5b613810838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b84846040516024016137ae9291906156e3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139ba565b505050565b6138af838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b848460405160240161384d9291906156e3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139ba565b505050565b60006138be613b8d565b111561399457600160048111156138d157fe5b8160048111156138dd57fe5b14156138f9576138f36138ee613b8d565b6109f1565b50613993565b60048081111561390557fe5b81600481111561391157fe5b141561392c57613927613922613b8d565b6119d4565b613992565b6002600481111561393957fe5b81600481111561394557fe5b14156139605761395b613956613b8d565b6128aa565b613991565b6003600481111561396d57fe5b81600481111561397957fe5b14156139905761398f61398a613b8d565b6116f4565b5b5b5b5b5b80600f60146101000a81548160ff021916908360048111156139b257fe5b021790555050565b6139d98273ffffffffffffffffffffffffffffffffffffffff166146f8565b613a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0f90615a12565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051613a41919061560d565b6000604051808303816000865af19150503d8060008114613a7e576040519150601f19603f3d011682016040523d82523d6000602084013e613a83565b606091505b509150915081613ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613abf90615872565b60405180910390fd5b600081511115613b265780806020019051613ae69190810190614b05565b613b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1c906159b2565b60405180910390fd5b5b50505050565b60008083118290613b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6a91906157b0565b60405180910390fd5b506000838581613b7f57fe5b049050809150509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613bea919061563f565b60206040518083038186803b158015613c0257600080fd5b505afa158015613c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c3a9190810190614c0f565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613c9c919061563f565b60206040518083038186803b158015613cb457600080fd5b505afa158015613cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613cec9190810190614c0f565b905090565b6000613cfb614889565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600e546040518363ffffffff1660e01b8152600401613d85929190615a52565b604080518083038186803b158015613d9c57600080fd5b505afa158015613db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613dd49190810190614bbd565b9050806020015191505090565b600080613dec610d28565b90506000811115613ea557600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401613e52919061563f565b60206040518083038186803b158015613e6a57600080fd5b505afa158015613e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613ea29190810190614c0f565b90505b8091505090565b600080613eb7611642565b90506000811115613f9157613f8e670de0b6b3a7640000613f80600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015613f3957600080fd5b505afa158015613f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f719190810190614c0f565b8461315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b8091505090565b6000613fa2611642565b90506000613fae612012565b905082811015613ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fea90615932565b60405180910390fd5b600061402d600161401f84614011888861315b90919063ffffffff16565b6131cb90919063ffffffff16565b6135d090919063ffffffff16565b905061403881614460565b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b81526004016140999190615a7b565b600060405180830381600087803b1580156140b357600080fd5b505af11580156140c7573d6000803e3d6000fd5b5050505050565b6060600160405190808252806020026020018201604052801561410b57816020015b6140f8614743565b8152602001906001900390816140f05790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200160008152508160008151811061414757fe5b602002602001018190525061415a614773565b604051806080016040528060001515815260200160008081111561417a57fe5b815260200160008081111561418b57fe5b815260200184815250905061419e6147b1565b6001816000019060018111156141b057fe5b908160018111156141bd57fe5b815250506000816020018181525050818160400181905250600e54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060600160405190808252806020026020018201604052801561425657816020015b61424361481d565b81526020019060019003908161423b5790505b509050818160008151811061426757fe5b6020026020010181905250600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b81526004016142cf929190615743565b600060405180830381600087803b1580156142e957600080fd5b505af11580156142fd573d6000803e3d6000fd5b505050505050505050565b6000614312610d28565b9050600061431e61299c565b905082811015614363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435a90615932565b60405180910390fd5b600061439d600161438f84614381888861315b90919063ffffffff16565b6131cb90919063ffffffff16565b6135d090919063ffffffff16565b90506143a881614604565b50505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161440b919061563f565b60206040518083038186803b15801561442357600080fd5b505afa158015614437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061445b9190810190614c0f565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b81526004016144bd9190615a7b565b602060405180830381600087803b1580156144d757600080fd5b505af11580156144eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061450f9190810190614c0f565b1461454f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614546906157f2565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016145af919061563f565b60206040518083038186803b1580156145c757600080fd5b505afa1580156145db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506145ff9190810190614c0f565b905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b815260040161466392919061565a565b602060405180830381600087803b15801561467d57600080fd5b505af1158015614691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506146b59190810190614c0f565b116146f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146ec906158b2565b60405180910390fd5b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561473a5750808214155b92505050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b604051806080016040528060001515815260200160008081111561479357fe5b81526020016000808111156147a457fe5b8152602001600081525090565b604051806101000160405280600060018111156147ca57fe5b8152602001600081526020016147de6148a5565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518061010001604052806000600181111561483657fe5b81526020016000815260200161484a6148a5565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518060400160405280600015158152602001600081525090565b60405180608001604052806000151581526020016000808111156148c557fe5b81526020016000808111156148d657fe5b8152602001600081525090565b6000813590506148f281615d81565b92915050565b60008151905061490781615d81565b92915050565b60008151905061491c81615d98565b92915050565b600082601f83011261493357600080fd5b815161494661494182615ade565b615ab1565b9150808252602083016020830185838301111561496257600080fd5b61496d838284615d09565b50505092915050565b60006040828403121561498857600080fd5b6149926040615ab1565b905060006149a28482850161490d565b60008301525060206149b6848285016149d7565b60208301525092915050565b6000813590506149d181615daf565b92915050565b6000815190506149e681615daf565b92915050565b6000602082840312156149fe57600080fd5b6000614a0c848285016148e3565b91505092915050565b600060208284031215614a2757600080fd5b6000614a35848285016148f8565b91505092915050565b60008060408385031215614a5157600080fd5b6000614a5f858286016148e3565b9250506020614a70858286016148e3565b9150509250929050565b600080600060608486031215614a8f57600080fd5b6000614a9d868287016148e3565b9350506020614aae868287016148e3565b9250506040614abf868287016149c2565b9150509250925092565b60008060408385031215614adc57600080fd5b6000614aea858286016148e3565b9250506020614afb858286016149c2565b9150509250929050565b600060208284031215614b1757600080fd5b6000614b258482850161490d565b91505092915050565b600080600080600060a08688031215614b4657600080fd5b600086015167ffffffffffffffff811115614b6057600080fd5b614b6c88828901614922565b9550506020614b7d888289016149d7565b9450506040614b8e888289016149d7565b9350506060614b9f888289016149d7565b9250506080614bb0888289016149d7565b9150509295509295909350565b600060408284031215614bcf57600080fd5b6000614bdd84828501614976565b91505092915050565b600060208284031215614bf857600080fd5b6000614c06848285016149c2565b91505092915050565b600060208284031215614c2157600080fd5b6000614c2f848285016149d7565b91505092915050565b6000614c44838361547a565b905092915050565b6000614c588383615582565b60408301905092915050565b614c6d81615c79565b82525050565b614c7c81615bca565b82525050565b614c8b81615bca565b82525050565b6000614c9c82615b2a565b614ca68185615b7b565b935083602082028501614cb885615b0a565b8060005b85811015614cf45784840389528151614cd58582614c38565b9450614ce083615b61565b925060208a01995050600181019050614cbc565b50829750879550505050505092915050565b6000614d1182615b35565b614d1b8185615b8c565b9350614d2683615b1a565b8060005b83811015614d57578151614d3e8882614c4c565b9750614d4983615b6e565b925050600181019050614d2a565b5085935050505092915050565b614d6d81615bdc565b82525050565b614d7c81615bdc565b82525050565b6000614d8d82615b4b565b614d978185615bae565b9350614da7818560208601615d09565b80840191505092915050565b6000614dbe82615b40565b614dc88185615b9d565b9350614dd8818560208601615d09565b614de181615d3c565b840191505092915050565b614df581615c8b565b82525050565b614e0481615c9d565b82525050565b614e1381615caf565b82525050565b614e2281615cc1565b82525050565b614e3181615cd3565b82525050565b6000614e4282615b56565b614e4c8185615bb9565b9350614e5c818560208601615d09565b614e6581615d3c565b840191505092915050565b6000614e7d602383615bb9565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ee3601983615bb9565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000614f23602283615bb9565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f89601783615bb9565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b6000614fc9601b83615bb9565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000615009602083615bb9565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b6000615049602183615bb9565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150af601883615bb9565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b60006150ef601483615bb9565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b600061512f601f83615bb9565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b600061516f602583615bb9565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006151d5601283615bb9565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b6000615215602483615bb9565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061527b601e83615bb9565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b60006152bb601683615bb9565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b60006152fb602a83615bb9565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000615361601f83615bb9565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b60006153a1603683615bb9565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b6000615407601f83615bb9565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b6000615447601f83615bb9565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000610160830160008301516154936000860182614dec565b5060208301516154a660208601826155e0565b5060408301516154b9604086018261552d565b5060608301516154cc60c08601826155e0565b5060808301516154df60e08601826155e0565b5060a08301516154f3610100860182614c73565b5060c08301516155076101208601826155e0565b5060e08301518482036101408601526155208282614db3565b9150508091505092915050565b6080820160008201516155436000850182614d64565b5060208201516155566020850182614dfb565b5060408201516155696040850182614e0a565b50606082015161557c60608501826155e0565b50505050565b6040820160008201516155986000850182614c73565b5060208201516155ab60208501826155e0565b50505050565b6040820160008201516155c76000850182614c73565b5060208201516155da60208501826155e0565b50505050565b6155e981615c62565b82525050565b6155f881615c62565b82525050565b61560781615c6c565b82525050565b60006156198284614d82565b915081905092915050565b60006020820190506156396000830184614c82565b92915050565b60006020820190506156546000830184614c64565b92915050565b600060408201905061566f6000830185614c64565b61567c60208301846155ef565b9392505050565b60006040820190506156986000830185614c82565b6156a56020830184614c82565b9392505050565b60006060820190506156c16000830186614c82565b6156ce6020830185614c82565b6156db60408301846155ef565b949350505050565b60006040820190506156f86000830185614c82565b61570560208301846155ef565b9392505050565b60006060820190506157216000830186614c82565b61572e60208301856155ef565b61573b6040830184614e28565b949350505050565b6000604082019050818103600083015261575d8185614d06565b905081810360208301526157718184614c91565b90509392505050565b600060208201905061578f6000830184614d73565b92915050565b60006020820190506157aa6000830184614e19565b92915050565b600060208201905081810360008301526157ca8184614e37565b905092915050565b600060208201905081810360008301526157eb81614e70565b9050919050565b6000602082019050818103600083015261580b81614ed6565b9050919050565b6000602082019050818103600083015261582b81614f16565b9050919050565b6000602082019050818103600083015261584b81614f7c565b9050919050565b6000602082019050818103600083015261586b81614fbc565b9050919050565b6000602082019050818103600083015261588b81614ffc565b9050919050565b600060208201905081810360008301526158ab8161503c565b9050919050565b600060208201905081810360008301526158cb816150a2565b9050919050565b600060208201905081810360008301526158eb816150e2565b9050919050565b6000602082019050818103600083015261590b81615122565b9050919050565b6000602082019050818103600083015261592b81615162565b9050919050565b6000602082019050818103600083015261594b816151c8565b9050919050565b6000602082019050818103600083015261596b81615208565b9050919050565b6000602082019050818103600083015261598b8161526e565b9050919050565b600060208201905081810360008301526159ab816152ae565b9050919050565b600060208201905081810360008301526159cb816152ee565b9050919050565b600060208201905081810360008301526159eb81615354565b9050919050565b60006020820190508181036000830152615a0b81615394565b9050919050565b60006020820190508181036000830152615a2b816153fa565b9050919050565b60006020820190508181036000830152615a4b8161543a565b9050919050565b6000606082019050615a6760008301856155b1565b615a7460408301846155ef565b9392505050565b6000602082019050615a9060008301846155ef565b92915050565b6000602082019050615aab60008301846155fe565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615ad457600080fd5b8060405250919050565b600067ffffffffffffffff821115615af557600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000615bd582615c42565b9050919050565b60008115159050919050565b6000819050615bf682615d4d565b919050565b6000819050615c0982615d5a565b919050565b6000819050615c1c82615d67565b919050565b6000819050615c2f82615d74565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615c8482615ce5565b9050919050565b6000615c9682615be8565b9050919050565b6000615ca882615bfb565b9050919050565b6000615cba82615c0e565b9050919050565b6000615ccc82615c21565b9050919050565b6000615cde82615c34565b9050919050565b6000615cf082615cf7565b9050919050565b6000615d0282615c42565b9050919050565b60005b83811015615d27578082015181840152602081019050615d0c565b83811115615d36576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615d5757fe5b50565b60018110615d6457fe5b50565b60018110615d7157fe5b50565b60058110615d7e57fe5b50565b615d8a81615bca565b8114615d9557600080fd5b50565b615da181615bdc565b8114615dac57600080fd5b50565b615db881615c62565b8114615dc357600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a72315820d401e43c62e5682aff9be62ba45744db2748390830bf9e6df55b9762794576c26c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80637d7c2a1c11610144578063b6b55f25116100b6578063e849d6591161007a578063e849d659146108f1578063f5a41dea1461091a578063f69e204614610945578063f7c1ec7714610970578063f82ce27d1461099b578063fc0c546a146109c65761025c565b8063b6b55f251461080c578063cf8ca42614610835578063d9d7858a14610860578063db006a751461088b578063dd62ed3e146108b45761025c565b806399b71d5c1161010857806399b71d5c146106fa578063a160176d14610711578063a457c2d71461073c578063a728797114610779578063a9059cbb146107a4578063b69ef8a8146107e15761025c565b80637d7c2a1c146106395780638124955c14610650578063819faf7b146106795780638e4ec6ef146106a457806395d89b41146106cf5761025c565b80632e1a7d4d116101dd57806358782c21116101a157806358782c211461052757806361c1ec551461055257806365aab7491461057d57806370a08231146105a65780637137ef99146105e357806377c7b8fc1461060e5761025c565b80632e1a7d4d14610440578063313ce56714610469578063395093511461049457806339c0a7e1146104d157806357ded9c9146104fc5761025c565b80630eb2a267116102245780630eb2a2671461035957806316f0115b1461038457806318160ddd146103af57806323b872dd146103da5780632afcf480146104175761025c565b806306636c1c1461025e57806306a3fe591461029b57806306fdde03146102c6578063085d4883146102f1578063095ea7b31461031c575b005b34801561026a57600080fd5b5061028560048036036102809190810190614be6565b6109f1565b6040516102929190615a7b565b60405180910390f35b3480156102a757600080fd5b506102b0610c2f565b6040516102bd9190615624565b60405180910390f35b3480156102d257600080fd5b506102db610c55565b6040516102e891906157b0565b60405180910390f35b3480156102fd57600080fd5b50610306610cf7565b6040516103139190615795565b60405180910390f35b34801561032857600080fd5b50610343600480360361033e9190810190614ac9565b610d0a565b604051610350919061577a565b60405180910390f35b34801561036557600080fd5b5061036e610d28565b60405161037b9190615a7b565b60405180910390f35b34801561039057600080fd5b50610399610dda565b6040516103a69190615a7b565b60405180910390f35b3480156103bb57600080fd5b506103c4610de0565b6040516103d19190615a7b565b60405180910390f35b3480156103e657600080fd5b5061040160048036036103fc9190810190614a7a565b610dea565b60405161040e919061577a565b60405180910390f35b34801561042357600080fd5b5061043e60048036036104399190810190614be6565b610ec3565b005b34801561044c57600080fd5b5061046760048036036104629190810190614be6565b61102f565b005b34801561047557600080fd5b5061047e61143c565b60405161048b9190615a96565b60405180910390f35b3480156104a057600080fd5b506104bb60048036036104b69190810190614ac9565b611453565b6040516104c8919061577a565b60405180910390f35b3480156104dd57600080fd5b506104e6611506565b6040516104f39190615a7b565b60405180910390f35b34801561050857600080fd5b506105116115f6565b60405161051e9190615624565b60405180910390f35b34801561053357600080fd5b5061053c61161c565b6040516105499190615624565b60405180910390f35b34801561055e57600080fd5b50610567611642565b6040516105749190615a7b565b60405180910390f35b34801561058957600080fd5b506105a4600480360361059f9190810190614be6565b6116f4565b005b3480156105b257600080fd5b506105cd60048036036105c891908101906149ec565b611790565b6040516105da9190615a7b565b60405180910390f35b3480156105ef57600080fd5b506105f86117d8565b6040516106059190615a7b565b60405180910390f35b34801561061a57600080fd5b5061062361184b565b6040516106309190615a7b565b60405180910390f35b34801561064557600080fd5b5061064e61188d565b005b34801561065c57600080fd5b5061067760048036036106729190810190614be6565b6119d4565b005b34801561068557600080fd5b5061068e611ac8565b60405161069b9190615624565b60405180910390f35b3480156106b057600080fd5b506106b9611aee565b6040516106c69190615624565b60405180910390f35b3480156106db57600080fd5b506106e4611b14565b6040516106f191906157b0565b60405180910390f35b34801561070657600080fd5b5061070f611bb6565b005b34801561071d57600080fd5b50610726611dd9565b6040516107339190615795565b60405180910390f35b34801561074857600080fd5b50610763600480360361075e9190810190614ac9565b611f45565b604051610770919061577a565b60405180910390f35b34801561078557600080fd5b5061078e612012565b60405161079b9190615a7b565b60405180910390f35b3480156107b057600080fd5b506107cb60048036036107c69190810190614ac9565b6120fe565b6040516107d8919061577a565b60405180910390f35b3480156107ed57600080fd5b506107f661211c565b6040516108039190615a7b565b60405180910390f35b34801561081857600080fd5b50610833600480360361082e9190810190614be6565b6121ce565b005b34801561084157600080fd5b5061084a612332565b6040516108579190615a7b565b60405180910390f35b34801561086c57600080fd5b506108756123e4565b6040516108829190615a7b565b60405180910390f35b34801561089757600080fd5b506108b260048036036108ad9190810190614be6565b6123ea565b005b3480156108c057600080fd5b506108db60048036036108d69190810190614a3e565b612823565b6040516108e89190615a7b565b60405180910390f35b3480156108fd57600080fd5b5061091860048036036109139190810190614be6565b6128aa565b005b34801561092657600080fd5b5061092f61299c565b60405161093c9190615a7b565b60405180910390f35b34801561095157600080fd5b5061095a612a67565b6040516109679190615624565b60405180910390f35b34801561097c57600080fd5b50610985612a8d565b6040516109929190615624565b60405180910390f35b3480156109a757600080fd5b506109b0612b34565b6040516109bd9190615624565b60405180910390f35b3480156109d257600080fd5b506109db612bdb565b6040516109e89190615624565b60405180910390f35b600060606001604051908082528060200260200182016040528015610a3057816020015b610a1d614743565b815260200190600190039081610a155790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110610a6c57fe5b6020026020010181905250610a7f614773565b6040518060800160405280600115158152602001600080811115610a9f57fe5b8152602001600080811115610ab057fe5b8152602001858152509050610ac36147b1565b600081600001906001811115610ad557fe5b90816001811115610ae257fe5b815250506000816020018181525050818160400181905250600e54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015610b7b57816020015b610b6861481d565b815260200190600190039081610b605790505b5090508181600081518110610b8c57fe5b6020026020010181905250600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401610bf4929190615743565b600060405180830381600087803b158015610c0e57600080fd5b505af1158015610c22573d6000803e3d6000fd5b5050505050505050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ced5780601f10610cc257610100808354040283529160200191610ced565b820191906000526020600020905b815481529060010190602001808311610cd057829003601f168201915b5050505050905090565b600f60149054906101000a900460ff1681565b6000610d1e610d17612c01565b8484612c09565b6001905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d85919061563f565b60206040518083038186803b158015610d9d57600080fd5b505afa158015610db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dd59190810190614c0f565b905090565b60075481565b6000600254905090565b6000610df7848484612dd4565b610eb884610e03612c01565b610eb385604051806060016040528060288152602001615ded60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e69612c01565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b612c09565b600190509392505050565b60016006600082825401925050819055506000600654905060008211610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590615972565b60405180910390fd5b610f266117d8565b600781905550610f7b333084600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130b9909392919063ffffffff16565b610f8361188d565b600080905060006007541415610fa25782905082600781905550610fce565b610fcb600754610fbd6002548661315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b610fd66117d8565b600781905550610fe63382613215565b50600654811461102b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611022906159d2565b60405180910390fd5b5050565b6001600660008282540192505081905550600060065490506000821161108a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611081906158f2565b60405180910390fd5b600061109533611790565b9050808311156110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d1906158d2565b60405180910390fd5b6110e261339d565b60078190555060006111136002546111058660075461315b90919063ffffffff16565b6131cb90919063ffffffff16565b905061119d846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111f48460025461341090919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516112589190615a7b565b60405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112bd919061563f565b60206040518083038186803b1580156112d557600080fd5b505afa1580156112e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061130d9190810190614c0f565b9050818110156113335761133261132d828461341090919063ffffffff16565b61345a565b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b815260040161139092919061565a565b602060405180830381600087803b1580156113aa57600080fd5b505af11580156113be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113e29190810190614b05565b506113eb61339d565b6007819055505050506006548114611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f906159d2565b60405180910390fd5b5050565b6000600560009054906101000a900460ff16905090565b60006114fc611460612c01565b846114f78560016000611471612c01565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d090919063ffffffff16565b612c09565b6001905092915050565b6000611510614889565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600e546040518363ffffffff1660e01b815260040161159a929190615a52565b604080518083038186803b1580156115b157600080fd5b505afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115e99190810190614bbd565b9050806020015191505090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161169f919061563f565b60206040518083038186803b1580156116b757600080fd5b505afa1580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116ef9190810190614c0f565b905090565b6116fc612a8d565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b815260040161175b9392919061570c565b600060405180830381600087803b15801561177557600080fd5b505af1158015611789573d6000803e3d6000fd5b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006118466117e561211c565b6118386117f0612332565b61182a6117fb611506565b61181c61180661299c565b61180e612012565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b905090565b6000806118566117d8565b9050611887600254611879670de0b6b3a76400008461315b90919063ffffffff16565b6131cb90919063ffffffff16565b91505090565b6000611897611dd9565b9050600f60149054906101000a900460ff1660048111156118b457fe5b8160048111156118c057fe5b146118ce576118cd613625565b5b60006118d861211c565b11156119ae57600160048111156118eb57fe5b8160048111156118f757fe5b14156119135761190d61190861211c565b6109f1565b506119ad565b60048081111561191f57fe5b81600481111561192b57fe5b14156119465761194161193c61211c565b6119d4565b6119ac565b6002600481111561195357fe5b81600481111561195f57fe5b141561197a5761197561197061211c565b6128aa565b6119ab565b6003600481111561198757fe5b81600481111561199357fe5b14156119aa576119a96119a461211c565b6116f4565b5b5b5b5b5b80600f60146101000a81548160ff021916908360048111156119cc57fe5b021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401611a3392919061565a565b602060405180830381600087803b158015611a4d57600080fd5b505af1158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a859190810190614c0f565b11611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc90615992565b60405180910390fd5b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bac5780601f10611b8157610100808354040283529160200191611bac565b820191906000526020600020905b815481529060010190602001808311611b8f57829003601f168201915b5050505050905090565b611c45600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b611cd4600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b611d48611cdf612b34565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b611dd7600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661369e9092919063ffffffff16565b565b6000806000806000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611e5e9190615624565b60006040518083038186803b158015611e7657600080fd5b505afa158015611e8a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250611eb39190810190614b2e565b945094509450945050600080905080851115611ecd578490505b80841115611ed9578390505b80831115611ee5578290505b80821115611ef1578190505b600080905085821415611f075760029050611f39565b84821415611f185760049050611f38565b83821415611f295760039050611f37565b82821415611f3657600190505b5b5b5b80965050505050505090565b6000612008611f52612c01565b8461200385604051806060016040528060258152602001615e156025913960016000611f7c612c01565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b612c09565b6001905092915050565b60008061201d611642565b905060008111156120f7576120f4670de0b6b3a76400006120e6600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561209f57600080fd5b505afa1580156120b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120d79190810190614c0f565b8461315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b8091505090565b600061211261210b612c01565b8484612dd4565b6001905092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612179919061563f565b60206040518083038186803b15801561219157600080fd5b505afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121c99190810190614c0f565b905090565b60016006600082825401925050819055506000600654905060008211612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090615972565b60405180910390fd5b61223161339d565b600781905550612286333084600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130b9909392919063ffffffff16565b6000809050600060075414156122a557829050826007819055506122d1565b6122ce6007546122c06002548661315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b6122d961339d565b6007819055506122e93382613215565b50600654811461232e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612325906159d2565b60405180910390fd5b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161238f919061563f565b60206040518083038186803b1580156123a757600080fd5b505afa1580156123bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123df9190810190614c0f565b905090565b600e5481565b60016006600082825401925050819055506000600654905060008211612445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243c906158f2565b60405180910390fd5b600061245033611790565b905080831115612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906158d2565b60405180910390fd5b61249d6117d8565b60078190555060006124ce6002546124c08660075461315b90919063ffffffff16565b6131cb90919063ffffffff16565b9050612558846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125af8460025461341090919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516126139190615a7b565b60405180910390a36000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612678919061563f565b60206040518083038186803b15801561269057600080fd5b505afa1580156126a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126c89190810190614c0f565b90506000600f60149054906101000a900460ff16905082821015612746576126ee611dd9565b9050600f60149054906101000a900460ff16600481111561270b57fe5b81600481111561271757fe5b1461272957612724613625565b612745565b61274461273f838561341090919063ffffffff16565b61345a565b5b5b6127933384600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138159092919063ffffffff16565b600f60149054906101000a900460ff1660048111156127ae57fe5b8160048111156127ba57fe5b146127c9576127c8816138b4565b5b6127d16117d8565b60078190555050505050600654811461281f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612816906159d2565b60405180910390fd5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016129079190615a7b565b602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129599190810190614c0f565b14612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090615832565b60405180910390fd5b50565b6000806129a7610d28565b90506000811115612a6057600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401612a0d919061563f565b60206040518083038186803b158015612a2557600080fd5b505afa158015612a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a5d9190810190614c0f565b90505b8091505090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b2f9190810190614a15565b905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015612b9e57600080fd5b505afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612bd69190810190614a15565b905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7090615952565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce090615812565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612dc79190615a7b565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3b90615912565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eab906157d2565b60405180910390fd5b612f1f81604051806060016040528060268152602001615dc7602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461305e9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612fb2816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130519190615a7b565b60405180910390a3505050565b60008383111582906130a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309d91906157b0565b60405180910390fd5b5060008385039050809150509392505050565b613155848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b8585856040516024016130f3939291906156ac565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139ba565b50505050565b60008083141561316e57600090506131c5565b600082840290508284828161317f57fe5b04146131c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b790615892565b60405180910390fd5b809150505b92915050565b600061320d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b2c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327c90615a32565b60405180910390fd5b61329a816002546135d090919063ffffffff16565b6002819055506132f1816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d090919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133919190615a7b565b60405180910390a35050565b600061340b6133aa613b8d565b6133fd6133b5613c3f565b6133ef6133c0613cf1565b6133e16133cb613de1565b6133d3613eac565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b6135d090919063ffffffff16565b905090565b600061345283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061305e565b905092915050565b6002600481111561346757fe5b600f60149054906101000a900460ff16600481111561348257fe5b14156134925761349181613f98565b5b6003600481111561349f57fe5b600f60149054906101000a900460ff1660048111156134ba57fe5b141561351457806134c9612332565b101561350a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350190615932565b60405180910390fd5b6135138161403e565b5b6001600481111561352157fe5b600f60149054906101000a900460ff16600481111561353c57fe5b1415613596578061354b611506565b101561358c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358390615932565b60405180910390fd5b613595816140ce565b5b6004808111156135a257fe5b600f60149054906101000a900460ff1660048111156135bd57fe5b14156135cd576135cc81614308565b5b50565b60008082840190508381101561361b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361290615852565b60405180910390fd5b8091505092915050565b600061362f6143ae565b905060008111156136445761364381614460565b5b61364c613cf1565b9050600081111561366157613660816140ce565b5b613669614552565b9050600081111561367e5761367d81614604565b5b613686613c3f565b9050600081111561369b5761369a8161403e565b5b50565b6000811480613737575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016136e5929190615683565b60206040518083038186803b1580156136fd57600080fd5b505afa158015613711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137359190810190614c0f565b145b613776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376d906159f2565b60405180910390fd5b613810838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b84846040516024016137ae9291906156e3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139ba565b505050565b6138af838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b848460405160240161384d9291906156e3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139ba565b505050565b60006138be613b8d565b111561399457600160048111156138d157fe5b8160048111156138dd57fe5b14156138f9576138f36138ee613b8d565b6109f1565b50613993565b60048081111561390557fe5b81600481111561391157fe5b141561392c57613927613922613b8d565b6119d4565b613992565b6002600481111561393957fe5b81600481111561394557fe5b14156139605761395b613956613b8d565b6128aa565b613991565b6003600481111561396d57fe5b81600481111561397957fe5b14156139905761398f61398a613b8d565b6116f4565b5b5b5b5b5b80600f60146101000a81548160ff021916908360048111156139b257fe5b021790555050565b6139d98273ffffffffffffffffffffffffffffffffffffffff166146f8565b613a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0f90615a12565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051613a41919061560d565b6000604051808303816000865af19150503d8060008114613a7e576040519150601f19603f3d011682016040523d82523d6000602084013e613a83565b606091505b509150915081613ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613abf90615872565b60405180910390fd5b600081511115613b265780806020019051613ae69190810190614b05565b613b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1c906159b2565b60405180910390fd5b5b50505050565b60008083118290613b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6a91906157b0565b60405180910390fd5b506000838581613b7f57fe5b049050809150509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613bea919061563f565b60206040518083038186803b158015613c0257600080fd5b505afa158015613c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c3a9190810190614c0f565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613c9c919061563f565b60206040518083038186803b158015613cb457600080fd5b505afa158015613cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613cec9190810190614c0f565b905090565b6000613cfb614889565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600e546040518363ffffffff1660e01b8152600401613d85929190615a52565b604080518083038186803b158015613d9c57600080fd5b505afa158015613db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613dd49190810190614bbd565b9050806020015191505090565b600080613dec610d28565b90506000811115613ea557600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401613e52919061563f565b60206040518083038186803b158015613e6a57600080fd5b505afa158015613e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613ea29190810190614c0f565b90505b8091505090565b600080613eb7611642565b90506000811115613f9157613f8e670de0b6b3a7640000613f80600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015613f3957600080fd5b505afa158015613f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f719190810190614c0f565b8461315b90919063ffffffff16565b6131cb90919063ffffffff16565b90505b8091505090565b6000613fa2611642565b90506000613fae612012565b905082811015613ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fea90615932565b60405180910390fd5b600061402d600161401f84614011888861315b90919063ffffffff16565b6131cb90919063ffffffff16565b6135d090919063ffffffff16565b905061403881614460565b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b81526004016140999190615a7b565b600060405180830381600087803b1580156140b357600080fd5b505af11580156140c7573d6000803e3d6000fd5b5050505050565b6060600160405190808252806020026020018201604052801561410b57816020015b6140f8614743565b8152602001906001900390816140f05790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200160008152508160008151811061414757fe5b602002602001018190525061415a614773565b604051806080016040528060001515815260200160008081111561417a57fe5b815260200160008081111561418b57fe5b815260200184815250905061419e6147b1565b6001816000019060018111156141b057fe5b908160018111156141bd57fe5b815250506000816020018181525050818160400181905250600e54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060600160405190808252806020026020018201604052801561425657816020015b61424361481d565b81526020019060019003908161423b5790505b509050818160008151811061426757fe5b6020026020010181905250600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b81526004016142cf929190615743565b600060405180830381600087803b1580156142e957600080fd5b505af11580156142fd573d6000803e3d6000fd5b505050505050505050565b6000614312610d28565b9050600061431e61299c565b905082811015614363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435a90615932565b60405180910390fd5b600061439d600161438f84614381888861315b90919063ffffffff16565b6131cb90919063ffffffff16565b6135d090919063ffffffff16565b90506143a881614604565b50505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161440b919061563f565b60206040518083038186803b15801561442357600080fd5b505afa158015614437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061445b9190810190614c0f565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b81526004016144bd9190615a7b565b602060405180830381600087803b1580156144d757600080fd5b505af11580156144eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061450f9190810190614c0f565b1461454f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614546906157f2565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016145af919061563f565b60206040518083038186803b1580156145c757600080fd5b505afa1580156145db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506145ff9190810190614c0f565b905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b815260040161466392919061565a565b602060405180830381600087803b15801561467d57600080fd5b505af1158015614691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506146b59190810190614c0f565b116146f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146ec906158b2565b60405180910390fd5b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561473a5750808214155b92505050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b604051806080016040528060001515815260200160008081111561479357fe5b81526020016000808111156147a457fe5b8152602001600081525090565b604051806101000160405280600060018111156147ca57fe5b8152602001600081526020016147de6148a5565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518061010001604052806000600181111561483657fe5b81526020016000815260200161484a6148a5565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518060400160405280600015158152602001600081525090565b60405180608001604052806000151581526020016000808111156148c557fe5b81526020016000808111156148d657fe5b8152602001600081525090565b6000813590506148f281615d81565b92915050565b60008151905061490781615d81565b92915050565b60008151905061491c81615d98565b92915050565b600082601f83011261493357600080fd5b815161494661494182615ade565b615ab1565b9150808252602083016020830185838301111561496257600080fd5b61496d838284615d09565b50505092915050565b60006040828403121561498857600080fd5b6149926040615ab1565b905060006149a28482850161490d565b60008301525060206149b6848285016149d7565b60208301525092915050565b6000813590506149d181615daf565b92915050565b6000815190506149e681615daf565b92915050565b6000602082840312156149fe57600080fd5b6000614a0c848285016148e3565b91505092915050565b600060208284031215614a2757600080fd5b6000614a35848285016148f8565b91505092915050565b60008060408385031215614a5157600080fd5b6000614a5f858286016148e3565b9250506020614a70858286016148e3565b9150509250929050565b600080600060608486031215614a8f57600080fd5b6000614a9d868287016148e3565b9350506020614aae868287016148e3565b9250506040614abf868287016149c2565b9150509250925092565b60008060408385031215614adc57600080fd5b6000614aea858286016148e3565b9250506020614afb858286016149c2565b9150509250929050565b600060208284031215614b1757600080fd5b6000614b258482850161490d565b91505092915050565b600080600080600060a08688031215614b4657600080fd5b600086015167ffffffffffffffff811115614b6057600080fd5b614b6c88828901614922565b9550506020614b7d888289016149d7565b9450506040614b8e888289016149d7565b9350506060614b9f888289016149d7565b9250506080614bb0888289016149d7565b9150509295509295909350565b600060408284031215614bcf57600080fd5b6000614bdd84828501614976565b91505092915050565b600060208284031215614bf857600080fd5b6000614c06848285016149c2565b91505092915050565b600060208284031215614c2157600080fd5b6000614c2f848285016149d7565b91505092915050565b6000614c44838361547a565b905092915050565b6000614c588383615582565b60408301905092915050565b614c6d81615c79565b82525050565b614c7c81615bca565b82525050565b614c8b81615bca565b82525050565b6000614c9c82615b2a565b614ca68185615b7b565b935083602082028501614cb885615b0a565b8060005b85811015614cf45784840389528151614cd58582614c38565b9450614ce083615b61565b925060208a01995050600181019050614cbc565b50829750879550505050505092915050565b6000614d1182615b35565b614d1b8185615b8c565b9350614d2683615b1a565b8060005b83811015614d57578151614d3e8882614c4c565b9750614d4983615b6e565b925050600181019050614d2a565b5085935050505092915050565b614d6d81615bdc565b82525050565b614d7c81615bdc565b82525050565b6000614d8d82615b4b565b614d978185615bae565b9350614da7818560208601615d09565b80840191505092915050565b6000614dbe82615b40565b614dc88185615b9d565b9350614dd8818560208601615d09565b614de181615d3c565b840191505092915050565b614df581615c8b565b82525050565b614e0481615c9d565b82525050565b614e1381615caf565b82525050565b614e2281615cc1565b82525050565b614e3181615cd3565b82525050565b6000614e4282615b56565b614e4c8185615bb9565b9350614e5c818560208601615d09565b614e6581615d3c565b840191505092915050565b6000614e7d602383615bb9565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ee3601983615bb9565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000614f23602283615bb9565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f89601783615bb9565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b6000614fc9601b83615bb9565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000615009602083615bb9565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b6000615049602183615bb9565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150af601883615bb9565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b60006150ef601483615bb9565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b600061512f601f83615bb9565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b600061516f602583615bb9565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006151d5601283615bb9565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b6000615215602483615bb9565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061527b601e83615bb9565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b60006152bb601683615bb9565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b60006152fb602a83615bb9565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000615361601f83615bb9565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b60006153a1603683615bb9565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b6000615407601f83615bb9565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b6000615447601f83615bb9565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000610160830160008301516154936000860182614dec565b5060208301516154a660208601826155e0565b5060408301516154b9604086018261552d565b5060608301516154cc60c08601826155e0565b5060808301516154df60e08601826155e0565b5060a08301516154f3610100860182614c73565b5060c08301516155076101208601826155e0565b5060e08301518482036101408601526155208282614db3565b9150508091505092915050565b6080820160008201516155436000850182614d64565b5060208201516155566020850182614dfb565b5060408201516155696040850182614e0a565b50606082015161557c60608501826155e0565b50505050565b6040820160008201516155986000850182614c73565b5060208201516155ab60208501826155e0565b50505050565b6040820160008201516155c76000850182614c73565b5060208201516155da60208501826155e0565b50505050565b6155e981615c62565b82525050565b6155f881615c62565b82525050565b61560781615c6c565b82525050565b60006156198284614d82565b915081905092915050565b60006020820190506156396000830184614c82565b92915050565b60006020820190506156546000830184614c64565b92915050565b600060408201905061566f6000830185614c64565b61567c60208301846155ef565b9392505050565b60006040820190506156986000830185614c82565b6156a56020830184614c82565b9392505050565b60006060820190506156c16000830186614c82565b6156ce6020830185614c82565b6156db60408301846155ef565b949350505050565b60006040820190506156f86000830185614c82565b61570560208301846155ef565b9392505050565b60006060820190506157216000830186614c82565b61572e60208301856155ef565b61573b6040830184614e28565b949350505050565b6000604082019050818103600083015261575d8185614d06565b905081810360208301526157718184614c91565b90509392505050565b600060208201905061578f6000830184614d73565b92915050565b60006020820190506157aa6000830184614e19565b92915050565b600060208201905081810360008301526157ca8184614e37565b905092915050565b600060208201905081810360008301526157eb81614e70565b9050919050565b6000602082019050818103600083015261580b81614ed6565b9050919050565b6000602082019050818103600083015261582b81614f16565b9050919050565b6000602082019050818103600083015261584b81614f7c565b9050919050565b6000602082019050818103600083015261586b81614fbc565b9050919050565b6000602082019050818103600083015261588b81614ffc565b9050919050565b600060208201905081810360008301526158ab8161503c565b9050919050565b600060208201905081810360008301526158cb816150a2565b9050919050565b600060208201905081810360008301526158eb816150e2565b9050919050565b6000602082019050818103600083015261590b81615122565b9050919050565b6000602082019050818103600083015261592b81615162565b9050919050565b6000602082019050818103600083015261594b816151c8565b9050919050565b6000602082019050818103600083015261596b81615208565b9050919050565b6000602082019050818103600083015261598b8161526e565b9050919050565b600060208201905081810360008301526159ab816152ae565b9050919050565b600060208201905081810360008301526159cb816152ee565b9050919050565b600060208201905081810360008301526159eb81615354565b9050919050565b60006020820190508181036000830152615a0b81615394565b9050919050565b60006020820190508181036000830152615a2b816153fa565b9050919050565b60006020820190508181036000830152615a4b8161543a565b9050919050565b6000606082019050615a6760008301856155b1565b615a7460408301846155ef565b9392505050565b6000602082019050615a9060008301846155ef565b92915050565b6000602082019050615aab60008301846155fe565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615ad457600080fd5b8060405250919050565b600067ffffffffffffffff821115615af557600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000615bd582615c42565b9050919050565b60008115159050919050565b6000819050615bf682615d4d565b919050565b6000819050615c0982615d5a565b919050565b6000819050615c1c82615d67565b919050565b6000819050615c2f82615d74565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615c8482615ce5565b9050919050565b6000615c9682615be8565b9050919050565b6000615ca882615bfb565b9050919050565b6000615cba82615c0e565b9050919050565b6000615ccc82615c21565b9050919050565b6000615cde82615c34565b9050919050565b6000615cf082615cf7565b9050919050565b6000615d0282615c42565b9050919050565b60005b83811015615d27578082015181840152602081019050615d0c565b83811115615d36576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615d5757fe5b50565b60018110615d6457fe5b50565b60018110615d7157fe5b50565b60058110615d7e57fe5b50565b615d8a81615bca565b8114615d9557600080fd5b50565b615da181615bdc565b8114615dac57600080fd5b50565b615db881615c62565b8114615dc357600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a72315820d401e43c62e5682aff9be62ba45744db2748390830bf9e6df55b9762794576c26c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode Sourcemap

12576:13371:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16011:579;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16011:579:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;12867:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12867:24:0;;;:::i;:::-;;;;;;;;;;;;;;;;4915:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4915:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;13066:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13066:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;1935:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1935:152:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18583:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18583:116:0;;;:::i;:::-;;;;;;;;;;;;;;;;12739:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12739:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;1418:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1418:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;2093:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2093:304:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23554:569;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23554:569:0;;;;;;;;;;;;;;;;:::i;:::-;;14356:895;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14356:895:0;;;;;;;;;;;;;;;;:::i;:::-;;5097:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5097:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;2403:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2403:210:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17830:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17830:166:0;;;:::i;:::-;;;;;;;;;;;;;;;;12946:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12946:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;12816:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12816:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;18000:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18000:120:0;;;:::i;:::-;;;;;;;;;;;;;;;;22780:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22780:96:0;;;;;;;;;;;;;;;;:::i;:::-;;1515:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1515:110:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24360:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24360:217:0;;;:::i;:::-;;;;;;;;;;;;;;;;24583:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24583:154:0;;;:::i;:::-;;;;;;;;;;;;;;;;21712:543;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21712:543:0;;;:::i;:::-;;22880:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22880:141:0;;;;;;;;;;;;;;;;:::i;:::-;;12843:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12843:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;12896;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12896:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;5004:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5004:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;17432:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17432:279:0;;;:::i;:::-;;15299:706;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15299:706:0;;;:::i;:::-;;;;;;;;;;;;;;;;2619:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2619:261:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18124:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18124:248:0;;;:::i;:::-;;;;;;;;;;;;;;;;1631:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1631:158:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17717:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17717:107:0;;;:::i;:::-;;;;;;;;;;;;;;;;13734:550;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13734:550:0;;;;;;;;;;;;;;;;:::i;:::-;;18703:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18703:115:0;;;:::i;:::-;;;;;;;;;;;;;;;;12920:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12920:21:0;;;:::i;:::-;;;;;;;;;;;;;;;;24790:1154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24790:1154:0;;;;;;;;;;;;;;;;:::i;:::-;;1795:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1795:134:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23025:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23025:131:0;;;;;;;;;;;;;;;;:::i;:::-;;18376:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18376:203:0;;;:::i;:::-;;;;;;;;;;;;;;;;12788:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12788:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;17174:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17174:120:0;;;:::i;:::-;;;;;;;;;;;;;;;;17298:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17298:128:0;;;:::i;:::-;;;;;;;;;;;;;;;;12763:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12763:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;16011:579;16062:4;16077:19;16110:1;16099:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16077:35;;16132:22;;;;;;;;16145:4;16132:22;;;;;;16152:1;16132:22;;;16121:5;16127:1;16121:8;;;;;;;;;;;;;:33;;;;16165:22;;:::i;:::-;16190:70;;;;;;;;16202:4;16190:70;;;;;;16208:21;16190:70;;;;;;;;;;;;16231:20;16190:70;;;;;;;;;;;;16253:6;16190:70;;;16165:95;;16269:21;;:::i;:::-;16316:18;16299:3;:14;;:35;;;;;;;;;;;;;;;;;;;;;;;16359:1;16343:3;:13;;:17;;;;;16382:3;16369;:10;;:16;;;;16416:6;;16394:3;:19;;:28;;;;;16458:4;16431:3;:16;;:32;;;;;;;;;;;16474:24;16518:1;16501:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16474:46;;16539:3;16529:4;16534:1;16529:7;;;;;;;;;;;;;:13;;;;16558:4;;;;;;;;;;;16553:18;;;16572:5;16579:4;16553:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16553:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16553:31:0;;;;16011:579;;;;;;;:::o;12867:24::-;;;;;;;;;;;;;:::o;4915:83::-;4952:13;4985:5;4978:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4915:83;:::o;13066:36::-;;;;;;;;;;;;;:::o;1935:152::-;2001:4;2018:39;2027:12;:10;:12::i;:::-;2041:7;2050:6;2018:8;:39::i;:::-;2075:4;2068:11;;1935:152;;;;:::o;18583:116::-;18630:7;18660;;;;;;;;;;;18653:25;;;18687:4;18653:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18653:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18653:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18653:40:0;;;;;;;;;18646:47;;18583:116;:::o;12739:19::-;;;;:::o;1418:91::-;1462:7;1489:12;;1482:19;;1418:91;:::o;2093:304::-;2182:4;2199:36;2209:6;2217:9;2228:6;2199:9;:36::i;:::-;2246:121;2255:6;2263:12;:10;:12::i;:::-;2277:89;2315:6;2277:89;;;;;;;;;;;;;;;;;:11;:19;2289:6;2277:19;;;;;;;;;;;;;;;:33;2297:12;:10;:12::i;:::-;2277:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;2246:8;:121::i;:::-;2385:4;2378:11;;2093:304;;;;;:::o;23554:569::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;23653:1;23643:7;:11;23635:54;;;;;;;;;;;;;;;;;;;;;;23705:22;:20;:22::i;:::-;23698:4;:29;;;;23738:66;23769:10;23789:4;23796:7;23745:5;;;;;;;;;;;23738:30;;;;:66;;;;;;:::i;:::-;23815:11;:9;:11::i;:::-;23869:14;23886:1;23869:18;;23908:1;23900:4;;:9;23896:150;;;23931:7;23922:16;;23956:7;23949:4;:14;;;;23896:150;;;23999:37;24031:4;;24000:25;24012:12;;24000:7;:11;;:25;;;;:::i;:::-;23999:31;;:37;;;;:::i;:::-;23990:46;;23896:150;24061:22;:20;:22::i;:::-;24054:4;:29;;;;24092:25;24098:10;24110:6;24092:5;:25::i;:::-;5436:1;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;23554:569;;:::o;14356:895::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;14457:1;14447:7;:11;14439:55;;;;;;;;;;;;;;;;;;;;;;14505:16;14524:21;14534:10;14524:9;:21::i;:::-;14505:40;;14573:8;14562:7;:19;;14554:52;;;;;;;;;;;;;;;;;;;;;;14669:23;:21;:23::i;:::-;14662:4;:30;;;;14751:9;14763:37;14787:12;;14764:17;14773:7;14764:4;;:8;;:17;;;;:::i;:::-;14763:23;;:37;;;;:::i;:::-;14751:49;;14837:67;14863:7;14837:67;;;;;;;;;;;;;;;;;:9;:21;14847:10;14837:21;;;;;;;;;;;;;;;;:25;;:67;;;;;:::i;:::-;14813:9;:21;14823:10;14813:21;;;;;;;;;;;;;;;:91;;;;14928:25;14945:7;14928:12;;:16;;:25;;;;:::i;:::-;14913:12;:40;;;;14998:1;14969:41;;14978:10;14969:41;;;15002:7;14969:41;;;;;;;;;;;;;;;15045:9;15064:5;;;;;;;;;;;15057:23;;;15089:4;15057:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15057:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15057:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15057:38:0;;;;;;;;;15045:50;;15112:1;15108;:5;15104:55;;;15126:23;15140:8;15146:1;15140;:5;;:8;;;;:::i;:::-;15126:13;:23::i;:::-;15104:55;15176:5;;;;;;;;;;;15169:22;;;15192:10;15204:1;15169:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15169:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15169:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15169:37:0;;;;;;;;;;15222:23;:21;:23::i;:::-;15215:4;:30;;;;5436:1;;;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;14356:895;;:::o;5097:83::-;5138:5;5163:9;;;;;;;;;;;5156:16;;5097:83;:::o;2403:210::-;2483:4;2500:83;2509:12;:10;:12::i;:::-;2523:7;2532:50;2571:10;2532:11;:25;2544:12;:10;:12::i;:::-;2532:25;;;;;;;;;;;;;;;:34;2558:7;2532:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;2500:8;:83::i;:::-;2601:4;2594:11;;2403:210;;;;:::o;17830:166::-;17874:7;17892:14;;:::i;:::-;17914:4;;;;;;;;;;;17909:24;;;17934:22;;;;;;;;17947:4;17934:22;;;;;;17954:1;17934:22;;;17958:6;;17909:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17909:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17909:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17909:56:0;;;;;;;;;17892:73;;17981:3;:9;;;17974:16;;;17830:166;:::o;12946:18::-;;;;;;;;;;;;;:::o;12816:22::-;;;;;;;;;;;;;:::o;18000:120::-;18048:7;18080:8;;;;;;;;;;;18073:26;;;18108:4;18073:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18073:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18073:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18073:41:0;;;;;;;;;18066:48;;18000:120;:::o;22780:96::-;22834:9;:7;:9::i;:::-;22829:23;;;22853:5;;;;;;;;;;;22860:6;22868:1;22829:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22829:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22829:41:0;;;;22780:96;:::o;1515:110::-;1572:7;1599:9;:18;1609:7;1599:18;;;;;;;;;;;;;;;;1592:25;;1515:110;;;:::o;24360:217::-;24413:4;24433:138;24561:9;:7;:9::i;:::-;24433:115;24534:13;:11;:13::i;:::-;24433:88;24507:13;:11;:13::i;:::-;24433:61;24470:23;:21;:23::i;:::-;24433:24;:22;:24::i;:::-;:36;;:61;;;;:::i;:::-;:73;;:88;;;;:::i;:::-;:100;;:115;;;;:::i;:::-;:127;;:138;;;;:::i;:::-;24426:145;;24360:217;:::o;24583:154::-;24636:4;24649:10;24662:22;:20;:22::i;:::-;24649:35;;24698:33;24718:12;;24698:15;24708:4;24698:5;:9;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;24691:40;;;24583:154;:::o;21712:543::-;21747:18;21768:11;:9;:11::i;:::-;21747:32;;21807:8;;;;;;;;;;;21792:23;;;;;;;;:11;:23;;;;;;;;;21788:60;;21826:14;:12;:14::i;:::-;21788:60;21872:1;21860:9;:7;:9::i;:::-;:13;21856:363;;;21903:11;21888:26;;;;;;;;:11;:26;;;;;;;;;21884:328;;;21927:21;21938:9;:7;:9::i;:::-;21927:10;:21::i;:::-;;21884:328;;;21983:14;21968:29;;;;;;;;:11;:29;;;;;;;;;21964:248;;;22010:24;22024:9;:7;:9::i;:::-;22010:13;:24::i;:::-;21964:248;;;22069:15;22054:30;;;;;;;;:11;:30;;;;;;;;;22050:162;;;22097:25;22112:9;:7;:9::i;:::-;22097:14;:25::i;:::-;22050:162;;;22157:11;22142:26;;;;;;;;:11;:26;;;;;;;;;22138:74;;;22181:21;22192:9;:7;:9::i;:::-;22181:10;:21::i;:::-;22138:74;22050:162;21964:248;21884:328;21856:363;22238:11;22227:8;;:22;;;;;;;;;;;;;;;;;;;;;;;;21712:543;:::o;22880:141::-;22987:1;22948:7;;;;;;;;;;;22940:21;;;22970:4;22977:6;22940:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22940:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22940:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;22940:44:0;;;;;;;;;:48;22932:83;;;;;;;;;;;;;;;;;;;;;;22880:141;:::o;12843:19::-;;;;;;;;;;;;;:::o;12896:::-;;;;;;;;;;;;;:::o;5004:87::-;5043:13;5076:7;5069:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5004:87;:::o;17432:279::-;17472:45;17498:8;;;;;;;;;;;17513:2;17479:5;;;;;;;;;;;17472:25;;;;:45;;;;;:::i;:::-;17552:41;17578:4;;;;;;;;;;;17589:2;17559:5;;;;;;;;;;;17552:25;;;;:41;;;;;:::i;:::-;17602:50;17628:13;:11;:13::i;:::-;17648:2;17609:5;;;;;;;;;;;17602:25;;;;:50;;;;;:::i;:::-;17661:44;17687:7;;;;;;;;;;;17701:2;17668:5;;;;;;;;;;;17661:25;;;;:44;;;;;:::i;:::-;17432:279::o;15299:706::-;15341:6;15358:12;15371;15384;15397;15427:3;;;;;;;;;;;15413:28;;;15442:5;;;;;;;;;;;15413:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15413:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15413:35:0;;;;;;39:16:-1;36:1;17:17;2:54;15413:35:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15413:35:0;;;;;;;;;15356:92;;;;;;;;;15455:11;15469:1;15455:15;;15488:3;15481:4;:10;15477:43;;;15508:4;15502:10;;15477:43;15537:3;15530:4;:10;15526:43;;;15557:4;15551:10;;15526:43;15586:3;15579:4;:10;15575:43;;;15606:4;15600:10;;15575:43;15635:3;15628:4;:10;15624:43;;;15655:4;15649:10;;15624:43;15675:18;15696:11;15675:32;;15725:4;15718:3;:11;15714:261;;;15754:15;15740:29;;15714:261;;;15794:4;15787:3;:11;15783:192;;;15823:14;15809:28;;15783:192;;;15862:4;15855:3;:11;15851:124;;;15891:11;15877:25;;15851:124;;;15927:4;15920:3;:11;15916:59;;;15956:11;15942:25;;15916:59;15851:124;15783:192;15714:261;15988:11;15981:18;;;;;;;;15299:706;:::o;2619:261::-;2704:4;2721:129;2730:12;:10;:12::i;:::-;2744:7;2753:96;2792:15;2753:96;;;;;;;;;;;;;;;;;:11;:25;2765:12;:10;:12::i;:::-;2753:25;;;;;;;;;;;;;;;:34;2779:7;2753:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;2721:8;:129::i;:::-;2868:4;2861:11;;2619:261;;;;:::o;18124:248::-;18179:7;18228:9;18240:17;:15;:17::i;:::-;18228:29;;18272:1;18268;:5;18264:88;;;18288:56;18339:4;18288:46;18303:8;;;;;;;;;;;18294:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18294:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18294:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18294:39:0;;;;;;;;;18288:1;:5;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;18284:60;;18264:88;18365:1;18358:8;;;18124:248;:::o;1631:158::-;1700:4;1717:42;1727:12;:10;:12::i;:::-;1741:9;1752:6;1717:9;:42::i;:::-;1777:4;1770:11;;1631:158;;;;:::o;17717:107::-;17757:7;17787:5;;;;;;;;;;;17780:23;;;17812:4;17780:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17780:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17780:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17780:38:0;;;;;;;;;17773:45;;17717:107;:::o;13734:550::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;13834:1;13824:7;:11;13816:54;;;;;;;;;;;;;;;;;;;;;;13886:23;:21;:23::i;:::-;13879:4;:30;;;;13920:66;13951:10;13971:4;13978:7;13927:5;;;;;;;;;;;13920:30;;;;:66;;;;;;:::i;:::-;14029:14;14046:1;14029:18;;14068:1;14060:4;;:9;14056:150;;;14091:7;14082:16;;14116:7;14109:4;:14;;;;14056:150;;;14159:37;14191:4;;14160:25;14172:12;;14160:7;:11;;:25;;;;:::i;:::-;14159:31;;:37;;;;:::i;:::-;14150:46;;14056:150;14221:23;:21;:23::i;:::-;14214:4;:30;;;;14253:25;14259:10;14271:6;14253:5;:25::i;:::-;5436:1;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;13734:550;;:::o;18703:115::-;18747:7;18777:9;;;;;;;;;;;18770:27;;;18806:4;18770:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18770:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18770:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18770:42:0;;;;;;;;;18763:49;;18703:115;:::o;12920:21::-;;;;:::o;24790:1154::-;5377:1;5360:13;;:18;;;;;;;;;;;5389:20;5412:13;;5389:36;;24889:1;24879:7;:11;24871:55;;;;;;;;;;;;;;;;;;;;;;24937:16;24956:21;24966:10;24956:9;:21::i;:::-;24937:40;;25005:8;24994:7;:19;;24986:52;;;;;;;;;;;;;;;;;;;;;;25101:22;:20;:22::i;:::-;25094:4;:29;;;;25182:9;25194:37;25218:12;;25195:17;25204:7;25195:4;;:8;;:17;;;;:::i;:::-;25194:23;;:37;;;;:::i;:::-;25182:49;;25268:67;25294:7;25268:67;;;;;;;;;;;;;;;;;:9;:21;25278:10;25268:21;;;;;;;;;;;;;;;;:25;;:67;;;;;:::i;:::-;25244:9;:21;25254:10;25244:21;;;;;;;;;;;;;;;:91;;;;25359:25;25376:7;25359:12;;:16;;:25;;;;:::i;:::-;25344:12;:40;;;;25429:1;25400:41;;25409:10;25400:41;;;25433:7;25400:41;;;;;;;;;;;;;;;25480:9;25499:5;;;;;;;;;;;25492:23;;;25524:4;25492:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25492:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25492:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;25492:38:0;;;;;;;;;25480:50;;25539:18;25560:8;;;;;;;;;;;25539:29;;25585:1;25581;:5;25577:189;;;25613:11;:9;:11::i;:::-;25599:25;;25654:8;;;;;;;;;;;25639:23;;;;;;;;:11;:23;;;;;;;;;25635:122;;25677:14;:12;:14::i;:::-;25635:122;;;25722:23;25736:8;25742:1;25736;:5;;:8;;;;:::i;:::-;25722:13;:23::i;:::-;25635:122;25577:189;25776:41;25803:10;25815:1;25783:5;;;;;;;;;;;25776:26;;;;:41;;;;;:::i;:::-;25847:8;;;;;;;;;;;25832:23;;;;;;;;:11;:23;;;;;;;;;25828:73;;25868:23;25879:11;25868:10;:23::i;:::-;25828:73;25916:22;:20;:22::i;:::-;25909:4;:29;;;;5436:1;;;;5472:13;;5456:12;:29;5448:73;;;;;;;;;;;;;;;;;;;;;;24790:1154;;:::o;1795:134::-;1867:7;1894:11;:18;1906:5;1894:18;;;;;;;;;;;;;;;:27;1913:7;1894:27;;;;;;;;;;;;;;;;1887:34;;1795:134;;;;:::o;23025:131::-;23121:1;23095:8;;;;;;;;;;;23086:23;;;23110:6;23086:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23086:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23086:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23086:31:0;;;;;;;;;:36;23078:72;;;;;;;;;;;;;;;;;;;;;;23025:131;:::o;18376:203::-;18430:7;18446:9;18458:16;:14;:16::i;:::-;18446:28;;18489:1;18485;:5;18481:78;;;18513:7;;;;;;;;;;;18505:31;;;18545:4;18505:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18505:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18505:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18505:46:0;;;;;;;;;18501:50;;18481:78;18572:1;18565:8;;;18376:203;:::o;12788:23::-;;;;;;;;;;;;;:::o;17174:120::-;17214:7;17266:4;;;;;;;;;;;17237:49;;;:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17237:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17237:51:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17237:51:0;;;;;;;;;17230:58;;17174:120;:::o;17298:128::-;17342:7;17394:4;;;;;;;;;;;17365:53;;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17365:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17365:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17365:55:0;;;;;;;;;17358:62;;17298:128;:::o;12763:20::-;;;;;;;;;;;;;:::o;852:98::-;897:15;932:10;925:17;;852:98;:::o;4031:338::-;4142:1;4125:19;;:5;:19;;;;4117:68;;;;;;;;;;;;;;;;;;;;;;4223:1;4204:21;;:7;:21;;;;4196:68;;;;;;;;;;;;;;;;;;;;;;4307:6;4277:11;:18;4289:5;4277:18;;;;;;;;;;;;;;;:27;4296:7;4277:27;;;;;;;;;;;;;;;:36;;;;4345:7;4329:32;;4338:5;4329:32;;;4354:6;4329:32;;;;;;;;;;;;;;;4031:338;;;:::o;2886:471::-;3002:1;2984:20;;:6;:20;;;;2976:70;;;;;;;;;;;;;;;;;;;;;;3086:1;3065:23;;:9;:23;;;;3057:71;;;;;;;;;;;;;;;;;;;;;;3161;3183:6;3161:71;;;;;;;;;;;;;;;;;:9;:17;3171:6;3161:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;3141:9;:17;3151:6;3141:17;;;;;;;;;;;;;;;:91;;;;3266:32;3291:6;3266:9;:20;3276:9;3266:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;3243:9;:20;3253:9;3243:20;;;;;;;;;;;;;;;:55;;;;3331:9;3314:35;;3323:6;3314:35;;;3342:6;3314:35;;;;;;;;;;;;;;;2886:471;;;:::o;5889:192::-;5975:7;6008:1;6003;:6;;6011:12;5995:29;;;;;;;;;;;;;;;;;;;;;;;;;6035:9;6051:1;6047;:5;6035:17;;6072:1;6065:8;;;5889:192;;;;;:::o;8244:204::-;8345:95;8364:5;8394;:18;;;:27;;;;8423:4;8429:2;8433:5;8371:68;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8371:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;8371:68:0;8345:18;:95::i;:::-;8244:204;;;;:::o;6087:250::-;6145:7;6174:1;6169;:6;6165:47;;;6199:1;6192:8;;;;6165:47;6224:9;6240:1;6236;:5;6224:17;;6269:1;6264;6260;:5;;;;;;:10;6252:56;;;;;;;;;;;;;;;;;;;;;;6328:1;6321:8;;;6087:250;;;;;:::o;6343:132::-;6401:7;6428:39;6432:1;6435;6428:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6421:46;;6343:132;;;;:::o;3363:308::-;3458:1;3439:21;;:7;:21;;;;3431:65;;;;;;;;;;;;;;;;;;;;;;3524:24;3541:6;3524:12;;:16;;:24;;;;:::i;:::-;3509:12;:39;;;;3580:30;3603:6;3580:9;:18;3590:7;3580:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;3559:9;:18;3569:7;3559:18;;;;;;;;;;;;;;;:51;;;;3647:7;3626:37;;3643:1;3626:37;;;3656:6;3626:37;;;;;;;;;;;;;;;3363:308;;:::o;24129:225::-;24185:4;24205:143;24337:10;:8;:10::i;:::-;24205:119;24309:14;:12;:14::i;:::-;24205:91;24281:14;:12;:14::i;:::-;24205:63;24243:24;:22;:24::i;:::-;24205:25;:23;:25::i;:::-;:37;;:63;;;;:::i;:::-;:75;;:91;;;;:::i;:::-;:103;;:119;;;;:::i;:::-;:131;;:143;;;;:::i;:::-;24198:150;;24129:225;:::o;5747:136::-;5805:7;5832:43;5836:1;5839;5832:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5825:50;;5747:136;;;;:::o;21205:501::-;21277:15;21265:27;;;;;;;;:8;;;;;;;;;;;:27;;;;;;;;;21261:80;;;21303:30;21325:7;21303:21;:30::i;:::-;21261:80;21363:11;21351:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;21347:132;;;21410:7;21393:13;:11;:13::i;:::-;:24;;21385:55;;;;;;;;;;;;;;;;;;;;;;21449:22;21463:7;21449:13;:22::i;:::-;21347:132;21501:11;21489:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;21485:132;;;21548:7;21531:13;:11;:13::i;:::-;:24;;21523:55;;;;;;;;;;;;;;;;;;;;;;21587:22;21601:7;21587:13;:22::i;:::-;21485:132;21639:14;21627:26;;;;;;;;:8;;;;;;;;;;;:26;;;;;;;;;21623:78;;;21664:29;21685:7;21664:20;:29::i;:::-;21623:78;21205:501;:::o;5560:181::-;5618:7;5638:9;5654:1;5650;:5;5638:17;;5679:1;5674;:6;;5666:46;;;;;;;;;;;;;;;;;;;;;;5732:1;5725:8;;;5560:181;;;;:::o;19952:421::-;19992:14;20009:18;:16;:18::i;:::-;19992:35;;20047:1;20038:6;:10;20034:58;;;20059:25;20077:6;20059:17;:25::i;:::-;20034:58;20107:14;:12;:14::i;:::-;20098:23;;20141:1;20132:6;:10;20128:54;;;20153:21;20167:6;20153:13;:21::i;:::-;20128:54;20197:17;:15;:17::i;:::-;20188:26;;20234:1;20225:6;:10;20221:57;;;20246:24;20263:6;20246:16;:24::i;:::-;20221:57;20293:14;:12;:14::i;:::-;20284:23;;20327:1;20318:6;:10;20314:54;;;20339:21;20353:6;20339:13;:21::i;:::-;20314:54;19952:421;:::o;8456:347::-;8561:1;8552:5;:10;8551:62;;;;8611:1;8568:5;:15;;;8592:4;8599:7;8568:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8568:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8568:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;8568:39:0;;;;;;;;;:44;8551:62;8543:152;;;;;;;;;;;;;;;;;;;;;;8706:89;8725:5;8755;:13;;;:22;;;;8779:7;8788:5;8732:62;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8732:62:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;8732:62:0;8706:18;:89::i;:::-;8456:347;;;:::o;8060:176::-;8143:85;8162:5;8192;:14;;;:23;;;;8217:2;8221:5;8169:58;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8169:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;8169:58:0;8143:18;:85::i;:::-;8060:176;;;:::o;22316:458::-;22389:1;22376:10;:8;:10::i;:::-;:14;22372:368;;;22420:11;22405:26;;;;;;;;:11;:26;;;;;;;;;22401:332;;;22444:22;22455:10;:8;:10::i;:::-;22444;:22::i;:::-;;22401:332;;;22501:14;22486:29;;;;;;;;:11;:29;;;;;;;;;22482:251;;;22528:25;22542:10;:8;:10::i;:::-;22528:13;:25::i;:::-;22482:251;;;22588:15;22573:30;;;;;;;;:11;:30;;;;;;;;;22569:164;;;22616:26;22631:10;:8;:10::i;:::-;22616:14;:26::i;:::-;22569:164;;;22677:11;22662:26;;;;;;;;:11;:26;;;;;;;;;22658:75;;;22701:22;22712:10;:8;:10::i;:::-;22701;:22::i;:::-;22658:75;22569:164;22482:251;22401:332;22372:368;22757:11;22746:8;;:22;;;;;;;;;;;;;;;;;;;;;;;;22316:458;:::o;9440:598::-;9528:27;9536:5;9528:25;;;:27::i;:::-;9520:71;;;;;;;;;;;;;;;;;;;;;;9665:12;9679:23;9714:5;9706:19;;9726:4;9706:25;;;;;;;;;;;;;;;;;;;;;;;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;;9664:67:0;;;;9750:7;9742:52;;;;;;;;;;;;;;;;;;;;;;9831:1;9811:10;:17;:21;9807:224;;;9953:10;9942:30;;;;;;;;;;;;;;9934:85;;;;;;;;;;;;;;;;;;;;;;9807:224;9440:598;;;;:::o;6481:258::-;6567:7;6666:1;6662;:5;6669:12;6654:28;;;;;;;;;;;;;;;;;;;;;;;;;6693:9;6709:1;6705;:5;;;;;;6693:17;;6730:1;6723:8;;;6481:258;;;;;:::o;18824:110::-;18867:7;18897:5;;;;;;;;;;;18890:23;;;18922:4;18890:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18890:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18890:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18890:38:0;;;;;;;;;18883:45;;18824:110;:::o;19828:118::-;19875:7;19905:9;;;;;;;;;;;19898:27;;;19934:4;19898:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19898:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19898:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19898:42:0;;;;;;;;;19891:49;;19828:118;:::o;18940:169::-;18987:7;19005:14;;:::i;:::-;19027:4;;;;;;;;;;;19022:24;;;19047:22;;;;;;;;19060:4;19047:22;;;;;;19067:1;19047:22;;;19071:6;;19022:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19022:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19022:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19022:56:0;;;;;;;;;19005:73;;19094:3;:9;;;19087:16;;;18940:169;:::o;19495:206::-;19552:7;19568:9;19580:16;:14;:16::i;:::-;19568:28;;19611:1;19607;:5;19603:78;;;19635:7;;;;;;;;;;;19627:31;;;19667:4;19627:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19627:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19627:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19627:46:0;;;;;;;;;19623:50;;19603:78;19694:1;19687:8;;;19495:206;:::o;19240:251::-;19298:7;19347:9;19359:17;:15;:17::i;:::-;19347:29;;19391:1;19387;:5;19383:88;;;19407:56;19458:4;19407:46;19422:8;;;;;;;;;;;19413:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19413:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19413:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19413:39:0;;;;;;;;;19407:1;:5;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;19403:60;;19383:88;19484:1;19477:8;;;19240:251;:::o;20379:328::-;20443:9;20455:17;:15;:17::i;:::-;20443:29;;20479:10;20492:24;:22;:24::i;:::-;20479:37;;20537:7;20531:2;:13;;20523:44;;;;;;;;;;;;;;;;;;;;;;20621:14;20638:31;20667:1;20638:24;20659:2;20639:14;20645:7;20639:1;:5;;:14;;;;:::i;:::-;20638:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;20621:48;;20676:25;20694:6;20676:17;:25::i;:::-;20379:328;;;;:::o;23160:92::-;23221:9;;;;;;;;;;;23214:24;;;23239:6;23214:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23214:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23214:32:0;;;;23160:92;:::o;16596:572::-;16653:19;16686:1;16675:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16653:35;;16708:22;;;;;;;;16721:4;16708:22;;;;;;16728:1;16708:22;;;16697:5;16703:1;16697:8;;;;;;;;;;;;;:33;;;;16741:22;;:::i;:::-;16766:71;;;;;;;;16778:5;16766:71;;;;;;16785:21;16766:71;;;;;;;;;;;;16808:20;16766:71;;;;;;;;;;;;16830:6;16766:71;;;16741:96;;16846:21;;:::i;:::-;16893:19;16876:3;:14;;:36;;;;;;;;;;;;;;;;;;;;;;;16937:1;16921:3;:13;;:17;;;;;16960:3;16947;:10;;:16;;;;16994:6;;16972:3;:19;;:28;;;;;17036:4;17009:3;:16;;:32;;;;;;;;;;;17052:24;17096:1;17079:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;17052:46;;17117:3;17107:4;17112:1;17107:7;;;;;;;;;;;;;:13;;;;17136:4;;;;;;;;;;;17131:18;;;17150:5;17157:4;17131:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17131:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17131:31:0;;;;16596:572;;;;;:::o;20739:460::-;20856:9;20868:16;:14;:16::i;:::-;20856:28;;20950:10;20963:23;:21;:23::i;:::-;20950:36;;21030:7;21024:2;:13;;21016:44;;;;;;;;;;;;;;;;;;;;;;21114:14;21131:31;21160:1;21131:24;21152:2;21132:14;21138:7;21132:1;:5;;:14;;;;:::i;:::-;21131:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;21114:48;;21169:24;21186:6;21169:16;:24::i;:::-;20739:460;;;;:::o;19113:123::-;19164:7;19196:8;;;;;;;;;;;19189:26;;;19224:4;19189:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19189:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19189:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19189:41:0;;;;;;;;;19182:48;;19113:123;:::o;23408:140::-;23511:1;23483:8;;;;;;;;;;;23474:25;;;23500:6;23474:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23474:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23474:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23474:33:0;;;;;;;;;:38;23466:76;;;;;;;;;;;;;;;;;;;;;;23408:140;:::o;19705:119::-;19755:7;19785;;;;;;;;;;;19778:25;;;19812:4;19778:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19778:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19778:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19778:40:0;;;;;;;;;19771:47;;19705:119;:::o;23256:148::-;23368:1;23329:7;;;;;;;;;;;23321:21;;;23351:4;23358:6;23321:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23321:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23321:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23321:44:0;;;;;;;;;:48;23313:85;;;;;;;;;;;;;;;;;;;;;;23256:148;:::o;7077:374::-;7137:4;7154:16;7181:19;7203:66;7181:88;;;;7372:7;7360:20;7348:32;;7412:3;7400:15;;:8;:15;;:42;;;;;7431:11;7419:8;:23;;7400:42;7392:51;;;;7077:374;;;:::o;12576:13371::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;283:128;;364:6;358:13;349:22;;376:30;400:5;376:30;;;343:68;;;;;419:444;;532:3;525:4;517:6;513:17;509:27;499:2;;550:1;547;540:12;499:2;580:6;574:13;602:65;617:49;659:6;617:49;;;602:65;;;593:74;;687:6;680:5;673:21;723:4;715:6;711:17;756:4;749:5;745:16;791:3;782:6;777:3;773:16;770:25;767:2;;;808:1;805;798:12;767:2;818:39;850:6;845:3;840;818:39;;;492:371;;;;;;;;896:493;;1017:4;1005:9;1000:3;996:19;992:30;989:2;;;1035:1;1032;1025:12;989:2;1053:20;1068:4;1053:20;;;1044:29;;1123:1;1154:57;1207:3;1198:6;1187:9;1183:22;1154:57;;;1148:3;1141:5;1137:15;1130:82;1083:140;1274:2;1307:60;1363:3;1354:6;1343:9;1339:22;1307:60;;;1300:4;1293:5;1289:16;1282:86;1233:146;983:406;;;;;1396:130;;1476:6;1463:20;1454:29;;1488:33;1515:5;1488:33;;;1448:78;;;;;1533:134;;1617:6;1611:13;1602:22;;1629:33;1656:5;1629:33;;;1596:71;;;;;1674:241;;1778:2;1766:9;1757:7;1753:23;1749:32;1746:2;;;1794:1;1791;1784:12;1746:2;1829:1;1846:53;1891:7;1882:6;1871:9;1867:22;1846:53;;;1836:63;;1808:97;1740:175;;;;;1922:263;;2037:2;2025:9;2016:7;2012:23;2008:32;2005:2;;;2053:1;2050;2043:12;2005:2;2088:1;2105:64;2161:7;2152:6;2141:9;2137:22;2105:64;;;2095:74;;2067:108;1999:186;;;;;2192:366;;;2313:2;2301:9;2292:7;2288:23;2284:32;2281:2;;;2329:1;2326;2319:12;2281:2;2364:1;2381:53;2426:7;2417:6;2406:9;2402:22;2381:53;;;2371:63;;2343:97;2471:2;2489:53;2534:7;2525:6;2514:9;2510:22;2489:53;;;2479:63;;2450:98;2275:283;;;;;;2565:491;;;;2703:2;2691:9;2682:7;2678:23;2674:32;2671:2;;;2719:1;2716;2709:12;2671:2;2754:1;2771:53;2816:7;2807:6;2796:9;2792:22;2771:53;;;2761:63;;2733:97;2861:2;2879:53;2924:7;2915:6;2904:9;2900:22;2879:53;;;2869:63;;2840:98;2969:2;2987:53;3032:7;3023:6;3012:9;3008:22;2987:53;;;2977:63;;2948:98;2665:391;;;;;;3063:366;;;3184:2;3172:9;3163:7;3159:23;3155:32;3152:2;;;3200:1;3197;3190:12;3152:2;3235:1;3252:53;3297:7;3288:6;3277:9;3273:22;3252:53;;;3242:63;;3214:97;3342:2;3360:53;3405:7;3396:6;3385:9;3381:22;3360:53;;;3350:63;;3321:98;3146:283;;;;;;3436:257;;3548:2;3536:9;3527:7;3523:23;3519:32;3516:2;;;3564:1;3561;3554:12;3516:2;3599:1;3616:61;3669:7;3660:6;3649:9;3645:22;3616:61;;;3606:71;;3578:105;3510:183;;;;;3700:908;;;;;;3893:3;3881:9;3872:7;3868:23;3864:33;3861:2;;;3910:1;3907;3900:12;3861:2;3966:1;3955:9;3951:17;3945:24;3989:18;3981:6;3978:30;3975:2;;;4021:1;4018;4011:12;3975:2;4041:74;4107:7;4098:6;4087:9;4083:22;4041:74;;;4031:84;;3924:197;4152:2;4170:64;4226:7;4217:6;4206:9;4202:22;4170:64;;;4160:74;;4131:109;4271:2;4289:64;4345:7;4336:6;4325:9;4321:22;4289:64;;;4279:74;;4250:109;4390:2;4408:64;4464:7;4455:6;4444:9;4440:22;4408:64;;;4398:74;;4369:109;4509:3;4528:64;4584:7;4575:6;4564:9;4560:22;4528:64;;;4518:74;;4488:110;3855:753;;;;;;;;;4615:305;;4751:2;4739:9;4730:7;4726:23;4722:32;4719:2;;;4767:1;4764;4757:12;4719:2;4802:1;4819:85;4896:7;4887:6;4876:9;4872:22;4819:85;;;4809:95;;4781:129;4713:207;;;;;4927:241;;5031:2;5019:9;5010:7;5006:23;5002:32;4999:2;;;5047:1;5044;5037:12;4999:2;5082:1;5099:53;5144:7;5135:6;5124:9;5120:22;5099:53;;;5089:63;;5061:97;4993:175;;;;;5175:263;;5290:2;5278:9;5269:7;5265:23;5261:32;5258:2;;;5306:1;5303;5296:12;5258:2;5341:1;5358:64;5414:7;5405:6;5394:9;5390:22;5358:64;;;5348:74;;5320:108;5252:186;;;;;5446:253;;5595:98;5689:3;5681:6;5595:98;;;5581:112;;5574:125;;;;;5708:249;;5831:86;5913:3;5905:6;5831:86;;;5946:4;5941:3;5937:14;5923:28;;5824:133;;;;;5965:142;6056:45;6095:5;6056:45;;;6051:3;6044:58;6038:69;;;6114:103;6187:24;6205:5;6187:24;;;6182:3;6175:37;6169:48;;;6224:113;6307:24;6325:5;6307:24;;;6302:3;6295:37;6289:48;;;6411:1040;;6604:78;6676:5;6604:78;;;6695:110;6798:6;6793:3;6695:110;;;6688:117;;6828:3;6870:4;6862:6;6858:17;6853:3;6849:27;6897:80;6971:5;6897:80;;;6997:7;7025:1;7010:402;7035:6;7032:1;7029:13;7010:402;;;7097:9;7091:4;7087:20;7082:3;7075:33;7142:6;7136:13;7164:112;7271:4;7256:13;7164:112;;;7156:120;;7293:84;7370:6;7293:84;;;7283:94;;7400:4;7395:3;7391:14;7384:21;;7067:345;7057:1;7054;7050:9;7045:14;;7010:402;;;7014:14;7425:4;7418:11;;7442:3;7435:10;;6583:868;;;;;;;;;;7514:834;;7695:72;7761:5;7695:72;;;7780:104;7877:6;7872:3;7780:104;;;7773:111;;7905:74;7973:5;7905:74;;;7999:7;8027:1;8012:314;8037:6;8034:1;8031:13;8012:314;;;8104:6;8098:13;8125:99;8220:3;8205:13;8125:99;;;8118:106;;8241:78;8312:6;8241:78;;;8231:88;;8069:257;8059:1;8056;8052:9;8047:14;;8012:314;;;8016:14;8339:3;8332:10;;7674:674;;;;;;;;8356:94;8423:21;8438:5;8423:21;;;8418:3;8411:34;8405:45;;;8457:104;8534:21;8549:5;8534:21;;;8529:3;8522:34;8516:45;;;8568:356;;8696:38;8728:5;8696:38;;;8746:88;8827:6;8822:3;8746:88;;;8739:95;;8839:52;8884:6;8879:3;8872:4;8865:5;8861:16;8839:52;;;8912:6;8907:3;8903:16;8896:23;;8676:248;;;;;;8931:315;;9027:34;9055:5;9027:34;;;9073:60;9126:6;9121:3;9073:60;;;9066:67;;9138:52;9183:6;9178:3;9171:4;9164:5;9160:16;9138:52;;;9211:29;9233:6;9211:29;;;9206:3;9202:39;9195:46;;9007:239;;;;;;9253:142;9339:50;9383:5;9339:50;;;9334:3;9327:63;9321:74;;;9402:156;9495:57;9546:5;9495:57;;;9490:3;9483:70;9477:81;;;9565:150;9655:54;9703:5;9655:54;;;9650:3;9643:67;9637:78;;;9722:144;9814:46;9854:5;9814:46;;;9809:3;9802:59;9796:70;;;9873:140;9963:44;10001:5;9963:44;;;9958:3;9951:57;9945:68;;;10020:347;;10132:39;10165:5;10132:39;;;10183:71;10247:6;10242:3;10183:71;;;10176:78;;10259:52;10304:6;10299:3;10292:4;10285:5;10281:16;10259:52;;;10332:29;10354:6;10332:29;;;10327:3;10323:39;10316:46;;10112:255;;;;;;10375:465;;10535:67;10599:2;10594:3;10535:67;;;10528:74;;10635:66;10631:1;10626:3;10622:11;10615:87;10736:66;10731:2;10726:3;10722:12;10715:88;10831:2;10826:3;10822:12;10815:19;;10521:319;;;;10849:364;;11009:67;11073:2;11068:3;11009:67;;;11002:74;;11109:66;11105:1;11100:3;11096:11;11089:87;11204:2;11199:3;11195:12;11188:19;;10995:218;;;;11222:465;;11382:67;11446:2;11441:3;11382:67;;;11375:74;;11482:66;11478:1;11473:3;11469:11;11462:87;11583:66;11578:2;11573:3;11569:12;11562:88;11678:2;11673:3;11669:12;11662:19;;11368:319;;;;11696:364;;11856:67;11920:2;11915:3;11856:67;;;11849:74;;11956:66;11952:1;11947:3;11943:11;11936:87;12051:2;12046:3;12042:12;12035:19;;11842:218;;;;12069:364;;12229:67;12293:2;12288:3;12229:67;;;12222:74;;12329:66;12325:1;12320:3;12316:11;12309:87;12424:2;12419:3;12415:12;12408:19;;12215:218;;;;12442:364;;12602:67;12666:2;12661:3;12602:67;;;12595:74;;12702:66;12698:1;12693:3;12689:11;12682:87;12797:2;12792:3;12788:12;12781:19;;12588:218;;;;12815:465;;12975:67;13039:2;13034:3;12975:67;;;12968:74;;13075:66;13071:1;13066:3;13062:11;13055:87;13176:66;13171:2;13166:3;13162:12;13155:88;13271:2;13266:3;13262:12;13255:19;;12961:319;;;;13289:364;;13449:67;13513:2;13508:3;13449:67;;;13442:74;;13549:66;13545:1;13540:3;13536:11;13529:87;13644:2;13639:3;13635:12;13628:19;;13435:218;;;;13662:364;;13822:67;13886:2;13881:3;13822:67;;;13815:74;;13922:66;13918:1;13913:3;13909:11;13902:87;14017:2;14012:3;14008:12;14001:19;;13808:218;;;;14035:364;;14195:67;14259:2;14254:3;14195:67;;;14188:74;;14295:66;14291:1;14286:3;14282:11;14275:87;14390:2;14385:3;14381:12;14374:19;;14181:218;;;;14408:465;;14568:67;14632:2;14627:3;14568:67;;;14561:74;;14668:66;14664:1;14659:3;14655:11;14648:87;14769:66;14764:2;14759:3;14755:12;14748:88;14864:2;14859:3;14855:12;14848:19;;14554:319;;;;14882:364;;15042:67;15106:2;15101:3;15042:67;;;15035:74;;15142:66;15138:1;15133:3;15129:11;15122:87;15237:2;15232:3;15228:12;15221:19;;15028:218;;;;15255:465;;15415:67;15479:2;15474:3;15415:67;;;15408:74;;15515:66;15511:1;15506:3;15502:11;15495:87;15616:66;15611:2;15606:3;15602:12;15595:88;15711:2;15706:3;15702:12;15695:19;;15401:319;;;;15729:364;;15889:67;15953:2;15948:3;15889:67;;;15882:74;;15989:66;15985:1;15980:3;15976:11;15969:87;16084:2;16079:3;16075:12;16068:19;;15875:218;;;;16102:364;;16262:67;16326:2;16321:3;16262:67;;;16255:74;;16362:66;16358:1;16353:3;16349:11;16342:87;16457:2;16452:3;16448:12;16441:19;;16248:218;;;;16475:465;;16635:67;16699:2;16694:3;16635:67;;;16628:74;;16735:66;16731:1;16726:3;16722:11;16715:87;16836:66;16831:2;16826:3;16822:12;16815:88;16931:2;16926:3;16922:12;16915:19;;16621:319;;;;16949:364;;17109:67;17173:2;17168:3;17109:67;;;17102:74;;17209:66;17205:1;17200:3;17196:11;17189:87;17304:2;17299:3;17295:12;17288:19;;17095:218;;;;17322:465;;17482:67;17546:2;17541:3;17482:67;;;17475:74;;17582:66;17578:1;17573:3;17569:11;17562:87;17683:66;17678:2;17673:3;17669:12;17662:88;17778:2;17773:3;17769:12;17762:19;;17468:319;;;;17796:364;;17956:67;18020:2;18015:3;17956:67;;;17949:74;;18056:66;18052:1;18047:3;18043:11;18036:87;18151:2;18146:3;18142:12;18135:19;;17942:218;;;;18169:364;;18329:67;18393:2;18388:3;18329:67;;;18322:74;;18429:66;18425:1;18420:3;18416:11;18409:87;18524:2;18519:3;18515:12;18508:19;;18315:218;;;;18602:1605;;18745:5;18740:3;18736:15;18835:3;18828:5;18824:15;18818:22;18846:75;18916:3;18911;18907:13;18893:12;18846:75;;;18766:161;19005:4;18998:5;18994:16;18988:23;19017:63;19074:4;19069:3;19065:14;19051:12;19017:63;;;18937:149;19161:4;19154:5;19150:16;19144:23;19173:117;19284:4;19279:3;19275:14;19261:12;19173:117;;;19096:200;19380:4;19373:5;19369:16;19363:23;19392:63;19449:4;19444:3;19440:14;19426:12;19392:63;;;19306:155;19547:4;19540:5;19536:16;19530:23;19559:63;19616:4;19611:3;19607:14;19593:12;19559:63;;;19471:157;19709:4;19702:5;19698:16;19692:23;19721:64;19778:5;19773:3;19769:15;19755:12;19721:64;;;19638:153;19874:4;19867:5;19863:16;19857:23;19886:64;19943:5;19938:3;19934:15;19920:12;19886:64;;;19801:155;20029:4;20022:5;20018:16;20012:23;20082:3;20076:4;20072:14;20064:5;20059:3;20055:15;20048:39;20102:67;20164:4;20150:12;20102:67;;;20094:75;;19966:215;20198:4;20191:11;;18718:1489;;;;;;20277:815;20414:4;20409:3;20405:14;20497:3;20490:5;20486:15;20480:22;20508:56;20559:3;20554;20550:13;20536:12;20508:56;;;20434:136;20651:4;20644:5;20640:16;20634:23;20663:83;20740:4;20735:3;20731:14;20717:12;20663:83;;;20580:172;20824:4;20817:5;20813:16;20807:23;20836:80;20910:4;20905:3;20901:14;20887:12;20836:80;;;20762:160;20996:4;20989:5;20985:16;20979:23;21008:63;21065:4;21060:3;21056:14;21042:12;21008:63;;;20932:145;20387:705;;;;21148:457;21271:4;21266:3;21262:14;21355:3;21348:5;21344:15;21338:22;21366:62;21423:3;21418;21414:13;21400:12;21366:62;;;21291:143;21509:4;21502:5;21498:16;21492:23;21521:63;21578:4;21573:3;21569:14;21555:12;21521:63;;;21444:146;21244:361;;;;21661:467;21794:4;21789:3;21785:14;21878:3;21871:5;21867:15;21861:22;21889:62;21946:3;21941;21937:13;21923:12;21889:62;;;21814:143;22032:4;22025:5;22021:16;22015:23;22044:63;22101:4;22096:3;22092:14;22078:12;22044:63;;;21967:146;21767:361;;;;22135:103;22208:24;22226:5;22208:24;;;22203:3;22196:37;22190:48;;;22245:113;22328:24;22346:5;22328:24;;;22323:3;22316:37;22310:48;;;22365:107;22444:22;22460:5;22444:22;;;22439:3;22432:35;22426:46;;;22479:262;;22623:93;22712:3;22703:6;22623:93;;;22616:100;;22733:3;22726:10;;22604:137;;;;;22748:213;;22866:2;22855:9;22851:18;22843:26;;22880:71;22948:1;22937:9;22933:17;22924:6;22880:71;;;22837:124;;;;;22968:229;;23094:2;23083:9;23079:18;23071:26;;23108:79;23184:1;23173:9;23169:17;23160:6;23108:79;;;23065:132;;;;;23204:340;;23358:2;23347:9;23343:18;23335:26;;23372:79;23448:1;23437:9;23433:17;23424:6;23372:79;;;23462:72;23530:2;23519:9;23515:18;23506:6;23462:72;;;23329:215;;;;;;23551:324;;23697:2;23686:9;23682:18;23674:26;;23711:71;23779:1;23768:9;23764:17;23755:6;23711:71;;;23793:72;23861:2;23850:9;23846:18;23837:6;23793:72;;;23668:207;;;;;;23882:435;;24056:2;24045:9;24041:18;24033:26;;24070:71;24138:1;24127:9;24123:17;24114:6;24070:71;;;24152:72;24220:2;24209:9;24205:18;24196:6;24152:72;;;24235;24303:2;24292:9;24288:18;24279:6;24235:72;;;24027:290;;;;;;;24324:324;;24470:2;24459:9;24455:18;24447:26;;24484:71;24552:1;24541:9;24537:17;24528:6;24484:71;;;24566:72;24634:2;24623:9;24619:18;24610:6;24566:72;;;24441:207;;;;;;24655:449;;24836:2;24825:9;24821:18;24813:26;;24850:71;24918:1;24907:9;24903:17;24894:6;24850:71;;;24932:72;25000:2;24989:9;24985:18;24976:6;24932:72;;;25015:79;25090:2;25079:9;25075:18;25066:6;25015:79;;;24807:297;;;;;;;25111:788;;25441:2;25430:9;25426:18;25418:26;;25491:9;25485:4;25481:20;25477:1;25466:9;25462:17;25455:47;25516:144;25655:4;25646:6;25516:144;;;25508:152;;25708:9;25702:4;25698:20;25693:2;25682:9;25678:18;25671:48;25733:156;25884:4;25875:6;25733:156;;;25725:164;;25412:487;;;;;;25906:201;;26018:2;26007:9;26003:18;25995:26;;26032:65;26094:1;26083:9;26079:17;26070:6;26032:65;;;25989:118;;;;;26114:231;;26241:2;26230:9;26226:18;26218:26;;26255:80;26332:1;26321:9;26317:17;26308:6;26255:80;;;26212:133;;;;;26352:301;;26490:2;26479:9;26475:18;26467:26;;26540:9;26534:4;26530:20;26526:1;26515:9;26511:17;26504:47;26565:78;26638:4;26629:6;26565:78;;;26557:86;;26461:192;;;;;26660:407;;26851:2;26840:9;26836:18;26828:26;;26901:9;26895:4;26891:20;26887:1;26876:9;26872:17;26865:47;26926:131;27052:4;26926:131;;;26918:139;;26822:245;;;;27074:407;;27265:2;27254:9;27250:18;27242:26;;27315:9;27309:4;27305:20;27301:1;27290:9;27286:17;27279:47;27340:131;27466:4;27340:131;;;27332:139;;27236:245;;;;27488:407;;27679:2;27668:9;27664:18;27656:26;;27729:9;27723:4;27719:20;27715:1;27704:9;27700:17;27693:47;27754:131;27880:4;27754:131;;;27746:139;;27650:245;;;;27902:407;;28093:2;28082:9;28078:18;28070:26;;28143:9;28137:4;28133:20;28129:1;28118:9;28114:17;28107:47;28168:131;28294:4;28168:131;;;28160:139;;28064:245;;;;28316:407;;28507:2;28496:9;28492:18;28484:26;;28557:9;28551:4;28547:20;28543:1;28532:9;28528:17;28521:47;28582:131;28708:4;28582:131;;;28574:139;;28478:245;;;;28730:407;;28921:2;28910:9;28906:18;28898:26;;28971:9;28965:4;28961:20;28957:1;28946:9;28942:17;28935:47;28996:131;29122:4;28996:131;;;28988:139;;28892:245;;;;29144:407;;29335:2;29324:9;29320:18;29312:26;;29385:9;29379:4;29375:20;29371:1;29360:9;29356:17;29349:47;29410:131;29536:4;29410:131;;;29402:139;;29306:245;;;;29558:407;;29749:2;29738:9;29734:18;29726:26;;29799:9;29793:4;29789:20;29785:1;29774:9;29770:17;29763:47;29824:131;29950:4;29824:131;;;29816:139;;29720:245;;;;29972:407;;30163:2;30152:9;30148:18;30140:26;;30213:9;30207:4;30203:20;30199:1;30188:9;30184:17;30177:47;30238:131;30364:4;30238:131;;;30230:139;;30134:245;;;;30386:407;;30577:2;30566:9;30562:18;30554:26;;30627:9;30621:4;30617:20;30613:1;30602:9;30598:17;30591:47;30652:131;30778:4;30652:131;;;30644:139;;30548:245;;;;30800:407;;30991:2;30980:9;30976:18;30968:26;;31041:9;31035:4;31031:20;31027:1;31016:9;31012:17;31005:47;31066:131;31192:4;31066:131;;;31058:139;;30962:245;;;;31214:407;;31405:2;31394:9;31390:18;31382:26;;31455:9;31449:4;31445:20;31441:1;31430:9;31426:17;31419:47;31480:131;31606:4;31480:131;;;31472:139;;31376:245;;;;31628:407;;31819:2;31808:9;31804:18;31796:26;;31869:9;31863:4;31859:20;31855:1;31844:9;31840:17;31833:47;31894:131;32020:4;31894:131;;;31886:139;;31790:245;;;;32042:407;;32233:2;32222:9;32218:18;32210:26;;32283:9;32277:4;32273:20;32269:1;32258:9;32254:17;32247:47;32308:131;32434:4;32308:131;;;32300:139;;32204:245;;;;32456:407;;32647:2;32636:9;32632:18;32624:26;;32697:9;32691:4;32687:20;32683:1;32672:9;32668:17;32661:47;32722:131;32848:4;32722:131;;;32714:139;;32618:245;;;;32870:407;;33061:2;33050:9;33046:18;33038:26;;33111:9;33105:4;33101:20;33097:1;33086:9;33082:17;33075:47;33136:131;33262:4;33136:131;;;33128:139;;33032:245;;;;33284:407;;33475:2;33464:9;33460:18;33452:26;;33525:9;33519:4;33515:20;33511:1;33500:9;33496:17;33489:47;33550:131;33676:4;33550:131;;;33542:139;;33446:245;;;;33698:407;;33889:2;33878:9;33874:18;33866:26;;33939:9;33933:4;33929:20;33925:1;33914:9;33910:17;33903:47;33964:131;34090:4;33964:131;;;33956:139;;33860:245;;;;34112:407;;34303:2;34292:9;34288:18;34280:26;;34353:9;34347:4;34343:20;34339:1;34328:9;34324:17;34317:47;34378:131;34504:4;34378:131;;;34370:139;;34274:245;;;;34526:407;;34717:2;34706:9;34702:18;34694:26;;34767:9;34761:4;34757:20;34753:1;34742:9;34738:17;34731:47;34792:131;34918:4;34792:131;;;34784:139;;34688:245;;;;34940:404;;35126:2;35115:9;35111:18;35103:26;;35140:111;35248:1;35237:9;35233:17;35224:6;35140:111;;;35262:72;35330:2;35319:9;35315:18;35306:6;35262:72;;;35097:247;;;;;;35351:213;;35469:2;35458:9;35454:18;35446:26;;35483:71;35551:1;35540:9;35536:17;35527:6;35483:71;;;35440:124;;;;;35571:205;;35685:2;35674:9;35670:18;35662:26;;35699:67;35763:1;35752:9;35748:17;35739:6;35699:67;;;35656:120;;;;;35783:256;;35845:2;35839:9;35829:19;;35883:4;35875:6;35871:17;35982:6;35970:10;35967:22;35946:18;35934:10;35931:34;35928:62;35925:2;;;36003:1;36000;35993:12;35925:2;36023:10;36019:2;36012:22;35823:216;;;;;36046:322;;36190:18;36182:6;36179:30;36176:2;;;36222:1;36219;36212:12;36176:2;36289:4;36285:9;36278:4;36270:6;36266:17;36262:33;36254:41;;36353:4;36347;36343:15;36335:23;;36113:255;;;;36375:175;;36485:3;36477:11;;36523:4;36518:3;36514:14;36506:22;;36471:79;;;;36557:169;;36661:3;36653:11;;36699:4;36694:3;36690:14;36682:22;;36647:79;;;;36733:161;;36866:5;36860:12;36850:22;;36831:63;;;;36901:155;;37028:5;37022:12;37012:22;;36993:63;;;;37063:117;;37152:5;37146:12;37136:22;;37117:63;;;;37187:121;;37280:5;37274:12;37264:22;;37245:63;;;;37315:122;;37409:5;37403:12;37393:22;;37374:63;;;;37444:132;;37566:4;37561:3;37557:14;37549:22;;37543:33;;;;37583:126;;37699:4;37694:3;37690:14;37682:22;;37676:33;;;;37717:202;;37871:6;37866:3;37859:19;37908:4;37903:3;37899:14;37884:29;;37852:67;;;;;37928:196;;38076:6;38071:3;38064:19;38113:4;38108:3;38104:14;38089:29;;38057:67;;;;;38133:152;;38237:6;38232:3;38225:19;38274:4;38269:3;38265:14;38250:29;;38218:67;;;;;38294:144;;38429:3;38414:18;;38407:31;;;;;38447:163;;38562:6;38557:3;38550:19;38599:4;38594:3;38590:14;38575:29;;38543:67;;;;;38618:91;;38680:24;38698:5;38680:24;;;38669:35;;38663:46;;;;38716:85;;38789:5;38782:13;38775:21;38764:32;;38758:43;;;;38808:136;;38885:5;38874:16;;38891:48;38933:5;38891:48;;;38868:76;;;;38951:150;;39035:5;39024:16;;39041:55;39090:5;39041:55;;;39018:83;;;;39108:144;;39189:5;39178:16;;39195:52;39241:5;39195:52;;;39172:80;;;;39259:128;;39332:5;39321:16;;39338:44;39376:5;39338:44;;;39315:72;;;;39394:84;;39466:6;39459:5;39455:18;39444:29;;39438:40;;;;39485:121;;39558:42;39551:5;39547:54;39536:65;;39530:76;;;;39613:72;;39675:5;39664:16;;39658:27;;;;39692:81;;39763:4;39756:5;39752:16;39741:27;;39735:38;;;;39780:129;;39867:37;39898:5;39867:37;;;39854:50;;39848:61;;;;39916:136;;40008:39;40041:5;40008:39;;;39995:52;;39989:63;;;;40059:150;;40158:46;40198:5;40158:46;;;40145:59;;40139:70;;;;40216:144;;40312:43;40349:5;40312:43;;;40299:56;;40293:67;;;;40367:128;;40455:35;40484:5;40455:35;;;40442:48;;40436:59;;;;40502:114;;40588:23;40605:5;40588:23;;;40575:36;;40569:47;;;;40623:121;;40702:37;40733:5;40702:37;;;40689:50;;40683:61;;;;40751:108;;40830:24;40848:5;40830:24;;;40817:37;;40811:48;;;;40867:268;40932:1;40939:101;40953:6;40950:1;40947:13;40939:101;;;41029:1;41024:3;41020:11;41014:18;41010:1;41005:3;41001:11;40994:39;40975:2;40972:1;40968:10;40963:15;;40939:101;;;41055:6;41052:1;41049:13;41046:2;;;41120:1;41111:6;41106:3;41102:16;41095:27;41046:2;40916:219;;;;;41143:97;;41231:2;41227:7;41222:2;41215:5;41211:14;41207:28;41197:38;;41191:49;;;;41248:106;41332:1;41325:5;41322:12;41312:2;;41338:9;41312:2;41306:48;;41361:113;41452:1;41445:5;41442:12;41432:2;;41458:9;41432:2;41426:48;;41481:110;41569:1;41562:5;41559:12;41549:2;;41575:9;41549:2;41543:48;;41598:102;41678:1;41671:5;41668:12;41658:2;;41684:9;41658:2;41652:48;;41707:117;41776:24;41794:5;41776:24;;;41769:5;41766:35;41756:2;;41815:1;41812;41805:12;41756:2;41750:74;;41831:111;41897:21;41912:5;41897:21;;;41890:5;41887:32;41877:2;;41933:1;41930;41923:12;41877:2;41871:71;;41949:117;42018:24;42036:5;42018:24;;;42011:5;42008:35;41998:2;;42057:1;42054;42047:12;41998:2;41992:74;

Swarm Source

bzzr://d401e43c62e5682aff9be62ba45744db2748390830bf9e6df55b9762794576c2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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