ETH Price: $3,328.51 (-4.01%)

Contract

0x47108548cCF9f9d06d20bB34aF8dEcA5D4AD2Ab6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LoanTokenLogic

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-05-31
*/

/**
 * Copyright 2017-2019, bZeroX, LLC. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0.
 */
 
pragma solidity 0.5.8;
pragma experimental ABIEncoderV2;


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address _who) public view returns (uint256);
  function transfer(address _to, uint256 _value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function approve(address _spender, uint256 _value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

/**
 * @title EIP20/ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract EIP20 is ERC20 {
    string public name;
    uint8 public decimals;
    string public symbol;
}

contract WETHInterface is EIP20 {
    function deposit() external payable;
    function withdraw(uint256 wad) external;
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Integer division of two numbers, rounding up and truncating the quotient
  */
  function divCeil(uint256 _a, uint256 _b) internal pure returns (uint256) {
    if (_a == 0) {
      return 0;
    }

    return ((_a - 1) / _b) + 1;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {

  /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs.
  /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056
  uint256 internal constant REENTRANCY_GUARD_FREE = 1;

  /// @dev Constant for locked guard state
  uint256 internal constant REENTRANCY_GUARD_LOCKED = 2;

  /**
   * @dev We use a single lock for the whole contract.
   */
  uint256 internal reentrancyLock = REENTRANCY_GUARD_FREE;

  /**
   * @dev Prevents a contract from calling itself, directly or indirectly.
   * If you mark a function `nonReentrant`, you should also
   * mark it `external`. Calling one `nonReentrant` function from
   * another is not supported. Instead, you can implement a
   * `private` function doing the actual work, and an `external`
   * wrapper marked as `nonReentrant`.
   */
  modifier nonReentrant() {
    require(reentrancyLock == REENTRANCY_GUARD_FREE, "nonReentrant");
    reentrancyLock = REENTRANCY_GUARD_LOCKED;
    _;
    reentrancyLock = REENTRANCY_GUARD_FREE;
  }

}

contract LoanTokenization is ReentrancyGuard, Ownable {

    uint256 internal constant MAX_UINT = 2**256 - 1;

    string public name;
    string public symbol;
    uint8 public decimals;

    address public bZxContract;
    address public bZxVault;
    address public bZxOracle;
    address public wethContract;

    address public loanTokenAddress;

    // price of token at last user checkpoint
    mapping (address => uint256) internal checkpointPrices_;
}

contract LoanTokenStorage is LoanTokenization {

    struct ListIndex {
        uint256 index;
        bool isSet;
    }

    struct LoanData {
        bytes32 loanOrderHash;
        uint256 leverageAmount;
        uint256 initialMarginAmount;
        uint256 maintenanceMarginAmount;
        uint256 maxDurationUnixTimestampSec;
        uint256 index;
    }

    struct TokenReserves {
        address lender;
        uint256 amount;
    }

    event Borrow(
        address indexed borrower,
        uint256 borrowAmount,
        uint256 interestRate,
        address collateralTokenAddress,
        address tradeTokenToFillAddress,
        bool withdrawOnOpen
    );

    event Claim(
        address indexed claimant,
        uint256 tokenAmount,
        uint256 assetAmount,
        uint256 remainingTokenAmount,
        uint256 price
    );

    bool internal isInitialized_ = false;

    address public tokenizedRegistry;

    uint256 public baseRate = 1000000000000000000; // 1.0%
    uint256 public rateMultiplier = 39000000000000000000; // 39%

    // "fee percentage retained by the oracle" = SafeMath.sub(10**20, spreadMultiplier);
    uint256 public spreadMultiplier;

    mapping (uint256 => bytes32) public loanOrderHashes; // mapping of levergeAmount to loanOrderHash
    mapping (bytes32 => LoanData) public loanOrderData; // mapping of loanOrderHash to LoanOrder
    uint256[] public leverageList;

    TokenReserves[] public burntTokenReserveList; // array of TokenReserves
    mapping (address => ListIndex) public burntTokenReserveListIndex; // mapping of lender address to ListIndex objects
    uint256 public burntTokenReserved; // total outstanding burnt token amount
    address internal nextOwedLender_;

    uint256 public totalAssetBorrow = 0; // current amount of loan token amount tied up in loans

    uint256 internal checkpointSupply_;

    uint256 internal lastSettleTime_;

    uint256 public initialPrice;
}

contract AdvancedTokenStorage is LoanTokenStorage {
    using SafeMath for uint256;

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 value
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Mint(
        address indexed minter,
        uint256 tokenAmount,
        uint256 assetAmount,
        uint256 price
    );
    event Burn(
        address indexed burner,
        uint256 tokenAmount,
        uint256 assetAmount,
        uint256 price
    );

    mapping(address => uint256) internal balances;
    mapping (address => mapping (address => uint256)) internal allowed;
    uint256 internal totalSupply_;

    function totalSupply()
        public
        view
        returns (uint256)
    {
        return totalSupply_;
    }

    function balanceOf(
        address _owner)
        public
        view
        returns (uint256)
    {
        return balances[_owner];
    }

    function allowance(
        address _owner,
        address _spender)
        public
        view
        returns (uint256)
    {
        return allowed[_owner][_spender];
    }
}

contract AdvancedToken is AdvancedTokenStorage {
    using SafeMath for uint256;

    /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance, and to add revert reasons.
    /// @param _from Address to transfer from.
    /// @param _to Address to transfer to.
    /// @param _value Amount to transfer.
    /// @return Success of transfer.
    function transferFrom(
        address _from,
        address _to,
        uint256 _value)
        public
        returns (bool)
    {
        uint256 allowanceAmount = allowed[_from][msg.sender];
        require(_value <= balances[_from], "insufficient balance");
        require(_value <= allowanceAmount, "insufficient allowance");
        require(_to != address(0), "token burn not allowed");

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        if (allowanceAmount < MAX_UINT) {
            allowed[_from][msg.sender] = allowanceAmount.sub(_value);
        }
        emit Transfer(_from, _to, _value);
        return true;
    }

    /// @dev Transfer token for a specified address, modified to add revert reasons.
    /// @param _to The address to transfer to.
    /// @param _value The amount to be transferred.
    function transfer(
        address _to,
        uint256 _value)
        public 
        returns (bool)
    {
        require(_value <= balances[msg.sender], "insufficient balance");
        require(_to != address(0), "token burn not allowed");

        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

    function approve(
        address _spender,
        uint256 _value)
        public
        returns (bool)
    {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    function increaseApproval(
        address _spender,
        uint256 _addedValue)
        public
        returns (bool)
    {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    function decreaseApproval(
        address _spender,
        uint256 _subtractedValue)
        public
        returns (bool)
    {
        uint256 oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue >= oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    function _mint(
        address _to,
        uint256 _tokenAmount,
        uint256 _assetAmount,
        uint256 _price)
        internal
    {
        require(_to != address(0), "invalid address");
        totalSupply_ = totalSupply_.add(_tokenAmount);
        balances[_to] = balances[_to].add(_tokenAmount);
        emit Mint(_to, _tokenAmount, _assetAmount, _price);
        emit Transfer(address(0), _to, _tokenAmount);
    }

    function _burn(
        address _who,
        uint256 _tokenAmount,
        uint256 _assetAmount,
        uint256 _price)
        internal
    {
        require(_tokenAmount <= balances[_who], "burn value exceeds balance");
        // no need to require value <= totalSupply, since that would imply the
        // sender's balance is greater than the totalSupply, which *should* be an assertion failure

        balances[_who] = balances[_who].sub(_tokenAmount);
        if (balances[_who] <= 10) { // we can't leave such small balance quantities
            balances[_who] = 0;
        }

        totalSupply_ = totalSupply_.sub(_tokenAmount);
        emit Burn(_who, _tokenAmount, _assetAmount, _price);
        emit Transfer(_who, address(0), _tokenAmount);
    }
}

contract BZxObjects {

    struct LoanOrder {
        address loanTokenAddress;
        address interestTokenAddress;
        address collateralTokenAddress;
        address oracleAddress;
        uint256 loanTokenAmount;
        uint256 interestAmount;
        uint256 initialMarginAmount;
        uint256 maintenanceMarginAmount;
        uint256 maxDurationUnixTimestampSec;
        bytes32 loanOrderHash;
    }

    struct LoanPosition {
        address trader;
        address collateralTokenAddressFilled;
        address positionTokenAddressFilled;
        uint256 loanTokenAmountFilled;
        uint256 loanTokenAmountUsed;
        uint256 collateralTokenAmountFilled;
        uint256 positionTokenAmountFilled;
        uint256 loanStartUnixTimestampSec;
        uint256 loanEndUnixTimestampSec;
        bool active;
        uint256 positionId;
    }
}

contract OracleNotifierInterface {

    function closeLoanNotifier(
        BZxObjects.LoanOrder memory loanOrder,
        BZxObjects.LoanPosition memory loanPosition,
        address loanCloser,
        uint256 closeAmount,
        bool isLiquidation)
        public
        returns (bool);
}

interface IBZx {
    function pushLoanOrderOnChain(
        address[8] calldata orderAddresses,
        uint256[11] calldata orderValues,
        bytes calldata oracleData,
        bytes calldata signature)
        external
        returns (bytes32); // loanOrderHash

    function setLoanOrderDesc(
        bytes32 loanOrderHash,
        string calldata desc)
        external
        returns (bool);

    function updateLoanAsLender(
        bytes32 loanOrderHash,
        uint256 increaseAmountForLoan,
        uint256 newInterestRate,
        uint256 newExpirationTimestamp)
        external
        returns (bool);

    function takeLoanOrderOnChainAsTraderByDelegate(
        address trader,
        bytes32 loanOrderHash,
        address collateralTokenFilled,
        uint256 loanTokenAmountFilled,
        address tradeTokenToFillAddress,
        bool withdrawOnOpen)
        external
        returns (uint256);

    function getLenderInterestForOracle(
        address lender,
        address oracleAddress,
        address interestTokenAddress)
        external
        view
        returns (
            uint256,    // interestPaid
            uint256,    // interestPaidDate
            uint256,    // interestOwedPerDay
            uint256);   // interestUnPaid

    function withdrawCollateral(
        bytes32 loanOrderHash,
        uint256 withdrawAmount)
        external
        returns (uint256 amountWithdrawn);

    function closeLoanPartially(
        bytes32 loanOrderHash,
        uint256 closeAmount)
        external
        returns (uint256 actualCloseAmount);

    function getMarginLevels(
        bytes32 loanOrderHash,
        address trader)
        external
        view
        returns (
            uint256 initialMarginAmount,
            uint256 maintenanceMarginAmount,
            uint256 currentMarginAmount);

    function getTotalEscrow(
        bytes32 loanOrderHash,
        address trader)
        external
        view
        returns (
            uint256 netCollateralAmount,
            uint256 interestDepositRemaining,
            uint256 loanTokenAmountBorrowed);

    function shouldLiquidate(
        bytes32 loanOrderHash,
        address trader)
        external
        view
        returns (bool);
}

interface IBZxOracle {
    function tradeUserAsset(
        address sourceTokenAddress,
        address destTokenAddress,
        address receiverAddress,
        address returnToSenderAddress,
        uint256 sourceTokenAmount,
        uint256 maxDestTokenAmount,
        uint256 minConversionRate)
        external
        returns (uint256 destTokenAmountReceived, uint256 sourceTokenAmountUsed);

    function interestFeePercent()
        external
        view
        returns (uint256);
}


interface iTokenizedRegistry {
    function getTokenAsset(
        address _token,
        uint256 _tokenType)
        external
        view
        returns (address);
}

contract LoanTokenLogic is AdvancedToken, OracleNotifierInterface {
    using SafeMath for uint256;

    modifier onlyOracle() {
        require(msg.sender == bZxOracle, "only Oracle allowed");
        _;
    }


    function()
        external
        payable
    {}


    /* Public functions */

    function mint(
        address receiver,
        uint256 depositAmount)
        external
        nonReentrant
        returns (uint256 mintAmount)
    {
        require (depositAmount > 0, "depositAmount == 0");

        if (burntTokenReserveList.length > 0) {
            _claimLoanToken(_getNextOwed());
            _claimLoanToken(receiver);
            if (msg.sender != receiver)
                _claimLoanToken(msg.sender);
        } else {
            _settleInterest();
        }

        uint256 currentPrice = _tokenPrice(_totalAssetSupply(0));
        mintAmount = depositAmount.mul(10**18).div(currentPrice);

        require(ERC20(loanTokenAddress).transferFrom(
            msg.sender,
            address(this),
            depositAmount
        ), "transfer of loanToken failed");

        _mint(receiver, mintAmount, depositAmount, currentPrice);

        checkpointPrices_[receiver] = currentPrice;
    }

    function burn(
        address receiver,
        uint256 burnAmount)
        external
        nonReentrant
        returns (uint256 loanAmountPaid)
    {
        loanAmountPaid = _burnToken(
            receiver,
            burnAmount
        );

        if (loanAmountPaid > 0) {
            require(ERC20(loanTokenAddress).transfer(
                receiver,
                loanAmountPaid
            ), "transfer of loanToken failed");
        }
    }

    // called by a borrower to open a loan
    // loan can be collateralized using any supported token (collateralTokenAddress)
    // interest collected is denominated the same as loanToken
    // returns borrowAmount
    function borrowToken(
        uint256 borrowAmount,
        uint256 leverageAmount,
        address collateralTokenAddress,
        address tradeTokenToFillAddress,
        bool withdrawOnOpen)
        external
        nonReentrant
        returns (uint256)
    {
        require(borrowAmount > 0, "borrowAmount == 0");

        bytes32 loanOrderHash = loanOrderHashes[leverageAmount];
        LoanData memory loanData = loanOrderData[loanOrderHash];
        require(loanData.initialMarginAmount != 0, "invalid leverage amount");

        _settleInterest();

        uint256 interestRate = _nextLoanInterestRate(borrowAmount);

        uint256 amount = _borrowToken(
            msg.sender,
            loanOrderHash,
            borrowAmount,
            interestRate,
            collateralTokenAddress,
            tradeTokenToFillAddress,
            withdrawOnOpen
        );
        require(amount > 0, "unable to borrow");
        return amount;
    }

    // called by a borrower to open a loan
    // escrowAmount == total collateral + interest available to back the loan
    // escrowAmount is denominated the same as loanToken
    // returns borrowAmount
    function borrowTokenFromEscrow(
        uint256 escrowAmount,
        uint256 leverageAmount,
        address tradeTokenToFillAddress,
        bool withdrawOnOpen)
        external
        nonReentrant
        returns (uint256)
    {
        require(escrowAmount > 0, "escrowAmount == 0");

        bytes32 loanOrderHash = loanOrderHashes[leverageAmount];
        LoanData memory loanData = loanOrderData[loanOrderHash];
        require(loanData.initialMarginAmount != 0, "invalid leverage amount");

        _settleInterest();

        uint256 interestRate = _nextLoanInterestRate(
            escrowAmount
                .mul(10**20)
                .div(loanData.initialMarginAmount)
        );

        uint256 borrowAmount = _getBorrowAmount(
            loanData.initialMarginAmount,
            escrowAmount,
            interestRate,
            loanData.maxDurationUnixTimestampSec,
            withdrawOnOpen
        );

        borrowAmount = _borrowToken(
            msg.sender,
            loanOrderHash,
            borrowAmount,
            interestRate,
            loanTokenAddress, // collateralTokenAddress
            tradeTokenToFillAddress,
            withdrawOnOpen
        );
        require(borrowAmount > 0, "unable to borrow");
        return borrowAmount;
    }

    function rolloverPosition(
        address borrower,
        bytes32 loanOrderHash,
        uint256 initialMarginAmount,
        uint256 escrowAmount,
        uint256 maxDuration,
        address tradeTokenToFillAddress)
        external
        returns (uint256)
    {
        require(msg.sender == address(this), "sender not self");

        uint256 interestRate = _nextLoanInterestRate(
            escrowAmount
                .mul(10**20)
                .div(initialMarginAmount)
        );

        uint256 borrowAmount = _getBorrowAmount(
            initialMarginAmount,
            escrowAmount,
            interestRate,
            maxDuration,
            false // withdrawOnOpen
        );

        return _borrowToken(
            borrower,
            loanOrderHash,
            borrowAmount,
            interestRate,
            loanTokenAddress,
            tradeTokenToFillAddress,
            false
        );
    }

    // Claims owned loan token for the caller
    // Also claims for user with the longest reserves
    // returns amount claimed for the caller
    function claimLoanToken()
        external
        nonReentrant
        returns (uint256 claimedAmount)
    {
        claimedAmount = _claimLoanToken(msg.sender);

        if (burntTokenReserveList.length > 0) {
            _claimLoanToken(_getNextOwed());

            if (burntTokenReserveListIndex[msg.sender].isSet && nextOwedLender_ != msg.sender) {
                // ensure lender is paid next
                nextOwedLender_ = msg.sender;
            }
        }
    }

    function settleInterest()
        external
        nonReentrant
    {
        _settleInterest();
    }

    function wrapEther()
        public
    {
        if (address(this).balance > 0) {
            WETHInterface(wethContract).deposit.value(address(this).balance)();
        }
    }

    // Sends non-LoanToken assets to the Oracle fund
    // These are assets that would otherwise be "stuck" due to a user accidently sending them to the contract
    function donateAsset(
        address tokenAddress)
        public
        returns (bool)
    {
        if (tokenAddress == loanTokenAddress)
            return false;

        uint256 balance = ERC20(tokenAddress).balanceOf(address(this));
        if (balance == 0)
            return false;

        require(ERC20(tokenAddress).transfer(
            bZxOracle,
            balance
        ), "transfer of token balance failed");

        return true;
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _value)
        public
        returns (bool)
    {
        super.transferFrom(
            _from,
            _to,
            _value
        );

        // handle checkpoint update
        uint256 currentPrice = tokenPrice();
        if (burntTokenReserveListIndex[_from].isSet || balances[_from] > 0) {
            checkpointPrices_[_from] = currentPrice;
        } else {
            checkpointPrices_[_from] = 0;
        }
        if (burntTokenReserveListIndex[_to].isSet || balances[_to] > 0) {
            checkpointPrices_[_to] = currentPrice;
        } else {
            checkpointPrices_[_to] = 0;
        }

        return true;
    }

    function transfer(
        address _to,
        uint256 _value)
        public
        returns (bool)
    {
        super.transfer(
            _to,
            _value
        );

        // handle checkpoint update
        uint256 currentPrice = tokenPrice();
        if (burntTokenReserveListIndex[msg.sender].isSet || balances[msg.sender] > 0) {
            checkpointPrices_[msg.sender] = currentPrice;
        } else {
            checkpointPrices_[msg.sender] = 0;
        }
        if (burntTokenReserveListIndex[_to].isSet || balances[_to] > 0) {
            checkpointPrices_[_to] = currentPrice;
        } else {
            checkpointPrices_[_to] = 0;
        }

        return true;
    }


    /* Public View functions */

    function tokenPrice()
        public
        view
        returns (uint256 price)
    {
        uint256 interestUnPaid = 0;
        if (lastSettleTime_ != block.timestamp) {
            (,,interestUnPaid) = _getAllInterest();

            interestUnPaid = interestUnPaid
                .mul(spreadMultiplier)
                .div(10**20);
        }

        return _tokenPrice(_totalAssetSupply(interestUnPaid));
    }

    function checkpointPrice(
        address _user)
        public
        view
        returns (uint256 price)
    {
        return checkpointPrices_[_user];
    }

    function totalReservedSupply()
        public
        view
        returns (uint256)
    {
        return burntTokenReserved.mul(tokenPrice()).div(10**18);
    }

    function marketLiquidity()
        public
        view
        returns (uint256)
    {
        uint256 totalSupply = totalAssetSupply();
        uint256 reservedSupply = totalReservedSupply();
        if (totalSupply > reservedSupply) {
            totalSupply = totalSupply.sub(reservedSupply);
        } else {
            return 0;
        }

        if (totalSupply > totalAssetBorrow) {
            return totalSupply.sub(totalAssetBorrow);
        } else {
            return 0;
        }
    }

    // interest that borrowers are currently paying for open loans
    function borrowInterestRate()
        public
        view
        returns (uint256)
    {
        if (totalAssetBorrow > 0) {
            return _protocolInterestRate(totalAssetSupply());
        } else {
            return baseRate;
        }
    }

    // interest that lenders are currently receiving for open loans
    function supplyInterestRate()
        public
        view
        returns (uint256)
    {
        uint256 assetSupply = totalAssetSupply();
        if (totalAssetBorrow > 0) {
            return _protocolInterestRate(assetSupply)
                .mul(_getUtilizationRate(assetSupply))
                .mul(spreadMultiplier)
                .div(10**40);
        } else {
            return 0;
        }
    }

    // the rate the next base protocol borrower will receive based on the amount being borrowed
    function nextLoanInterestRate(
        uint256 borrowAmount)
        public
        view
        returns (uint256)
    {
        if (borrowAmount > 0) {
            uint256 interestUnPaid = 0;
            if (lastSettleTime_ != block.timestamp) {
                (,,interestUnPaid) = _getAllInterest();

                interestUnPaid = interestUnPaid
                    .mul(spreadMultiplier)
                    .div(10**20);
            }

            uint256 balance = ERC20(loanTokenAddress).balanceOf(address(this)).add(interestUnPaid);
            if (borrowAmount > balance) {
                borrowAmount = balance;
            }
        }

        return _nextLoanInterestRate(borrowAmount);
    }

    // returns the total amount of interest earned for all active loans
    function interestReceived()
        public
        view
        returns (uint256 interestTotalAccrued)
    {
        (uint256 interestPaidSoFar,,uint256 interestUnPaid) = _getAllInterest();

        return interestPaidSoFar
            .add(interestUnPaid)
            .mul(spreadMultiplier)
            .div(10**20);
    }

    function totalAssetSupply()
        public
        view
        returns (uint256)
    {
        uint256 interestUnPaid = 0;
        if (lastSettleTime_ != block.timestamp) {
            (,,interestUnPaid) = _getAllInterest();

            interestUnPaid = interestUnPaid
                .mul(spreadMultiplier)
                .div(10**20);
        }

        return _totalAssetSupply(interestUnPaid);
    }

    function getMaxEscrowAmount(
        uint256 leverageAmount)
        public
        view
        returns (uint256)
    {
        LoanData memory loanData = loanOrderData[loanOrderHashes[leverageAmount]];
        if (loanData.initialMarginAmount == 0)
            return 0;

        return marketLiquidity()
            .mul(loanData.initialMarginAmount)
            .div(_adjustValue(
                10**20, // maximum possible interest (100%)
                loanData.maxDurationUnixTimestampSec,
                loanData.initialMarginAmount));
    }

    function getBorrowAmount(
        uint256 escrowAmount,
        uint256 leverageAmount,
        bool withdrawOnOpen)
        public
        view
        returns (uint256)
    {
        if (escrowAmount == 0)
            return 0;

        LoanData memory loanData = loanOrderData[loanOrderHashes[leverageAmount]];
        if (loanData.initialMarginAmount == 0)
            return 0;

        return _getBorrowAmount(
            loanData.initialMarginAmount,
            escrowAmount,
            nextLoanInterestRate(
                escrowAmount
                    .mul(10**20)
                    .div(loanData.initialMarginAmount)
            ),
            loanData.maxDurationUnixTimestampSec,
            withdrawOnOpen
        );
    }

    function getLoanData(
        uint256 levergeAmount)
        public
        view
        returns (LoanData memory)
    {
        return loanOrderData[loanOrderHashes[levergeAmount]];
    }

    function getLeverageList()
        public
        view
        returns (uint256[] memory)
    {
        return leverageList;
    }

    // returns the user's balance of underlying token
    function assetBalanceOf(
        address _owner)
        public
        view
        returns (uint256)
    {
        return balanceOf(_owner)
            .mul(tokenPrice())
            .div(10**18);
    }


    /* Internal functions */

    function _burnToken(
        address receiver,
        uint256 burnAmount)
        internal
        returns (uint256 loanAmountPaid)
    {
        require(burnAmount > 0, "burnAmount == 0");

        if (burnAmount > balanceOf(msg.sender)) {
            burnAmount = balanceOf(msg.sender);
        }

        if (burntTokenReserveList.length > 0) {
            _claimLoanToken(_getNextOwed());
            _claimLoanToken(receiver);
            if (msg.sender != receiver)
                _claimLoanToken(msg.sender);
        } else {
            _settleInterest();
        }

        uint256 currentPrice = _tokenPrice(_totalAssetSupply(0));

        uint256 loanAmountOwed = burnAmount.mul(currentPrice).div(10**18);
        uint256 loanAmountAvailableInContract = ERC20(loanTokenAddress).balanceOf(address(this));

        loanAmountPaid = loanAmountOwed;
        if (loanAmountPaid > loanAmountAvailableInContract) {
            uint256 reserveAmount = loanAmountPaid.sub(loanAmountAvailableInContract);
            uint256 reserveTokenAmount = reserveAmount.mul(10**18).div(currentPrice);

            burntTokenReserved = burntTokenReserved.add(reserveTokenAmount);
            if (burntTokenReserveListIndex[receiver].isSet) {
                uint256 index = burntTokenReserveListIndex[receiver].index;
                burntTokenReserveList[index].amount = burntTokenReserveList[index].amount.add(reserveTokenAmount);
            } else {
                burntTokenReserveList.push(TokenReserves({
                    lender: receiver,
                    amount: reserveTokenAmount
                }));
                burntTokenReserveListIndex[receiver] = ListIndex({
                    index: burntTokenReserveList.length-1,
                    isSet: true
                });
            }

            loanAmountPaid = loanAmountAvailableInContract;
        }

        _burn(msg.sender, burnAmount, loanAmountPaid, currentPrice);

        if (burntTokenReserveListIndex[msg.sender].isSet || balances[msg.sender] > 0) {
            checkpointPrices_[msg.sender] = currentPrice;
        } else {
            checkpointPrices_[msg.sender] = 0;
        }
    }

    function _settleInterest()
        internal
    {
        if (lastSettleTime_ != block.timestamp) {
            (bool success,) = bZxContract.call.gas(gasleft())(
                abi.encodeWithSignature(
                    "payInterestForOracle(address,address)",
                    bZxOracle,
                    loanTokenAddress // same as interestTokenAddress
                )
            );
            success;
            lastSettleTime_ = block.timestamp;
        }
    }

    function _getNextOwed()
        internal
        view
        returns (address)
    {
        if (nextOwedLender_ != address(0))
            return nextOwedLender_;
        else if (burntTokenReserveList.length > 0)
            return burntTokenReserveList[0].lender;
        else
            return address(0);
    }

    function _claimLoanToken(
        address lender)
        internal
        returns (uint256)
    {
        _settleInterest();

        if (!burntTokenReserveListIndex[lender].isSet)
            return 0;

        uint256 index = burntTokenReserveListIndex[lender].index;
        uint256 currentPrice = _tokenPrice(_totalAssetSupply(0));

        uint256 claimAmount = burntTokenReserveList[index].amount.mul(currentPrice).div(10**18);
        if (claimAmount == 0)
            return 0;

        uint256 availableAmount = ERC20(loanTokenAddress).balanceOf(address(this));
        if (availableAmount == 0) {
            return 0;
        }

        uint256 claimTokenAmount;
        if (claimAmount <= availableAmount) {
            claimTokenAmount = burntTokenReserveList[index].amount;
            _removeFromList(lender, index);
        } else {
            claimAmount = availableAmount;
            claimTokenAmount = claimAmount.mul(10**18).div(currentPrice);

            // prevents less than 10 being left in burntTokenReserveList[index].amount
            if (claimTokenAmount.add(10) < burntTokenReserveList[index].amount) {
                burntTokenReserveList[index].amount = burntTokenReserveList[index].amount.sub(claimTokenAmount);
            } else {
                _removeFromList(lender, index);
            }
        }

        require(ERC20(loanTokenAddress).transfer(
            lender,
            claimAmount
        ), "transfer of loanToken failed");

        if (burntTokenReserveListIndex[lender].isSet || balances[lender] > 0) {
            checkpointPrices_[lender] = currentPrice;
        } else {
            checkpointPrices_[lender] = 0;
        }

        burntTokenReserved = burntTokenReserved > claimTokenAmount ?
            burntTokenReserved.sub(claimTokenAmount) :
            0;

        emit Claim(
            lender,
            claimTokenAmount,
            claimAmount,
            burntTokenReserveListIndex[lender].isSet ?
                burntTokenReserveList[burntTokenReserveListIndex[lender].index].amount :
                0,
            currentPrice
        );

        return claimAmount;
    }

    // returns borrowAmount
    function _borrowToken(
        address msgsender,
        bytes32 loanOrderHash,
        uint256 borrowAmount,
        uint256 interestRate,
        address collateralTokenAddress,
        address tradeTokenToFillAddress,
        bool withdrawOnOpen)
        internal
        returns (uint256)
    {
        if (borrowAmount == 0) {
            return 0;
        }

        //require(ERC20(loanTokenAddress).balanceOf(address(this)) >= borrowAmount, "insufficient loan supply");
        uint256 availableToBorrow = ERC20(loanTokenAddress).balanceOf(address(this));
        if (availableToBorrow == 0)
            return 0;

        uint256 reservedSupply = totalReservedSupply();
        if (availableToBorrow > reservedSupply) {
            availableToBorrow = availableToBorrow.sub(reservedSupply);
        } else {
            return 0;
        }

        if (borrowAmount > availableToBorrow) {
            borrowAmount = availableToBorrow;
        }

        // re-up the BZxVault spend approval if needed
        uint256 tempAllowance = ERC20(loanTokenAddress).allowance(address(this), bZxVault);
        if (tempAllowance < borrowAmount) {
            if (tempAllowance > 0) {
                // reset approval to 0
                require(ERC20(loanTokenAddress).approve(bZxVault, 0), "approval reset of loanToken failed");
            }

            require(ERC20(loanTokenAddress).approve(bZxVault, MAX_UINT), "approval of loanToken failed");
        }

        require(IBZx(bZxContract).updateLoanAsLender(
            loanOrderHash,
            borrowAmount,
            interestRate.div(365),
            block.timestamp+1),
            "updateLoanAsLender failed"
        );

        require (IBZx(bZxContract).takeLoanOrderOnChainAsTraderByDelegate(
            msgsender,
            loanOrderHash,
            collateralTokenAddress,
            borrowAmount,
            tradeTokenToFillAddress,
            withdrawOnOpen) == borrowAmount,
            "takeLoanOrderOnChainAsTraderByDelegate failed"
        );

        // update total borrowed amount outstanding in loans
        totalAssetBorrow = totalAssetBorrow.add(borrowAmount);

        // checkpoint supply since the base protocol borrow stats have changed
        checkpointSupply_ = _totalAssetSupply(0);

        if (burntTokenReserveList.length > 0) {
            _claimLoanToken(_getNextOwed());
            _claimLoanToken(msgsender);
        }

        emit Borrow(
            msgsender,
            borrowAmount,
            interestRate,
            collateralTokenAddress,
            tradeTokenToFillAddress,
            withdrawOnOpen
        );

        return borrowAmount;
    }

    function _removeFromList(
        address lender,
        uint256 index)
        internal
    {
        // remove lender from burntToken list
        if (burntTokenReserveList.length > 1) {
            // replace item in list with last item in array
            burntTokenReserveList[index] = burntTokenReserveList[burntTokenReserveList.length - 1];

            // update the position of this replacement
            burntTokenReserveListIndex[burntTokenReserveList[index].lender].index = index;
        }

        // trim array and clear storage
        burntTokenReserveList.length--;
        burntTokenReserveListIndex[lender].index = 0;
        burntTokenReserveListIndex[lender].isSet = false;

        if (lender == nextOwedLender_) {
            nextOwedLender_ = address(0);
        }
    }


    /* Internal View functions */

    function _tokenPrice(
        uint256 assetSupply)
        internal
        view
        returns (uint256)
    {
        uint256 totalTokenSupply = totalSupply_.add(burntTokenReserved);

        return totalTokenSupply > 0 ?
            assetSupply
                .mul(10**18)
                .div(totalTokenSupply) : initialPrice;
    }

    function _protocolInterestRate(
        uint256 assetSupply)
        internal
        view
        returns (uint256)
    {
        uint256 interestRate;
        if (totalAssetBorrow > 0) {
            (,uint256 interestOwedPerDay,) = _getAllInterest();
            interestRate = interestOwedPerDay
                .mul(10**20)
                .div(totalAssetBorrow)
                .mul(365)
                .mul(checkpointSupply_)
                .div(assetSupply);
        } else {
            interestRate = baseRate;
        }

        return interestRate;
    }

    // next loan interest adjustment
    function _nextLoanInterestRate(
        uint256 newBorrowAmount)
        internal
        view
        returns (uint256 nextRate)
    {
        uint256 assetSupply = totalAssetSupply();

        uint256 utilizationRate = _getUtilizationRate(assetSupply)
            .add(newBorrowAmount > 0 ?
                newBorrowAmount
                .mul(10**20)
                .div(assetSupply) : 0);

        uint256 minRate = baseRate;
        uint256 maxRate = rateMultiplier.add(baseRate);

        if (utilizationRate > 90 ether) {
            // scale rate proportionally up to 100%

            utilizationRate = utilizationRate.sub(90 ether);
            if (utilizationRate > 10 ether)
                utilizationRate = 10 ether;

            maxRate = maxRate
                .mul(90)
                .div(100);

            nextRate = utilizationRate
                .mul(SafeMath.sub(100 ether, maxRate))
                .div(10 ether)
                .add(maxRate);
        } else {
            nextRate = utilizationRate
                .mul(rateMultiplier)
                .div(10**20)
                .add(baseRate);

            if (nextRate < minRate)
                nextRate = minRate;
            else if (nextRate > maxRate)
                nextRate = maxRate;
        }

        return nextRate;
    }

    function _getAllInterest()
        internal
        view
        returns (
            uint256 interestPaidSoFar,
            uint256 interestOwedPerDay,
            uint256 interestUnPaid)
    {
        // these values don't account for any fees retained by the oracle, so we account for it elsewhere with spreadMultiplier
        (interestPaidSoFar,,interestOwedPerDay,interestUnPaid) = IBZx(bZxContract).getLenderInterestForOracle(
            address(this),
            bZxOracle,
            loanTokenAddress // same as interestTokenAddress
        );
    }

    function _getBorrowAmount(
        uint256 marginAmount,
        uint256 escrowAmount,
        uint256 interestRate,
        uint256 maxDuration,
        bool withdrawOnOpen)
        internal
        pure
        returns (uint256)
    {
        if (withdrawOnOpen) {
            // adjust for over-collateralized loan (initial margin + 100% margin)
            marginAmount = marginAmount.add(10**20);
        }

        // assumes that loan, collateral, and interest token are the same
        return escrowAmount
            .mul(10**40)
            .div(_adjustValue(
                interestRate,
                maxDuration,
                marginAmount))
            .div(marginAmount);
    }

    function _adjustValue(
        uint256 interestRate,
        uint256 maxDuration,
        uint256 marginAmount)
        internal
        pure
        returns (uint256)
    {
        return maxDuration > 0 ?
            interestRate
                .mul(10**20)
                .div(31536000) // 86400 * 365
                .mul(maxDuration)
                .div(marginAmount)
                .add(10**20) :
            10**20;
    }

    function _getUtilizationRate(
        uint256 assetSupply)
        internal
        view
        returns (uint256)
    {
        if (totalAssetBorrow > 0 && assetSupply > 0) {
            // U = total_borrow / total_supply
            return totalAssetBorrow
                .mul(10**20)
                .div(assetSupply);
        } else {
            return 0;
        }
    }

    function _totalAssetSupply(
        uint256 interestUnPaid)
        internal
        view
        returns (uint256)
    {
        return totalSupply_.add(burntTokenReserved) > 0 ?
            ERC20(loanTokenAddress).balanceOf(address(this))
                .add(totalAssetBorrow)
                .add(interestUnPaid) : 0;
    }


    /* Oracle-Only functions */

    // called only by BZxOracle when a loan is partially or fully closed
    function closeLoanNotifier(
        BZxObjects.LoanOrder memory loanOrder,
        BZxObjects.LoanPosition memory loanPosition,
        address loanCloser,
        uint256 closeAmount,
        bool /* isLiquidation */)
        public
        onlyOracle
        returns (bool)
    {
        LoanData memory loanData = loanOrderData[loanOrder.loanOrderHash];
        if (loanData.loanOrderHash == loanOrder.loanOrderHash) {

            totalAssetBorrow = totalAssetBorrow > closeAmount ?
                totalAssetBorrow.sub(closeAmount) : 0;

            if (burntTokenReserveList.length > 0) {
                _claimLoanToken(_getNextOwed());
            } else {
                _settleInterest();
            }

            if (closeAmount == 0)
                return true;

            // checkpoint supply since the base protocol borrow stats have changed
            checkpointSupply_ = _totalAssetSupply(0);

            if (loanCloser != loanPosition.trader) {

                address tradeTokenAddress = iTokenizedRegistry(tokenizedRegistry).getTokenAsset(
                    loanPosition.trader,
                    2 // tokenType=pToken
                );

                if (tradeTokenAddress != address(0)) {

                    uint256 escrowAmount = ERC20(loanTokenAddress).balanceOf(loanPosition.trader);

                    if (escrowAmount > 0) {
                        (bool success,) = address(this).call.gas(gasleft())(
                            abi.encodeWithSignature(
                                "rolloverPosition(address,bytes32,uint256,uint256,uint256,address)",
                                loanPosition.trader,
                                loanOrder.loanOrderHash,
                                loanData.initialMarginAmount,
                                escrowAmount,
                                loanData.maxDurationUnixTimestampSec,
                                tradeTokenAddress
                            )
                        );
                        success;
                    }
                }
            }

            return true;
        } else {
            return false;
        }
    }


    /* Owner-Only functions */

    function initLeverage(
        uint256[4] memory orderParams) // leverageAmount, initialMarginAmount, maintenanceMarginAmount, maxDurationUnixTimestampSec
        public
        onlyOwner
    {
        require(loanOrderHashes[orderParams[0]] == 0, "leverageAmount already defined");

        address[8] memory orderAddresses = [
            address(this), // makerAddress
            loanTokenAddress, // loanTokenAddress
            loanTokenAddress, // interestTokenAddress (same as loanToken)
            address(0), // collateralTokenAddress
            address(0), // feeRecipientAddress
            bZxOracle,
            address(0), // takerAddress
            address(0) // tradeTokenToFillAddress
        ];

        uint256[11] memory orderValues = [
            0, // loanTokenAmount
            0, // interestAmountPerDay
            orderParams[1], // initialMarginAmount,
            orderParams[2], // maintenanceMarginAmount,
            0, // lenderRelayFee
            0, // traderRelayFee
            orderParams[3], // maxDurationUnixTimestampSec,
            0, // expirationUnixTimestampSec
            0, // makerRole (0 = lender)
            0, // withdrawOnOpen
            uint(keccak256(abi.encodePacked(msg.sender, block.timestamp))) // salt
        ];

        bytes32 loanOrderHash = IBZx(bZxContract).pushLoanOrderOnChain(
            orderAddresses,
            orderValues,
            abi.encodePacked(address(this)), // oracleData -> closeLoanNotifier
            ""
        );
        IBZx(bZxContract).setLoanOrderDesc(
            loanOrderHash,
            name
        );
        loanOrderData[loanOrderHash] = LoanData({
            loanOrderHash: loanOrderHash,
            leverageAmount: orderParams[0],
            initialMarginAmount: orderParams[1],
            maintenanceMarginAmount: orderParams[2],
            maxDurationUnixTimestampSec: orderParams[3],
            index: leverageList.length
        });
        loanOrderHashes[orderParams[0]] = loanOrderHash;
        leverageList.push(orderParams[0]);
    }

    function removeLeverage(
        uint256 leverageAmount)
        public
        onlyOwner
    {
        bytes32 loanOrderHash = loanOrderHashes[leverageAmount];
        require(loanOrderHash != 0, "leverageAmount not defined");

        if (leverageList.length > 1) {
            uint256 index = loanOrderData[loanOrderHash].index;
            leverageList[index] = leverageList[leverageList.length - 1];
            loanOrderData[loanOrderHashes[leverageList[index]]].index = index;
        }
        leverageList.length--;

        delete loanOrderHashes[leverageAmount];
        delete loanOrderData[loanOrderHash];
    }

    // These params should be percentages represented like so: 5% = 5000000000000000000
    // rateMultiplier + baseRate can't exceed 100%
    function setDemandCurve(
        uint256 _baseRate,
        uint256 _rateMultiplier)
        public
        onlyOwner
    {
        require(rateMultiplier.add(baseRate) <= 10**20);
        baseRate = _baseRate;
        rateMultiplier = _rateMultiplier;
    }

    function setInterestFeePercent(
        uint256 _newRate)
        public
        onlyOwner
    {
        require(_newRate <= 10**20);
        spreadMultiplier = SafeMath.sub(10**20, _newRate);
    }

    function setBZxContract(
        address _addr)
        public
        onlyOwner
    {
        bZxContract = _addr;
    }

    function setBZxVault(
        address _addr)
        public
        onlyOwner
    {
        bZxVault = _addr;
    }

    function setBZxOracle(
        address _addr)
        public
        onlyOwner
    {
        bZxOracle = _addr;
    }

    function setTokenizedRegistry(
        address _addr)
        public
        onlyOwner
    {
        tokenizedRegistry = _addr;
    }

    function setInitialPrice(
        uint256 _value)
        public
        onlyOwner
    {
        require(_value > 0, "value can't be 0");
        initialPrice = _value;
    }

    function initialize(
        address _bZxContract,
        address _bZxVault,
        address _bZxOracle,
        address _loanTokenAddress,
        address _tokenizedRegistry,
        string memory _name,
        string memory _symbol)
        public
        onlyOwner
    {
        require (!isInitialized_, "already initialized");

        bZxContract = _bZxContract;
        bZxVault = _bZxVault;
        bZxOracle = _bZxOracle;
        loanTokenAddress = _loanTokenAddress;
        tokenizedRegistry = _tokenizedRegistry;

        name = _name;
        symbol = _symbol;
        decimals = EIP20(loanTokenAddress).decimals();

        spreadMultiplier = SafeMath.sub(10**20, IBZxOracle(_bZxOracle).interestFeePercent());

        initialPrice = 10**18; // starting price of 1

        isInitialized_ = true;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"assetBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimLoanToken","outputs":[{"name":"claimedAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"supplyInterestRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burntTokenReserved","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"borrowAmount","type":"uint256"},{"name":"leverageAmount","type":"uint256"},{"name":"collateralTokenAddress","type":"address"},{"name":"tradeTokenToFillAddress","type":"address"},{"name":"withdrawOnOpen","type":"bool"}],"name":"borrowToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setTokenizedRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalAssetBorrow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"escrowAmount","type":"uint256"},{"name":"leverageAmount","type":"uint256"},{"name":"tradeTokenToFillAddress","type":"address"},{"name":"withdrawOnOpen","type":"bool"}],"name":"borrowTokenFromEscrow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"loanOrderData","outputs":[{"name":"loanOrderHash","type":"bytes32"},{"name":"leverageAmount","type":"uint256"},{"name":"initialMarginAmount","type":"uint256"},{"name":"maintenanceMarginAmount","type":"uint256"},{"name":"maxDurationUnixTimestampSec","type":"uint256"},{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderParams","type":"uint256[4]"}],"name":"initLeverage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setBZxVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getLeverageList","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"leverageAmount","type":"uint256"}],"name":"removeLeverage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rateMultiplier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_baseRate","type":"uint256"},{"name":"_rateMultiplier","type":"uint256"}],"name":"setDemandCurve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"depositAmount","type":"uint256"}],"name":"mint","outputs":[{"name":"mintAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wethContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_bZxContract","type":"address"},{"name":"_bZxVault","type":"address"},{"name":"_bZxOracle","type":"address"},{"name":"_loanTokenAddress","type":"address"},{"name":"_tokenizedRegistry","type":"address"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenAddress","type":"address"}],"name":"donateAsset","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"marketLiquidity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"levergeAmount","type":"uint256"}],"name":"getLoanData","outputs":[{"components":[{"name":"loanOrderHash","type":"bytes32"},{"name":"leverageAmount","type":"uint256"},{"name":"initialMarginAmount","type":"uint256"},{"name":"maintenanceMarginAmount","type":"uint256"},{"name":"maxDurationUnixTimestampSec","type":"uint256"},{"name":"index","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalReservedSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"interestReceived","outputs":[{"name":"interestTotalAccrued","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"wrapEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenizedRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"burntTokenReserveList","outputs":[{"name":"lender","type":"address"},{"name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loanTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenPrice","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"leverageAmount","type":"uint256"}],"name":"getMaxEscrowAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"borrowInterestRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bZxVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"escrowAmount","type":"uint256"},{"name":"leverageAmount","type":"uint256"},{"name":"withdrawOnOpen","type":"bool"}],"name":"getBorrowAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newRate","type":"uint256"}],"name":"setInterestFeePercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalAssetSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bZxOracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bZxContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"leverageList","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"burnAmount","type":"uint256"}],"name":"burn","outputs":[{"name":"loanAmountPaid","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"setInitialPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setBZxOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"borrowAmount","type":"uint256"}],"name":"nextLoanInterestRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"borrower","type":"address"},{"name":"loanOrderHash","type":"bytes32"},{"name":"initialMarginAmount","type":"uint256"},{"name":"escrowAmount","type":"uint256"},{"name":"maxDuration","type":"uint256"},{"name":"tradeTokenToFillAddress","type":"address"}],"name":"rolloverPosition","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"components":[{"name":"loanTokenAddress","type":"address"},{"name":"interestTokenAddress","type":"address"},{"name":"collateralTokenAddress","type":"address"},{"name":"oracleAddress","type":"address"},{"name":"loanTokenAmount","type":"uint256"},{"name":"interestAmount","type":"uint256"},{"name":"initialMarginAmount","type":"uint256"},{"name":"maintenanceMarginAmount","type":"uint256"},{"name":"maxDurationUnixTimestampSec","type":"uint256"},{"name":"loanOrderHash","type":"bytes32"}],"name":"loanOrder","type":"tuple"},{"components":[{"name":"trader","type":"address"},{"name":"collateralTokenAddressFilled","type":"address"},{"name":"positionTokenAddressFilled","type":"address"},{"name":"loanTokenAmountFilled","type":"uint256"},{"name":"loanTokenAmountUsed","type":"uint256"},{"name":"collateralTokenAmountFilled","type":"uint256"},{"name":"positionTokenAmountFilled","type":"uint256"},{"name":"loanStartUnixTimestampSec","type":"uint256"},{"name":"loanEndUnixTimestampSec","type":"uint256"},{"name":"active","type":"bool"},{"name":"positionId","type":"uint256"}],"name":"loanPosition","type":"tuple"},{"name":"loanCloser","type":"address"},{"name":"closeAmount","type":"uint256"},{"name":"","type":"bool"}],"name":"closeLoanNotifier","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"spreadMultiplier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setBZxContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"checkpointPrice","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"burntTokenReserveListIndex","outputs":[{"name":"index","type":"uint256"},{"name":"isSet","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"loanOrderHashes","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"settleInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"minter","type":"address"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"assetAmount","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"assetAmount","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"borrower","type":"address"},{"indexed":false,"name":"borrowAmount","type":"uint256"},{"indexed":false,"name":"interestRate","type":"uint256"},{"indexed":false,"name":"collateralTokenAddress","type":"address"},{"indexed":false,"name":"tradeTokenToFillAddress","type":"address"},{"indexed":false,"name":"withdrawOnOpen","type":"bool"}],"name":"Borrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"claimant","type":"address"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"assetAmount","type":"uint256"},{"indexed":false,"name":"remainingTokenAmount","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405260016000818155600a805460ff19169055670de0b6b3a7640000600b5568021d3bd55e803c0000600c5560155580546001600160a01b03191633179055615c20806100506000396000f3fe6080604052600436106103c35760003560e01c806370a08231116101f25780639dc29fac1161010d578063d84d2a47116100a0578063f2fde38b1161006f578063f2fde38b14610aa0578063fbd9574d14610ac0578063fe05634214610aee578063ffda0a3714610b0e576103c3565b8063d84d2a4714610a2b578063dd62ed3e14610a40578063e54280e714610a60578063eebc508114610a80576103c3565b8063ac9fd2b8116100dc578063ac9fd2b8146109ab578063b32854fe146109cb578063cd4fa66d146109eb578063d73dd62314610a0b576103c3565b80639dc29fac1461092b5780639f4ba0ee1461094b578063a08074041461096b578063a9059cbb1461098b576103c3565b80638b9ce4191161018557806395d89b411161015457806395d89b41146108cc57806396c7871b146108e1578063995363d3146108f65780639b3a54d11461090b576103c3565b80638b9ce419146108625780638c9f7074146108825780638da5cb5b146108a25780638fb807c5146108b7576103c3565b80637ff9b596116101c15780637ff9b59614610803578063829b38f4146108185780638325a1c014610838578063894ca3081461084d576103c3565b806370a082311461078b578063736ee3d3146107ab5780637866c6c1146107c0578063797bf385146107ee576103c3565b80632c9e1885116102e2578063571f0910116102755780636618846311610244578063661884631461072c578063674d13c81461074c5780636dfd3c5a146107615780636f1296d214610776576103c3565b8063571f0910146106aa57806359e239af146106ca578063612ef80b146106ea578063622fe39f146106ff576103c3565b8063330691ac116102b1578063330691ac146106335780633660bef01461064857806340c10f19146106685780634780eac114610688576103c3565b80632c9e1885146105af5780632ecae90a146105cf578063313ce567146105f157806332a9a43b14610613576103c3565b8063191e2fc71161035a57806323b872dd1161032957806323b872dd1461051d578063247bbed71461053d5780632515aacd1461055d57806328ca651f1461058f576103c3565b8063191e2fc7146104be5780631d0806ae146104de5780631f68f20a146104f357806320f6d07c14610508576103c3565b806309ec6b6b1161039657806309ec6b6b1461045f5780630c4925fd146104745780631319b8801461048957806318160ddd146104a9576103c3565b806306b3efd6146103c557806306fdde03146103fb578063087fc48b1461041d578063095ea7b314610432575b005b3480156103d157600080fd5b506103e56103e036600461482c565b610b23565b6040516103f2919061578c565b60405180910390f35b34801561040757600080fd5b50610410610b65565b6040516103f2919061583e565b34801561042957600080fd5b506103e5610bf0565b34801561043e57600080fd5b5061045261044d366004614a42565b610c97565b6040516103f2919061577e565b34801561046b57600080fd5b506103e5610d02565b34801561048057600080fd5b506103e5610d5f565b34801561049557600080fd5b506103e56104a4366004614b83565b610d65565b3480156104b557600080fd5b506103e5610e98565b3480156104ca57600080fd5b506103c36104d936600461482c565b610e9e565b3480156104ea57600080fd5b506103e5610edd565b3480156104ff57600080fd5b506103e5610ee3565b34801561051457600080fd5b506103e5610ee9565b34801561052957600080fd5b5061045261053836600461496e565b610eef565b34801561054957600080fd5b506103e5610558366004614beb565b611017565b34801561056957600080fd5b5061057d610578366004614aae565b611194565b6040516103f2969594939291906157ef565b34801561059b57600080fd5b506103c36105aa366004614a72565b6111c9565b3480156105bb57600080fd5b506103c36105ca36600461482c565b61154f565b3480156105db57600080fd5b506105e4611588565b6040516103f2919061576d565b3480156105fd57600080fd5b506106066115e0565b6040516103f29190615a55565b34801561061f57600080fd5b506103c361062e366004614aae565b6115e9565b34801561063f57600080fd5b506103e5611721565b34801561065457600080fd5b506103c3610663366004614b64565b611727565b34801561067457600080fd5b506103e5610683366004614a42565b611775565b34801561069457600080fd5b5061069d611914565b6040516103f291906155c0565b3480156106b657600080fd5b506103c36106c53660046148a2565b611923565b3480156106d657600080fd5b506104526106e536600461482c565b611b38565b3480156106f657600080fd5b506103e5611c9d565b34801561070b57600080fd5b5061071f61071a366004614aae565b611d07565b6040516103f291906159cf565b34801561073857600080fd5b50610452610747366004614a42565b611d72565b34801561075857600080fd5b506103e5611e64565b34801561076d57600080fd5b506103e5611e91565b34801561078257600080fd5b506103c3611ed0565b34801561079757600080fd5b506103e56107a636600461482c565b611f3e565b3480156107b757600080fd5b5061069d611f59565b3480156107cc57600080fd5b506107e06107db366004614aae565b611f6d565b6040516103f292919061570e565b3480156107fa57600080fd5b5061069d611fa2565b34801561080f57600080fd5b506103e5611fb1565b34801561082457600080fd5b506103e5610833366004614aae565b612004565b34801561084457600080fd5b506103e56120a9565b34801561085957600080fd5b5061069d6120d4565b34801561086e57600080fd5b506103e561087d366004614c4c565b6120e3565b34801561088e57600080fd5b506103c361089d366004614aae565b6121a4565b3480156108ae57600080fd5b5061069d6121ea565b3480156108c357600080fd5b506103e56121f9565b3480156108d857600080fd5b50610410612243565b3480156108ed57600080fd5b5061069d61229e565b34801561090257600080fd5b5061069d6122ad565b34801561091757600080fd5b506103e5610926366004614aae565b6122c1565b34801561093757600080fd5b506103e5610946366004614a42565b6122df565b34801561095757600080fd5b506103c3610966366004614aae565b6123ce565b34801561097757600080fd5b506103c361098636600461482c565b61240d565b34801561099757600080fd5b506104526109a6366004614a42565b612446565b3480156109b757600080fd5b506103e56109c6366004614aae565b612546565b3480156109d757600080fd5b506103e56109e63660046149bb565b61263d565b3480156109f757600080fd5b50610452610a06366004614aea565b6126c7565b348015610a1757600080fd5b50610452610a26366004614a42565b6129cd565b348015610a3757600080fd5b506103e5612a59565b348015610a4c57600080fd5b506103e5610a5b366004614868565b612a5f565b348015610a6c57600080fd5b506103c3610a7b36600461482c565b612a8a565b348015610a8c57600080fd5b506103e5610a9b36600461482c565b612ac9565b348015610aac57600080fd5b506103c3610abb36600461482c565b612ae4565b348015610acc57600080fd5b50610ae0610adb36600461482c565b612b07565b6040516103f29291906159dd565b348015610afa57600080fd5b506103e5610b09366004614aae565b612b23565b348015610b1a57600080fd5b506103c3612b35565b6000610b5d670de0b6b3a7640000610b51610b3c611fb1565b610b4586611f3e565b9063ffffffff612b6e16565b9063ffffffff612b9316565b90505b919050565b6002805460408051602060018416156101000260001901909316849004601f81018490048402820184019092528181529291830182828015610be85780601f10610bbd57610100808354040283529160200191610be8565b820191906000526020600020905b815481529060010190602001808311610bcb57829003601f168201915b505050505081565b6000600160005414610c2057604051600160e51b62461bcd028152600401610c179061598f565b60405180910390fd5b6002600055610c2e33612ba6565b60115490915015610c8f57610c49610c44612fdf565b612ba6565b503360009081526012602052604090206001015460ff168015610c7757506014546001600160a01b03163314155b15610c8f57601480546001600160a01b031916331790555b600160005590565b336000818152601a602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610cf090869061578c565b60405180910390a35060015b92915050565b600080610d0d6121f9565b60155490915015610d5057610d48701d6329f1c35ca4bfabb9f5610000000000610b51600d54610b45610d3f86613044565b610b458761308d565b915050610d5c565b6000915050610d5c565b505b90565b60135481565b6000600160005414610d8c57604051600160e51b62461bcd028152600401610c179061598f565b600260005585610db157604051600160e51b62461bcd028152600401610c17906159bf565b6000858152600e6020526040902054610dc86143ae565b506000818152600f6020908152604091829020825160c08101845281548152600182015492810192909252600281015492820183905260038101546060830152600481015460808301526005015460a082015290610e3b57604051600160e51b62461bcd028152600401610c179061590f565b610e436130ed565b6000610e4e896131b3565b90506000610e6133858c858c8c8c613302565b905060008111610e8657604051600160e51b62461bcd028152600401610c179061587f565b60016000559998505050505050505050565b601b5490565b6001546001600160a01b03163314610eb557600080fd5b600a80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60185481565b600b5481565b60155481565b6000610efc8484846137ed565b506000610f07611fb1565b6001600160a01b03861660009081526012602052604090206001015490915060ff1680610f4b57506001600160a01b03851660009081526019602052604090205415155b15610f70576001600160a01b0385166000908152600960205260409020819055610f8a565b6001600160a01b0385166000908152600960205260408120555b6001600160a01b03841660009081526012602052604090206001015460ff1680610fcb57506001600160a01b03841660009081526019602052604090205415155b15610ff0576001600160a01b038416600090815260096020526040902081905561100a565b6001600160a01b0384166000908152600960205260408120555b60019150505b9392505050565b600060016000541461103e57604051600160e51b62461bcd028152600401610c179061598f565b60026000558461106357604051600160e51b62461bcd028152600401610c179061595f565b6000848152600e602052604090205461107a6143ae565b506000818152600f6020908152604091829020825160c08101845281548152600182015492810192909252600281015492820183905260038101546060830152600481015460808301526005015460a0820152906110ed57604051600160e51b62461bcd028152600401610c179061590f565b6110f56130ed565b600061112361111e8360400151610b5168056bc75e2d631000008c612b6e90919063ffffffff16565b6131b3565b9050600061113c83604001518a8486608001518a613987565b60085490915061115e9033908690849086906001600160a01b03168c8c613302565b90506000811161118357604051600160e51b62461bcd028152600401610c179061587f565b600160005598975050505050505050565b600f60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b6001546001600160a01b031633146111e057600080fd5b80516000908152600e60205260409020541561121157604051600160e51b62461bcd028152600401610c179061592f565b6112196143e7565b5060408051610100810182523081526008546001600160a01b0390811660208301819052928201929092526000606082018190526080820181905260065490921660a082015260c0810182905260e0810191909152611276614406565b60408051610160810182526000808252602082015290810184600160200201518152602001846002600481106112a857fe5b602002015181526020016000815260200160008152602001846003600481106112cd57fe5b6020020151815260200160008152602001600081526020016000815260200133426040516020016112ff92919061558e565b6040516020818303038152906040528051906020012060001c81525090506000600460019054906101000a90046001600160a01b03166001600160a01b03166317815f1d8484306040516020016113569190615579565b60408051601f198184030181529082905263ffffffff851660e01b8252611381939291600401615729565b602060405180830381600087803b15801561139b57600080fd5b505af11580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113d39190810190614acc565b60048054604051600160e01b63c8319c6102815292935061010090046001600160a01b03169163c8319c619161140e9185916002910161579a565b602060405180830381600087803b15801561142857600080fd5b505af115801561143c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114609190810190614a90565b506040805160c08101825282815285516020820152908101856001602002015181526020018560026004811061149257fe5b60200201518152602001856003600481106114a957fe5b60209081029190910151825260108054928201929092526000848152600f825260408082208551815585840151600180830191909155868301516002830155606087015160038301556080870151600483015560a09096015160059091015588518252600e90925290812093909355945185549182018655949091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67201929092555050565b6001546001600160a01b0316331461156657600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b606060108054806020026020016040519081016040528092919081815260200182805480156115d657602002820191906000526020600020905b8154815260200190600101908083116115c2575b5050505050905090565b60045460ff1681565b6001546001600160a01b0316331461160057600080fd5b6000818152600e60205260409020548061162f57604051600160e51b62461bcd028152600401610c179061585f565b601054600110156116cb576000818152600f602052604090206005015460108054600019810190811061165e57fe5b90600052602060002001546010828154811061167657fe5b906000526020600020018190555080600f6000600e60006010868154811061169a57fe5b9060005260206000200154815260200190815260200160002054815260200190815260200160002060050181905550505b60108054906116de906000198301614425565b506000918252600e60209081526040808420849055918352600f905281208181556001810182905560028101829055600381018290556004810182905560050155565b600c5481565b6001546001600160a01b0316331461173e57600080fd5b68056bc75e2d6310000061175f600b54600c546139de90919063ffffffff16565b111561176a57600080fd5b600b91909155600c55565b600060016000541461179c57604051600160e51b62461bcd028152600401610c179061598f565b6002600055816117c157604051600160e51b62461bcd028152600401610c179061593f565b601154156117ff576117d4610c44612fdf565b506117de83612ba6565b50336001600160a01b038416146117fa576117f833612ba6565b505b611807565b6118076130ed565b600061181b61181660006139eb565b613a51565b905061183981610b5185670de0b6b3a764000063ffffffff612b6e16565b600854604051600160e01b6323b872dd0281529193506001600160a01b0316906323b872dd90611871903390309088906004016155f7565b602060405180830381600087803b15801561188b57600080fd5b505af115801561189f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118c39190810190614a90565b6118e257604051600160e51b62461bcd028152600401610c17906159af565b6118ee84838584613a99565b6001600160a01b0390931660009081526009602052604081209390935560019092555090565b6007546001600160a01b031681565b6001546001600160a01b0316331461193a57600080fd5b600a5460ff161561196057604051600160e51b62461bcd028152600401610c17906158bf565b600480546001600160a01b03808a16610100908102610100600160a81b031993841617909355600580548a83166001600160a01b031991821617909155600680548a8416908316179055600880548984169216919091179055600a8054918716909302911617905581516119db90600290602085019061444e565b5080516119ef90600390602084019061444e565b50600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3e57600080fd5b505afa158015611a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a769190810190614ce4565b600460006101000a81548160ff021916908360ff160217905550611b1368056bc75e2d63100000866001600160a01b031663fe8925f46040518163ffffffff1660e01b815260040160206040518083038186803b158015611ad657600080fd5b505afa158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b0e9190810190614acc565b613b9a565b600d555050670de0b6b3a76400006018555050600a805460ff19166001179055505050565b6008546000906001600160a01b0383811691161415611b5957506000610b60565b604051600160e01b6370a082310281526000906001600160a01b038416906370a0823190611b8b9030906004016155ce565b60206040518083038186803b158015611ba357600080fd5b505afa158015611bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611bdb9190810190614acc565b905080611bec576000915050610b60565b600654604051600160e01b63a9059cbb0281526001600160a01b038581169263a9059cbb92611c239290911690859060040161570e565b602060405180830381600087803b158015611c3d57600080fd5b505af1158015611c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c759190810190614a90565b611c9457604051600160e51b62461bcd028152600401610c17906158af565b50600192915050565b600080611ca86121f9565b90506000611cb4611e64565b905080821115611cd557611cce828263ffffffff613b9a16565b9150611ce0565b600092505050610d5c565b601554821115611cd557601554611cfe90839063ffffffff613b9a16565b92505050610d5c565b611d0f6143ae565b506000908152600e60209081526040808320548352600f825291829020825160c08101845281548152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015260059091015460a082015290565b336000908152601a602090815260408083206001600160a01b0386168452909152812054808310611dc657336000908152601a602090815260408083206001600160a01b0388168452909152812055611dfb565b611dd6818463ffffffff613b9a16565b336000908152601a602090815260408083206001600160a01b03891684529091529020555b336000818152601a602090815260408083206001600160a01b0389168085529252918290205491519092917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591611e52919061578c565b60405180910390a35060019392505050565b6000611e8c670de0b6b3a7640000610b51611e7d611fb1565b6013549063ffffffff612b6e16565b905090565b6000806000611e9e613bac565b9250509150611ec968056bc75e2d63100000610b51600d54610b4585876139de90919063ffffffff16565b9250505090565b303115611f3c5760075460408051600160e41b630d0e30db02815290516001600160a01b039092169163d0e30db091303191600480830192600092919082900301818588803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b50505050505b565b6001600160a01b031660009081526019602052604090205490565b600a5461010090046001600160a01b031681565b60118181548110611f7a57fe5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b6008546001600160a01b031681565b60175460009081904214611ff257611fc7613bac565b600d54909350611fef925068056bc75e2d631000009150610b5190849063ffffffff612b6e16565b90505b611ffe611816826139eb565b91505090565b600061200e6143ae565b506000828152600e60209081526040808320548352600f825291829020825160c08101845281548152600182015492810192909252600281015492820183905260038101546060830152600481015460808301526005015460a08201529061207a576000915050610b60565b61101061209968056bc75e2d6310000083608001518460400151613c56565b610b518360400151610b45611c9d565b601554600090156120cb576120c46120bf6121f9565b61308d565b9050610d5c565b50600b54610d5c565b6005546001600160a01b031681565b6000836120f257506000611010565b6120fa6143ae565b506000838152600e60209081526040808320548352600f825291829020825160c08101845281548152600182015492810192909252600281015492820183905260038101546060830152600481015460808301526005015460a082015290612166576000915050611010565b604081015161219b90866121906109c683610b518468056bc75e2d6310000063ffffffff612b6e16565b846080015187613987565b95945050505050565b6001546001600160a01b031633146121bb57600080fd5b68056bc75e2d631000008111156121d157600080fd5b6121e468056bc75e2d6310000082613b9a565b600d5550565b6001546001600160a01b031681565b6017546000908190421461223a5761220f613bac565b600d54909350612237925068056bc75e2d631000009150610b5190849063ffffffff612b6e16565b90505b611ffe816139eb565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610be85780601f10610bbd57610100808354040283529160200191610be8565b6006546001600160a01b031681565b60045461010090046001600160a01b031681565b601081815481106122ce57fe5b600091825260209091200154905081565b600060016000541461230657604051600160e51b62461bcd028152600401610c179061598f565b60026000556123158383613ca1565b905080156123c357600854604051600160e01b63a9059cbb0281526001600160a01b039091169063a9059cbb90612352908690859060040161570e565b602060405180830381600087803b15801561236c57600080fd5b505af1158015612380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123a49190810190614a90565b6123c357604051600160e51b62461bcd028152600401610c17906159af565b600160005592915050565b6001546001600160a01b031633146123e557600080fd5b6000811161240857604051600160e51b62461bcd028152600401610c179061599f565b601855565b6001546001600160a01b0316331461242457600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60006124528383614018565b50600061245d611fb1565b3360009081526012602052604090206001015490915060ff168061248f57503360009081526019602052604090205415155b156124ab573360009081526009602052604090208190556124bc565b336000908152600960205260408120555b6001600160a01b03841660009081526012602052604090206001015460ff16806124fd57506001600160a01b03841660009081526019602052604090205415155b15612522576001600160a01b038416600090815260096020526040902081905561253c565b6001600160a01b0384166000908152600960205260408120555b5060019392505050565b6000811561263457601754600090421461258d57612562613bac565b600d5490935061258a925068056bc75e2d631000009150610b5190849063ffffffff612b6e16565b90505b600854604051600160e01b6370a082310281526000916126239184916001600160a01b0316906370a08231906125c79030906004016155ce565b60206040518083038186803b1580156125df57600080fd5b505afa1580156125f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126179190810190614acc565b9063ffffffff6139de16565b905080841115612631578093505b50505b610b5d826131b3565b600033301461266157604051600160e51b62461bcd028152600401610c179061596f565b600061268361111e87610b518868056bc75e2d6310000063ffffffff612b6e16565b90506000612695878784886000613987565b6008549091506126b8908a908a90849086906001600160a01b0316896000613302565b925050505b9695505050505050565b6006546000906001600160a01b031633146126f757604051600160e51b62461bcd028152600401610c17906158df565b6126ff6143ae565b50610120860180516000908152600f6020908152604091829020825160c081018452815480825260018301549382019390935260028201549381019390935260038101546060840152600481015460808401526005015460a08301529151909114156129c0578360155411612775576000612788565b601554612788908563ffffffff613b9a16565b601555601154156127a45761279e610c44612fdf565b506127ac565b6127ac6130ed565b836127bb57600191505061219b565b6127c560006139eb565b60165585516001600160a01b038681169116146129b657600a548651604051600160e41b630a95243102815260009261010090046001600160a01b03169163a95243109161281991906002906004016156f3565b60206040518083038186803b15801561283157600080fd5b505afa158015612845573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612869919081019061484a565b90506001600160a01b038116156129b4576008548751604051600160e01b6370a082310281526000926001600160a01b0316916370a08231916128af91906004016155c0565b60206040518083038186803b1580156128c757600080fd5b505afa1580156128db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128ff9190810190614acc565b905080156129b2576000305a8a516101208d015160408089015160808a0151915161293294939289918b906024016156a4565b60408051601f198184030181529181526020820180516001600160e01b0316600160e11b6359942a7f021790525161296a91906155b4565b60006040518083038160008787f1925050503d80600081146129a8576040519150601f19603f3d011682016040523d82523d6000602084013e6129ad565b606091505b505050505b505b505b600191505061219b565b5060009695505050505050565b336000908152601a602090815260408083206001600160a01b0386168452909152812054612a01908363ffffffff6139de16565b336000818152601a602090815260408083206001600160a01b038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591610cf0919061578c565b600d5481565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205490565b6001546001600160a01b03163314612aa157600080fd5b600480546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b031660009081526009602052604090205490565b6001546001600160a01b03163314612afb57600080fd5b612b0481614102565b50565b6012602052600090815260409020805460019091015460ff1682565b600e6020526000908152604090205481565b600160005414612b5a57604051600160e51b62461bcd028152600401610c179061598f565b6002600055612b676130ed565b6001600055565b600082612b7d57506000610cfc565b5081810281838281612b8b57fe5b0414610cfc57fe5b6000818381612b9e57fe5b049392505050565b6000612bb06130ed565b6001600160a01b03821660009081526012602052604090206001015460ff16612bdb57506000610b60565b6001600160a01b03821660009081526012602052604081205490612c01611816826139eb565b90506000612c42670de0b6b3a7640000610b518460118781548110612c2257fe5b906000526020600020906002020160010154612b6e90919063ffffffff16565b905080612c555760009350505050610b60565b600854604051600160e01b6370a082310281526000916001600160a01b0316906370a0823190612c899030906004016155ce565b60206040518083038186803b158015612ca157600080fd5b505afa158015612cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cd99190810190614acc565b905080612ced576000945050505050610b60565b6000818311612d265760118581548110612d0357fe5b9060005260206000209060020201600101549050612d218786614171565b612de4565b9091508190612d4784610b5184670de0b6b3a764000063ffffffff612b6e16565b905060118581548110612d5657fe5b906000526020600020906002020160010154612d7c600a836139de90919063ffffffff16565b1015612dda57612db38160118781548110612d9357fe5b906000526020600020906002020160010154613b9a90919063ffffffff16565b60118681548110612dc057fe5b906000526020600020906002020160010181905550612de4565b612de48786614171565b600854604051600160e01b63a9059cbb0281526001600160a01b039091169063a9059cbb90612e19908a90879060040161570e565b602060405180830381600087803b158015612e3357600080fd5b505af1158015612e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e6b9190810190614a90565b612e8a57604051600160e51b62461bcd028152600401610c17906159af565b6001600160a01b03871660009081526012602052604090206001015460ff1680612ecb57506001600160a01b03871660009081526019602052604090205415155b15612ef0576001600160a01b0387166000908152600960205260409020849055612f0a565b6001600160a01b0387166000908152600960205260408120555b8060135411612f1a576000612f2d565b601354612f2d908263ffffffff613b9a16565b6013556001600160a01b0387166000818152601260205260409020600101547f68e1caf97c4c29c1ac46024e9590f80b7a1f690d393703879cf66eea4e1e8421908390869060ff16612f80576000612fbb565b6001600160a01b038b16600090815260126020526040902054601180549091908110612fa857fe5b9060005260206000209060020201600101545b88604051612fcc94939291906157ba565b60405180910390a2509095945050505050565b6014546000906001600160a01b03161561300557506014546001600160a01b0316610d5c565b6011541561303c57601160008154811061301b57fe5b60009182526020909120600290910201546001600160a01b03169050610d5c565b506000610d5c565b6000806015541180156130575750600082115b156130855761307e82610b5168056bc75e2d63100000601554612b6e90919063ffffffff16565b9050610b60565b506000610b60565b600080600060155411156130e35760006130a5613bac565b509150506130db84610b51601654610b4561016d610b45601554610b5168056bc75e2d631000008a612b6e90919063ffffffff16565b915050610b5d565b50600b5492915050565b4260175414611f3c5760045460009061010090046001600160a01b03165a60065460085460405161312e926001600160a01b03908116921690602401615647565b60408051601f198184030181529181526020820180516001600160e01b0316600160e01b63327ab639021790525161316691906155b4565b60006040518083038160008787f1925050503d80600081146131a4576040519150601f19603f3d011682016040523d82523d6000602084013e6131a9565b606091505b5050426017555050565b6000806131be6121f9565b905060006131fa600085116131d45760006131f1565b6131f183610b518768056bc75e2d6310000063ffffffff612b6e16565b61261784613044565b600b54600c5491925090600090613217908363ffffffff6139de16565b90506804e1003b28d92800008311156132b357613243836804e1003b28d928000063ffffffff613b9a16565b9250678ac7230489e8000083111561326157678ac7230489e8000092505b6132776064610b5183605a63ffffffff612b6e16565b90506132ac81612617678ac7230489e80000610b5161329f68056bc75e2d6310000087613b9a565b889063ffffffff612b6e16565b94506132f9565b6132db600b5461261768056bc75e2d63100000610b51600c5488612b6e90919063ffffffff16565b9450818510156132ed578194506132f9565b808511156132f9578094505b50505050919050565b600085613311575060006137e2565b600854604051600160e01b6370a082310281526000916001600160a01b0316906370a08231906133459030906004016155ce565b60206040518083038186803b15801561335d57600080fd5b505afa158015613371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133959190810190614acc565b9050806133a65760009150506137e2565b60006133b0611e64565b9050808211156133d1576133ca828263ffffffff613b9a16565b91506133dc565b6000925050506137e2565b818811156133e8578197505b600854600554604051600160e11b636eb1769f0281526000926001600160a01b039081169263dd62ed3e9261342392309216906004016155dc565b60206040518083038186803b15801561343b57600080fd5b505afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134739190810190614acc565b9050888110156135da57801561352e57600854600554604051600160e01b63095ea7b30281526001600160a01b039283169263095ea7b3926134bd929116906000906004016156f3565b602060405180830381600087803b1580156134d757600080fd5b505af11580156134eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061350f9190810190614a90565b61352e57604051600160e51b62461bcd028152600401610c179061597f565b600854600554604051600160e01b63095ea7b30281526001600160a01b039283169263095ea7b392613569929116906000199060040161570e565b602060405180830381600087803b15801561358357600080fd5b505af1158015613597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506135bb9190810190614a90565b6135da57604051600160e51b62461bcd028152600401610c179061594f565b60045461010090046001600160a01b031663229e0b168b8b6135fe8c61016d612b93565b426001016040518563ffffffff1660e01b815260040161362194939291906157ba565b602060405180830381600087803b15801561363b57600080fd5b505af115801561364f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136739190810190614a90565b61369257604051600160e51b62461bcd028152600401610c17906158ff565b88600460019054906101000a90046001600160a01b03166001600160a01b03166395eb84c08d8d8b8e8c8c6040518763ffffffff1660e01b81526004016136de96959493929190615655565b602060405180830381600087803b1580156136f857600080fd5b505af115801561370c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137309190810190614acc565b1461375057604051600160e51b62461bcd028152600401610c179061589f565b601554613763908a63ffffffff6139de16565b60155561377060006139eb565b6016556011541561379257613786610c44612fdf565b506137908b612ba6565b505b8a6001600160a01b03167f86e15dd78cd784ab7788bcf5b96b9395e86030e048e5faedcfe752c700f6157e8a8a8a8a8a6040516137d39594939291906159f8565b60405180910390a28893505050505b979650505050505050565b6001600160a01b0383166000818152601a60209081526040808320338452825280832054938352601990915281205490919083111561384157604051600160e51b62461bcd028152600401610c179061591f565b8083111561386457604051600160e51b62461bcd028152600401610c179061586f565b6001600160a01b03841661388d57604051600160e51b62461bcd028152600401610c179061588f565b6001600160a01b0385166000908152601960205260409020546138b6908463ffffffff613b9a16565b6001600160a01b0380871660009081526019602052604080822093909355908616815220546138eb908463ffffffff6139de16565b6001600160a01b0385166000908152601960205260409020556000198110156139435761391e818463ffffffff613b9a16565b6001600160a01b0386166000908152601a602090815260408083203384529091529020555b836001600160a01b0316856001600160a01b0316600080516020615bc783398151915285604051613974919061578c565b60405180910390a3506001949350505050565b600081156139ab576139a88668056bc75e2d6310000063ffffffff6139de16565b95505b6126bd86610b516139bd87878b613c56565b610b5189701d6329f1c35ca4bfabb9f561000000000063ffffffff612b6e16565b81810182811015610cfc57fe5b600080613a05601354601b546139de90919063ffffffff16565b11613a11576000610b5d565b601554600854604051600160e01b6370a08231028152610b5d928592612617926001600160a01b03909116906370a08231906125c79030906004016155ce565b600080613a6b601354601b546139de90919063ffffffff16565b905060008111613a7d57601854611010565b61101081610b5185670de0b6b3a764000063ffffffff612b6e16565b6001600160a01b038416613ac257604051600160e51b62461bcd028152600401610c17906158cf565b601b54613ad5908463ffffffff6139de16565b601b556001600160a01b038416600090815260196020526040902054613b01908463ffffffff6139de16565b6001600160a01b038516600081815260196020526040908190209290925590517fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb90613b5290869086908690615a3a565b60405180910390a2836001600160a01b031660006001600160a01b0316600080516020615bc783398151915285604051613b8c919061578c565b60405180910390a350505050565b600082821115613ba657fe5b50900390565b60048054600654600854604051600160e31b63015216af028152600094859485946101009091046001600160a01b0390811694630a90b57894613bf8943094841693909216910161561f565b60806040518083038186803b158015613c1057600080fd5b505afa158015613c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c489190810190614c8f565b929690955091935090915050565b6000808311613c6e5768056bc75e2d63100000613c99565b613c9968056bc75e2d6310000061261784610b5187610b456301e13380838c8863ffffffff612b6e16565b949350505050565b6000808211613cc557604051600160e51b62461bcd028152600401610c179061584f565b613cce33611f3e565b821115613ce157613cde33611f3e565b91505b60115415613d1f57613cf4610c44612fdf565b50613cfe83612ba6565b50336001600160a01b03841614613d1a57613d1833612ba6565b505b613d27565b613d276130ed565b6000613d3661181660006139eb565b90506000613d56670de0b6b3a7640000610b51868563ffffffff612b6e16565b600854604051600160e01b6370a082310281529192506000916001600160a01b03909116906370a0823190613d8f9030906004016155ce565b60206040518083038186803b158015613da757600080fd5b505afa158015613dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613ddf9190810190614acc565b905081935080841115613fa7576000613dfe858363ffffffff613b9a16565b90506000613e1e85610b5184670de0b6b3a764000063ffffffff612b6e16565b601354909150613e34908263ffffffff6139de16565b6013556001600160a01b03881660009081526012602052604090206001015460ff1615613ed0576001600160a01b03881660009081526012602052604090205460118054613ea891849184908110613e8857fe5b9060005260206000209060020201600101546139de90919063ffffffff16565b60118281548110613eb557fe5b90600052602060002090600202016001018190555050613fa1565b6040805180820182526001600160a01b038a811680835260208084018681526011805460018082018355600083815297517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68600290930292830180546001600160a01b031916919098161790965591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c69909201919091558551808701875290546000190181528082018481529285526012909152939092209251835590519101805460ff19169115159190911790555b82955050505b613fb33386868661427f565b3360009081526012602052604090206001015460ff1680613fe257503360009081526019602052604090205415155b15613ffe5733600090815260096020526040902083905561400f565b336000908152600960205260408120555b50505092915050565b3360009081526019602052604081205482111561404a57604051600160e51b62461bcd028152600401610c179061591f565b6001600160a01b03831661407357604051600160e51b62461bcd028152600401610c179061588f565b33600090815260196020526040902054614093908363ffffffff613b9a16565b33600090815260196020526040808220929092556001600160a01b038516815220546140c5908363ffffffff6139de16565b6001600160a01b038416600081815260196020526040908190209290925590513390600080516020615bc783398151915290610cf090869061578c565b6001600160a01b03811661411557600080fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b601154600110156142235760118054600019810190811061418e57fe5b9060005260206000209060020201601182815481106141a957fe5b600091825260208220835460029092020180546001600160a01b0319166001600160a01b039092169190911781556001928301549201919091556011805483926012929091849081106141f857fe5b600091825260208083206002909202909101546001600160a01b031683528201929092526040019020555b60118054906142369060001983016144c8565b506001600160a01b038083166000818152601260205260408120908155600101805460ff19169055601454909116141561427b57601480546001600160a01b03191690555b5050565b6001600160a01b0384166000908152601960205260409020548311156142ba57604051600160e51b62461bcd028152600401610c17906158ef565b6001600160a01b0384166000908152601960205260409020546142e3908463ffffffff613b9a16565b6001600160a01b0385166000908152601960205260409020819055600a1061431f576001600160a01b0384166000908152601960205260408120555b601b54614332908463ffffffff613b9a16565b601b556040516001600160a01b038516907f743033787f4738ff4d6a7225ce2bd0977ee5f86b91a902a58f5e4d0b297b46449061437490869086908690615a3a565b60405180910390a260006001600160a01b0316846001600160a01b0316600080516020615bc783398151915285604051613b8c919061578c565b6040518060c001604052806000801916815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061010001604052806008906020820280388339509192915050565b604051806101600160405280600b906020820280388339509192915050565b815481835581811115614449576000838152602090206144499181019083016144f4565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061448f57805160ff19168380011785556144bc565b828001600101855582156144bc579182015b828111156144bc5782518255916020019190600101906144a1565b50610d5a9291506144f4565b81548183558181111561444957600202816002028360005260206000209182019101614449919061450e565b610d5c91905b80821115610d5a57600081556001016144fa565b610d5c91905b80821115610d5a5780546001600160a01b031916815560006001820155600201614514565b8035610cfc81615b97565b8051610cfc81615b97565b600082601f83011261456057600080fd5b600461457361456e82615a8a565b615a63565b9150818385602084028201111561458957600080fd5b60005b838110156145b5578161459f88826145d5565b845250602092830192919091019060010161458c565b5050505092915050565b8035610cfc81615bab565b8051610cfc81615bab565b8035610cfc81615bb4565b8051610cfc81615bb4565b600082601f8301126145fc57600080fd5b813561460a61456e82615aa8565b9150808252602083016020830185838301111561462657600080fd5b61400f838284615b3e565b6000610140828403121561464457600080fd5b61464f610140615a63565b9050600061465d8484614539565b825250602061466e84848301614539565b602083015250604061468284828501614539565b604083015250606061469684828501614539565b60608301525060806146aa848285016145d5565b60808301525060a06146be848285016145d5565b60a08301525060c06146d2848285016145d5565b60c08301525060e06146e6848285016145d5565b60e0830152506101006146fb848285016145d5565b61010083015250610120614711848285016145d5565b6101208301525092915050565b6000610160828403121561473157600080fd5b61473c610160615a63565b9050600061474a8484614539565b825250602061475b84848301614539565b602083015250604061476f84828501614539565b6040830152506060614783848285016145d5565b6060830152506080614797848285016145d5565b60808301525060a06147ab848285016145d5565b60a08301525060c06147bf848285016145d5565b60c08301525060e06147d3848285016145d5565b60e0830152506101006147e8848285016145d5565b610100830152506101206147fe848285016145bf565b61012083015250610140614814848285016145d5565b6101408301525092915050565b8051610cfc81615bbd565b60006020828403121561483e57600080fd5b6000613c998484614539565b60006020828403121561485c57600080fd5b6000613c998484614544565b6000806040838503121561487b57600080fd5b60006148878585614539565b925050602061489885828601614539565b9150509250929050565b600080600080600080600060e0888a0312156148bd57600080fd5b60006148c98a8a614539565b97505060206148da8a828b01614539565b96505060406148eb8a828b01614539565b95505060606148fc8a828b01614539565b945050608061490d8a828b01614539565b93505060a088013567ffffffffffffffff81111561492a57600080fd5b6149368a828b016145eb565b92505060c088013567ffffffffffffffff81111561495357600080fd5b61495f8a828b016145eb565b91505092959891949750929550565b60008060006060848603121561498357600080fd5b600061498f8686614539565b93505060206149a086828701614539565b92505060406149b1868287016145d5565b9150509250925092565b60008060008060008060c087890312156149d457600080fd5b60006149e08989614539565b96505060206149f189828a016145d5565b9550506040614a0289828a016145d5565b9450506060614a1389828a016145d5565b9350506080614a2489828a016145d5565b92505060a0614a3589828a01614539565b9150509295509295509295565b60008060408385031215614a5557600080fd5b6000614a618585614539565b9250506020614898858286016145d5565b600060808284031215614a8457600080fd5b6000613c99848461454f565b600060208284031215614aa257600080fd5b6000613c9984846145ca565b600060208284031215614ac057600080fd5b6000613c9984846145d5565b600060208284031215614ade57600080fd5b6000613c9984846145e0565b60008060008060006103008688031215614b0357600080fd5b6000614b0f8888614631565b955050610140614b218882890161471e565b9450506102a0614b3388828901614539565b9350506102c0614b45888289016145d5565b9250506102e0614b57888289016145bf565b9150509295509295909350565b60008060408385031215614b7757600080fd5b6000614a6185856145d5565b600080600080600060a08688031215614b9b57600080fd5b6000614ba788886145d5565b9550506020614bb8888289016145d5565b9450506040614bc988828901614539565b9350506060614bda88828901614539565b9250506080614b57888289016145bf565b60008060008060808587031215614c0157600080fd5b6000614c0d87876145d5565b9450506020614c1e878288016145d5565b9350506040614c2f87828801614539565b9250506060614c40878288016145bf565b91505092959194509250565b600080600060608486031215614c6157600080fd5b6000614c6d86866145d5565b9350506020614c7e868287016145d5565b92505060406149b1868287016145bf565b60008060008060808587031215614ca557600080fd5b6000614cb187876145e0565b9450506020614cc2878288016145e0565b9350506040614cd3878288016145e0565b9250506060614c40878288016145e0565b600060208284031215614cf657600080fd5b6000613c998484614821565b6000614d0e8383614d42565b505060200190565b6000614d0e8383614e4d565b614d2b81615b1d565b82525050565b614d2b614d3d82615afb565b615b76565b614d2b81615afb565b614d5481615ae2565b614d5e8184610b60565b9250614d6982610d5c565b8060005b83811015614d97578151614d818782614d02565b9650614d8c83615ad0565b925050600101614d6d565b505050505050565b614da881615ae8565b614db28184610b60565b9250614dbd82610d5c565b8060005b83811015614d97578151614dd58782614d16565b9650614de083615ad0565b925050600101614dc1565b6000614df682615aee565b614e008185615af2565b9350614e0b83615ad0565b8060005b83811015614e39578151614e238882614d16565b9750614e2e83615ad0565b925050600101614e0f565b509495945050505050565b614d2b81615b06565b614d2b81610d5c565b6000614e6182615aee565b614e6b8185615af2565b9350614e7b818560208601615b4a565b614e8481615b87565b9093019392505050565b6000614e9982615aee565b614ea38185610b60565b9350614eb3818560208601615b4a565b9290920192915050565b614d2b81615b28565b600081546001811660008114614ee35760018114614f0957614f48565b607f6002830416614ef48187615af2565b60ff1984168152955050602085019250614f48565b60028204614f178187615af2565b9550614f2285615ad6565b60005b82811015614f4157815488820152600190910190602001614f25565b8701945050505b505092915050565b6000614f5d600f83615af2565b7f6275726e416d6f756e74203d3d20300000000000000000000000000000000000815260200192915050565b6000614f96601a83615af2565b7f6c65766572616765416d6f756e74206e6f7420646566696e6564000000000000815260200192915050565b6000614fcf601683615af2565b7f696e73756666696369656e7420616c6c6f77616e636500000000000000000000815260200192915050565b6000615008601083615af2565b7f756e61626c6520746f20626f72726f7700000000000000000000000000000000815260200192915050565b6000615041601683615af2565b7f746f6b656e206275726e206e6f7420616c6c6f77656400000000000000000000815260200192915050565b600061507a602d83615af2565b7f74616b654c6f616e4f726465724f6e436861696e41735472616465724279446581527f6c6567617465206661696c656400000000000000000000000000000000000000602082015260400192915050565b60006150d9602083615af2565b7f7472616e73666572206f6620746f6b656e2062616c616e6365206661696c6564815260200192915050565b6000615112601383615af2565b7f616c726561647920696e697469616c697a656400000000000000000000000000815260200192915050565b600061514b600f83615af2565b7f696e76616c696420616464726573730000000000000000000000000000000000815260200192915050565b6000615184601383615af2565b7f6f6e6c79204f7261636c6520616c6c6f77656400000000000000000000000000815260200192915050565b60006151bd601a83615af2565b7f6275726e2076616c756520657863656564732062616c616e6365000000000000815260200192915050565b60006151f6601983615af2565b7f7570646174654c6f616e41734c656e646572206661696c656400000000000000815260200192915050565b600061522f601783615af2565b7f696e76616c6964206c6576657261676520616d6f756e74000000000000000000815260200192915050565b6000615268601483615af2565b7f696e73756666696369656e742062616c616e6365000000000000000000000000815260200192915050565b60006152a1601e83615af2565b7f6c65766572616765416d6f756e7420616c726561647920646566696e65640000815260200192915050565b60006152da601283615af2565b7f6465706f736974416d6f756e74203d3d20300000000000000000000000000000815260200192915050565b6000615313601c83615af2565b7f617070726f76616c206f66206c6f616e546f6b656e206661696c656400000000815260200192915050565b600061534c601183615af2565b7f657363726f77416d6f756e74203d3d2030000000000000000000000000000000815260200192915050565b6000615385600f83615af2565b7f73656e646572206e6f742073656c660000000000000000000000000000000000815260200192915050565b6000610cfc600083615af2565b60006153cb602283615af2565b7f617070726f76616c207265736574206f66206c6f616e546f6b656e206661696c8152600160f21b61195902602082015260400192915050565b6000615412600c83615af2565b7f6e6f6e5265656e7472616e740000000000000000000000000000000000000000815260200192915050565b600061544b601083615af2565b7f76616c75652063616e2774206265203000000000000000000000000000000000815260200192915050565b6000615484601c83615af2565b7f7472616e73666572206f66206c6f616e546f6b656e206661696c656400000000815260200192915050565b60006154bd601183615af2565b7f626f72726f77416d6f756e74203d3d2030000000000000000000000000000000815260200192915050565b805160c08301906154fa8482614e4d565b50602082015161550d6020850182614e4d565b5060408201516155206040850182614e4d565b5060608201516155336060850182614e4d565b5060808201516155466080850182614e4d565b5060a082015161555960a0850182614e4d565b50505050565b614d2b61556b82610d5c565b610d5c565b614d2b81615b17565b60006155858284614d31565b50601401919050565b600061559a8285614d31565b6014820191506155aa828461555f565b5060200192915050565b60006110108284614e8e565b60208101610cfc8284614d42565b60208101610cfc8284614d22565b604081016155ea8285614d22565b6110106020830184614d42565b606081016156058286614d22565b6156126020830185614d22565b613c996040830184614e4d565b6060810161562d8286614d22565b61563a6020830185614d42565b613c996040830184614d42565b604081016155ea8285614d42565b60c081016156638289614d42565b6156706020830188614e4d565b61567d6040830187614d42565b61568a6060830186614e4d565b6156976080830185614d42565b6137e260a0830184614e44565b60c081016156b28289614d42565b6156bf6020830188614e4d565b6156cc6040830187614e4d565b6156d96060830186614e4d565b6156e66080830185614e4d565b6137e260a0830184614d42565b604081016157018285614d42565b6110106020830184614ebd565b6040810161571c8285614d42565b6110106020830184614e4d565b6102a081016157388286614d4b565b615746610100830185614d9f565b8181036102608301526157598184614e56565b905081810361028083015261219b816153b1565b602080825281016110108184614deb565b60208101610cfc8284614e44565b60208101610cfc8284614e4d565b604081016157a88285614e4d565b8181036020830152613c998184614ec6565b608081016157c88287614e4d565b6157d56020830186614e4d565b6157e26040830185614e4d565b61219b6060830184614e4d565b60c081016157fd8289614e4d565b61580a6020830188614e4d565b6158176040830187614e4d565b6158246060830186614e4d565b6158316080830185614e4d565b6137e260a0830184614e4d565b602080825281016110108184614e56565b60208082528101610b5d81614f50565b60208082528101610b5d81614f89565b60208082528101610b5d81614fc2565b60208082528101610b5d81614ffb565b60208082528101610b5d81615034565b60208082528101610b5d8161506d565b60208082528101610b5d816150cc565b60208082528101610b5d81615105565b60208082528101610b5d8161513e565b60208082528101610b5d81615177565b60208082528101610b5d816151b0565b60208082528101610b5d816151e9565b60208082528101610b5d81615222565b60208082528101610b5d8161525b565b60208082528101610b5d81615294565b60208082528101610b5d816152cd565b60208082528101610b5d81615306565b60208082528101610b5d8161533f565b60208082528101610b5d81615378565b60208082528101610b5d816153be565b60208082528101610b5d81615405565b60208082528101610b5d8161543e565b60208082528101610b5d81615477565b60208082528101610b5d816154b0565b60c08101610cfc82846154e9565b604081016159eb8285614e4d565b6110106020830184614e44565b60a08101615a068288614e4d565b615a136020830187614e4d565b615a206040830186614d42565b615a2d6060830185614d42565b6126bd6080830184614e44565b60608101615a488286614e4d565b6156126020830185614e4d565b60208101610cfc8284615570565b60405181810167ffffffffffffffff81118282101715615a8257600080fd5b604052919050565b600067ffffffffffffffff821115615aa157600080fd5b5060200290565b600067ffffffffffffffff821115615abf57600080fd5b506020601f91909101601f19160190565b60200190565b60009081526020902090565b50600890565b50600b90565b5190565b90815260200190565b6000610b5d82615b0b565b151590565b6001600160a01b031690565b60ff1690565b6000610b5d82615b33565b6000610b5d82610d5c565b6000610b5d82615afb565b82818337506000910152565b60005b83811015615b65578181015183820152602001615b4d565b838111156155595750506000910152565b6000610b5d826000610b5d82615b91565b601f01601f191690565b60601b90565b615ba081615afb565b8114612b0457600080fd5b615ba081615b06565b615ba081610d5c565b615ba081615b1756feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa265627a7a72305820122ea82348615938dc9aef2e1e7a7a9b0243b84270c3ad0bd802796374920cc46c6578706572696d656e74616cf50037

Deployed Bytecode

0x6080604052600436106103c35760003560e01c806370a08231116101f25780639dc29fac1161010d578063d84d2a47116100a0578063f2fde38b1161006f578063f2fde38b14610aa0578063fbd9574d14610ac0578063fe05634214610aee578063ffda0a3714610b0e576103c3565b8063d84d2a4714610a2b578063dd62ed3e14610a40578063e54280e714610a60578063eebc508114610a80576103c3565b8063ac9fd2b8116100dc578063ac9fd2b8146109ab578063b32854fe146109cb578063cd4fa66d146109eb578063d73dd62314610a0b576103c3565b80639dc29fac1461092b5780639f4ba0ee1461094b578063a08074041461096b578063a9059cbb1461098b576103c3565b80638b9ce4191161018557806395d89b411161015457806395d89b41146108cc57806396c7871b146108e1578063995363d3146108f65780639b3a54d11461090b576103c3565b80638b9ce419146108625780638c9f7074146108825780638da5cb5b146108a25780638fb807c5146108b7576103c3565b80637ff9b596116101c15780637ff9b59614610803578063829b38f4146108185780638325a1c014610838578063894ca3081461084d576103c3565b806370a082311461078b578063736ee3d3146107ab5780637866c6c1146107c0578063797bf385146107ee576103c3565b80632c9e1885116102e2578063571f0910116102755780636618846311610244578063661884631461072c578063674d13c81461074c5780636dfd3c5a146107615780636f1296d214610776576103c3565b8063571f0910146106aa57806359e239af146106ca578063612ef80b146106ea578063622fe39f146106ff576103c3565b8063330691ac116102b1578063330691ac146106335780633660bef01461064857806340c10f19146106685780634780eac114610688576103c3565b80632c9e1885146105af5780632ecae90a146105cf578063313ce567146105f157806332a9a43b14610613576103c3565b8063191e2fc71161035a57806323b872dd1161032957806323b872dd1461051d578063247bbed71461053d5780632515aacd1461055d57806328ca651f1461058f576103c3565b8063191e2fc7146104be5780631d0806ae146104de5780631f68f20a146104f357806320f6d07c14610508576103c3565b806309ec6b6b1161039657806309ec6b6b1461045f5780630c4925fd146104745780631319b8801461048957806318160ddd146104a9576103c3565b806306b3efd6146103c557806306fdde03146103fb578063087fc48b1461041d578063095ea7b314610432575b005b3480156103d157600080fd5b506103e56103e036600461482c565b610b23565b6040516103f2919061578c565b60405180910390f35b34801561040757600080fd5b50610410610b65565b6040516103f2919061583e565b34801561042957600080fd5b506103e5610bf0565b34801561043e57600080fd5b5061045261044d366004614a42565b610c97565b6040516103f2919061577e565b34801561046b57600080fd5b506103e5610d02565b34801561048057600080fd5b506103e5610d5f565b34801561049557600080fd5b506103e56104a4366004614b83565b610d65565b3480156104b557600080fd5b506103e5610e98565b3480156104ca57600080fd5b506103c36104d936600461482c565b610e9e565b3480156104ea57600080fd5b506103e5610edd565b3480156104ff57600080fd5b506103e5610ee3565b34801561051457600080fd5b506103e5610ee9565b34801561052957600080fd5b5061045261053836600461496e565b610eef565b34801561054957600080fd5b506103e5610558366004614beb565b611017565b34801561056957600080fd5b5061057d610578366004614aae565b611194565b6040516103f2969594939291906157ef565b34801561059b57600080fd5b506103c36105aa366004614a72565b6111c9565b3480156105bb57600080fd5b506103c36105ca36600461482c565b61154f565b3480156105db57600080fd5b506105e4611588565b6040516103f2919061576d565b3480156105fd57600080fd5b506106066115e0565b6040516103f29190615a55565b34801561061f57600080fd5b506103c361062e366004614aae565b6115e9565b34801561063f57600080fd5b506103e5611721565b34801561065457600080fd5b506103c3610663366004614b64565b611727565b34801561067457600080fd5b506103e5610683366004614a42565b611775565b34801561069457600080fd5b5061069d611914565b6040516103f291906155c0565b3480156106b657600080fd5b506103c36106c53660046148a2565b611923565b3480156106d657600080fd5b506104526106e536600461482c565b611b38565b3480156106f657600080fd5b506103e5611c9d565b34801561070b57600080fd5b5061071f61071a366004614aae565b611d07565b6040516103f291906159cf565b34801561073857600080fd5b50610452610747366004614a42565b611d72565b34801561075857600080fd5b506103e5611e64565b34801561076d57600080fd5b506103e5611e91565b34801561078257600080fd5b506103c3611ed0565b34801561079757600080fd5b506103e56107a636600461482c565b611f3e565b3480156107b757600080fd5b5061069d611f59565b3480156107cc57600080fd5b506107e06107db366004614aae565b611f6d565b6040516103f292919061570e565b3480156107fa57600080fd5b5061069d611fa2565b34801561080f57600080fd5b506103e5611fb1565b34801561082457600080fd5b506103e5610833366004614aae565b612004565b34801561084457600080fd5b506103e56120a9565b34801561085957600080fd5b5061069d6120d4565b34801561086e57600080fd5b506103e561087d366004614c4c565b6120e3565b34801561088e57600080fd5b506103c361089d366004614aae565b6121a4565b3480156108ae57600080fd5b5061069d6121ea565b3480156108c357600080fd5b506103e56121f9565b3480156108d857600080fd5b50610410612243565b3480156108ed57600080fd5b5061069d61229e565b34801561090257600080fd5b5061069d6122ad565b34801561091757600080fd5b506103e5610926366004614aae565b6122c1565b34801561093757600080fd5b506103e5610946366004614a42565b6122df565b34801561095757600080fd5b506103c3610966366004614aae565b6123ce565b34801561097757600080fd5b506103c361098636600461482c565b61240d565b34801561099757600080fd5b506104526109a6366004614a42565b612446565b3480156109b757600080fd5b506103e56109c6366004614aae565b612546565b3480156109d757600080fd5b506103e56109e63660046149bb565b61263d565b3480156109f757600080fd5b50610452610a06366004614aea565b6126c7565b348015610a1757600080fd5b50610452610a26366004614a42565b6129cd565b348015610a3757600080fd5b506103e5612a59565b348015610a4c57600080fd5b506103e5610a5b366004614868565b612a5f565b348015610a6c57600080fd5b506103c3610a7b36600461482c565b612a8a565b348015610a8c57600080fd5b506103e5610a9b36600461482c565b612ac9565b348015610aac57600080fd5b506103c3610abb36600461482c565b612ae4565b348015610acc57600080fd5b50610ae0610adb36600461482c565b612b07565b6040516103f29291906159dd565b348015610afa57600080fd5b506103e5610b09366004614aae565b612b23565b348015610b1a57600080fd5b506103c3612b35565b6000610b5d670de0b6b3a7640000610b51610b3c611fb1565b610b4586611f3e565b9063ffffffff612b6e16565b9063ffffffff612b9316565b90505b919050565b6002805460408051602060018416156101000260001901909316849004601f81018490048402820184019092528181529291830182828015610be85780601f10610bbd57610100808354040283529160200191610be8565b820191906000526020600020905b815481529060010190602001808311610bcb57829003601f168201915b505050505081565b6000600160005414610c2057604051600160e51b62461bcd028152600401610c179061598f565b60405180910390fd5b6002600055610c2e33612ba6565b60115490915015610c8f57610c49610c44612fdf565b612ba6565b503360009081526012602052604090206001015460ff168015610c7757506014546001600160a01b03163314155b15610c8f57601480546001600160a01b031916331790555b600160005590565b336000818152601a602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610cf090869061578c565b60405180910390a35060015b92915050565b600080610d0d6121f9565b60155490915015610d5057610d48701d6329f1c35ca4bfabb9f5610000000000610b51600d54610b45610d3f86613044565b610b458761308d565b915050610d5c565b6000915050610d5c565b505b90565b60135481565b6000600160005414610d8c57604051600160e51b62461bcd028152600401610c179061598f565b600260005585610db157604051600160e51b62461bcd028152600401610c17906159bf565b6000858152600e6020526040902054610dc86143ae565b506000818152600f6020908152604091829020825160c08101845281548152600182015492810192909252600281015492820183905260038101546060830152600481015460808301526005015460a082015290610e3b57604051600160e51b62461bcd028152600401610c179061590f565b610e436130ed565b6000610e4e896131b3565b90506000610e6133858c858c8c8c613302565b905060008111610e8657604051600160e51b62461bcd028152600401610c179061587f565b60016000559998505050505050505050565b601b5490565b6001546001600160a01b03163314610eb557600080fd5b600a80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60185481565b600b5481565b60155481565b6000610efc8484846137ed565b506000610f07611fb1565b6001600160a01b03861660009081526012602052604090206001015490915060ff1680610f4b57506001600160a01b03851660009081526019602052604090205415155b15610f70576001600160a01b0385166000908152600960205260409020819055610f8a565b6001600160a01b0385166000908152600960205260408120555b6001600160a01b03841660009081526012602052604090206001015460ff1680610fcb57506001600160a01b03841660009081526019602052604090205415155b15610ff0576001600160a01b038416600090815260096020526040902081905561100a565b6001600160a01b0384166000908152600960205260408120555b60019150505b9392505050565b600060016000541461103e57604051600160e51b62461bcd028152600401610c179061598f565b60026000558461106357604051600160e51b62461bcd028152600401610c179061595f565b6000848152600e602052604090205461107a6143ae565b506000818152600f6020908152604091829020825160c08101845281548152600182015492810192909252600281015492820183905260038101546060830152600481015460808301526005015460a0820152906110ed57604051600160e51b62461bcd028152600401610c179061590f565b6110f56130ed565b600061112361111e8360400151610b5168056bc75e2d631000008c612b6e90919063ffffffff16565b6131b3565b9050600061113c83604001518a8486608001518a613987565b60085490915061115e9033908690849086906001600160a01b03168c8c613302565b90506000811161118357604051600160e51b62461bcd028152600401610c179061587f565b600160005598975050505050505050565b600f60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b6001546001600160a01b031633146111e057600080fd5b80516000908152600e60205260409020541561121157604051600160e51b62461bcd028152600401610c179061592f565b6112196143e7565b5060408051610100810182523081526008546001600160a01b0390811660208301819052928201929092526000606082018190526080820181905260065490921660a082015260c0810182905260e0810191909152611276614406565b60408051610160810182526000808252602082015290810184600160200201518152602001846002600481106112a857fe5b602002015181526020016000815260200160008152602001846003600481106112cd57fe5b6020020151815260200160008152602001600081526020016000815260200133426040516020016112ff92919061558e565b6040516020818303038152906040528051906020012060001c81525090506000600460019054906101000a90046001600160a01b03166001600160a01b03166317815f1d8484306040516020016113569190615579565b60408051601f198184030181529082905263ffffffff851660e01b8252611381939291600401615729565b602060405180830381600087803b15801561139b57600080fd5b505af11580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113d39190810190614acc565b60048054604051600160e01b63c8319c6102815292935061010090046001600160a01b03169163c8319c619161140e9185916002910161579a565b602060405180830381600087803b15801561142857600080fd5b505af115801561143c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114609190810190614a90565b506040805160c08101825282815285516020820152908101856001602002015181526020018560026004811061149257fe5b60200201518152602001856003600481106114a957fe5b60209081029190910151825260108054928201929092526000848152600f825260408082208551815585840151600180830191909155868301516002830155606087015160038301556080870151600483015560a09096015160059091015588518252600e90925290812093909355945185549182018655949091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67201929092555050565b6001546001600160a01b0316331461156657600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b606060108054806020026020016040519081016040528092919081815260200182805480156115d657602002820191906000526020600020905b8154815260200190600101908083116115c2575b5050505050905090565b60045460ff1681565b6001546001600160a01b0316331461160057600080fd5b6000818152600e60205260409020548061162f57604051600160e51b62461bcd028152600401610c179061585f565b601054600110156116cb576000818152600f602052604090206005015460108054600019810190811061165e57fe5b90600052602060002001546010828154811061167657fe5b906000526020600020018190555080600f6000600e60006010868154811061169a57fe5b9060005260206000200154815260200190815260200160002054815260200190815260200160002060050181905550505b60108054906116de906000198301614425565b506000918252600e60209081526040808420849055918352600f905281208181556001810182905560028101829055600381018290556004810182905560050155565b600c5481565b6001546001600160a01b0316331461173e57600080fd5b68056bc75e2d6310000061175f600b54600c546139de90919063ffffffff16565b111561176a57600080fd5b600b91909155600c55565b600060016000541461179c57604051600160e51b62461bcd028152600401610c179061598f565b6002600055816117c157604051600160e51b62461bcd028152600401610c179061593f565b601154156117ff576117d4610c44612fdf565b506117de83612ba6565b50336001600160a01b038416146117fa576117f833612ba6565b505b611807565b6118076130ed565b600061181b61181660006139eb565b613a51565b905061183981610b5185670de0b6b3a764000063ffffffff612b6e16565b600854604051600160e01b6323b872dd0281529193506001600160a01b0316906323b872dd90611871903390309088906004016155f7565b602060405180830381600087803b15801561188b57600080fd5b505af115801561189f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118c39190810190614a90565b6118e257604051600160e51b62461bcd028152600401610c17906159af565b6118ee84838584613a99565b6001600160a01b0390931660009081526009602052604081209390935560019092555090565b6007546001600160a01b031681565b6001546001600160a01b0316331461193a57600080fd5b600a5460ff161561196057604051600160e51b62461bcd028152600401610c17906158bf565b600480546001600160a01b03808a16610100908102610100600160a81b031993841617909355600580548a83166001600160a01b031991821617909155600680548a8416908316179055600880548984169216919091179055600a8054918716909302911617905581516119db90600290602085019061444e565b5080516119ef90600390602084019061444e565b50600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3e57600080fd5b505afa158015611a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a769190810190614ce4565b600460006101000a81548160ff021916908360ff160217905550611b1368056bc75e2d63100000866001600160a01b031663fe8925f46040518163ffffffff1660e01b815260040160206040518083038186803b158015611ad657600080fd5b505afa158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b0e9190810190614acc565b613b9a565b600d555050670de0b6b3a76400006018555050600a805460ff19166001179055505050565b6008546000906001600160a01b0383811691161415611b5957506000610b60565b604051600160e01b6370a082310281526000906001600160a01b038416906370a0823190611b8b9030906004016155ce565b60206040518083038186803b158015611ba357600080fd5b505afa158015611bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611bdb9190810190614acc565b905080611bec576000915050610b60565b600654604051600160e01b63a9059cbb0281526001600160a01b038581169263a9059cbb92611c239290911690859060040161570e565b602060405180830381600087803b158015611c3d57600080fd5b505af1158015611c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c759190810190614a90565b611c9457604051600160e51b62461bcd028152600401610c17906158af565b50600192915050565b600080611ca86121f9565b90506000611cb4611e64565b905080821115611cd557611cce828263ffffffff613b9a16565b9150611ce0565b600092505050610d5c565b601554821115611cd557601554611cfe90839063ffffffff613b9a16565b92505050610d5c565b611d0f6143ae565b506000908152600e60209081526040808320548352600f825291829020825160c08101845281548152600182015492810192909252600281015492820192909252600382015460608201526004820154608082015260059091015460a082015290565b336000908152601a602090815260408083206001600160a01b0386168452909152812054808310611dc657336000908152601a602090815260408083206001600160a01b0388168452909152812055611dfb565b611dd6818463ffffffff613b9a16565b336000908152601a602090815260408083206001600160a01b03891684529091529020555b336000818152601a602090815260408083206001600160a01b0389168085529252918290205491519092917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591611e52919061578c565b60405180910390a35060019392505050565b6000611e8c670de0b6b3a7640000610b51611e7d611fb1565b6013549063ffffffff612b6e16565b905090565b6000806000611e9e613bac565b9250509150611ec968056bc75e2d63100000610b51600d54610b4585876139de90919063ffffffff16565b9250505090565b303115611f3c5760075460408051600160e41b630d0e30db02815290516001600160a01b039092169163d0e30db091303191600480830192600092919082900301818588803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b50505050505b565b6001600160a01b031660009081526019602052604090205490565b600a5461010090046001600160a01b031681565b60118181548110611f7a57fe5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b6008546001600160a01b031681565b60175460009081904214611ff257611fc7613bac565b600d54909350611fef925068056bc75e2d631000009150610b5190849063ffffffff612b6e16565b90505b611ffe611816826139eb565b91505090565b600061200e6143ae565b506000828152600e60209081526040808320548352600f825291829020825160c08101845281548152600182015492810192909252600281015492820183905260038101546060830152600481015460808301526005015460a08201529061207a576000915050610b60565b61101061209968056bc75e2d6310000083608001518460400151613c56565b610b518360400151610b45611c9d565b601554600090156120cb576120c46120bf6121f9565b61308d565b9050610d5c565b50600b54610d5c565b6005546001600160a01b031681565b6000836120f257506000611010565b6120fa6143ae565b506000838152600e60209081526040808320548352600f825291829020825160c08101845281548152600182015492810192909252600281015492820183905260038101546060830152600481015460808301526005015460a082015290612166576000915050611010565b604081015161219b90866121906109c683610b518468056bc75e2d6310000063ffffffff612b6e16565b846080015187613987565b95945050505050565b6001546001600160a01b031633146121bb57600080fd5b68056bc75e2d631000008111156121d157600080fd5b6121e468056bc75e2d6310000082613b9a565b600d5550565b6001546001600160a01b031681565b6017546000908190421461223a5761220f613bac565b600d54909350612237925068056bc75e2d631000009150610b5190849063ffffffff612b6e16565b90505b611ffe816139eb565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610be85780601f10610bbd57610100808354040283529160200191610be8565b6006546001600160a01b031681565b60045461010090046001600160a01b031681565b601081815481106122ce57fe5b600091825260209091200154905081565b600060016000541461230657604051600160e51b62461bcd028152600401610c179061598f565b60026000556123158383613ca1565b905080156123c357600854604051600160e01b63a9059cbb0281526001600160a01b039091169063a9059cbb90612352908690859060040161570e565b602060405180830381600087803b15801561236c57600080fd5b505af1158015612380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123a49190810190614a90565b6123c357604051600160e51b62461bcd028152600401610c17906159af565b600160005592915050565b6001546001600160a01b031633146123e557600080fd5b6000811161240857604051600160e51b62461bcd028152600401610c179061599f565b601855565b6001546001600160a01b0316331461242457600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60006124528383614018565b50600061245d611fb1565b3360009081526012602052604090206001015490915060ff168061248f57503360009081526019602052604090205415155b156124ab573360009081526009602052604090208190556124bc565b336000908152600960205260408120555b6001600160a01b03841660009081526012602052604090206001015460ff16806124fd57506001600160a01b03841660009081526019602052604090205415155b15612522576001600160a01b038416600090815260096020526040902081905561253c565b6001600160a01b0384166000908152600960205260408120555b5060019392505050565b6000811561263457601754600090421461258d57612562613bac565b600d5490935061258a925068056bc75e2d631000009150610b5190849063ffffffff612b6e16565b90505b600854604051600160e01b6370a082310281526000916126239184916001600160a01b0316906370a08231906125c79030906004016155ce565b60206040518083038186803b1580156125df57600080fd5b505afa1580156125f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126179190810190614acc565b9063ffffffff6139de16565b905080841115612631578093505b50505b610b5d826131b3565b600033301461266157604051600160e51b62461bcd028152600401610c179061596f565b600061268361111e87610b518868056bc75e2d6310000063ffffffff612b6e16565b90506000612695878784886000613987565b6008549091506126b8908a908a90849086906001600160a01b0316896000613302565b925050505b9695505050505050565b6006546000906001600160a01b031633146126f757604051600160e51b62461bcd028152600401610c17906158df565b6126ff6143ae565b50610120860180516000908152600f6020908152604091829020825160c081018452815480825260018301549382019390935260028201549381019390935260038101546060840152600481015460808401526005015460a08301529151909114156129c0578360155411612775576000612788565b601554612788908563ffffffff613b9a16565b601555601154156127a45761279e610c44612fdf565b506127ac565b6127ac6130ed565b836127bb57600191505061219b565b6127c560006139eb565b60165585516001600160a01b038681169116146129b657600a548651604051600160e41b630a95243102815260009261010090046001600160a01b03169163a95243109161281991906002906004016156f3565b60206040518083038186803b15801561283157600080fd5b505afa158015612845573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612869919081019061484a565b90506001600160a01b038116156129b4576008548751604051600160e01b6370a082310281526000926001600160a01b0316916370a08231916128af91906004016155c0565b60206040518083038186803b1580156128c757600080fd5b505afa1580156128db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128ff9190810190614acc565b905080156129b2576000305a8a516101208d015160408089015160808a0151915161293294939289918b906024016156a4565b60408051601f198184030181529181526020820180516001600160e01b0316600160e11b6359942a7f021790525161296a91906155b4565b60006040518083038160008787f1925050503d80600081146129a8576040519150601f19603f3d011682016040523d82523d6000602084013e6129ad565b606091505b505050505b505b505b600191505061219b565b5060009695505050505050565b336000908152601a602090815260408083206001600160a01b0386168452909152812054612a01908363ffffffff6139de16565b336000818152601a602090815260408083206001600160a01b038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591610cf0919061578c565b600d5481565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205490565b6001546001600160a01b03163314612aa157600080fd5b600480546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b031660009081526009602052604090205490565b6001546001600160a01b03163314612afb57600080fd5b612b0481614102565b50565b6012602052600090815260409020805460019091015460ff1682565b600e6020526000908152604090205481565b600160005414612b5a57604051600160e51b62461bcd028152600401610c179061598f565b6002600055612b676130ed565b6001600055565b600082612b7d57506000610cfc565b5081810281838281612b8b57fe5b0414610cfc57fe5b6000818381612b9e57fe5b049392505050565b6000612bb06130ed565b6001600160a01b03821660009081526012602052604090206001015460ff16612bdb57506000610b60565b6001600160a01b03821660009081526012602052604081205490612c01611816826139eb565b90506000612c42670de0b6b3a7640000610b518460118781548110612c2257fe5b906000526020600020906002020160010154612b6e90919063ffffffff16565b905080612c555760009350505050610b60565b600854604051600160e01b6370a082310281526000916001600160a01b0316906370a0823190612c899030906004016155ce565b60206040518083038186803b158015612ca157600080fd5b505afa158015612cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cd99190810190614acc565b905080612ced576000945050505050610b60565b6000818311612d265760118581548110612d0357fe5b9060005260206000209060020201600101549050612d218786614171565b612de4565b9091508190612d4784610b5184670de0b6b3a764000063ffffffff612b6e16565b905060118581548110612d5657fe5b906000526020600020906002020160010154612d7c600a836139de90919063ffffffff16565b1015612dda57612db38160118781548110612d9357fe5b906000526020600020906002020160010154613b9a90919063ffffffff16565b60118681548110612dc057fe5b906000526020600020906002020160010181905550612de4565b612de48786614171565b600854604051600160e01b63a9059cbb0281526001600160a01b039091169063a9059cbb90612e19908a90879060040161570e565b602060405180830381600087803b158015612e3357600080fd5b505af1158015612e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e6b9190810190614a90565b612e8a57604051600160e51b62461bcd028152600401610c17906159af565b6001600160a01b03871660009081526012602052604090206001015460ff1680612ecb57506001600160a01b03871660009081526019602052604090205415155b15612ef0576001600160a01b0387166000908152600960205260409020849055612f0a565b6001600160a01b0387166000908152600960205260408120555b8060135411612f1a576000612f2d565b601354612f2d908263ffffffff613b9a16565b6013556001600160a01b0387166000818152601260205260409020600101547f68e1caf97c4c29c1ac46024e9590f80b7a1f690d393703879cf66eea4e1e8421908390869060ff16612f80576000612fbb565b6001600160a01b038b16600090815260126020526040902054601180549091908110612fa857fe5b9060005260206000209060020201600101545b88604051612fcc94939291906157ba565b60405180910390a2509095945050505050565b6014546000906001600160a01b03161561300557506014546001600160a01b0316610d5c565b6011541561303c57601160008154811061301b57fe5b60009182526020909120600290910201546001600160a01b03169050610d5c565b506000610d5c565b6000806015541180156130575750600082115b156130855761307e82610b5168056bc75e2d63100000601554612b6e90919063ffffffff16565b9050610b60565b506000610b60565b600080600060155411156130e35760006130a5613bac565b509150506130db84610b51601654610b4561016d610b45601554610b5168056bc75e2d631000008a612b6e90919063ffffffff16565b915050610b5d565b50600b5492915050565b4260175414611f3c5760045460009061010090046001600160a01b03165a60065460085460405161312e926001600160a01b03908116921690602401615647565b60408051601f198184030181529181526020820180516001600160e01b0316600160e01b63327ab639021790525161316691906155b4565b60006040518083038160008787f1925050503d80600081146131a4576040519150601f19603f3d011682016040523d82523d6000602084013e6131a9565b606091505b5050426017555050565b6000806131be6121f9565b905060006131fa600085116131d45760006131f1565b6131f183610b518768056bc75e2d6310000063ffffffff612b6e16565b61261784613044565b600b54600c5491925090600090613217908363ffffffff6139de16565b90506804e1003b28d92800008311156132b357613243836804e1003b28d928000063ffffffff613b9a16565b9250678ac7230489e8000083111561326157678ac7230489e8000092505b6132776064610b5183605a63ffffffff612b6e16565b90506132ac81612617678ac7230489e80000610b5161329f68056bc75e2d6310000087613b9a565b889063ffffffff612b6e16565b94506132f9565b6132db600b5461261768056bc75e2d63100000610b51600c5488612b6e90919063ffffffff16565b9450818510156132ed578194506132f9565b808511156132f9578094505b50505050919050565b600085613311575060006137e2565b600854604051600160e01b6370a082310281526000916001600160a01b0316906370a08231906133459030906004016155ce565b60206040518083038186803b15801561335d57600080fd5b505afa158015613371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133959190810190614acc565b9050806133a65760009150506137e2565b60006133b0611e64565b9050808211156133d1576133ca828263ffffffff613b9a16565b91506133dc565b6000925050506137e2565b818811156133e8578197505b600854600554604051600160e11b636eb1769f0281526000926001600160a01b039081169263dd62ed3e9261342392309216906004016155dc565b60206040518083038186803b15801561343b57600080fd5b505afa15801561344f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134739190810190614acc565b9050888110156135da57801561352e57600854600554604051600160e01b63095ea7b30281526001600160a01b039283169263095ea7b3926134bd929116906000906004016156f3565b602060405180830381600087803b1580156134d757600080fd5b505af11580156134eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061350f9190810190614a90565b61352e57604051600160e51b62461bcd028152600401610c179061597f565b600854600554604051600160e01b63095ea7b30281526001600160a01b039283169263095ea7b392613569929116906000199060040161570e565b602060405180830381600087803b15801561358357600080fd5b505af1158015613597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506135bb9190810190614a90565b6135da57604051600160e51b62461bcd028152600401610c179061594f565b60045461010090046001600160a01b031663229e0b168b8b6135fe8c61016d612b93565b426001016040518563ffffffff1660e01b815260040161362194939291906157ba565b602060405180830381600087803b15801561363b57600080fd5b505af115801561364f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136739190810190614a90565b61369257604051600160e51b62461bcd028152600401610c17906158ff565b88600460019054906101000a90046001600160a01b03166001600160a01b03166395eb84c08d8d8b8e8c8c6040518763ffffffff1660e01b81526004016136de96959493929190615655565b602060405180830381600087803b1580156136f857600080fd5b505af115801561370c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137309190810190614acc565b1461375057604051600160e51b62461bcd028152600401610c179061589f565b601554613763908a63ffffffff6139de16565b60155561377060006139eb565b6016556011541561379257613786610c44612fdf565b506137908b612ba6565b505b8a6001600160a01b03167f86e15dd78cd784ab7788bcf5b96b9395e86030e048e5faedcfe752c700f6157e8a8a8a8a8a6040516137d39594939291906159f8565b60405180910390a28893505050505b979650505050505050565b6001600160a01b0383166000818152601a60209081526040808320338452825280832054938352601990915281205490919083111561384157604051600160e51b62461bcd028152600401610c179061591f565b8083111561386457604051600160e51b62461bcd028152600401610c179061586f565b6001600160a01b03841661388d57604051600160e51b62461bcd028152600401610c179061588f565b6001600160a01b0385166000908152601960205260409020546138b6908463ffffffff613b9a16565b6001600160a01b0380871660009081526019602052604080822093909355908616815220546138eb908463ffffffff6139de16565b6001600160a01b0385166000908152601960205260409020556000198110156139435761391e818463ffffffff613b9a16565b6001600160a01b0386166000908152601a602090815260408083203384529091529020555b836001600160a01b0316856001600160a01b0316600080516020615bc783398151915285604051613974919061578c565b60405180910390a3506001949350505050565b600081156139ab576139a88668056bc75e2d6310000063ffffffff6139de16565b95505b6126bd86610b516139bd87878b613c56565b610b5189701d6329f1c35ca4bfabb9f561000000000063ffffffff612b6e16565b81810182811015610cfc57fe5b600080613a05601354601b546139de90919063ffffffff16565b11613a11576000610b5d565b601554600854604051600160e01b6370a08231028152610b5d928592612617926001600160a01b03909116906370a08231906125c79030906004016155ce565b600080613a6b601354601b546139de90919063ffffffff16565b905060008111613a7d57601854611010565b61101081610b5185670de0b6b3a764000063ffffffff612b6e16565b6001600160a01b038416613ac257604051600160e51b62461bcd028152600401610c17906158cf565b601b54613ad5908463ffffffff6139de16565b601b556001600160a01b038416600090815260196020526040902054613b01908463ffffffff6139de16565b6001600160a01b038516600081815260196020526040908190209290925590517fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb90613b5290869086908690615a3a565b60405180910390a2836001600160a01b031660006001600160a01b0316600080516020615bc783398151915285604051613b8c919061578c565b60405180910390a350505050565b600082821115613ba657fe5b50900390565b60048054600654600854604051600160e31b63015216af028152600094859485946101009091046001600160a01b0390811694630a90b57894613bf8943094841693909216910161561f565b60806040518083038186803b158015613c1057600080fd5b505afa158015613c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c489190810190614c8f565b929690955091935090915050565b6000808311613c6e5768056bc75e2d63100000613c99565b613c9968056bc75e2d6310000061261784610b5187610b456301e13380838c8863ffffffff612b6e16565b949350505050565b6000808211613cc557604051600160e51b62461bcd028152600401610c179061584f565b613cce33611f3e565b821115613ce157613cde33611f3e565b91505b60115415613d1f57613cf4610c44612fdf565b50613cfe83612ba6565b50336001600160a01b03841614613d1a57613d1833612ba6565b505b613d27565b613d276130ed565b6000613d3661181660006139eb565b90506000613d56670de0b6b3a7640000610b51868563ffffffff612b6e16565b600854604051600160e01b6370a082310281529192506000916001600160a01b03909116906370a0823190613d8f9030906004016155ce565b60206040518083038186803b158015613da757600080fd5b505afa158015613dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613ddf9190810190614acc565b905081935080841115613fa7576000613dfe858363ffffffff613b9a16565b90506000613e1e85610b5184670de0b6b3a764000063ffffffff612b6e16565b601354909150613e34908263ffffffff6139de16565b6013556001600160a01b03881660009081526012602052604090206001015460ff1615613ed0576001600160a01b03881660009081526012602052604090205460118054613ea891849184908110613e8857fe5b9060005260206000209060020201600101546139de90919063ffffffff16565b60118281548110613eb557fe5b90600052602060002090600202016001018190555050613fa1565b6040805180820182526001600160a01b038a811680835260208084018681526011805460018082018355600083815297517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68600290930292830180546001600160a01b031916919098161790965591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c69909201919091558551808701875290546000190181528082018481529285526012909152939092209251835590519101805460ff19169115159190911790555b82955050505b613fb33386868661427f565b3360009081526012602052604090206001015460ff1680613fe257503360009081526019602052604090205415155b15613ffe5733600090815260096020526040902083905561400f565b336000908152600960205260408120555b50505092915050565b3360009081526019602052604081205482111561404a57604051600160e51b62461bcd028152600401610c179061591f565b6001600160a01b03831661407357604051600160e51b62461bcd028152600401610c179061588f565b33600090815260196020526040902054614093908363ffffffff613b9a16565b33600090815260196020526040808220929092556001600160a01b038516815220546140c5908363ffffffff6139de16565b6001600160a01b038416600081815260196020526040908190209290925590513390600080516020615bc783398151915290610cf090869061578c565b6001600160a01b03811661411557600080fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b601154600110156142235760118054600019810190811061418e57fe5b9060005260206000209060020201601182815481106141a957fe5b600091825260208220835460029092020180546001600160a01b0319166001600160a01b039092169190911781556001928301549201919091556011805483926012929091849081106141f857fe5b600091825260208083206002909202909101546001600160a01b031683528201929092526040019020555b60118054906142369060001983016144c8565b506001600160a01b038083166000818152601260205260408120908155600101805460ff19169055601454909116141561427b57601480546001600160a01b03191690555b5050565b6001600160a01b0384166000908152601960205260409020548311156142ba57604051600160e51b62461bcd028152600401610c17906158ef565b6001600160a01b0384166000908152601960205260409020546142e3908463ffffffff613b9a16565b6001600160a01b0385166000908152601960205260409020819055600a1061431f576001600160a01b0384166000908152601960205260408120555b601b54614332908463ffffffff613b9a16565b601b556040516001600160a01b038516907f743033787f4738ff4d6a7225ce2bd0977ee5f86b91a902a58f5e4d0b297b46449061437490869086908690615a3a565b60405180910390a260006001600160a01b0316846001600160a01b0316600080516020615bc783398151915285604051613b8c919061578c565b6040518060c001604052806000801916815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061010001604052806008906020820280388339509192915050565b604051806101600160405280600b906020820280388339509192915050565b815481835581811115614449576000838152602090206144499181019083016144f4565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061448f57805160ff19168380011785556144bc565b828001600101855582156144bc579182015b828111156144bc5782518255916020019190600101906144a1565b50610d5a9291506144f4565b81548183558181111561444957600202816002028360005260206000209182019101614449919061450e565b610d5c91905b80821115610d5a57600081556001016144fa565b610d5c91905b80821115610d5a5780546001600160a01b031916815560006001820155600201614514565b8035610cfc81615b97565b8051610cfc81615b97565b600082601f83011261456057600080fd5b600461457361456e82615a8a565b615a63565b9150818385602084028201111561458957600080fd5b60005b838110156145b5578161459f88826145d5565b845250602092830192919091019060010161458c565b5050505092915050565b8035610cfc81615bab565b8051610cfc81615bab565b8035610cfc81615bb4565b8051610cfc81615bb4565b600082601f8301126145fc57600080fd5b813561460a61456e82615aa8565b9150808252602083016020830185838301111561462657600080fd5b61400f838284615b3e565b6000610140828403121561464457600080fd5b61464f610140615a63565b9050600061465d8484614539565b825250602061466e84848301614539565b602083015250604061468284828501614539565b604083015250606061469684828501614539565b60608301525060806146aa848285016145d5565b60808301525060a06146be848285016145d5565b60a08301525060c06146d2848285016145d5565b60c08301525060e06146e6848285016145d5565b60e0830152506101006146fb848285016145d5565b61010083015250610120614711848285016145d5565b6101208301525092915050565b6000610160828403121561473157600080fd5b61473c610160615a63565b9050600061474a8484614539565b825250602061475b84848301614539565b602083015250604061476f84828501614539565b6040830152506060614783848285016145d5565b6060830152506080614797848285016145d5565b60808301525060a06147ab848285016145d5565b60a08301525060c06147bf848285016145d5565b60c08301525060e06147d3848285016145d5565b60e0830152506101006147e8848285016145d5565b610100830152506101206147fe848285016145bf565b61012083015250610140614814848285016145d5565b6101408301525092915050565b8051610cfc81615bbd565b60006020828403121561483e57600080fd5b6000613c998484614539565b60006020828403121561485c57600080fd5b6000613c998484614544565b6000806040838503121561487b57600080fd5b60006148878585614539565b925050602061489885828601614539565b9150509250929050565b600080600080600080600060e0888a0312156148bd57600080fd5b60006148c98a8a614539565b97505060206148da8a828b01614539565b96505060406148eb8a828b01614539565b95505060606148fc8a828b01614539565b945050608061490d8a828b01614539565b93505060a088013567ffffffffffffffff81111561492a57600080fd5b6149368a828b016145eb565b92505060c088013567ffffffffffffffff81111561495357600080fd5b61495f8a828b016145eb565b91505092959891949750929550565b60008060006060848603121561498357600080fd5b600061498f8686614539565b93505060206149a086828701614539565b92505060406149b1868287016145d5565b9150509250925092565b60008060008060008060c087890312156149d457600080fd5b60006149e08989614539565b96505060206149f189828a016145d5565b9550506040614a0289828a016145d5565b9450506060614a1389828a016145d5565b9350506080614a2489828a016145d5565b92505060a0614a3589828a01614539565b9150509295509295509295565b60008060408385031215614a5557600080fd5b6000614a618585614539565b9250506020614898858286016145d5565b600060808284031215614a8457600080fd5b6000613c99848461454f565b600060208284031215614aa257600080fd5b6000613c9984846145ca565b600060208284031215614ac057600080fd5b6000613c9984846145d5565b600060208284031215614ade57600080fd5b6000613c9984846145e0565b60008060008060006103008688031215614b0357600080fd5b6000614b0f8888614631565b955050610140614b218882890161471e565b9450506102a0614b3388828901614539565b9350506102c0614b45888289016145d5565b9250506102e0614b57888289016145bf565b9150509295509295909350565b60008060408385031215614b7757600080fd5b6000614a6185856145d5565b600080600080600060a08688031215614b9b57600080fd5b6000614ba788886145d5565b9550506020614bb8888289016145d5565b9450506040614bc988828901614539565b9350506060614bda88828901614539565b9250506080614b57888289016145bf565b60008060008060808587031215614c0157600080fd5b6000614c0d87876145d5565b9450506020614c1e878288016145d5565b9350506040614c2f87828801614539565b9250506060614c40878288016145bf565b91505092959194509250565b600080600060608486031215614c6157600080fd5b6000614c6d86866145d5565b9350506020614c7e868287016145d5565b92505060406149b1868287016145bf565b60008060008060808587031215614ca557600080fd5b6000614cb187876145e0565b9450506020614cc2878288016145e0565b9350506040614cd3878288016145e0565b9250506060614c40878288016145e0565b600060208284031215614cf657600080fd5b6000613c998484614821565b6000614d0e8383614d42565b505060200190565b6000614d0e8383614e4d565b614d2b81615b1d565b82525050565b614d2b614d3d82615afb565b615b76565b614d2b81615afb565b614d5481615ae2565b614d5e8184610b60565b9250614d6982610d5c565b8060005b83811015614d97578151614d818782614d02565b9650614d8c83615ad0565b925050600101614d6d565b505050505050565b614da881615ae8565b614db28184610b60565b9250614dbd82610d5c565b8060005b83811015614d97578151614dd58782614d16565b9650614de083615ad0565b925050600101614dc1565b6000614df682615aee565b614e008185615af2565b9350614e0b83615ad0565b8060005b83811015614e39578151614e238882614d16565b9750614e2e83615ad0565b925050600101614e0f565b509495945050505050565b614d2b81615b06565b614d2b81610d5c565b6000614e6182615aee565b614e6b8185615af2565b9350614e7b818560208601615b4a565b614e8481615b87565b9093019392505050565b6000614e9982615aee565b614ea38185610b60565b9350614eb3818560208601615b4a565b9290920192915050565b614d2b81615b28565b600081546001811660008114614ee35760018114614f0957614f48565b607f6002830416614ef48187615af2565b60ff1984168152955050602085019250614f48565b60028204614f178187615af2565b9550614f2285615ad6565b60005b82811015614f4157815488820152600190910190602001614f25565b8701945050505b505092915050565b6000614f5d600f83615af2565b7f6275726e416d6f756e74203d3d20300000000000000000000000000000000000815260200192915050565b6000614f96601a83615af2565b7f6c65766572616765416d6f756e74206e6f7420646566696e6564000000000000815260200192915050565b6000614fcf601683615af2565b7f696e73756666696369656e7420616c6c6f77616e636500000000000000000000815260200192915050565b6000615008601083615af2565b7f756e61626c6520746f20626f72726f7700000000000000000000000000000000815260200192915050565b6000615041601683615af2565b7f746f6b656e206275726e206e6f7420616c6c6f77656400000000000000000000815260200192915050565b600061507a602d83615af2565b7f74616b654c6f616e4f726465724f6e436861696e41735472616465724279446581527f6c6567617465206661696c656400000000000000000000000000000000000000602082015260400192915050565b60006150d9602083615af2565b7f7472616e73666572206f6620746f6b656e2062616c616e6365206661696c6564815260200192915050565b6000615112601383615af2565b7f616c726561647920696e697469616c697a656400000000000000000000000000815260200192915050565b600061514b600f83615af2565b7f696e76616c696420616464726573730000000000000000000000000000000000815260200192915050565b6000615184601383615af2565b7f6f6e6c79204f7261636c6520616c6c6f77656400000000000000000000000000815260200192915050565b60006151bd601a83615af2565b7f6275726e2076616c756520657863656564732062616c616e6365000000000000815260200192915050565b60006151f6601983615af2565b7f7570646174654c6f616e41734c656e646572206661696c656400000000000000815260200192915050565b600061522f601783615af2565b7f696e76616c6964206c6576657261676520616d6f756e74000000000000000000815260200192915050565b6000615268601483615af2565b7f696e73756666696369656e742062616c616e6365000000000000000000000000815260200192915050565b60006152a1601e83615af2565b7f6c65766572616765416d6f756e7420616c726561647920646566696e65640000815260200192915050565b60006152da601283615af2565b7f6465706f736974416d6f756e74203d3d20300000000000000000000000000000815260200192915050565b6000615313601c83615af2565b7f617070726f76616c206f66206c6f616e546f6b656e206661696c656400000000815260200192915050565b600061534c601183615af2565b7f657363726f77416d6f756e74203d3d2030000000000000000000000000000000815260200192915050565b6000615385600f83615af2565b7f73656e646572206e6f742073656c660000000000000000000000000000000000815260200192915050565b6000610cfc600083615af2565b60006153cb602283615af2565b7f617070726f76616c207265736574206f66206c6f616e546f6b656e206661696c8152600160f21b61195902602082015260400192915050565b6000615412600c83615af2565b7f6e6f6e5265656e7472616e740000000000000000000000000000000000000000815260200192915050565b600061544b601083615af2565b7f76616c75652063616e2774206265203000000000000000000000000000000000815260200192915050565b6000615484601c83615af2565b7f7472616e73666572206f66206c6f616e546f6b656e206661696c656400000000815260200192915050565b60006154bd601183615af2565b7f626f72726f77416d6f756e74203d3d2030000000000000000000000000000000815260200192915050565b805160c08301906154fa8482614e4d565b50602082015161550d6020850182614e4d565b5060408201516155206040850182614e4d565b5060608201516155336060850182614e4d565b5060808201516155466080850182614e4d565b5060a082015161555960a0850182614e4d565b50505050565b614d2b61556b82610d5c565b610d5c565b614d2b81615b17565b60006155858284614d31565b50601401919050565b600061559a8285614d31565b6014820191506155aa828461555f565b5060200192915050565b60006110108284614e8e565b60208101610cfc8284614d42565b60208101610cfc8284614d22565b604081016155ea8285614d22565b6110106020830184614d42565b606081016156058286614d22565b6156126020830185614d22565b613c996040830184614e4d565b6060810161562d8286614d22565b61563a6020830185614d42565b613c996040830184614d42565b604081016155ea8285614d42565b60c081016156638289614d42565b6156706020830188614e4d565b61567d6040830187614d42565b61568a6060830186614e4d565b6156976080830185614d42565b6137e260a0830184614e44565b60c081016156b28289614d42565b6156bf6020830188614e4d565b6156cc6040830187614e4d565b6156d96060830186614e4d565b6156e66080830185614e4d565b6137e260a0830184614d42565b604081016157018285614d42565b6110106020830184614ebd565b6040810161571c8285614d42565b6110106020830184614e4d565b6102a081016157388286614d4b565b615746610100830185614d9f565b8181036102608301526157598184614e56565b905081810361028083015261219b816153b1565b602080825281016110108184614deb565b60208101610cfc8284614e44565b60208101610cfc8284614e4d565b604081016157a88285614e4d565b8181036020830152613c998184614ec6565b608081016157c88287614e4d565b6157d56020830186614e4d565b6157e26040830185614e4d565b61219b6060830184614e4d565b60c081016157fd8289614e4d565b61580a6020830188614e4d565b6158176040830187614e4d565b6158246060830186614e4d565b6158316080830185614e4d565b6137e260a0830184614e4d565b602080825281016110108184614e56565b60208082528101610b5d81614f50565b60208082528101610b5d81614f89565b60208082528101610b5d81614fc2565b60208082528101610b5d81614ffb565b60208082528101610b5d81615034565b60208082528101610b5d8161506d565b60208082528101610b5d816150cc565b60208082528101610b5d81615105565b60208082528101610b5d8161513e565b60208082528101610b5d81615177565b60208082528101610b5d816151b0565b60208082528101610b5d816151e9565b60208082528101610b5d81615222565b60208082528101610b5d8161525b565b60208082528101610b5d81615294565b60208082528101610b5d816152cd565b60208082528101610b5d81615306565b60208082528101610b5d8161533f565b60208082528101610b5d81615378565b60208082528101610b5d816153be565b60208082528101610b5d81615405565b60208082528101610b5d8161543e565b60208082528101610b5d81615477565b60208082528101610b5d816154b0565b60c08101610cfc82846154e9565b604081016159eb8285614e4d565b6110106020830184614e44565b60a08101615a068288614e4d565b615a136020830187614e4d565b615a206040830186614d42565b615a2d6060830185614d42565b6126bd6080830184614e44565b60608101615a488286614e4d565b6156126020830185614e4d565b60208101610cfc8284615570565b60405181810167ffffffffffffffff81118282101715615a8257600080fd5b604052919050565b600067ffffffffffffffff821115615aa157600080fd5b5060200290565b600067ffffffffffffffff821115615abf57600080fd5b506020601f91909101601f19160190565b60200190565b60009081526020902090565b50600890565b50600b90565b5190565b90815260200190565b6000610b5d82615b0b565b151590565b6001600160a01b031690565b60ff1690565b6000610b5d82615b33565b6000610b5d82610d5c565b6000610b5d82615afb565b82818337506000910152565b60005b83811015615b65578181015183820152602001615b4d565b838111156155595750506000910152565b6000610b5d826000610b5d82615b91565b601f01601f191690565b60601b90565b615ba081615afb565b8114612b0457600080fd5b615ba081615b06565b615ba081610d5c565b615ba081615b1756feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa265627a7a72305820122ea82348615938dc9aef2e1e7a7a9b0243b84270c3ad0bd802796374920cc46c6578706572696d656e74616cf50037

Deployed Bytecode Sourcemap

17782:35691:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32021:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32021:213:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5818:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5818:18:0;;;:::i;:::-;;;;;;;;23442:491;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23442:491:0;;;:::i;11207:248::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11207:248:0;;;;;;;;:::i;:::-;;;;;;;;28155:422;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28155:422:0;;;:::i;7851:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7851:33:0;;;:::i;19766:989::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19766:989:0;;;;;;;;:::i;8960:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8960:123:0;;;:::i;52288:139::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;52288:139:0;;;;;;;;:::i;8156:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8156:27:0;;;:::i;7156:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7156:45:0;;;:::i;7972:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7972:35:0;;;:::i;24897:757::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24897:757:0;;;;;;;;:::i;20973:1334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20973:1334:0;;;;;;;;:::i;7517:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7517:50:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;48492:2115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;48492:2115:0;;;;;;;;:::i;52028:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;52028:121:0;;;;;;;;:::i;31822:136::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31822:136:0;;;:::i;:::-;;;;;;;;5870:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5870:21:0;;;:::i;:::-;;;;;;;;50615:641;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;50615:641:0;;;;;;;;:::i;7216:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7216:52:0;;;:::i;51405:267::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;51405:267:0;;;;;;;;:::i;18101:952::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18101:952:0;;;;;;;;:::i;5994:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5994:27:0;;;:::i;:::-;;;;;;;;52624:846;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;52624:846:0;;;;;;;;:::i;24413:476::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24413:476:0;;;;;;;;:::i;27225:518::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27225:518:0;;;:::i;31619:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31619:195:0;;;;;;;;:::i;:::-;;;;;;;;11796:499;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11796:499:0;;;;;;;;:::i;27050:167::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27050:167:0;;;:::i;29494:334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29494:334:0;;;:::i;24056:184::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24056:184:0;;;:::i;9091:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9091:149:0;;;;;;;;:::i;7115:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7115:32:0;;;:::i;7653:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7653:44:0;;;;;;;;:::i;:::-;;;;;;;;;6030:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6030:31:0;;;:::i;26432:434::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26432:434:0;;;:::i;30265:568::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30265:568:0;;;;;;;;:::i;27819:259::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27819:259:0;;;:::i;5933:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5933:23:0;;;:::i;30841:770::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30841:770:0;;;;;;;;:::i;51680:205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;51680:205:0;;;;;;;;:::i;3327:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3327:20:0;;;:::i;29836:421::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29836:421:0;;;:::i;5843:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5843:20:0;;;:::i;5963:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5963:24:0;;;:::i;5900:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5900:26:0;;;:::i;7615:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7615:29:0;;;;;;;;:::i;19061:474::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19061:474:0;;;;;;;;:::i;52435:181::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;52435:181:0;;;;;;;;:::i;52157:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;52157:123:0;;;;;;;;:::i;25662:725::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25662:725:0;;;;;;;;:::i;28682:731::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28682:731:0;;;;;;;;:::i;22315:971::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22315:971:0;;;;;;;;:::i;46220:2228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;46220:2228:0;;;;;;;;:::i;11463:325::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11463:325:0;;;;;;;;:::i;7374:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7374:31:0;;;:::i;9248:185::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9248:185:0;;;;;;;;:::i;51893:127::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;51893:127:0;;;;;;;;:::i;26874:168::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26874:168:0;;;;;;;;:::i;3958:105::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3958:105:0;;;;;;;;:::i;7730:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7730:64:0;;;;;;;;:::i;:::-;;;;;;;;;7414:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7414:51:0;;;;;;;;:::i;23941:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23941:107:0;;;:::i;32021:213::-;32119:7;32151:75;32219:6;32151:49;32187:12;:10;:12::i;:::-;32151:17;32161:6;32151:9;:17::i;:::-;:35;:49;:35;:49;:::i;:::-;:67;:75;:67;:75;:::i;:::-;32144:82;;32021:213;;;;:::o;5818:18::-;;;;;;;;;;;;;;-1:-1:-1;;5818:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23442:491::-;23526:21;4860:1;5528:14;;:39;5520:64;;;;-1:-1:-1;;;;;5520:64:0;;;;;;;;;;;;;;;;;4964:1;5591:14;:40;23581:27;23597:10;23581:15;:27::i;:::-;23625:21;:28;23565:43;;-1:-1:-1;23625:32:0;23621:305;;23674:31;23690:14;:12;:14::i;:::-;23674:15;:31::i;:::-;-1:-1:-1;23753:10:0;23726:38;;;;:26;:38;;;;;:44;;;;;:77;;;;-1:-1:-1;23774:15:0;;-1:-1:-1;;;;;23774:15:0;23793:10;23774:29;;23726:77;23722:193;;;23871:15;:28;;-1:-1:-1;;;;;;23871:28:0;23889:10;23871:28;;;23722:193;4860:1;5646:14;:38;23442:491;:::o;11207:248::-;11341:10;11311:4;11333:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;11333:29:0;;;;;;;;;;:38;;;11387;11311:4;;11333:29;;11387:38;;;;11365:6;;11387:38;;;;;;;;;;-1:-1:-1;11443:4:0;11207:248;;;;;:::o;28155:422::-;28233:7;28258:19;28280:18;:16;:18::i;:::-;28313:16;;28258:40;;-1:-1:-1;28313:20:0;28309:261;;28357:160;28510:6;28357:130;28470:16;;28357:90;28414:32;28434:11;28414:19;:32::i;:::-;28357:34;28379:11;28357:21;:34::i;:160::-;28350:167;;;;;28309:261;28557:1;28550:8;;;;;28309:261;28155:422;;;:::o;7851:33::-;;;;:::o;19766:989::-;20023:7;4860:1;5528:14;;:39;5520:64;;;;-1:-1:-1;;;;;5520:64:0;;;;;;;;;4964:1;5591:14;:40;20056:16;20048:46;;;;-1:-1:-1;;;;;20048:46:0;;;;;;;;;20107:21;20131:31;;;:15;:31;;;;;;20173:24;;:::i;:::-;-1:-1:-1;20200:28:0;;;;:13;:28;;;;;;;;;20173:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20239:69;;;;-1:-1:-1;;;;;20239:69:0;;;;;;;;;20321:17;:15;:17::i;:::-;20351:20;20374:35;20396:12;20374:21;:35::i;:::-;20351:58;;20422:14;20439:234;20466:10;20491:13;20519:12;20546;20573:22;20610:23;20648:14;20439:12;:234::i;:::-;20422:251;;20701:1;20692:6;:10;20684:39;;;;-1:-1:-1;;;;;20684:39:0;;;;;;;;;4860:1;5646:14;:38;20741:6;19766:989;-1:-1:-1;;;;;;;;;19766:989:0:o;8960:123::-;9063:12;;8960:123;:::o;52288:139::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;52394:17;:25;;-1:-1:-1;;;;;52394:25:0;;;;;-1:-1:-1;;;;;;52394:25:0;;;;;;;;;52288:139::o;8156:27::-;;;;:::o;7156:45::-;;;;:::o;7972:35::-;;;;:::o;24897:757::-;25025:4;25047:88;25080:5;25100:3;25118:6;25047:18;:88::i;:::-;;25185:20;25208:12;:10;:12::i;:::-;-1:-1:-1;;;;;25235:33:0;;;;;;:26;:33;;;;;:39;;;25185:35;;-1:-1:-1;25235:39:0;;;:62;;-1:-1:-1;;;;;;25278:15:0;;25296:1;25278:15;;;:8;:15;;;;;;:19;;25235:62;25231:195;;;-1:-1:-1;;;;;25314:24:0;;;;;;:17;:24;;;;;:39;;;25231:195;;;-1:-1:-1;;;;;25386:24:0;;25413:1;25386:24;;;:17;:24;;;;;:28;25231:195;-1:-1:-1;;;;;25440:31:0;;;;;;:26;:31;;;;;:37;;;;;;:58;;-1:-1:-1;;;;;;25481:13:0;;25497:1;25481:13;;;:8;:13;;;;;;:17;;25440:58;25436:187;;;-1:-1:-1;;;;;25515:22:0;;;;;;:17;:22;;;;;:37;;;25436:187;;;-1:-1:-1;;;;;25585:22:0;;25610:1;25585:22;;;:17;:22;;;;;:26;25436:187;25642:4;25635:11;;;24897:757;;;;;;:::o;20973:1334::-;21199:7;4860:1;5528:14;;:39;5520:64;;;;-1:-1:-1;;;;;5520:64:0;;;;;;;;;4964:1;5591:14;:40;21232:16;21224:46;;;;-1:-1:-1;;;;;21224:46:0;;;;;;;;;21283:21;21307:31;;;:15;:31;;;;;;21349:24;;:::i;:::-;-1:-1:-1;21376:28:0;;;;:13;:28;;;;;;;;;21349:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21415:69;;;;-1:-1:-1;;;;;21415:69:0;;;;;;;;;21497:17;:15;:17::i;:::-;21527:20;21550:141;21586:94;21651:8;:28;;;21586:42;21621:6;21586:12;:34;;:42;;;;:::i;:94::-;21550:21;:141::i;:::-;21527:164;;21704:20;21727:204;21758:8;:28;;;21801:12;21828;21855:8;:36;;;21906:14;21727:16;:204::i;:::-;22093:16;;21704:227;;-1:-1:-1;21959:254:0;;21986:10;;22011:13;;21704:227;;22066:12;;-1:-1:-1;;;;;22093:16:0;22150:23;22188:14;21959:12;:254::i;:::-;21944:269;;22247:1;22232:12;:16;22224:45;;;;-1:-1:-1;;;;;22224:45:0;;;;;;;;;4860:1;5646:14;:38;22287:12;20973:1334;-1:-1:-1;;;;;;;;20973:1334:0:o;7517:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48492:2115::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;48723:14;;48707:31;;;;:15;48723:14;48707:31;;;;;:36;48699:79;;;;-1:-1:-1;;;;;48699:79:0;;;;;;;;;48791:32;;:::i;:::-;-1:-1:-1;48791:432:0;;;;;;;;48849:4;48791:432;;48885:16;;-1:-1:-1;;;;;48885:16:0;;;48791:432;;;;;;;;;;;;;-1:-1:-1;48791:432:0;;;;;;;;;;;;49110:9;;;;;48791:432;;;;;;;;;;;;;;;;;49236:30;;:::i;:::-;:565;;;;;;;;-1:-1:-1;49236:565:0;;;;;;;;;;49359:11;49371:1;49359:14;;;;49236:565;;;;49412:11;49424:1;49412:14;;;;;;;;;;;49236:565;;;;49469:1;49236:565;;;;49503:1;49236:565;;;;49537:11;49549:1;49537:14;;;;;;;;;;;49236:565;;;;49598:1;49236:565;;;;49644:1;49236:565;;;;49686:1;49236:565;;;;49752:10;49764:15;49735:45;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;49735:45:0;;;49725:56;;;;;;49720:62;;49236:565;;;;;49814:21;49843:11;;;;;;;;;-1:-1:-1;;;;;49843:11:0;-1:-1:-1;;;;;49838:38:0;;49891:14;49920:11;49971:4;49946:31;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;49946:31:0;;;;49838:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49838:202:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49838:202: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;49838:202:0;;;;;;;;;50056:11;;;50051:92;;-1:-1:-1;;;;;50051:92:0;;49814:226;;-1:-1:-1;50056:11:0;;;-1:-1:-1;;;;;50056:11:0;;50051:34;;:92;;49814:226;;50128:4;;50051:92;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50051:92:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50051:92: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;50051:92:0;;;;;;;;;-1:-1:-1;50185:312:0;;;;;;;;;;;50268:14;;50185:312;;;;;;;50268:11;50330:1;50318:14;;;;50185:312;;;;50372:11;50384:1;50372:14;;;;;;;;;;;50185:312;;;;50430:11;50442:1;50430:14;;;;;;;;;;;;;;;;50185:312;;50466:12;:19;;50185:312;;;;;;;-1:-1:-1;50154:28:0;;;:13;:28;;;;;;:343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50524:14;;50508:31;;:15;:31;;;;;;:47;;;;50584:14;;27:10:-1;;23:18;;;45:23;;50566:33:0;;;;;;;;;;-1:-1:-1;;48492:2115:0:o;52028:121::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;52125:8;:16;;-1:-1:-1;;;;;;52125:16:0;-1:-1:-1;;;;;52125:16:0;;;;;;;;;;52028:121::o;31822:136::-;31897:16;31938:12;31931:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31822:136;:::o;5870:21::-;;;;;;:::o;50615:641::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;50724:21;50748:31;;;:15;:31;;;;;;50798:18;50790:57;;;;-1:-1:-1;;;;;50790:57:0;;;;;;;;;50864:12;:19;50886:1;-1:-1:-1;50860:260:0;;;50904:13;50920:28;;;:13;:28;;;;;:34;;;50991:12;51004:19;;-1:-1:-1;;51004:23:0;;;50991:37;;;;;;;;;;;;;;50969:12;50982:5;50969:19;;;;;;;;;;;;;;;:59;;;;51103:5;51043:13;:51;51057:15;:36;51073:12;51086:5;51073:19;;;;;;;;;;;;;;;;51057:36;;;;;;;;;;;;51043:51;;;;;;;;;;;:57;;:65;;;;50860:260;;51130:12;:21;;;;;-1:-1:-1;;51130:21:0;;;:::i;:::-;-1:-1:-1;51171:31:0;;;;:15;:31;;;;;;;;51164:38;;;51220:28;;;:13;:28;;;;51213:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50615:641::o;7216:52::-;;;;:::o;51405:267::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;51583:6;51551:28;51570:8;;51551:14;;:18;;:28;;;;:::i;:::-;:38;;51543:47;;;;;;51601:8;:20;;;;51632:14;:32;51405:267::o;18101:952::-;18233:18;4860:1;5528:14;;:39;5520:64;;;;-1:-1:-1;;;;;5520:64:0;;;;;;;;;4964:1;5591:14;:40;18278:17;18269:49;;;;-1:-1:-1;;;;;18269:49:0;;;;;;;;;18335:21;:28;:32;18331:273;;18384:31;18400:14;:12;:14::i;18384:31::-;;18430:25;18446:8;18430:15;:25::i;:::-;-1:-1:-1;18474:10:0;-1:-1:-1;;;;;18474:22:0;;;18470:72;;18515:27;18531:10;18515:15;:27::i;:::-;;18470:72;18331:273;;;18575:17;:15;:17::i;:::-;18616:20;18639:33;18651:20;18669:1;18651:17;:20::i;:::-;18639:11;:33::i;:::-;18616:56;-1:-1:-1;18696:43:0;18616:56;18696:25;:13;18714:6;18696:25;:17;:25;:::i;:43::-;18766:16;;18760:128;;-1:-1:-1;;;;;18760:128:0;;18683:56;;-1:-1:-1;;;;;;18766:16:0;;18760:36;;:128;;18811:10;;18844:4;;18864:13;;18760:128;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18760:128:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18760:128: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;18760:128:0;;;;;;;;;18752:169;;;;-1:-1:-1;;;;;18752:169:0;;;;;;;;;18934:56;18940:8;18950:10;18962:13;18977:12;18934:5;:56::i;:::-;-1:-1:-1;;;;;19003:27:0;;;;;;;:17;:27;;;;;:42;;;;4860:1;5646:38;;;-1:-1:-1;18101:952:0;:::o;5994:27::-;;;-1:-1:-1;;;;;5994:27:0;;:::o;52624:846::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;52929:14;;;;52928:15;52919:48;;;;-1:-1:-1;;;;;52919:48:0;;;;;;;;;52980:11;:26;;-1:-1:-1;;;;;52980:26:0;;;;;;;-1:-1:-1;;;;;;52980:26:0;;;;;;;53017:8;:20;;;;;-1:-1:-1;;;;;;53017:20:0;;;;;;;53048:9;:22;;;;;;;;;;;53081:16;:36;;;;;;;;;;;;;53128:17;:38;;;;;;;;;;;;;53179:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;53202:16:0;;;;:6;;:16;;;;;:::i;:::-;;53246;;;;;;;;;-1:-1:-1;;;;;53246:16:0;-1:-1:-1;;;;;53240:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53240:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53240:34: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;53240:34:0;;;;;;;;;53229:8;;:45;;;;;;;;;;;;;;;;;;53306:65;53319:6;53338:10;-1:-1:-1;;;;;53327:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53327:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53327:43: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;53327:43:0;;;;;;;;;53306:12;:65::i;:::-;53287:16;:84;-1:-1:-1;;53399:6:0;53384:12;:21;-1:-1:-1;;53441:14:0;:21;;-1:-1:-1;;53441:21:0;53458:4;53441:21;;;-1:-1:-1;;;52624:846:0:o;24413:476::-;24542:16;;24500:4;;-1:-1:-1;;;;;24526:32:0;;;24542:16;;24526:32;24522:63;;;-1:-1:-1;24580:5:0;24573:12;;24522:63;24616:44;;-1:-1:-1;;;;;24616:44:0;;24598:15;;-1:-1:-1;;;;;24616:29:0;;;;;:44;;24654:4;;24616:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24616:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24616: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;24616:44:0;;;;;;;;;24598:62;-1:-1:-1;24675:12:0;24671:43;;24709:5;24702:12;;;;;24671:43;24778:9;;24735:85;;-1:-1:-1;;;;;24735:85:0;;-1:-1:-1;;;;;24735:28:0;;;;;;:85;;24778:9;;;;24802:7;;24735:85;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24735:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24735:85: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;24735:85:0;;;;;;;;;24727:130;;;;-1:-1:-1;;;;;24727:130:0;;;;;;;;;-1:-1:-1;24877:4:0;;24413:476;-1:-1:-1;;24413:476:0:o;27225:518::-;27300:7;27325:19;27347:18;:16;:18::i;:::-;27325:40;;27376:22;27401:21;:19;:21::i;:::-;27376:46;;27451:14;27437:11;:28;27433:147;;;27496:31;:11;27512:14;27496:31;:15;:31;:::i;:::-;27482:45;;27433:147;;;27567:1;27560:8;;;;;;27433:147;27610:16;;27596:11;:30;27592:144;;;27666:16;;27650:33;;:11;;:33;:15;:33;:::i;:::-;27643:40;;;;;;31619:195;31721:15;;:::i;:::-;-1:-1:-1;31761:45:0;31775:30;;;:15;:30;;;;;;;;;31761:45;;:13;:45;;;;;;31754:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31619:195::o;11796:499::-;11968:10;11919:4;11960:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;11960:29:0;;;;;;;;;;12004:28;;;12000:189;;12057:10;12081:1;12049:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;12049:29:0;;;;;;;;;:33;12000:189;;;12147:30;:8;12160:16;12147:30;:12;:30;:::i;:::-;12123:10;12115:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;12115:29:0;;;;;;;;;:62;12000:189;12213:10;12235:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;12204:61:0;;12235:29;;;;;;;;;;12204:61;;;;12213:10;12204:61;;;;12235:29;12204:61;;;;;;;;;;-1:-1:-1;12283:4:0;;11796:499;-1:-1:-1;;;11796:499:0:o;27050:167::-;27129:7;27161:48;27202:6;27161:36;27184:12;:10;:12::i;:::-;27161:18;;;:36;:22;:36;:::i;:48::-;27154:55;;27050:167;:::o;29494:334::-;29570:28;29617:25;29644:22;29670:17;:15;:17::i;:::-;29616:71;;;;;29707:113;29813:6;29707:87;29777:16;;29707:51;29743:14;29707:17;:35;;:51;;;;:::i;:113::-;29700:120;;;;29494:334;:::o;24056:184::-;24121:4;24113:21;:25;24109:124;;24169:12;;24155:66;;;-1:-1:-1;;;;;24155:66:0;;;;-1:-1:-1;;;;;24169:12:0;;;;24155:35;;24205:4;24197:21;;24155:66;;;;;24169:12;;24155:66;;;;;;;24197:21;24169:12;24155:66;;;5:2:-1;;;;30:1;27;20:12;5:2;24155:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24155:66:0;;;;;24109:124;24056:184::o;9091:149::-;-1:-1:-1;;;;;9216:16:0;9184:7;9216:16;;;:8;:16;;;;;;;9091:149::o;7115:32::-;;;;;;-1:-1:-1;;;;;7115:32:0;;:::o;7653:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7653:44:0;;;;-1:-1:-1;7653:44:0;:::o;6030:31::-;;;-1:-1:-1;;;;;6030:31:0;;:::o;26432:434::-;26574:15;;26502:13;;;;26593:15;26574:34;26570:223;;26646:17;:15;:17::i;:::-;26734:16;;26625:38;;-1:-1:-1;26697:84:0;;-1:-1:-1;26774:6:0;;-1:-1:-1;26697:54:0;;26625:38;;26697:54;:36;:54;:::i;:84::-;26680:101;;26570:223;26812:46;26824:33;26842:14;26824:17;:33::i;26812:46::-;26805:53;;;26432:434;:::o;30265:568::-;30375:7;30400:24;;:::i;:::-;-1:-1:-1;30427:46:0;30441:31;;;:15;:31;;;;;;;;;30427:46;;:13;:46;;;;;;30400:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30484:60;;30543:1;30536:8;;;;;30484:60;30564:261;30648:176;30679:6;30740:8;:36;;;30795:8;:28;;;30648:12;:176::i;:::-;30564:65;30600:8;:28;;;30564:17;:15;:17::i;27819:259::-;27926:16;;27897:7;;27926:20;27922:149;;27970:41;27992:18;:16;:18::i;:::-;27970:21;:41::i;:::-;27963:48;;;;27922:149;-1:-1:-1;28051:8:0;;28044:15;;5933:23;;;-1:-1:-1;;;;;5933:23:0;;:::o;30841:770::-;31009:7;31038:17;31034:44;;-1:-1:-1;31077:1:0;31070:8;;31034:44;31091:24;;:::i;:::-;-1:-1:-1;31118:46:0;31132:31;;;:15;:31;;;;;;;;;31118:46;;:13;:46;;;;;;31091:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31175:60;;31234:1;31227:8;;;;;31175:60;31286:28;;;;31255:348;;31329:12;31356:156;31395:102;31286:28;31395:46;31329:12;31434:6;31395:46;:38;:46;:::i;31356:156::-;31527:8;:36;;;31578:14;31255:16;:348::i;:::-;31248:355;30841:770;-1:-1:-1;;;;;30841:770:0:o;51680:205::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;51810:6;51798:8;:18;;51790:27;;;;;;51847:30;51860:6;51868:8;51847:12;:30::i;:::-;51828:16;:49;-1:-1:-1;51680:205:0:o;3327:20::-;;;-1:-1:-1;;;;;3327:20:0;;:::o;29836:421::-;29978:15;;29912:7;;;;29997:15;29978:34;29974:223;;30050:17;:15;:17::i;:::-;30138:16;;30029:38;;-1:-1:-1;30101:84:0;;-1:-1:-1;30178:6:0;;-1:-1:-1;30101:54:0;;30029:38;;30101:54;:36;:54;:::i;:84::-;30084:101;;29974:223;30216:33;30234:14;30216:17;:33::i;5843:20::-;;;;;;;;;;;;;;;-1:-1:-1;;5843:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5963:24;;;-1:-1:-1;;;;;5963:24:0;;:::o;5900:26::-;;;;;;-1:-1:-1;;;;;5900:26:0;;:::o;7615:29::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7615:29:0;:::o;19061:474::-;19190:22;4860:1;5528:14;;:39;5520:64;;;;-1:-1:-1;;;;;5520:64:0;;;;;;;;;4964:1;5591:14;:40;19247:69;19272:8;19295:10;19247;:69::i;:::-;19230:86;-1:-1:-1;19333:18:0;;19329:199;;19382:16;;19376:107;;-1:-1:-1;;;;;19376:107:0;;-1:-1:-1;;;;;19382:16:0;;;;19376:32;;:107;;19427:8;;19454:14;;19376:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19376:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19376:107: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;19376:107:0;;;;;;;;;19368:148;;;;-1:-1:-1;;;;;19368:148:0;;;;;;;;;4860:1;5646:14;:38;19061:474;;-1:-1:-1;;19061:474:0:o;52435:181::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;52554:1;52545:6;:10;52537:39;;;;-1:-1:-1;;;;;52537:39:0;;;;;;;;;52587:12;:21;52435:181::o;52157:123::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;52255:9;:17;;-1:-1:-1;;;;;;52255:17:0;-1:-1:-1;;;;;52255:17:0;;;;;;;;;;52157:123::o;25662:725::-;25762:4;25784:64;25813:3;25831:6;25784:14;:64::i;:::-;;25898:20;25921:12;:10;:12::i;:::-;25975:10;25948:38;;;;:26;:38;;;;;:44;;;25898:35;;-1:-1:-1;25948:44:0;;;:72;;-1:-1:-1;26005:10:0;26019:1;25996:20;;;:8;:20;;;;;;:24;;25948:72;25944:215;;;26055:10;26037:29;;;;:17;:29;;;;;:44;;;25944:215;;;26132:10;26146:1;26114:29;;;:17;:29;;;;;:33;25944:215;-1:-1:-1;;;;;26173:31:0;;;;;;:26;:31;;;;;:37;;;;;;:58;;-1:-1:-1;;;;;;26214:13:0;;26230:1;26214:13;;;:8;:13;;;;;;:17;;26173:58;26169:187;;;-1:-1:-1;;;;;26248:22:0;;;;;;:17;:22;;;;;:37;;;26169:187;;;-1:-1:-1;;;;;26318:22:0;;26343:1;26318:22;;;:17;:22;;;;;:26;26169:187;-1:-1:-1;26375:4:0;;25662:725;-1:-1:-1;;;25662:725:0:o;28682:731::-;28792:7;28821:16;;28817:534;;28899:15;;28854:22;;28918:15;28899:34;28895:243;;28975:17;:15;:17::i;:::-;29071:16;;28954:38;;-1:-1:-1;29030:92:0;;-1:-1:-1;29115:6:0;;-1:-1:-1;29030:58:0;;28954:38;;29030:58;:40;:58;:::i;:92::-;29013:109;;28895:243;29178:16;;29172:48;;-1:-1:-1;;;;;29172:48:0;;29154:15;;29172:68;;29225:14;;-1:-1:-1;;;;;29178:16:0;;29172:33;;:48;;29214:4;;29172:48;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29172:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29172:48: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;29172:48:0;;;;;;;;;:52;:68;:52;:68;:::i;:::-;29154:86;;29274:7;29259:12;:22;29255:85;;;29317:7;29302:22;;29255:85;28817:534;;;29370:35;29392:12;29370:21;:35::i;22315:971::-;22578:7;22611:10;22633:4;22611:27;22603:55;;;;-1:-1:-1;;;;;22603:55:0;;;;;;;;;22671:20;22694:132;22730:85;22795:19;22730:42;:12;22765:6;22730:42;:34;:42;:::i;22694:132::-;22671:155;;22839:20;22862:179;22893:19;22927:12;22954;22981:11;23007:5;22862:16;:179::i;:::-;23193:16;;22839:202;;-1:-1:-1;23061:217:0;;23088:8;;23111:13;;22839:202;;23166:12;;-1:-1:-1;;;;;23193:16:0;23224:23;23193:16;23061:12;:217::i;:::-;23054:224;;;;22315:971;;;;;;;;;:::o;46220:2228::-;17945:9;;46498:4;;-1:-1:-1;;;;;17945:9:0;17931:10;:23;17923:55;;;;-1:-1:-1;;;;;17923:55:0;;;;;;;;;46520:24;;:::i;:::-;-1:-1:-1;46561:23:0;;;;;46547:38;;;;:13;:38;;;;;;;;;46520:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46626:23;;46520:65;;46600:49;46596:1845;;;46706:11;46687:16;;:30;:87;;46773:1;46687:87;;;46737:16;;:33;;46758:11;46737:33;:20;:33;:::i;:::-;46668:16;:106;46795:21;:28;:32;46791:162;;46848:31;46864:14;:12;:14::i;46848:31::-;;46791:162;;;46920:17;:15;:17::i;:::-;46973:16;46969:50;;47015:4;47008:11;;;;;46969:50;47140:20;47158:1;47140:17;:20::i;:::-;47120:17;:40;47195:19;;-1:-1:-1;;;;;47181:33:0;;;;;;47177:1180;;47284:17;;47339:19;;47265:156;;-1:-1:-1;;;;;47265:156:0;;47237:25;;47284:17;;;-1:-1:-1;;;;;47284:17:0;;47265:51;;:156;;47339:19;47381:1;;47265:156;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47265:156:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47265:156: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;47265:156:0;;;;;;;;;47237:184;-1:-1:-1;;;;;;47446:31:0;;;47442:900;;47533:16;;47561:19;;47527:54;;-1:-1:-1;;;;;47527:54:0;;47504:20;;-1:-1:-1;;;;;47533:16:0;;47527:33;;:54;;47561:19;47527:54;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47527:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47527:54: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;47527:54:0;;;;;;;;;47504:77;-1:-1:-1;47610:16:0;;47606:717;;47656:12;47681:4;47696:9;47897:19;;47951:23;;;;48009:28;;;;;48119:36;;;;47737:501;;;;47897:19;47951:23;48072:12;;48190:17;;47737:501;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;47737:501:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;179:29;160:49;;47673:592:0;;;47737:501;47673:592;;;;;;;;;;;;;;;;;;;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;-1:-1;;;;47606:717:0;47442:900;;47177:1180;;48380:4;48373:11;;;;;46596:1845;-1:-1:-1;48424:5:0;;46220:2228;-1:-1:-1;;;;;;46220:2228:0:o;11463:325::-;11643:10;11581:4;11635:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;11635:29:0;;;;;;;;;;:46;;11669:11;11635:46;:33;:46;:::i;:::-;11611:10;11603:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;11603:29:0;;;;;;;;;;;:78;;;11697:61;;11603:29;;11697:61;;;;11603:78;11697:61;;7374:31;;;;:::o;9248:185::-;-1:-1:-1;;;;;9400:15:0;;;9368:7;9400:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;9248:185::o;51893:127::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;51993:11;:19;;-1:-1:-1;;;;;51993:19:0;;;;;-1:-1:-1;;;;;;51993:19:0;;;;;;;;;51893:127::o;26874:168::-;-1:-1:-1;;;;;27010:24:0;26972:13;27010:24;;;:17;:24;;;;;;;26874:168::o;3958:105::-;3770:5;;-1:-1:-1;;;;;3770:5:0;3756:10;:19;3748:28;;;;;;4028:29;4047:9;4028:18;:29::i;:::-;3958:105;:::o;7730:64::-;;;;;;;;;;;;;;;;;;;;;:::o;7414:51::-;;;;;;;;;;;;;:::o;23941:107::-;4860:1;5528:14;;:39;5520:64;;;;-1:-1:-1;;;;;5520:64:0;;;;;;;;;4964:1;5591:14;:40;24023:17;:15;:17::i;:::-;4860:1;5646:14;:38;23941:107::o;1642:391::-;1702:9;1932:7;1928:38;;-1:-1:-1;1957:1:0;1950:8;;1928:38;-1:-1:-1;1978:7:0;;;1983:2;1978;:7;:2;1999:6;;;;;:12;1992:20;;;2120:288;2180:7;2400:2;2395;:7;;;;;;;2120:288;-1:-1:-1;;;2120:288:0:o;35349:2220::-;35436:7;35461:17;:15;:17::i;:::-;-1:-1:-1;;;;;35496:34:0;;;;;;:26;:34;;;;;:40;;;;;35491:68;;-1:-1:-1;35558:1:0;35551:8;;35491:68;-1:-1:-1;;;;;35588:34:0;;35572:13;35588:34;;;:26;:34;;;;;:40;;35662:33;35674:20;35572:13;35674:17;:20::i;35662:33::-;35639:56;;35708:19;35730:65;35788:6;35730:53;35770:12;35730:21;35752:5;35730:28;;;;;;;;;;;;;;;;;;:35;;;:39;;:53;;;;:::i;:65::-;35708:87;-1:-1:-1;35810:16:0;35806:43;;35848:1;35841:8;;;;;;;35806:43;35894:16;;35888:48;;-1:-1:-1;;;;;35888:48:0;;35862:23;;-1:-1:-1;;;;;35894:16:0;;35888:33;;:48;;35930:4;;35888:48;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35888:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35888:48: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;35888:48:0;;;;;;;;;35862:74;-1:-1:-1;35951:20:0;35947:61;;35995:1;35988:8;;;;;;;;35947:61;36020:24;36074:15;36059:11;:30;36055:672;;36125:21;36147:5;36125:28;;;;;;;;;;;;;;;;;;:35;;;36106:54;;36175:30;36191:6;36199:5;36175:15;:30::i;:::-;36055:672;;;36252:15;;-1:-1:-1;36252:15:0;;36301:41;36329:12;36301:23;36252:15;36317:6;36301:23;:15;:23;:::i;:41::-;36282:60;;36478:21;36500:5;36478:28;;;;;;;;;;;;;;;;;;:35;;;36451:24;36472:2;36451:16;:20;;:24;;;;:::i;:::-;:62;36447:269;;;36572:57;36612:16;36572:21;36594:5;36572:28;;;;;;;;;;;;;;;;;;:35;;;:39;;:57;;;;:::i;:::-;36534:21;36556:5;36534:28;;;;;;;;;;;;;;;;;;:35;;:95;;;;36447:269;;;36670:30;36686:6;36694:5;36670:15;:30::i;:::-;36753:16;;36747:90;;-1:-1:-1;;;;;36747:90:0;;-1:-1:-1;;;;;36753:16:0;;;;36747:32;;:90;;36794:6;;36815:11;;36747:90;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36747:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36747:90: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;36747:90:0;;;;;;;;;36739:131;;;;-1:-1:-1;;;;;36739:131:0;;;;;;;;;-1:-1:-1;;;;;36887:34:0;;;;;;:26;:34;;;;;:40;;;;;;:64;;-1:-1:-1;;;;;;36931:16:0;;36950:1;36931:16;;;:8;:16;;;;;;:20;;36887:64;36883:199;;;-1:-1:-1;;;;;36968:25:0;;;;;;:17;:25;;;;;:40;;;36883:199;;;-1:-1:-1;;;;;37041:25:0;;37069:1;37041:25;;;:17;:25;;;;;:29;36883:199;37136:16;37115:18;;:37;:110;;37224:1;37115:110;;;37168:18;;:40;;37191:16;37168:40;:22;:40;:::i;:::-;37094:18;:131;-1:-1:-1;;;;;37243:287:0;;37341:34;;;;:26;:34;;;;;:40;;;37243:287;;37284:16;;37315:11;;37341:40;;:151;;37491:1;37341:151;;;-1:-1:-1;;;;;37423:34:0;;;;;;:26;:34;;;;;:40;37401:21;:63;;:21;;37423:40;37401:63;;;;;;;;;;;;;;;;:70;;;37341:151;37507:12;37243:287;;;;;;;;;;;;;;;;;;-1:-1:-1;37550:11:0;;35349:2220;-1:-1:-1;;;;;35349:2220:0:o;35013:328::-;35116:15;;35087:7;;-1:-1:-1;;;;;35116:15:0;:29;35112:221;;-1:-1:-1;35167:15:0;;-1:-1:-1;;;;;35167:15:0;35160:22;;35112:221;35202:21;:28;:32;35198:135;;35256:21;35278:1;35256:24;;;;;;;;;;;;;;;;;;;;;:31;-1:-1:-1;;;;;35256:31:0;;-1:-1:-1;35249:38:0;;35198:135;-1:-1:-1;35331:1:0;35316:17;;45365:391;45475:7;45523:1;45504:16;;:20;:39;;;;;45542:1;45528:11;:15;45504:39;45500:249;;;45615:81;45684:11;45615:46;45654:6;45615:16;;:38;;:46;;;;:::i;:81::-;45608:88;;;;45500:249;-1:-1:-1;45736:1:0;45729:8;;41593:587;41705:7;41730:20;41784:1;41765:16;;:20;41761:380;;;41804:26;41835:17;:15;:17::i;:::-;41802:50;;;;41882:191;42061:11;41882:156;42020:17;;41882:115;41993:3;41882:88;41953:16;;41882:48;41923:6;41882:18;:40;;:48;;;;:::i;:191::-;41867:206;;41761:380;;;;-1:-1:-1;42121:8:0;;42160:12;41593:587;-1:-1:-1;;41593:587:0:o;34510:495::-;34594:15;34575;;:34;34571:427;;34644:11;;34627:12;;34644:11;;;-1:-1:-1;;;;;34644:11:0;34665:9;34802;;34834:16;;34694:207;;;;-1:-1:-1;;;;;34802:9:0;;;;34834:16;;34694:207;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;34694:207:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;179:29;160:49;;34644:272:0;;;34694:207;34644:272;;;;;;;;;;;;;;;;;;;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;-1:-1;;34971:15:0;34953;:33;-1:-1:-1;;34510:495:0:o;42226:1362::-;42342:16;42376:19;42398:18;:16;:18::i;:::-;42376:40;;42429:23;42455:175;42524:1;42506:15;:19;:123;;42628:1;42506:123;;;42545:80;42613:11;42545:45;:15;42583:6;42545:45;:37;:45;:::i;:80::-;42455:32;42475:11;42455:19;:32::i;:175::-;42661:8;;42698:14;;42429:201;;-1:-1:-1;42661:8:0;42643:15;;42698:28;;42661:8;42698:28;:18;:28;:::i;:::-;42680:46;;42761:8;42743:15;:26;42739:814;;;42859:29;:15;42879:8;42859:29;:19;:29;:::i;:::-;42841:47;;42925:8;42907:15;:26;42903:75;;;42970:8;42952:26;;42903:75;43005:60;43061:3;43005:33;:7;43035:2;43005:33;:29;:33;:::i;:60::-;42995:70;;43093:134;43219:7;43093:103;43187:8;43093:71;43131:32;43144:9;43155:7;43131:12;:32::i;:::-;43093:15;;:71;:37;:71;:::i;:134::-;43082:145;;42739:814;;;43271:115;43377:8;;43271:83;43347:6;43271:53;43309:14;;43271:15;:37;;:53;;;;:::i;:115::-;43260:126;;43418:7;43407:8;:18;43403:138;;;43455:7;43444:18;;43403:138;;;43497:7;43486:8;:18;43482:59;;;43534:7;43523:18;;43482:59;-1:-1:-1;;;;42226:1362:0;;;:::o;37606:2753::-;37900:7;37929:17;37925:58;;-1:-1:-1;37970:1:0;37963:8;;37925:58;38143:16;;38137:48;;-1:-1:-1;;;;;38137:48:0;;38109:25;;-1:-1:-1;;;;;38143:16:0;;38137:33;;:48;;38179:4;;38137:48;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38137:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38137:48: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;38137:48:0;;;;;;;;;38109:76;-1:-1:-1;38200:22:0;38196:49;;38244:1;38237:8;;;;;38196:49;38258:22;38283:21;:19;:21::i;:::-;38258:46;;38339:14;38319:17;:34;38315:165;;;38390:37;:17;38412:14;38390:37;:21;:37;:::i;:::-;38370:57;;38315:165;;;38467:1;38460:8;;;;;;38315:165;38511:17;38496:12;:32;38492:97;;;38560:17;38545:32;;38492:97;38687:16;;38730:8;;38681:58;;-1:-1:-1;;;;;38681:58:0;;38657:21;;-1:-1:-1;;;;;38687:16:0;;;;38681:33;;:58;;38723:4;;38730:8;;38681:58;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38681:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38681:58: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;38681:58:0;;;;;;;;;38657:82;;38770:12;38754:13;:28;38750:358;;;38803:17;;38799:189;;38895:16;;38921:8;;38889:44;;-1:-1:-1;;;;;38889:44:0;;-1:-1:-1;;;;;38895:16:0;;;;38889:31;;:44;;38921:8;;;38895:16;;38889:44;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38889:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38889: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;38889:44:0;;;;;;;;;38881:91;;;;-1:-1:-1;;;;;38881:91:0;;;;;;;;;39018:16;;39044:8;;39012:51;;-1:-1:-1;;;;;39012:51:0;;-1:-1:-1;;;;;39018:16:0;;;;39012:31;;:51;;39044:8;;;-1:-1:-1;;5799:10:0;39012:51;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39012:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39012: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;39012:51:0;;;;;;;;;39004:92;;;;-1:-1:-1;;;;;39004:92:0;;;;;;;;;39133:11;;;;;-1:-1:-1;;;;;39133:11:0;39128:36;39179:13;39207:12;39234:21;:12;39251:3;39234:16;:21::i;:::-;39270:15;39286:1;39270:17;39128:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39128:160:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39128:160: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;39128:160:0;;;;;;;;;39120:221;;;;-1:-1:-1;;;;;39120:221:0;;;;;;;;;39607:12;39368:11;;;;;;;;;-1:-1:-1;;;;;39368:11:0;-1:-1:-1;;;;;39363:56:0;;39434:9;39458:13;39486:22;39523:12;39550:23;39588:14;39363:240;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39363:240:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39363:240: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;39363:240:0;;;;;;;;;:256;39354:338;;;;-1:-1:-1;;;;;39354:338:0;;;;;;;;;39786:16;;:34;;39807:12;39786:34;:20;:34;:::i;:::-;39767:16;:53;39933:20;39951:1;39933:17;:20::i;:::-;39913:17;:40;39970:21;:28;:32;39966:137;;40019:31;40035:14;:12;:14::i;40019:31::-;;40065:26;40081:9;40065:15;:26::i;:::-;;39966:137;40141:9;-1:-1:-1;;;;;40120:199:0;;40165:12;40192;40219:22;40256:23;40294:14;40120:199;;;;;;;;;;;;;;;;;;;40339:12;40332:19;;;;;37606:2753;;;;;;;;;;:::o;9842:714::-;-1:-1:-1;;;;;10018:14:0;;9970:4;10018:14;;;:7;:14;;;;;;;;10033:10;10018:26;;;;;;;;10073:15;;;:8;:15;;;;;;9970:4;;10018:26;10063:25;;;10055:58;;;;-1:-1:-1;;;;;10055:58:0;;;;;;;;;10142:15;10132:6;:25;;10124:60;;;;-1:-1:-1;;;;;10124:60:0;;;;;;;;;-1:-1:-1;;;;;10203:17:0;;10195:52;;;;-1:-1:-1;;;;;10195:52:0;;;;;;;;;-1:-1:-1;;;;;10278:15:0;;;;;;:8;:15;;;;;;:27;;10298:6;10278:27;:19;:27;:::i;:::-;-1:-1:-1;;;;;10260:15:0;;;;;;;:8;:15;;;;;;:45;;;;10332:13;;;;;;;:25;;10350:6;10332:25;:17;:25;:::i;:::-;-1:-1:-1;;;;;10316:13:0;;;;;;:8;:13;;;;;:41;-1:-1:-1;;10372:26:0;;10368:115;;;10444:27;:15;10464:6;10444:27;:19;:27;:::i;:::-;-1:-1:-1;;;;;10415:14:0;;;;;;:7;:14;;;;;;;;10430:10;10415:26;;;;;;;:56;10368:115;10514:3;-1:-1:-1;;;;;10498:28:0;10507:5;-1:-1:-1;;;;;10498:28:0;-1:-1:-1;;;;;;;;;;;10519:6:0;10498:28;;;;;;;;;;;;;;;-1:-1:-1;10544:4:0;;9842:714;-1:-1:-1;;;;9842:714:0:o;44180:721::-;44410:7;44439:14;44435:169;;;44568:24;:12;44585:6;44568:24;:16;:24;:::i;:::-;44553:39;;44435:169;44698:195;44880:12;44698:163;44755:105;44786:12;44817:11;44847:12;44755;:105::i;:::-;44698:38;:12;44729:6;44698:38;:30;:38;:::i;2971:132::-;3053:7;;;3074;;;;3067:15;;;45764:337;45875:7;45946:1;45907:36;45924:18;;45907:12;;:16;;:36;;;;:::i;:::-;:40;:186;;46092:1;45907:186;;;46034:16;;45969;;45963:48;;-1:-1:-1;;;;;45963:48:0;;:126;;46074:14;;45963:88;;-1:-1:-1;;;;;45969:16:0;;;;45963:33;;:48;;46005:4;;45963:48;;;;41235:350;41337:7;41362:24;41389:36;41406:18;;41389:12;;:16;;:36;;;;:::i;:::-;41362:63;;41464:1;41445:16;:20;:132;;41565:12;;41445:132;;;41481:81;41545:16;41481:41;:11;41515:6;41481:41;:33;:41;:::i;12303:442::-;-1:-1:-1;;;;;12470:17:0;;12462:45;;;;-1:-1:-1;;;;;12462:45:0;;;;;;;;;12533:12;;:30;;12550:12;12533:30;:16;:30;:::i;:::-;12518:12;:45;-1:-1:-1;;;;;12590:13:0;;;;;;:8;:13;;;;;;:31;;12608:12;12590:31;:17;:31;:::i;:::-;-1:-1:-1;;;;;12574:13:0;;;;;;:8;:13;;;;;;;:47;;;;12637:45;;;;;;12647:12;;12661;;12675:6;;12637:45;;;;;;;;;;12719:3;-1:-1:-1;;;;;12698:39:0;12715:1;-1:-1:-1;;;;;12698:39:0;-1:-1:-1;;;;;;;;;;;12724:12:0;12698:39;;;;;;;;;;;;;;;12303:442;;;;:::o;2785:119::-;2845:7;2874:2;2868;:8;;2861:16;;;;-1:-1:-1;2891:7:0;;;2785:119::o;43596:576::-;43999:11;;;44081:9;;44105:16;;43994:170;;-1:-1:-1;;;;;43994:170:0;;43687:25;;;;;;43999:11;;;;-1:-1:-1;;;;;43999:11:0;;;;43994:44;;:170;;44061:4;;44081:9;;;44105:16;;;;43994:170;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43994:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43994:170: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;43994:170:0;;;;;;;;;43937:227;;;;-1:-1:-1;43937:227:0;;-1:-1:-1;43596:576:0;;-1:-1:-1;;43596:576:0:o;44909:448::-;45074:7;45120:1;45106:11;:15;:243;;45343:6;45106:243;;;45137:190;45320:6;45137:160;45284:12;45137:124;45249:11;45137:74;45202:8;45137:124;:12;45320:6;45137:42;:34;:42;:::i;:190::-;45099:250;44909:448;-1:-1:-1;;;;44909:448:0:o;32276:2226::-;32389:22;32450:1;32437:10;:14;32429:42;;;;-1:-1:-1;;;;;32429:42:0;;;;;;;;;32501:21;32511:10;32501:9;:21::i;:::-;32488:10;:34;32484:101;;;32552:21;32562:10;32552:9;:21::i;:::-;32539:34;;32484:101;32601:21;:28;:32;32597:273;;32650:31;32666:14;:12;:14::i;32650:31::-;;32696:25;32712:8;32696:15;:25::i;:::-;-1:-1:-1;32740:10:0;-1:-1:-1;;;;;32740:22:0;;;32736:72;;32781:27;32797:10;32781:15;:27::i;:::-;;32736:72;32597:273;;;32841:17;:15;:17::i;:::-;32882:20;32905:33;32917:20;32935:1;32917:17;:20::i;32905:33::-;32882:56;-1:-1:-1;32951:22:0;32976:40;33009:6;32976:28;:10;32882:56;32976:28;:14;:28;:::i;:40::-;33073:16;;33067:48;;-1:-1:-1;;;;;33067:48:0;;32951:65;;-1:-1:-1;33027:37:0;;-1:-1:-1;;;;;33073:16:0;;;;33067:33;;:48;;33109:4;;33067:48;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33067:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33067:48: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;33067:48:0;;;;;;;;;33027:88;;33145:14;33128:31;;33191:29;33174:14;:46;33170:1026;;;33237:21;33261:49;:14;33280:29;33261:49;:18;:49;:::i;:::-;33237:73;-1:-1:-1;33325:26:0;33354:43;33384:12;33354:25;33237:73;33372:6;33354:25;:17;:25;:::i;:43::-;33435:18;;33325:72;;-1:-1:-1;33435:42:0;;33325:72;33435:42;:22;:42;:::i;:::-;33414:18;:63;-1:-1:-1;;;;;33496:36:0;;;;;;:26;:36;;;;;:42;;;;;33492:630;;;-1:-1:-1;;;;;33575:36:0;;33559:13;33575:36;;;:26;:36;;;;;:42;33674:21;:28;;:59;;33714:18;;33575:42;;33674:28;;;;;;;;;;;;;;;;:35;;;:39;;:59;;;;:::i;:::-;33636:21;33658:5;33636:28;;;;;;;;;;;;;;;;;;:35;;:97;;;;33492:630;;;;33801:122;;;;;;;;-1:-1:-1;;;;;33801:122:0;;;;;;;;;;;;;33774:21;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;33774:150:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33774:150:0;;;;;;;;;;;;;;;;;;;33982:124;;;;;;;34022:28;;-1:-1:-1;;34022:30:0;33982:124;;;;;;;;33943:36;;;:26;:36;;;;;;;:163;;;;;;;;;;-1:-1:-1;;33943:163:0;;;;;;;;;;33492:630;34155:29;34138:46;;33170:1026;;;34208:59;34214:10;34226;34238:14;34254:12;34208:5;:59::i;:::-;34311:10;34284:38;;;;:26;:38;;;;;:44;;;;;;:72;;-1:-1:-1;34341:10:0;34355:1;34332:20;;;:8;:20;;;;;;:24;;34284:72;34280:215;;;34391:10;34373:29;;;;:17;:29;;;;;:44;;;34280:215;;;34468:10;34482:1;34450:29;;;:17;:29;;;;;:33;34280:215;32276:2226;;;;;;;:::o;10751:448::-;10901:10;10852:4;10892:20;;;:8;:20;;;;;;10882:30;;;10874:63;;;;-1:-1:-1;;;;;10874:63:0;;;;;;;;;-1:-1:-1;;;;;10956:17:0;;10948:52;;;;-1:-1:-1;;;;;10948:52:0;;;;;;;;;11045:10;11036:20;;;;:8;:20;;;;;;:32;;11061:6;11036:32;:24;:32;:::i;:::-;11022:10;11013:20;;;;:8;:20;;;;;;:55;;;;-1:-1:-1;;;;;11095:13:0;;;;;;:25;;11113:6;11095:25;:17;:25;:::i;:::-;-1:-1:-1;;;;;11079:13:0;;;;;;:8;:13;;;;;;;:41;;;;11136:33;;11145:10;;-1:-1:-1;;;;;;;;;;;11136:33:0;;;11162:6;;11136:33;;4204:175;-1:-1:-1;;;;;4275:23:0;;4267:32;;;;;;4332:5;;4311:38;;-1:-1:-1;;;;;4311:38:0;;;;4332:5;;4311:38;;4332:5;;4311:38;4356:5;:17;;-1:-1:-1;;;;;;4356:17:0;-1:-1:-1;;;;;4356:17:0;;;;;;;;;;4204:175::o;40367:821::-;40527:21;:28;40558:1;-1:-1:-1;40523:362:0;;;40668:21;40690:28;;-1:-1:-1;;40690:32:0;;;40668:55;;;;;;;;;;;;;;;;40637:21;40659:5;40637:28;;;;;;;;;;;;;;;:86;;:28;;;;;:86;;-1:-1:-1;;;;;;40637:86:0;-1:-1:-1;;;;;40637:86:0;;;;;;;;;;;;;;;;;;;;40823:21;:28;;40868:5;;40796:26;;40637:28;;40868:5;;40823:28;;;;;;;;;;;;;;;;;;;;;:35;-1:-1:-1;;;;;40823:35:0;40796:63;;;;;;;;;;;;:77;40523:362;40938:21;:30;;;;;-1:-1:-1;;40938:30:0;;;:::i;:::-;-1:-1:-1;;;;;;40979:34:0;;;41022:1;40979:34;;;:26;:34;;;;;:44;;;41034:40;;:48;;-1:-1:-1;;41034:48:0;;;41109:15;;;;;41099:25;41095:86;;;41141:15;:28;;-1:-1:-1;;;;;;41141:28:0;;;41095:86;40367:821;;:::o;12753:785::-;-1:-1:-1;;;;;12937:14:0;;;;;;:8;:14;;;;;;12921:30;;;12913:69;;;;-1:-1:-1;;;;;12913:69:0;;;;;;;;;-1:-1:-1;;;;;13193:14:0;;;;;;:8;:14;;;;;;:32;;13212:12;13193:32;:18;:32;:::i;:::-;-1:-1:-1;;;;;13176:14:0;;;;;;:8;:14;;;;;:49;;;13258:2;-1:-1:-1;13236:119:0;;-1:-1:-1;;;;;13325:14:0;;13342:1;13325:14;;;:8;:14;;;;;:18;13236:119;13382:12;;:30;;13399:12;13382:30;:16;:30;:::i;:::-;13367:12;:45;13428:46;;-1:-1:-1;;;;;13428:46:0;;;;;;;13439:12;;13453;;13467:6;;13428:46;;;;;;;;;;13513:1;-1:-1:-1;;;;;13490:40:0;13499:4;-1:-1:-1;;;;;13490:40:0;-1:-1:-1;;;;;;;;;;;13517:12:0;13490:40;;;;;;;17782:35691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;17782:35691:0;;;-1:-1:-1;;17782:35691:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;17782:35691:0;;;-1:-1:-1;;17782:35691:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17782:35691:0;;;-1:-1:-1;17782:35691:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17782:35691:0;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;302:615;;417:3;410:4;402:6;398:17;394:27;384:2;;435:1;432;425:12;384:2;459:3;477:78;492:62;547:6;492:62;;;477:78;;;468:87;;572:5;631:6;678:3;670:4;662:6;658:17;653:3;649:27;646:36;643:2;;;695:1;692;685:12;643:2;720:1;705:206;730:6;727:1;724:13;705:206;;;788:3;810:37;843:3;831:10;810:37;;;798:50;;-1:-1;871:4;862:14;;;;890;;;;;752:1;745:9;705:206;;;709:14;377:540;;;;;;;;925:124;989:20;;1014:30;989:20;1014:30;;1056:128;1131:13;;1149:30;1131:13;1149:30;;1191:130;1258:20;;1283:33;1258:20;1283:33;;1328:134;1406:13;;1424:33;1406:13;1424:33;;1470:442;;1572:3;1565:4;1557:6;1553:17;1549:27;1539:2;;1590:1;1587;1580:12;1539:2;1627:6;1614:20;1649:65;1664:49;1706:6;1664:49;;1649:65;1640:74;;1734:6;1727:5;1720:21;1770:4;1762:6;1758:17;1803:4;1796:5;1792:16;1838:3;1829:6;1824:3;1820:16;1817:25;1814:2;;;1855:1;1852;1845:12;1814:2;1865:41;1899:6;1894:3;1889;1865:41;;1954:1771;;2069:5;2057:9;2052:3;2048:19;2044:31;2041:2;;;2088:1;2085;2078:12;2041:2;2106:21;2121:5;2106:21;;;2097:30;-1:-1;2189:1;2220:49;2265:3;2245:9;2220:49;;;2196:74;;-1:-1;2347:2;2380:49;2425:3;2401:22;;;2380:49;;;2373:4;2366:5;2362:16;2355:75;2291:150;2509:2;2542:49;2587:3;2578:6;2567:9;2563:22;2542:49;;;2535:4;2528:5;2524:16;2517:75;2451:152;2662:2;2695:49;2740:3;2731:6;2720:9;2716:22;2695:49;;;2688:4;2681:5;2677:16;2670:75;2613:143;2817:3;2851:49;2896:3;2887:6;2876:9;2872:22;2851:49;;;2844:4;2837:5;2833:16;2826:75;2766:146;2972:3;3006:49;3051:3;3042:6;3031:9;3027:22;3006:49;;;2999:4;2992:5;2988:16;2981:75;2922:145;3132:3;3166:49;3211:3;3202:6;3191:9;3187:22;3166:49;;;3159:4;3152:5;3148:16;3141:75;3077:150;3296:3;3330:49;3375:3;3366:6;3355:9;3351:22;3330:49;;;3323:4;3316:5;3312:16;3305:75;3237:154;3464:3;3499:49;3544:3;3535:6;3524:9;3520:22;3499:49;;;3491:5;3484;3480:17;3473:76;3401:159;3619:3;3654:49;3699:3;3690:6;3679:9;3675:22;3654:49;;;3646:5;3639;3635:17;3628:76;3570:145;2035:1690;;;;;3769:1947;;3887:5;3875:9;3870:3;3866:19;3862:31;3859:2;;;3906:1;3903;3896:12;3859:2;3924:21;3939:5;3924:21;;;3915:30;-1:-1;3997:1;4028:49;4073:3;4053:9;4028:49;;;4004:74;;-1:-1;4163:2;4196:49;4241:3;4217:22;;;4196:49;;;4189:4;4182:5;4178:16;4171:75;4099:158;4329:2;4362:49;4407:3;4398:6;4387:9;4383:22;4362:49;;;4355:4;4348:5;4344:16;4337:75;4267:156;4490:2;4523:49;4568:3;4559:6;4548:9;4544:22;4523:49;;;4516:4;4509:5;4505:16;4498:75;4433:151;4649:3;4683:49;4728:3;4719:6;4708:9;4704:22;4683:49;;;4676:4;4669:5;4665:16;4658:75;4594:150;4817:3;4851:49;4896:3;4887:6;4876:9;4872:22;4851:49;;;4844:4;4837:5;4833:16;4826:75;4754:158;4983:3;5017:49;5062:3;5053:6;5042:9;5038:22;5017:49;;;5010:4;5003:5;4999:16;4992:75;4922:156;5149:3;5183:49;5228:3;5219:6;5208:9;5204:22;5183:49;;;5176:4;5169:5;5165:16;5158:75;5088:156;5313:3;5348:49;5393:3;5384:6;5373:9;5369:22;5348:49;;;5340:5;5333;5329:17;5322:76;5254:155;5461:3;5496:46;5538:3;5529:6;5518:9;5514:22;5496:46;;;5488:5;5481;5477:17;5470:73;5419:135;5610:3;5645:49;5690:3;5681:6;5670:9;5666:22;5645:49;;;5637:5;5630;5626:17;5619:76;5564:142;3853:1863;;;;;6001:130;6077:13;;6095:31;6077:13;6095:31;;6138:241;;6242:2;6230:9;6221:7;6217:23;6213:32;6210:2;;;6258:1;6255;6248:12;6210:2;6293:1;6310:53;6355:7;6335:9;6310:53;;6386:263;;6501:2;6489:9;6480:7;6476:23;6472:32;6469:2;;;6517:1;6514;6507:12;6469:2;6552:1;6569:64;6625:7;6605:9;6569:64;;6656:366;;;6777:2;6765:9;6756:7;6752:23;6748:32;6745:2;;;6793:1;6790;6783:12;6745:2;6828:1;6845:53;6890:7;6870:9;6845:53;;;6835:63;;6807:97;6935:2;6953:53;6998:7;6989:6;6978:9;6974:22;6953:53;;;6943:63;;6914:98;6739:283;;;;;;7029:1207;;;;;;;;7255:3;7243:9;7234:7;7230:23;7226:33;7223:2;;;7272:1;7269;7262:12;7223:2;7307:1;7324:53;7369:7;7349:9;7324:53;;;7314:63;;7286:97;7414:2;7432:53;7477:7;7468:6;7457:9;7453:22;7432:53;;;7422:63;;7393:98;7522:2;7540:53;7585:7;7576:6;7565:9;7561:22;7540:53;;;7530:63;;7501:98;7630:2;7648:53;7693:7;7684:6;7673:9;7669:22;7648:53;;;7638:63;;7609:98;7738:3;7757:53;7802:7;7793:6;7782:9;7778:22;7757:53;;;7747:63;;7717:99;7875:3;7864:9;7860:19;7847:33;7900:18;7892:6;7889:30;7886:2;;;7932:1;7929;7922:12;7886:2;7952:63;8007:7;7998:6;7987:9;7983:22;7952:63;;;7942:73;;7826:195;8080:3;8069:9;8065:19;8052:33;8105:18;8097:6;8094:30;8091:2;;;8137:1;8134;8127:12;8091:2;8157:63;8212:7;8203:6;8192:9;8188:22;8157:63;;;8147:73;;8031:195;7217:1019;;;;;;;;;;;8243:491;;;;8381:2;8369:9;8360:7;8356:23;8352:32;8349:2;;;8397:1;8394;8387:12;8349:2;8432:1;8449:53;8494:7;8474:9;8449:53;;;8439:63;;8411:97;8539:2;8557:53;8602:7;8593:6;8582:9;8578:22;8557:53;;;8547:63;;8518:98;8647:2;8665:53;8710:7;8701:6;8690:9;8686:22;8665:53;;;8655:63;;8626:98;8343:391;;;;;;8741:869;;;;;;;8930:3;8918:9;8909:7;8905:23;8901:33;8898:2;;;8947:1;8944;8937:12;8898:2;8982:1;8999:53;9044:7;9024:9;8999:53;;;8989:63;;8961:97;9089:2;9107:53;9152:7;9143:6;9132:9;9128:22;9107:53;;;9097:63;;9068:98;9197:2;9215:53;9260:7;9251:6;9240:9;9236:22;9215:53;;;9205:63;;9176:98;9305:2;9323:53;9368:7;9359:6;9348:9;9344:22;9323:53;;;9313:63;;9284:98;9413:3;9432:53;9477:7;9468:6;9457:9;9453:22;9432:53;;;9422:63;;9392:99;9522:3;9541:53;9586:7;9577:6;9566:9;9562:22;9541:53;;;9531:63;;9501:99;8892:718;;;;;;;;;9617:366;;;9738:2;9726:9;9717:7;9713:23;9709:32;9706:2;;;9754:1;9751;9744:12;9706:2;9789:1;9806:53;9851:7;9831:9;9806:53;;;9796:63;;9768:97;9896:2;9914:53;9959:7;9950:6;9939:9;9935:22;9914:53;;9990:288;;10117:3;10105:9;10096:7;10092:23;10088:33;10085:2;;;10134:1;10131;10124:12;10085:2;10169:1;10186:76;10254:7;10234:9;10186:76;;10285:257;;10397:2;10385:9;10376:7;10372:23;10368:32;10365:2;;;10413:1;10410;10403:12;10365:2;10448:1;10465:61;10518:7;10498:9;10465:61;;10549:241;;10653:2;10641:9;10632:7;10628:23;10624:32;10621:2;;;10669:1;10666;10659:12;10621:2;10704:1;10721:53;10766:7;10746:9;10721:53;;10797:263;;10912:2;10900:9;10891:7;10887:23;10883:32;10880:2;;;10928:1;10925;10918:12;10880:2;10963:1;10980:64;11036:7;11016:9;10980:64;;11067:850;;;;;;11291:3;11279:9;11270:7;11266:23;11262:33;11259:2;;;11308:1;11305;11298:12;11259:2;11343:1;11360:79;11431:7;11411:9;11360:79;;;11350:89;;11322:123;11476:3;11495:82;11569:7;11560:6;11549:9;11545:22;11495:82;;;11485:92;;11455:128;11614:3;11633:53;11678:7;11669:6;11658:9;11654:22;11633:53;;;11623:63;;11593:99;11723:3;11742:53;11787:7;11778:6;11767:9;11763:22;11742:53;;;11732:63;;11702:99;11832:3;11851:50;11893:7;11884:6;11873:9;11869:22;11851:50;;;11841:60;;11811:96;11253:664;;;;;;;;;12442:366;;;12563:2;12551:9;12542:7;12538:23;12534:32;12531:2;;;12579:1;12576;12569:12;12531:2;12614:1;12631:53;12676:7;12656:9;12631:53;;12815:737;;;;;;12984:3;12972:9;12963:7;12959:23;12955:33;12952:2;;;13001:1;12998;12991:12;12952:2;13036:1;13053:53;13098:7;13078:9;13053:53;;;13043:63;;13015:97;13143:2;13161:53;13206:7;13197:6;13186:9;13182:22;13161:53;;;13151:63;;13122:98;13251:2;13269:53;13314:7;13305:6;13294:9;13290:22;13269:53;;;13259:63;;13230:98;13359:2;13377:53;13422:7;13413:6;13402:9;13398:22;13377:53;;;13367:63;;13338:98;13467:3;13486:50;13528:7;13519:6;13508:9;13504:22;13486:50;;13559:611;;;;;13711:3;13699:9;13690:7;13686:23;13682:33;13679:2;;;13728:1;13725;13718:12;13679:2;13763:1;13780:53;13825:7;13805:9;13780:53;;;13770:63;;13742:97;13870:2;13888:53;13933:7;13924:6;13913:9;13909:22;13888:53;;;13878:63;;13849:98;13978:2;13996:53;14041:7;14032:6;14021:9;14017:22;13996:53;;;13986:63;;13957:98;14086:2;14104:50;14146:7;14137:6;14126:9;14122:22;14104:50;;;14094:60;;14065:95;13673:497;;;;;;;;14177:485;;;;14312:2;14300:9;14291:7;14287:23;14283:32;14280:2;;;14328:1;14325;14318:12;14280:2;14363:1;14380:53;14425:7;14405:9;14380:53;;;14370:63;;14342:97;14470:2;14488:53;14533:7;14524:6;14513:9;14509:22;14488:53;;;14478:63;;14449:98;14578:2;14596:50;14638:7;14629:6;14618:9;14614:22;14596:50;;14669:672;;;;;14835:3;14823:9;14814:7;14810:23;14806:33;14803:2;;;14852:1;14849;14842:12;14803:2;14887:1;14904:64;14960:7;14940:9;14904:64;;;14894:74;;14866:108;15005:2;15023:64;15079:7;15070:6;15059:9;15055:22;15023:64;;;15013:74;;14984:109;15124:2;15142:64;15198:7;15189:6;15178:9;15174:22;15142:64;;;15132:74;;15103:109;15243:2;15261:64;15317:7;15308:6;15297:9;15293:22;15261:64;;15348:259;;15461:2;15449:9;15440:7;15436:23;15432:32;15429:2;;;15477:1;15474;15467:12;15429:2;15512:1;15529:62;15583:7;15563:9;15529:62;;15615:173;;15702:46;15744:3;15736:6;15702:46;;;-1:-1;;15777:4;15768:14;;15695:93;15797:173;;15884:46;15926:3;15918:6;15884:46;;15978:142;16069:45;16108:5;16069:45;;;16064:3;16057:58;16051:69;;;16127:184;16244:61;16272:32;16298:5;16272:32;;;16244:61;;16318:103;16391:24;16409:5;16391:24;;16581:660;16714:52;16760:5;16714:52;;;16779:84;16856:6;16851:3;16779:84;;;16772:91;;16884:54;16932:5;16884:54;;;16958:7;16986:1;16971:258;16996:6;16993:1;16990:13;16971:258;;;17063:6;17057:13;17084:63;17143:3;17128:13;17084:63;;;17077:70;;17164:58;17215:6;17164:58;;;17154:68;-1:-1;;17018:1;17011:9;16971:258;;;16975:14;16693:548;;;;;;17284:666;17419:53;17466:5;17419:53;;;17485:85;17563:6;17558:3;17485:85;;;17478:92;;17591:55;17640:5;17591:55;;;17666:7;17694:1;17679:259;17704:6;17701:1;17698:13;17679:259;;;17771:6;17765:13;17792:63;17851:3;17836:13;17792:63;;;17785:70;;17872:59;17924:6;17872:59;;;17862:69;-1:-1;;17726:1;17719:9;17679:259;;17989:690;;18134:54;18182:5;18134:54;;;18201:86;18280:6;18275:3;18201:86;;;18194:93;;18308:56;18358:5;18308:56;;;18384:7;18412:1;18397:260;18422:6;18419:1;18416:13;18397:260;;;18489:6;18483:13;18510:63;18569:3;18554:13;18510:63;;;18503:70;;18590:60;18643:6;18590:60;;;18580:70;-1:-1;;18444:1;18437:9;18397:260;;;-1:-1;18670:3;;18113:566;-1:-1;;;;;18113:566;18687:104;18764:21;18779:5;18764:21;;18798:103;18871:24;18889:5;18871:24;;19028:343;;19138:38;19170:5;19138:38;;;19188:70;19251:6;19246:3;19188:70;;;19181:77;;19263:52;19308:6;19303:3;19296:4;19289:5;19285:16;19263:52;;;19336:29;19358:6;19336:29;;;19327:39;;;;19118:253;-1:-1;;;19118:253;19378:356;;19506:38;19538:5;19506:38;;;19556:88;19637:6;19632:3;19556:88;;;19549:95;;19649:52;19694:6;19689:3;19682:4;19675:5;19671:16;19649:52;;;19713:16;;;;;19486:248;-1:-1;;19486:248;19741:142;19832:45;19871:5;19832:45;;20410:823;;20529:5;20523:12;20563:1;20552:9;20548:17;20576:1;20571:248;;;;20830:1;20825:402;;;;20541:686;;20571:248;20649:4;20645:1;20634:9;20630:17;20626:28;20668:71;20732:6;20727:3;20668:71;;;-1:-1;;20758:25;;20746:38;;20661:78;-1:-1;;20807:4;20798:14;;;-1:-1;20571:248;;20825:402;20894:1;20883:9;20879:17;20910:71;20974:6;20969:3;20910:71;;;20903:78;;21003:38;21035:5;21003:38;;;21057:1;21065:130;21079:6;21076:1;21073:13;21065:130;;;21138:14;;21125:11;;;21118:35;21185:1;21172:15;;;;21101:4;21094:12;21065:130;;;21209:11;;;-1:-1;;;20541:686;;20499:734;;;;;;21242:364;;21402:67;21466:2;21461:3;21402:67;;;21502:66;21482:87;;21597:2;21588:12;;21388:218;-1:-1;;21388:218;21615:364;;21775:67;21839:2;21834:3;21775:67;;;21875:66;21855:87;;21970:2;21961:12;;21761:218;-1:-1;;21761:218;21988:364;;22148:67;22212:2;22207:3;22148:67;;;22248:66;22228:87;;22343:2;22334:12;;22134:218;-1:-1;;22134:218;22361:364;;22521:67;22585:2;22580:3;22521:67;;;22621:66;22601:87;;22716:2;22707:12;;22507:218;-1:-1;;22507:218;22734:364;;22894:67;22958:2;22953:3;22894:67;;;22994:66;22974:87;;23089:2;23080:12;;22880:218;-1:-1;;22880:218;23107:465;;23267:67;23331:2;23326:3;23267:67;;;23367:66;23347:87;;23468:66;23463:2;23454:12;;23447:88;23563:2;23554:12;;23253:319;-1:-1;;23253:319;23581:364;;23741:67;23805:2;23800:3;23741:67;;;23841:66;23821:87;;23936:2;23927:12;;23727:218;-1:-1;;23727:218;23954:364;;24114:67;24178:2;24173:3;24114:67;;;24214:66;24194:87;;24309:2;24300:12;;24100:218;-1:-1;;24100:218;24327:364;;24487:67;24551:2;24546:3;24487:67;;;24587:66;24567:87;;24682:2;24673:12;;24473:218;-1:-1;;24473:218;24700:364;;24860:67;24924:2;24919:3;24860:67;;;24960:66;24940:87;;25055:2;25046:12;;24846:218;-1:-1;;24846:218;25073:364;;25233:67;25297:2;25292:3;25233:67;;;25333:66;25313:87;;25428:2;25419:12;;25219:218;-1:-1;;25219:218;25446:364;;25606:67;25670:2;25665:3;25606:67;;;25706:66;25686:87;;25801:2;25792:12;;25592:218;-1:-1;;25592:218;25819:364;;25979:67;26043:2;26038:3;25979:67;;;26079:66;26059:87;;26174:2;26165:12;;25965:218;-1:-1;;25965:218;26192:364;;26352:67;26416:2;26411:3;26352:67;;;26452:66;26432:87;;26547:2;26538:12;;26338:218;-1:-1;;26338:218;26565:364;;26725:67;26789:2;26784:3;26725:67;;;26825:66;26805:87;;26920:2;26911:12;;26711:218;-1:-1;;26711:218;26938:364;;27098:67;27162:2;27157:3;27098:67;;;27198:66;27178:87;;27293:2;27284:12;;27084:218;-1:-1;;27084:218;27311:364;;27471:67;27535:2;27530:3;27471:67;;;27571:66;27551:87;;27666:2;27657:12;;27457:218;-1:-1;;27457:218;27684:364;;27844:67;27908:2;27903:3;27844:67;;;27944:66;27924:87;;28039:2;28030:12;;27830:218;-1:-1;;27830:218;28057:364;;28217:67;28281:2;28276:3;28217:67;;;28317:66;28297:87;;28412:2;28403:12;;28203:218;-1:-1;;28203:218;28430:260;;28589:65;28652:1;28647:3;28589:65;;28699:465;;28859:67;28923:2;28918:3;28859:67;;;28959:66;28939:87;;-1:-1;;;;;29055:2;29046:12;;29039:88;29155:2;29146:12;;28845:319;-1:-1;;28845:319;29173:364;;29333:67;29397:2;29392:3;29333:67;;;29433:66;29413:87;;29528:2;29519:12;;29319:218;-1:-1;;29319:218;29546:364;;29706:67;29770:2;29765:3;29706:67;;;29806:66;29786:87;;29901:2;29892:12;;29692:218;-1:-1;;29692:218;29919:364;;30079:67;30143:2;30138:3;30079:67;;;30179:66;30159:87;;30274:2;30265:12;;30065:218;-1:-1;;30065:218;30292:364;;30452:67;30516:2;30511:3;30452:67;;;30552:66;30532:87;;30647:2;30638:12;;30438:218;-1:-1;;30438:218;30739:1167;30957:22;;30882:4;30873:14;;;30985:62;30877:3;30957:22;30985:62;;;30902:151;31136:4;31129:5;31125:16;31119:23;31148:63;31205:4;31200:3;31196:14;31182:12;31148:63;;;31063:154;31305:4;31298:5;31294:16;31288:23;31317:63;31374:4;31369:3;31365:14;31351:12;31317:63;;;31227:159;31478:4;31471:5;31467:16;31461:23;31490:63;31547:4;31542:3;31538:14;31524:12;31490:63;;;31396:163;31655:4;31648:5;31644:16;31638:23;31667:63;31724:4;31719:3;31715:14;31701:12;31667:63;;;31569:167;31810:4;31803:5;31799:16;31793:23;31822:63;31879:4;31874:3;31870:14;31856:12;31822:63;;;31746:145;30855:1051;;;;32143:152;32244:45;32264:24;32282:5;32264:24;;;32244:45;;32302:107;32381:22;32397:5;32381:22;;32416:276;;32551:91;32638:3;32629:6;32551:91;;;-1:-1;32664:2;32655:12;;32539:153;-1:-1;32539:153;32699:415;;32862:91;32949:3;32940:6;32862:91;;;32975:2;32970:3;32966:12;32959:19;;32989:75;33060:3;33051:6;32989:75;;;-1:-1;33086:2;33077:12;;32850:264;-1:-1;;32850:264;33121:262;;33265:93;33354:3;33345:6;33265:93;;33390:213;33508:2;33493:18;;33522:71;33497:9;33566:6;33522:71;;33610:229;33736:2;33721:18;;33750:79;33725:9;33802:6;33750:79;;33846:340;34000:2;33985:18;;34014:79;33989:9;34066:6;34014:79;;;34104:72;34172:2;34161:9;34157:18;34148:6;34104:72;;34193:467;34383:2;34368:18;;34397:79;34372:9;34449:6;34397:79;;;34487:80;34563:2;34552:9;34548:18;34539:6;34487:80;;;34578:72;34646:2;34635:9;34631:18;34622:6;34578:72;;34667:451;34849:2;34834:18;;34863:79;34838:9;34915:6;34863:79;;;34953:72;35021:2;35010:9;35006:18;34997:6;34953:72;;;35036;35104:2;35093:9;35089:18;35080:6;35036:72;;35125:324;35271:2;35256:18;;35285:71;35260:9;35329:6;35285:71;;35456:759;35708:3;35693:19;;35723:71;35697:9;35767:6;35723:71;;;35805:72;35873:2;35862:9;35858:18;35849:6;35805:72;;;35888;35956:2;35945:9;35941:18;35932:6;35888:72;;;35971;36039:2;36028:9;36024:18;36015:6;35971:72;;;36054:73;36122:3;36111:9;36107:19;36098:6;36054:73;;;36138:67;36200:3;36189:9;36185:19;36176:6;36138:67;;36222:771;36480:3;36465:19;;36495:71;36469:9;36539:6;36495:71;;;36577:72;36645:2;36634:9;36630:18;36621:6;36577:72;;;36660;36728:2;36717:9;36713:18;36704:6;36660:72;;;36743;36811:2;36800:9;36796:18;36787:6;36743:72;;;36826:73;36894:3;36883:9;36879:19;36870:6;36826:73;;;36910;36978:3;36967:9;36963:19;36954:6;36910:73;;37000:340;37154:2;37139:18;;37168:71;37143:9;37212:6;37168:71;;;37250:80;37326:2;37315:9;37311:18;37302:6;37250:80;;37694:324;37840:2;37825:18;;37854:71;37829:9;37898:6;37854:71;;;37936:72;38004:2;37993:9;37989:18;37980:6;37936:72;;38025:1014;38411:3;38396:19;;38426:117;38400:9;38516:6;38426:117;;;38554:121;38670:3;38659:9;38655:19;38646:6;38554:121;;;38724:9;38718:4;38714:20;38708:3;38697:9;38693:19;38686:49;38749:76;38820:4;38811:6;38749:76;;;38741:84;;38874:9;38868:4;38864:20;38858:3;38847:9;38843:19;38836:49;38899:130;39024:4;38899:130;;39046:361;39214:2;39228:47;;;39199:18;;39289:108;39199:18;39383:6;39289:108;;39414:201;39526:2;39511:18;;39540:65;39515:9;39578:6;39540:65;;39622:213;39740:2;39725:18;;39754:71;39729:9;39798:6;39754:71;;39842:406;40005:2;39990:18;;40019:71;39994:9;40063:6;40019:71;;;40138:9;40132:4;40128:20;40123:2;40112:9;40108:18;40101:48;40163:75;40233:4;40224:6;40163:75;;40255:547;40457:3;40442:19;;40472:71;40446:9;40516:6;40472:71;;;40554:72;40622:2;40611:9;40607:18;40598:6;40554:72;;;40637;40705:2;40694:9;40690:18;40681:6;40637:72;;;40720;40788:2;40777:9;40773:18;40764:6;40720:72;;40809:771;41067:3;41052:19;;41082:71;41056:9;41126:6;41082:71;;;41164:72;41232:2;41221:9;41217:18;41208:6;41164:72;;;41247;41315:2;41304:9;41300:18;41291:6;41247:72;;;41330;41398:2;41387:9;41383:18;41374:6;41330:72;;;41413:73;41481:3;41470:9;41466:19;41457:6;41413:73;;;41497;41565:3;41554:9;41550:19;41541:6;41497:73;;41587:293;41721:2;41735:47;;;41706:18;;41796:74;41706:18;41856:6;41796:74;;41887:407;42078:2;42092:47;;;42063:18;;42153:131;42063:18;42153:131;;42301:407;42492:2;42506:47;;;42477:18;;42567:131;42477:18;42567:131;;42715:407;42906:2;42920:47;;;42891:18;;42981:131;42891:18;42981:131;;43129:407;43320:2;43334:47;;;43305:18;;43395:131;43305:18;43395:131;;43543:407;43734:2;43748:47;;;43719:18;;43809:131;43719:18;43809:131;;43957:407;44148:2;44162:47;;;44133:18;;44223:131;44133:18;44223:131;;44371:407;44562:2;44576:47;;;44547:18;;44637:131;44547:18;44637:131;;44785:407;44976:2;44990:47;;;44961:18;;45051:131;44961:18;45051:131;;45199:407;45390:2;45404:47;;;45375:18;;45465:131;45375:18;45465:131;;45613:407;45804:2;45818:47;;;45789:18;;45879:131;45789:18;45879:131;;46027:407;46218:2;46232:47;;;46203:18;;46293:131;46203:18;46293:131;;46441:407;46632:2;46646:47;;;46617:18;;46707:131;46617:18;46707:131;;46855:407;47046:2;47060:47;;;47031:18;;47121:131;47031:18;47121:131;;47269:407;47460:2;47474:47;;;47445:18;;47535:131;47445:18;47535:131;;47683:407;47874:2;47888:47;;;47859:18;;47949:131;47859:18;47949:131;;48097:407;48288:2;48302:47;;;48273:18;;48363:131;48273:18;48363:131;;48511:407;48702:2;48716:47;;;48687:18;;48777:131;48687:18;48777:131;;48925:407;49116:2;49130:47;;;49101:18;;49191:131;49101:18;49191:131;;49339:407;49530:2;49544:47;;;49515:18;;49605:131;49515:18;49605:131;;49753:407;49944:2;49958:47;;;49929:18;;50019:131;49929:18;50019:131;;50167:407;50358:2;50372:47;;;50343:18;;50433:131;50343:18;50433:131;;50581:407;50772:2;50786:47;;;50757:18;;50847:131;50757:18;50847:131;;50995:407;51186:2;51200:47;;;51171:18;;51261:131;51171:18;51261:131;;51409:407;51600:2;51614:47;;;51585:18;;51675:131;51585:18;51675:131;;51823:314;51991:3;51976:19;;52006:121;51980:9;52100:6;52006:121;;52364:312;52504:2;52489:18;;52518:71;52493:9;52562:6;52518:71;;;52600:66;52662:2;52651:9;52647:18;52638:6;52600:66;;52683:647;52907:3;52892:19;;52922:71;52896:9;52966:6;52922:71;;;53004:72;53072:2;53061:9;53057:18;53048:6;53004:72;;;53087;53155:2;53144:9;53140:18;53131:6;53087:72;;;53170;53238:2;53227:9;53223:18;53214:6;53170:72;;;53253:67;53315:3;53304:9;53300:19;53291:6;53253:67;;53337:435;53511:2;53496:18;;53525:71;53500:9;53569:6;53525:71;;;53607:72;53675:2;53664:9;53660:18;53651:6;53607:72;;54333:205;54447:2;54432:18;;54461:67;54436:9;54501:6;54461:67;;54545:256;54607:2;54601:9;54633:17;;;54708:18;54693:34;;54729:22;;;54690:62;54687:2;;;54765:1;54762;54755:12;54687:2;54781;54774:22;54585:216;;-1:-1;54585:216;54808:233;;54965:18;54957:6;54954:30;54951:2;;;54997:1;54994;54987:12;54951:2;-1:-1;55026:4;55014:17;;54888:153;55048:259;;55192:18;55184:6;55181:30;55178:2;;;55224:1;55221;55214:12;55178:2;-1:-1;55297:4;55268;55245:17;;;;-1:-1;;55241:33;55287:15;;55115:192;55564:123;55674:4;55662:17;;55642:45;55700:129;;55768:15;;;55816:4;55803:18;;;55759:70;55839:96;-1:-1;55927:3;;55911:24;55942:97;-1:-1;56031:3;;56015:24;56046:107;56136:12;;56120:33;57055:178;57173:19;;;57222:4;57213:14;;57166:67;57737:91;;57799:24;57817:5;57799:24;;57941:85;58007:13;58000:21;;57983:43;58112:121;-1:-1;;;;;58174:54;;58157:76;58319:81;58390:4;58379:16;;58362:38;58407:129;;58494:37;58525:5;58494:37;;58543:116;;58630:24;58648:5;58630:24;;58789:121;;58868:37;58899:5;58868:37;;59033:145;59114:6;59109:3;59104;59091:30;-1:-1;59170:1;59152:16;;59145:27;59084:94;59187:268;59252:1;59259:101;59273:6;59270:1;59267:13;59259:101;;;59340:11;;;59334:18;59321:11;;;59314:39;59295:2;59288:10;59259:101;;;59375:6;59372:1;59369:13;59366:2;;;-1:-1;;59440:1;59422:16;;59415:27;59236:219;59463:103;;59535:26;59555:5;59573:89;59637:20;59651:5;59637:20;;59750:97;59838:2;59818:14;-1:-1;;59814:28;;59798:49;59856:81;59921:2;59917:14;;59898:39;59946:117;60015:24;60033:5;60015:24;;;60008:5;60005:35;59995:2;;60054:1;60051;60044:12;60070:111;60136:21;60151:5;60136:21;;60188:117;60257:24;60275:5;60257:24;;60436:113;60503:22;60519:5;60503:22;

Swarm Source

bzzr://122ea82348615938dc9aef2e1e7a7a9b0243b84270c3ad0bd802796374920cc4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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