Contract 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 8

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xff6c7debe5a4bc4f9177b84001751ac6f68472ba2d178d41a786403a38f20d3bWithdraw704395232023-03-16 14:57:58397 days 9 hrs ago0x155be441950115280512e7916aca24f3cc49d94c IN  0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0 ETH0.0001187 0.1
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16Buy Goods404214912022-11-23 2:46:47510 days 21 hrs ago0x93090a94f723e03ccf3e5b38183bdbe24e47a72e IN  0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0 ETH0.00009236 0.1
0xe86ff3770a1118c392a042ed8d595dad70d909fb39ea67b35808d5d1abfede98Pay Monthly Fee404208632022-11-23 2:43:23510 days 21 hrs ago0xe390d8ec12340d8dcdb8511907fe0fd3d87430b3 IN  0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0 ETH0.00006828 0.1
0x4ee12dabd67e6733c75f2bac677f28a31d9cba3b8a1e34c0174118d326f85a8bDeposit ETH403291242022-11-22 18:44:16511 days 5 hrs ago0x155be441950115280512e7916aca24f3cc49d94c IN  0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0.05 ETH0.00003964 0.1
0x91e1fef2fcd970b667a9b16c2abfc23eb28aed61ab5b297dc27ee20bc8c6f943Update Signer403086372022-11-22 17:12:26511 days 7 hrs ago0x24bd16b990f3a376712f4fce6c5fcb05a3db3745 IN  0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0 ETH0.00002848 0.1
0xe3c4a4715d8d1f05bda4c4cde26ce85ad5e6669dc959e1d521a516f194f0c6d8Initialize402847982022-11-22 15:28:53511 days 9 hrs ago0x24bd16b990f3a376712f4fce6c5fcb05a3db3745 IN  0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0 ETH0.00011163 0.1
0xe2fac280194810cd99ac3c2c0f71065422bf38ca65d0cae863b6976aff8adebbInitialize Owner...402805152022-11-22 15:10:19511 days 9 hrs ago0x24bd16b990f3a376712f4fce6c5fcb05a3db3745 IN  0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0 ETH0.00004166 0.1
0x86e34fccfae3e15000e5350924dcf97ad4394163cfd82d0ab30684553edbe6230x60a06040402800642022-11-22 15:08:19511 days 9 hrs ago0x24bd16b990f3a376712f4fce6c5fcb05a3db3745 IN  Create: OkseCard0 ETH0.00199106 0.1
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xff6c7debe5a4bc4f9177b84001751ac6f68472ba2d178d41a786403a38f20d3b704395232023-03-16 14:57:58397 days 9 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x68453d1d6fcdb3690e072e0dd621981d43722fbd0 ETH
0xff6c7debe5a4bc4f9177b84001751ac6f68472ba2d178d41a786403a38f20d3b704395232023-03-16 14:57:58397 days 9 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0x155be441950115280512e7916aca24f3cc49d94c0.033448585637499783 ETH
0xff6c7debe5a4bc4f9177b84001751ac6f68472ba2d178d41a786403a38f20d3b704395232023-03-16 14:57:58397 days 9 hrs ago Wrapped Ether 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0.033448585637499783 ETH
0xff6c7debe5a4bc4f9177b84001751ac6f68472ba2d178d41a786403a38f20d3b704395232023-03-16 14:57:58397 days 9 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c Wrapped Ether0 ETH
0xff6c7debe5a4bc4f9177b84001751ac6f68472ba2d178d41a786403a38f20d3b704395232023-03-16 14:57:58397 days 9 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x68453d1d6fcdb3690e072e0dd621981d43722fbd0 ETH
0xff6c7debe5a4bc4f9177b84001751ac6f68472ba2d178d41a786403a38f20d3b704395232023-03-16 14:57:58397 days 9 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0x00000000000000000000000000000000000000010 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0xfa3e7d864cf426381af1a990fd2e19d56b03df330 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x68453d1d6fcdb3690e072e0dd621981d43722fbd0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0xf1be1e8bca3cf8178d02749e53baab039d0122b70 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x68453d1d6fcdb3690e072e0dd621981d43722fbd0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0x1d8616e6d8a770ee99871e9f64e0234f50a39d9b 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x1d8616e6d8a770ee99871e9f64e0234f50a39d9b0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0xf1be1e8bca3cf8178d02749e53baab039d0122b70 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x68453d1d6fcdb3690e072e0dd621981d43722fbd0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x68453d1d6fcdb3690e072e0dd621981d43722fbd0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0x1d8616e6d8a770ee99871e9f64e0234f50a39d9b 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x4d76bc7b9629cc6bdefec6118ea5bd3a63a940d90 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0xfa3e7d864cf426381af1a990fd2e19d56b03df330 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c Arbitrum: USDC Token0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c Arbitrum: USDC Token0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0xfa3e7d864cf426381af1a990fd2e19d56b03df330 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x41f5391b474bfb3688aca4ea3e6bebd8abe7838c0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c Wrapped Ether0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x41f5391b474bfb3688aca4ea3e6bebd8abe7838c0 ETH
0x387fce901652b7e71545cffa49421518813153a2e2c19741c3251dd9c2dc8e16404214912022-11-23 2:46:47510 days 21 hrs ago 0xf7a2bb5c3592ede90cf33f9832529404d650cf8c 0x41f5391b474bfb3688aca4ea3e6bebd8abe7838c0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OkseCard

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2022-11-22
*/

// Sources flattened with hardhat v2.9.6 https://hardhat.org

// File @openzeppelin/contracts/token/ERC20/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File contracts/libraries/TransferHelper.sol

pragma solidity >=0.6.0;

library TransferHelper {
    /// @notice Transfers tokens from the targeted address to the given destination
    /// @notice Errors with 'STF' if transfer fails
    /// @param token The contract address of the token to be transferred
    /// @param from The originating address from which the tokens will be transferred
    /// @param to The destination address of the transfer
    /// @param value The amount to be transferred
    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) =
            token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF');
    }

    /// @notice Transfers tokens from msg.sender to a recipient
    /// @dev Errors with ST if transfer fails
    /// @param token The contract address of the token which will be transferred
    /// @param to The recipient of the transfer
    /// @param value The value of the transfer
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST');
    }

    /// @notice Approves the stipulated contract to spend the given allowance in the given token
    /// @dev Errors with 'SA' if transfer fails
    /// @param token The contract address of the token to be approved
    /// @param to The target of the approval
    /// @param value The amount of the given token the target will be allowed to spend
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA');
    }

    /// @notice Transfers ETH to the recipient address
    /// @dev Fails with `STE`
    /// @param to The destination of the transfer
    /// @param value The value to be transferred
    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'STE');
    }
}


// File contracts/interfaces/PriceOracle.sol

pragma solidity ^0.7.0;

abstract contract PriceOracle {
    /// @notice Indicator that this is a PriceOracle contract (for inspection)
    bool public constant isPriceOracle = true;

    /**
      * @notice Get the underlying price of a cToken asset
      * @param market The cToken to get the underlying price of
      * @return The underlying asset price mantissa (scaled by 1e18).
      *  Zero means the price is unavailable.
      */
    function getUnderlyingPrice(address market) external virtual view returns (uint);

}


// File contracts/interfaces/ILimitManager.sol

pragma solidity ^0.7.0;

interface ILimitManager {
    function getUserLimit(address userAddr) external view returns (uint256);

    function getDailyLimit(uint256 level) external view returns (uint256);

    function getSpendAmountToday(address userAddr)
        external
        view
        returns (uint256);

    function withinLimits(address userAddr, uint256 usdAmount)
        external
        view
        returns (bool);

    function updateUserSpendAmount(address userAddr, uint256 usdAmount)
        external;
}


// File contracts/interfaces/ILevelManager.sol

pragma solidity ^0.7.0;

interface ILevelManager {
    function getUserLevel(address userAddr) external view returns (uint256);

    function getLevel(uint256 _okseAmount) external view returns (uint256);

    function updateUserLevel(
        address userAddr,
        uint256 beforeAmount
    ) external returns (bool);
}


// File contracts/interfaces/IMarketManager.sol

pragma solidity ^0.7.0;

interface IMarketManager {
    function WETH() external view returns (address);

    function USDC() external view returns (address);

    function OKSE() external view returns (address);

    function defaultMarket() external view returns (address);

    function oksePaymentEnable() external view returns (bool);

    function emergencyStop() external view returns (bool);

    function marketEnable(address market) external view returns (bool);

    function isMarketExist(address market) external view returns (bool);

    function userMainMarket(address userAddr) external view returns (address);

    function slippage() external view returns (uint256);

    function getUserMainMarket(address userAddr)
        external
        view
        returns (address);

    function setUserMainMakret(address userAddr, address market) external;
}


// File contracts/interfaces/ICashBackManager.sol

pragma solidity ^0.7.0;

interface ICashBackManager {
    function cashBackEnable() external view returns (bool);

    function getCashBackPercent(uint256 level) external view returns (uint256);
}


// File contracts/interfaces/IWETH9.sol

pragma solidity ^0.7.0;

/// @title Interface for WETH9
interface IWETH9 is IERC20 {
    /// @notice Deposit ether to get wrapped ether
    function deposit() external payable;

    /// @notice Withdraw wrapped ether to get ether
    function withdraw(uint256) external;
}


// File contracts/interfaces/ISwapper.sol

pragma solidity ^0.7.0;

interface ISwapper {
    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) external;

    function getAmountsIn(uint256 amountOut, address[] memory path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsOut(uint256 amountIn, address[] memory path)
        external
        view
        returns (uint256[] memory amounts);

    function GetReceiverAddress(address[] memory path)
        external
        view
        returns (address);

    function getOptimumPath(address token0, address token1)
        external
        view
        returns (address[] memory);
}


// File contracts/interfaces/ERC20Interface.sol

pragma solidity ^0.7.0;

interface ERC20Interface {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the token decimals.
   */
  function decimals() external view returns (uint8);

  /**
   * @dev Returns the token symbol.
   */
  function symbol() external view returns (string memory);

  /**
  * @dev Returns the token name.
  */
  function name() external view returns (string memory);

  /**
   * @dev Returns the bep token owner.
   */
  function getOwner() external view returns (address);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address _owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File contracts/interfaces/IConverter.sol

pragma solidity ^0.7.0;

interface IConverter {
    function convertUsdAmountToAssetAmount(
        uint256 usdAmount,
        address assetAddress
    ) external view returns (uint256);

    function convertAssetAmountToUsdAmount(
        uint256 assetAmount,
        address assetAddress
    ) external view returns (uint256);

    function getUsdAmount(
        address market,
        uint256 assetAmount,
        address priceOracle
    ) external view returns (uint256 usdAmount);

    function getAssetAmount(
        address market,
        uint256 usdAmount,
        address priceOracle
    ) external view returns (uint256 assetAmount);
}


// File contracts/libraries/SafeMath.sol

pragma solidity ^0.7.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
  /**
   * @dev Returns the addition of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   * - Addition cannot overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    return add(a, b, "SafeMath: addition overflow");
  }

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

    return c;
  }

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

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

    return c;
  }

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

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

    return c;
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return div(a, b, "SafeMath: division by zero");
  }

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

    return c;
  }

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

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


// File contracts/MultiSigOwner.sol

pragma solidity ^0.7.0;
pragma abicoder v2;

// 2/3 Multi Sig Owner
contract MultiSigOwner {
    address[] public owners;
    mapping(uint256 => bool) public signatureId;
    bool private initialized;
    // events
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
    event SignValidTimeChanged(uint256 newValue);
    modifier validSignOfOwner(
        bytes calldata signData,
        bytes calldata keys,
        string memory functionName
    ) {
        require(isOwner(msg.sender), "on");
        address signer = getSigner(signData, keys);
        require(
            signer != msg.sender && isOwner(signer) && signer != address(0),
            "is"
        );
        (bytes4 method, uint256 id, uint256 validTime, ) = abi.decode(
            signData,
            (bytes4, uint256, uint256, bytes)
        );
        require(
            signatureId[id] == false &&
                method == bytes4(keccak256(bytes(functionName))),
            "sru"
        );
        require(validTime > block.timestamp, "ep");
        signatureId[id] = true;
        _;
    }

    function isOwner(address addr) public view returns (bool) {
        bool _isOwner = false;
        for (uint256 i = 0; i < owners.length; i++) {
            if (owners[i] == addr) {
                _isOwner = true;
            }
        }
        return _isOwner;
    }

    constructor() {}

    function initializeOwners(address[3] memory _owners) public {
        require(
            !initialized &&
                _owners[0] != address(0) &&
                _owners[1] != address(0) &&
                _owners[2] != address(0),
            "ai"
        );
        owners = [_owners[0], _owners[1], _owners[2]];
        initialized = true;
    }

    function getSigner(bytes calldata _data, bytes calldata keys)
        public
        view
        returns (address)
    {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        (uint8 v, bytes32 r, bytes32 s) = abi.decode(
            keys,
            (uint8, bytes32, bytes32)
        );
        return
            ecrecover(
                toEthSignedMessageHash(
                    keccak256(abi.encodePacked(this, chainId, _data))
                ),
                v,
                r,
                s
            );
    }

    function encodePackedData(bytes calldata _data)
        public
        view
        returns (bytes32)
    {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return keccak256(abi.encodePacked(this, chainId, _data));
    }

    function toEthSignedMessageHash(bytes32 hash)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
            );
    }

    // Set functions
    // verified
    function transferOwnership(bytes calldata signData, bytes calldata keys)
        public
        validSignOfOwner(signData, keys, "transferOwnership")
    {
        (, , , bytes memory params) = abi.decode(
            signData,
            (bytes4, uint256, uint256, bytes)
        );
        address newOwner = abi.decode(params, (address));
        uint256 index;
        for (uint256 i = 0; i < owners.length; i++) {
            if (owners[i] == msg.sender) {
                index = i;
            }
        }
        address oldOwner = owners[index];
        owners[index] = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/OwnerConstants.sol

pragma solidity ^0.7.0;
contract OwnerConstants is MultiSigOwner {
    using SafeMath for uint256;
    // daily limit contants
    uint256 public constant MAX_LEVEL = 5;

    // this is reward address for user's withdraw and payment for goods.
    address public treasuryAddress;
    // this address should be deposit okse in his balance and users can get cashback from this address.
    address public financialAddress;
    // master address is used to send USDC tokens when user buy goods.
    address public masterAddress;
    // monthly fee rewarded address
    address public monthlyFeeAddress;

    // staking contract address, which is used to receive 20% of monthly fee, so staked users can be rewarded from this contract
    address public stakeContractAddress;
    // statking amount of monthly fee
    uint256 public stakePercent; // 15 %

    // withdraw fee and payment fee should not exeed this amount, 1% is coresponding to 100.
    uint256 public constant MAX_FEE_AMOUNT = 500; // 5%
    // buy fee setting.
    uint256 public buyFeePercent; // 1%

    // withdraw fee setting.
    uint256 public withdrawFeePercent; // 0.1 %

    // set monthly fee of user to use card payment, unit is usd amount ( 1e18)
    uint256 public monthlyFeeAmount; // 6.99 USD
    // if user pay monthly fee using okse, then he will pay less amount fro this percent. 0% => 0, 100% => 10000
    uint256 public okseMonthlyProfit; // 10%
    // buy tx fee in usd
    uint256 public buyTxFee; // 0.7 usd
    event ManagerAddressChanged(
        address treasuryAddress,
        address financialAddress,
        address masterAddress,
        address monthlyFeeAddress
    );
    event FeeValuesChanged(
        uint256 monthlyFeeAmount,
        uint256 okseMonthlyProfit,
        uint256 withdrawFeePercent,
        uint256 buyTxFee,
        uint256 buyFeePercent
    );
    event StakeContractParamChanged(
        address stakeContractAddress,
        uint256 stakePercent
    );

    constructor() {}

    function getMonthlyFeeAmount(bool payFromOkse)
        public
        view
        returns (uint256)
    {
        uint256 result;
        if (payFromOkse) {
            result = monthlyFeeAmount.sub(
                (monthlyFeeAmount.mul(okseMonthlyProfit)).div(10000)
            );
        } else {
            result = monthlyFeeAmount;
        }
        return result;
    }

    function setManagerAddresses(bytes calldata signData, bytes calldata keys)
        public
        validSignOfOwner(signData, keys, "setManagerAddresses")
    {
        (, , , bytes memory params) = abi.decode(
            signData,
            (bytes4, uint256, uint256, bytes)
        );
        (
            address _newTreasuryAddress,
            address _newFinancialAddress,
            address _newMasterAddress,
            address _mothlyFeeAddress
        ) = abi.decode(params, (address, address, address, address));

        treasuryAddress = _newTreasuryAddress;
        financialAddress = _newFinancialAddress;
        masterAddress = _newMasterAddress;
        monthlyFeeAddress = _mothlyFeeAddress;
        emit ManagerAddressChanged(
            treasuryAddress,
            financialAddress,
            masterAddress,
            monthlyFeeAddress
        );
    }

    // verified
    function setFeeValues(bytes calldata signData, bytes calldata keys)
        public
        validSignOfOwner(signData, keys, "setFeeValues")
    {
        (, , , bytes memory params) = abi.decode(
            signData,
            (bytes4, uint256, uint256, bytes)
        );
        (
            uint256 _monthlyFeeAmount,
            uint256 _okseMonthlyProfit,
            uint256 _withdrawFeePercent,
            uint256 newBuyFeePercent,
            uint256 newBuyTxFee
        ) = abi.decode(params, (uint256, uint256, uint256, uint256, uint256));
        require(_okseMonthlyProfit <= 10000, "over percent");
        require(_withdrawFeePercent <= MAX_FEE_AMOUNT, "mfo");
        monthlyFeeAmount = _monthlyFeeAmount;
        okseMonthlyProfit = _okseMonthlyProfit;
        withdrawFeePercent = _withdrawFeePercent;
        require(newBuyFeePercent <= MAX_FEE_AMOUNT, "mpo");
        buyFeePercent = newBuyFeePercent;
        buyTxFee = newBuyTxFee;
        emit FeeValuesChanged(
            monthlyFeeAmount,
            okseMonthlyProfit,
            withdrawFeePercent,
            buyTxFee,
            buyFeePercent
        );
    }

    function setStakeContractParams(
        bytes calldata signData,
        bytes calldata keys
    ) public validSignOfOwner(signData, keys, "setStakeContractParams") {
        (, , , bytes memory params) = abi.decode(
            signData,
            (bytes4, uint256, uint256, bytes)
        );
        (address _stakeContractAddress, uint256 _stakePercent) = abi.decode(
            params,
            (address, uint256)
        );
        stakeContractAddress = _stakeContractAddress;
        stakePercent = _stakePercent;
        emit StakeContractParamChanged(stakeContractAddress, stakePercent);
    }
}


// File contracts/SignerRole.sol

pragma solidity ^0.7.0;
/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
  struct Role {
    mapping(address => bool) bearer;
  }

  /**
   * @dev Give an account access to this role.
   */
  function add(Role storage role, address account) internal {
    require(!has(role, account), "Roles: account already has role");
    role.bearer[account] = true;
  }

  /**
   * @dev Remove an account's access to this role.
   */
  function remove(Role storage role, address account) internal {
    // require(has(role, account), "Roles: account does not have role");
    role.bearer[account] = false;
  }

  /**
   * @dev Check if an account has this role.
   * @return bool
   */
  function has(Role storage role, address account)
    internal
    view
    returns (bool)
  {
    require(account != address(0), "Roles: account is the zero address");
    return role.bearer[account];
  }
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
  // Empty internal constructor, to prevent people from mistakenly deploying
  // an instance of this contract, which should be used via inheritance.
  constructor() {}

  // solhint-disable-previous-line no-empty-blocks

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

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

abstract contract SignerRole is Context {
  using Roles for Roles.Role;

  event SignerAdded(address indexed account);
  event SignerRemoved(address indexed account);

  Roles.Role private _signers;

  constructor(address _signer) {
    _addSigner(_signer);
  }

  modifier onlySigner() {
    require(
      isSigner(_msgSender()),
      "SignerRole: caller does not have the Signer role"
    );
    _;
  }

  function isSigner(address account) public view returns (bool) {
    return _signers.has(account);
  }

  function _addSigner(address account) internal {
    _signers.add(account);
    emit SignerAdded(account);
  }

  function _removeSigner(address account) internal {
    _signers.remove(account);
    emit SignerRemoved(account);
  }
}


// File contracts/OkseCard.sol


// Solidity files have to start with this pragma.
// It will be used by the Solidity compiler to validate its version.
pragma solidity ^0.7.0;
// We import this library to be able to use console.log
// import "hardhat/console.sol";
// This is the main building block for smart contracts.
contract OkseCard is OwnerConstants, SignerRole {
    //  bytes4 public constant PAY_MONTHLY_FEE = bytes4(keccak256(bytes('payMonthlyFee')));
    bytes4 public constant PAY_MONTHLY_FEE = 0x529a8d6c;
    //  bytes4 public constant WITHDRAW = bytes4(keccak256(bytes('withdraw')));
    bytes4 public constant WITHDRAW = 0x855511cc;
    //  bytes4 public constant BUYGOODS = bytes4(keccak256(bytes('buyGoods')));
    bytes4 public constant BUYGOODS = 0xa8fd19f2;
    //  bytes4 public constant SET_USER_MAIN_MARKET = bytes4(keccak256(bytes('setUserMainMarket')));
    bytes4 public constant SET_USER_MAIN_MARKET = 0x4a22142e;

    // uint256 public constant CARD_VALIDATION_TIME = 10 minutes; // 30 days in prodcution
    uint256 public constant CARD_VALIDATION_TIME = 30 days; // 30 days in prodcution

    using SafeMath for uint256;
    address public immutable converter;
    address public swapper;

    // Price oracle address, which is used for verification of swapping assets amount
    address public priceOracle;
    address public limitManager;
    address public levelManager;
    address public marketManager;
    address public cashbackManager;

    // Governor can set followings:
    address public governorAddress; // Governance address

    /*** Main Actions ***/
    // user's deposited balance.
    // user  => ( market => balances)
    mapping(address => mapping(address => uint256)) public usersBalances;

    mapping(address => uint256) public userValidTimes;

    //prevent reentrancy attack
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    bool private initialized;

    // uint256 public timeDiff;
    struct SignKeys {
        uint8 v;
        bytes32 r;
        bytes32 s;
    }
    struct SignData {
        bytes4 method;
        uint256 id;
        address market;
        address userAddr;
        uint256 amount;
        uint256 validTime;
    }
    // emit event

    event UserBalanceChanged(
        address indexed userAddr,
        address indexed market,
        uint256 amount
    );

    event GovernorAddressChanged(
        address indexed previousGovernor,
        address indexed newGovernor
    );
    event MonthlyFeePaid(
        uint256 id,
        address userAddr,
        uint256 userValidTime,
        uint256 usdAmount
    );
    event UserDeposit(address userAddr, address market, uint256 amount);
    event UserWithdraw(
        uint256 id,
        address userAddr,
        address market,
        uint256 amount,
        uint256 remainedBalance
    );
    event SignerBuyGoods(
        uint256 id,
        address signer1,
        address signer2,
        address market,
        address userAddr,
        uint256 usdAmount
    );
    event UserMainMarketChanged(
        uint256 id,
        address userAddr,
        address market,
        address beforeMarket
    );
    event ContractAddressChanged(
        address priceOracle,
        address swapper,
        address limitManager,
        address levelManager,
        address marketManager,
        address cashbackManager
    );
    event WithdrawTokens(address token, address to, uint256 amount);

    // verified
    /**
     * Contract initialization.
     *
     * The `constructor` is executed only once when the contract is created.
     * The `public` modifier makes a function callable from outside the contract.
     */
    constructor(address _converter, address _initialSigner)
        SignerRole(_initialSigner)
    {
        converter = _converter;
        // The totalSupply is assigned to transaction sender, which is the account
        // that is deploying the contract.
    }

    // verified
    receive() external payable {
        // require(msg.sender == WETH, 'Not WETH9');
    }

    // verified
    function initialize(
        address _priceOracle,
        address _limitManager,
        address _levelManager,
        address _marketManager,
        address _cashbackManager,
        address _financialAddress,
        address _masterAddress,
        address _treasuryAddress,
        address _governorAddress,
        address _monthlyFeeAddress,
        address _stakeContractAddress,
        address _swapper
    ) public {
        require(!initialized, "ai");
        // owner = _owner;
        // _addSigner(_owner);
        priceOracle = _priceOracle;
        limitManager = _limitManager;
        levelManager = _levelManager;
        marketManager = _marketManager;
        cashbackManager = _cashbackManager;
        treasuryAddress = _treasuryAddress;
        financialAddress = _financialAddress;
        masterAddress = _masterAddress;
        governorAddress = _governorAddress;
        monthlyFeeAddress = _monthlyFeeAddress;
        stakeContractAddress = _stakeContractAddress;
        swapper = _swapper;
        //private variables initialize.
        _status = _NOT_ENTERED;
        //initialize OwnerConstants arrays

        stakePercent = 15 * (100 + 15);
        buyFeePercent = 250;
        buyTxFee = 0.7 ether;
        withdrawFeePercent = 0;
        monthlyFeeAmount = 6.99 ether;
        okseMonthlyProfit = 1000;
        initialized = true;
    }

    /// modifier functions
    // verified
    modifier onlyGovernor() {
        require(_msgSender() == governorAddress, "og");
        _;
    }
    // // verified
    modifier marketEnabled(address market) {
        require(IMarketManager(marketManager).marketEnable(market), "mdnd");
        _;
    }
    // verified
    modifier noExpired(address userAddr) {
        require(!getUserExpired(userAddr), "user expired");
        _;
    }

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

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

        _;

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

    modifier validSignOfUser(
        SignData calldata sign_data,
        SignKeys calldata sign_key
    ) {
        require(
            sign_data.userAddr == getecrecover(sign_data, sign_key),
            "ssst"
        );
        _;
    }
    modifier noEmergency() {
        require(!IMarketManager(marketManager).emergencyStop(), "stopped");
        _;
    }

    function getUserOkseBalance(address userAddr)
        external
        view
        returns (uint256)
    {
        return usersBalances[userAddr][IMarketManager(marketManager).OKSE()];
    }

    // verified
    function getUserExpired(address _userAddr) public view returns (bool) {
        // if monthly fee is zero then user never expired
        if (monthlyFeeAmount == 0){
            return false;
        }
        if (userValidTimes[_userAddr].add(25 days) > block.timestamp) {
                return false;
        }
        return true;
    }

    // set Governance address
    function setGovernor(address newGovernor) public onlyGovernor {
        address oldGovernor = governorAddress;
        governorAddress = newGovernor;
        emit GovernorAddressChanged(oldGovernor, newGovernor);
    }

    // verified
    function updateSigner(address _signer, bool bAddOrRemove)
        public
        onlyGovernor
    {
        if (bAddOrRemove) {
            _addSigner(_signer);
        } else {
            _removeSigner(_signer);
        }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    function onUpdateUserBalance(
        address userAddr,
        address market,
        uint256 amount,
        uint256 beforeAmount
    ) internal returns (bool) {
        emit UserBalanceChanged(userAddr, market, amount);
        if (market != IMarketManager(marketManager).OKSE()) return true;
        return
            ILevelManager(levelManager).updateUserLevel(userAddr, beforeAmount);
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // newly verified
    function deposit(address market, uint256 amount)
        public
        marketEnabled(market)
        nonReentrant
        noEmergency
    {
        TransferHelper.safeTransferFrom(
            market,
            msg.sender,
            address(this),
            amount
        );
        _addUserBalance(market, msg.sender, amount);
        emit UserDeposit(msg.sender, market, amount);
    }

    // newly verified
    function depositETH() public payable nonReentrant {
        address WETH = IMarketManager(marketManager).WETH();
        require(IMarketManager(marketManager).marketEnable(WETH), "me");
        IWETH9(WETH).deposit{value: msg.value}();
        _addUserBalance(WETH, msg.sender, msg.value);
        emit UserDeposit(msg.sender, WETH, msg.value);
    }

    // verified
    function _addUserBalance(
        address market,
        address userAddr,
        uint256 amount
    ) internal marketEnabled(market) {
        uint256 beforeAmount = usersBalances[userAddr][market];
        usersBalances[userAddr][market] = usersBalances[userAddr][market].add(
            amount
        );
        onUpdateUserBalance(
            userAddr,
            market,
            usersBalances[userAddr][market],
            beforeAmount
        );
    }

    // newly verified
    function setUserMainMarket(
        uint256 id,
        address market,
        uint256 validTime,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        address userAddr = msg.sender;
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        require(
            isSigner(
                ecrecover(
                    toEthSignedMessageHash(
                        keccak256(
                            abi.encodePacked(
                                this,
                                SET_USER_MAIN_MARKET,
                                id,
                                userAddr,
                                market,
                                chainId,
                                uint256(0),
                                validTime
                            )
                        )
                    ),
                    v,
                    r,
                    s
                )
            ),
            "summ"
        );
        require(signatureId[id] == false, "pru");
        signatureId[id] = true;
        require(validTime > block.timestamp, "expired");
        address beforeMarket = IMarketManager(marketManager).getUserMainMarket(
            userAddr
        );
        IMarketManager(marketManager).setUserMainMakret(userAddr, market);
        emit UserMainMarketChanged(id, userAddr, market, beforeMarket);
    }

    // verified
    function payMonthlyFee(
        uint256 id,
        SignData calldata _data,
        SignKeys calldata user_key,
        address market
    )
        public
        nonReentrant
        marketEnabled(market)
        noEmergency
        validSignOfUser(_data, user_key)
        onlySigner
    {
        address userAddr = _data.userAddr;
        require(userValidTimes[userAddr] <= block.timestamp, "e");
        require(monthlyFeeAmount <= _data.amount, "over paid");
        require(
            signatureId[id] == false && _data.method == PAY_MONTHLY_FEE,
            "pru"
        );
        signatureId[id] = true;
        // increase valid period

        // extend user's valid time
        uint256 _monthlyFee = getMonthlyFeeAmount(
            market == IMarketManager(marketManager).OKSE()
        );
        uint256 _tempVal = _monthlyFee;
        userValidTimes[userAddr] = block.timestamp.add(CARD_VALIDATION_TIME);

        if (stakeContractAddress != address(0)) {
            _tempVal = (_monthlyFee.mul(10000)).div(stakePercent.add(10000));
        }

        uint256 beforeAmount = usersBalances[userAddr][market];
        calculateAmount(
            market,
            userAddr,
            _tempVal,
            monthlyFeeAddress,
            stakeContractAddress,
            stakePercent
        );
        onUpdateUserBalance(
            userAddr,
            market,
            usersBalances[userAddr][market],
            beforeAmount
        );
        emit MonthlyFeePaid(
            id,
            userAddr,
            userValidTimes[userAddr],
            _monthlyFee
        );
    }

    // newly verified
    function withdraw(
        uint256 id,
        address market,
        uint256 amount,
        uint256 validTime,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public nonReentrant {
        address userAddr = msg.sender;
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        require(
            isSigner(
                ecrecover(
                    toEthSignedMessageHash(
                        keccak256(
                            abi.encodePacked(
                                this,
                                WITHDRAW,
                                id,
                                userAddr,
                                market,
                                chainId,
                                amount,
                                validTime
                            )
                        )
                    ),
                    v,
                    r,
                    s
                )
            ),
            "ssst"
        );
        require(signatureId[id] == false, "pru");
        signatureId[id] = true;
        require(validTime > block.timestamp, "expired");
        uint256 beforeAmount = usersBalances[userAddr][market];
        // require(beforeAmount >= amount, "ib");
        usersBalances[userAddr][market] = beforeAmount.sub(amount);
        address WETH = IMarketManager(marketManager).WETH();
        if (market == WETH) {
            IWETH9(WETH).withdraw(amount);
            if (treasuryAddress != address(0)) {
                uint256 feeAmount = (amount.mul(withdrawFeePercent)).div(10000);
                if (feeAmount > 0) {
                    TransferHelper.safeTransferETH(treasuryAddress, feeAmount);
                }
                TransferHelper.safeTransferETH(
                    msg.sender,
                    amount.sub(feeAmount)
                );
            } else {
                TransferHelper.safeTransferETH(msg.sender, amount);
            }
        } else {
            if (treasuryAddress != address(0)) {
                uint256 feeAmount = (amount.mul(withdrawFeePercent)).div(10000);
                if (feeAmount > 0) {
                    TransferHelper.safeTransfer(
                        market,
                        treasuryAddress,
                        feeAmount
                    );
                }
                TransferHelper.safeTransfer(
                    market,
                    msg.sender,
                    amount.sub(feeAmount)
                );
            } else {
                TransferHelper.safeTransfer(market, msg.sender, amount);
            }
        }
        uint256 userBal = usersBalances[userAddr][market];
        onUpdateUserBalance(userAddr, market, userBal, beforeAmount);
        emit UserWithdraw(id, userAddr, market, amount, userBal);
    }

    // decimal of usdAmount is 18
    // newly verified
    function buyGoods(SignData calldata _data, SignKeys[2] calldata signer_key)
        external
        nonReentrant
        marketEnabled(_data.market)
        noExpired(_data.userAddr)
        noEmergency
    {
        address[2] memory signers = [
            getecrecover(_data, signer_key[0]),
            getecrecover(_data, signer_key[1])
        ];
        require(
            isSigner(signers[0]) &&
                isSigner(signers[1]) &&
                (signers[0] != signers[1]),
            "is"
        );
        require(
            signatureId[_data.id] == false && _data.method == BUYGOODS,
            "pru"
        );
        signatureId[_data.id] = true;
        if (_data.market == IMarketManager(marketManager).OKSE()) {
            require(IMarketManager(marketManager).oksePaymentEnable(), "jsy");
        }
        require(
            IMarketManager(marketManager).getUserMainMarket(_data.userAddr) ==
                _data.market,
            "jsy2"
        );
        uint256 spendAmount = _makePayment(
            _data.market,
            _data.userAddr,
            _data.amount
        );
        cashBack(_data.userAddr, spendAmount);
        emit SignerBuyGoods(
            _data.id,
            signers[0],
            signers[1],
            _data.market,
            _data.userAddr,
            _data.amount
        );
    }

    // deduce user assets using usd amount
    // decimal of usdAmount is 18
    // verified
    function _makePayment(
        address market,
        address userAddr,
        uint256 usdAmount
    ) internal returns (uint256 spendAmount) {
        uint256 beforeAmount = usersBalances[userAddr][market];
        spendAmount = calculateAmount(
            market,
            userAddr,
            usdAmount,
            masterAddress,
            treasuryAddress,
            buyFeePercent
        );
        ILimitManager(limitManager).updateUserSpendAmount(userAddr, usdAmount);

        onUpdateUserBalance(
            userAddr,
            market,
            usersBalances[userAddr][market],
            beforeAmount
        );
    }

    // calculate aseet amount from market and required usd amount
    // decimal of usdAmount is 18
    // spendAmount is decimal 18
    function calculateAmount(
        address market,
        address userAddr,
        uint256 usdAmount,
        address targetAddress,
        address feeAddress,
        uint256 feePercent
    ) internal returns (uint256 spendAmount) {
        uint256 _amount;
        address USDC = IMarketManager(marketManager).USDC();
        if (feeAddress != address(0)) {
            _amount = usdAmount.add((usdAmount.mul(feePercent)).div(10000)).add(
                    buyTxFee
                );
        } else {
            _amount = usdAmount;
        }
        // change _amount to USDC asset amounts
        uint256 assetAmountIn = IConverter(converter).getAssetAmount(
            market,
            _amount,
            priceOracle
        );
        assetAmountIn = assetAmountIn.add(
            (assetAmountIn.mul(IMarketManager(marketManager).slippage())).div(
                10000
            )
        );
        _amount = IConverter(converter).convertUsdAmountToAssetAmount(
            _amount,
            USDC
        );
        uint256 userBal = usersBalances[userAddr][market];
        if (market != USDC) {
            // we need to change somehting here, because if there are not pair {market, USDC} , then we have to add another path
            // so please check the path is exist and if no, please add market, weth, usdc to path
            address[] memory path = ISwapper(swapper).getOptimumPath(
                market,
                USDC
            );
            uint256[] memory amounts = ISwapper(swapper).getAmountsIn(
                _amount,
                path
            );

            require(amounts[0] < assetAmountIn, "ua");
            usersBalances[userAddr][market] = userBal.sub(amounts[0]);
            TransferHelper.safeTransfer(
                path[0],
                ISwapper(swapper).GetReceiverAddress(path),
                amounts[0]
            );
            ISwapper(swapper)._swap(amounts, path, address(this));
        } else {
            // require(_amount <= usersBalances[userAddr][market], "uat");
            require(_amount < assetAmountIn, "au");
            usersBalances[userAddr][market] = userBal.sub(_amount);
        }
        require(targetAddress != address(0), "mis");
        uint256 usdcAmount = IConverter(converter)
            .convertUsdAmountToAssetAmount(usdAmount, USDC);
        require(_amount >= usdcAmount, "sp");
        TransferHelper.safeTransfer(USDC, targetAddress, usdcAmount);
        uint256 fee = _amount.sub(usdcAmount);
        if (feeAddress != address(0))
            TransferHelper.safeTransfer(USDC, feeAddress, fee);
        spendAmount = IConverter(converter).convertAssetAmountToUsdAmount(
            _amount,
            USDC
        );
    }

    function cashBack(address userAddr, uint256 usdAmount) internal {
        if (!ICashBackManager(cashbackManager).cashBackEnable()) return;
        uint256 cashBackPercent = ICashBackManager(cashbackManager)
            .getCashBackPercent(
                ILevelManager(levelManager).getUserLevel(userAddr)
            );
        address OKSE = IMarketManager(marketManager).OKSE();
        uint256 okseAmount = IConverter(converter).getAssetAmount(
            OKSE,
            (usdAmount.mul(cashBackPercent)).div(10000),
            priceOracle
        );
        // require(ERC20Interface(OKSE).balanceOf(address(this)) >= okseAmount , "insufficient OKSE");
        if (usersBalances[financialAddress][OKSE] > okseAmount) {
            usersBalances[financialAddress][OKSE] = usersBalances[
                financialAddress
            ][OKSE].sub(okseAmount);
            //needs extra check that owner deposited how much OKSE for cashBack
            _addUserBalance(OKSE, userAddr, okseAmount);
        }
    }

    // verified
    function getUserAssetAmount(address userAddr, address market)
        public
        view
        returns (uint256)
    {
        return usersBalances[userAddr][market];
    }

    // verified
    function encodePackedData(SignData calldata _data)
        public
        view
        returns (bytes32)
    {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return
            keccak256(
                abi.encodePacked(
                    this,
                    _data.method,
                    _data.id,
                    _data.userAddr,
                    _data.market,
                    chainId,
                    _data.amount,
                    _data.validTime
                )
            );
    }

    // verified
    function getecrecover(SignData calldata _data, SignKeys calldata key)
        public
        view
        returns (address)
    {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return
            ecrecover(
                toEthSignedMessageHash(
                    keccak256(
                        abi.encodePacked(
                            this,
                            _data.method,
                            _data.id,
                            _data.userAddr,
                            _data.market,
                            chainId,
                            _data.amount,
                            _data.validTime
                        )
                    )
                ),
                key.v,
                key.r,
                key.s
            );
    }

    // verified
    function setContractAddress(bytes calldata signData, bytes calldata keys)
        public
        validSignOfOwner(signData, keys, "setContractAddress")
    {
        (, , , bytes memory params) = abi.decode(
            signData,
            (bytes4, uint256, uint256, bytes)
        );
        (
            address _priceOracle,
            address _swapper,
            address _limitManager,
            address _levelManager,
            address _marketManager,
            address _cashbackManager
        ) = abi.decode(
                params,
                (address, address, address, address, address, address)
            );
        priceOracle = _priceOracle;
        swapper = _swapper;
        limitManager = _limitManager;
        levelManager = _levelManager;
        marketManager = _marketManager;
        cashbackManager = _cashbackManager;
        emit ContractAddressChanged(
            priceOracle,
            swapper,
            limitManager,
            levelManager,
            marketManager,
            cashbackManager
        );
    }

    // owner function
    function withdrawTokens(bytes calldata signData, bytes calldata keys)
        public
        validSignOfOwner(signData, keys, "withdrawTokens")
    {
        (, , , bytes memory params) = abi.decode(
            signData,
            (bytes4, uint256, uint256, bytes)
        );
        (address token, address to) = abi.decode(params, (address, address));

        require(!IMarketManager(marketManager).isMarketExist(token), "me");
        uint256 amount;
        if (token == address(0)) {
            amount = address(this).balance;
            TransferHelper.safeTransferETH(to, amount);
        } else {
            amount = ERC20Interface(token).balanceOf(address(this));
            TransferHelper.safeTransfer(token, to, amount);
        }
        emit WithdrawTokens(token, to, amount);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_converter","type":"address"},{"internalType":"address","name":"_initialSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"priceOracle","type":"address"},{"indexed":false,"internalType":"address","name":"swapper","type":"address"},{"indexed":false,"internalType":"address","name":"limitManager","type":"address"},{"indexed":false,"internalType":"address","name":"levelManager","type":"address"},{"indexed":false,"internalType":"address","name":"marketManager","type":"address"},{"indexed":false,"internalType":"address","name":"cashbackManager","type":"address"}],"name":"ContractAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"monthlyFeeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"okseMonthlyProfit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawFeePercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyTxFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyFeePercent","type":"uint256"}],"name":"FeeValuesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernor","type":"address"}],"name":"GovernorAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasuryAddress","type":"address"},{"indexed":false,"internalType":"address","name":"financialAddress","type":"address"},{"indexed":false,"internalType":"address","name":"masterAddress","type":"address"},{"indexed":false,"internalType":"address","name":"monthlyFeeAddress","type":"address"}],"name":"ManagerAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"userValidTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdAmount","type":"uint256"}],"name":"MonthlyFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"SignValidTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer1","type":"address"},{"indexed":false,"internalType":"address","name":"signer2","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"usdAmount","type":"uint256"}],"name":"SignerBuyGoods","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stakeContractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakePercent","type":"uint256"}],"name":"StakeContractParamChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddr","type":"address"},{"indexed":true,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserBalanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"beforeMarket","type":"address"}],"name":"UserMainMarketChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remainedBalance","type":"uint256"}],"name":"UserWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawTokens","type":"event"},{"inputs":[],"name":"BUYGOODS","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CARD_VALIDATION_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LEVEL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAY_MONTHLY_FEE","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_USER_MAIN_MARKET","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OkseCard.SignKeys[2]","name":"signer_key","type":"tuple[2]"}],"name":"buyGoods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashbackManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"converter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"encodePackedData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"}],"name":"encodePackedData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"financialAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"payFromOkse","type":"bool"}],"name":"getMonthlyFeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"address","name":"market","type":"address"}],"name":"getUserAssetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddr","type":"address"}],"name":"getUserExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getUserOkseBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OkseCard.SignKeys","name":"key","type":"tuple"}],"name":"getecrecover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_priceOracle","type":"address"},{"internalType":"address","name":"_limitManager","type":"address"},{"internalType":"address","name":"_levelManager","type":"address"},{"internalType":"address","name":"_marketManager","type":"address"},{"internalType":"address","name":"_cashbackManager","type":"address"},{"internalType":"address","name":"_financialAddress","type":"address"},{"internalType":"address","name":"_masterAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_governorAddress","type":"address"},{"internalType":"address","name":"_monthlyFeeAddress","type":"address"},{"internalType":"address","name":"_stakeContractAddress","type":"address"},{"internalType":"address","name":"_swapper","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[3]","name":"_owners","type":"address[3]"}],"name":"initializeOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"levelManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyFeeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyFeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"okseMonthlyProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OkseCard.SignKeys","name":"user_key","type":"tuple"},{"internalType":"address","name":"market","type":"address"}],"name":"payMonthlyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"priceOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setFeeValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernor","type":"address"}],"name":"setGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setManagerAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setStakeContractParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"validTime","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"setUserMainMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signatureId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bool","name":"bAddOrRemove","type":"bool"}],"name":"updateSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userValidTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"usersBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b5060405162005e4c38038062005e4c83398101604081905262000034916200016c565b80620000408162000058565b505060601b6001600160601b0319166080526200021c565b6200007381600d620000aa60201b620034a31790919060201c565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b620000b6828262000104565b15620000df5760405162461bcd60e51b8152600401620000d690620001a3565b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200012f5760405162461bcd60e51b8152600401620000d690620001da565b506001600160a01b03166000908152602091909152604090205460ff1690565b80516001600160a01b03811681146200016757600080fd5b919050565b600080604083850312156200017f578182fd5b6200018a836200014f565b91506200019a602084016200014f565b90509250929050565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60805160601c615bf96200025360003980612b4c52806136a352806137eb5280613c385280613d2b52806146195250615bf96000f3fe6080604052600436106102ef5760003560e01c80636ac7bca011610186578063b2b9f0ed116100d7578063d1f21f4f11610085578063d1f21f4f1461085d578063d365a08e1461087d578063d73d8b9014610892578063e9b786cb146108b2578063f460590b146108c7578063f6326fb3146108e7578063f6e71bc8146108ef576102f6565b8063b2b9f0ed146107a9578063bd38837b146107c9578063c42cf535146107de578063c5f956af146107fe578063c8a68c9614610813578063cc3fdd4c14610828578063cefd071b1461083d576102f6565b80637df73e27116101345780637df73e27146106ea57806389c9cbc01461070a5780638a0afa771461071f578063947977a81461073f578063a49062d41461075f578063a89b7ed614610774578063af14944414610794576102f6565b80636ac7bca0146106205780636c3fc891146106405780636e933c74146106605780636f1a65e0146106805780636f9e4f0b1461069557806375e16b17146106b55780637b7b0820146106d5576102f6565b806334a6cdc5116102405780635d70557c116101ee5780635d70557c146105565780635e3260471461056b57806361e3c5231461058b57806362c3c2e5146105ab5780636309daf5146105cb57806368af81e6146105eb57806368d3ae831461060b576102f6565b806334a6cdc5146104975780633d5c2644146104ac57806341ed2c12146104cc578063459a1782146104e157806347e7ef2414610501578063495ef705146105215780634e24127714610536576102f6565b8063272caf691161029d578063272caf69146103df578063276f1c41146103f45780632a54caba146104095780632a8d950c1461042b5780632b3297f9146104405780632f54bf6e1461045557806332c2e8d714610482576102f6565b8063025e7c27146102fb5780630885ad571461033157806308b14011146103535780630b800f481461037357806316ba71971461039357806321f8fba7146103b55780632630c12f146103ca576102f6565b366102f657005b600080fd5b34801561030757600080fd5b5061031b6103163660046150f7565b610904565b60405161032891906153d9565b60405180910390f35b34801561033d57600080fd5b5061035161034c3660046151e4565b61092e565b005b34801561035f57600080fd5b5061035161036e366004615003565b610dce565b34801561037f57600080fd5b5061035161038e366004614be4565b6110dc565b34801561039f57600080fd5b506103a861121d565b6040516103289190615578565b3480156103c157600080fd5b5061031b611228565b3480156103d657600080fd5b5061031b611237565b3480156103eb57600080fd5b5061031b611246565b34801561040057600080fd5b5061031b611255565b34801561041557600080fd5b5061041e611264565b6040516103289190615551565b34801561043757600080fd5b5061031b61126a565b34801561044c57600080fd5b5061031b611279565b34801561046157600080fd5b50610475610470366004614a35565b611288565b6040516103289190615546565b34801561048e57600080fd5b506103a86112df565b3480156104a357600080fd5b5061041e6112ea565b3480156104b857600080fd5b5061041e6104c7366004614a35565b6112f0565b3480156104d857600080fd5b5061031b6113a1565b3480156104ed57600080fd5b506103516104fc366004615003565b6113b0565b34801561050d57600080fd5b5061035161051c366004614cf8565b6115f1565b34801561052d57600080fd5b5061041e6117ab565b34801561054257600080fd5b5061041e610551366004614ec8565b6117b1565b34801561056257600080fd5b5061031b6117f5565b34801561057757600080fd5b50610351610586366004615086565b611804565b34801561059757600080fd5b5061041e6105a6366004614bb7565b611da7565b3480156105b757600080fd5b506104756105c6366004614a35565b611dd2565b3480156105d757600080fd5b5061041e6105e6366004614a35565b611e25565b3480156105f757600080fd5b5061041e610606366004614fc4565b611e37565b34801561061757600080fd5b5061041e611e72565b34801561062c57600080fd5b5061035161063b366004615003565b611e78565b34801561064c57600080fd5b5061035161065b366004615003565b6120d5565b34801561066c57600080fd5b5061041e61067b36600461506b565b61241f565b34801561068c57600080fd5b5061041e612495565b3480156106a157600080fd5b506103516106b0366004614d23565b61249c565b3480156106c157600080fd5b5061031b6106d0366004615003565b612554565b3480156106e157600080fd5b5061031b6125fe565b3480156106f657600080fd5b50610475610705366004614a35565b61260d565b34801561071657600080fd5b5061031b61261a565b34801561072b57600080fd5b5061035161073a36600461518b565b612629565b34801561074b57600080fd5b5061035161075a366004615003565b612867565b34801561076b57600080fd5b5061041e612a5f565b34801561078057600080fd5b5061031b61078f3660046150c2565b612a64565b3480156107a057600080fd5b506103a8612b2a565b3480156107b557600080fd5b506104756107c43660046150f7565b612b35565b3480156107d557600080fd5b5061031b612b4a565b3480156107ea57600080fd5b506103516107f9366004614a35565b612b6e565b34801561080a57600080fd5b5061031b612bfa565b34801561081f57600080fd5b5061041e612c0e565b34801561083457600080fd5b5061041e612c14565b34801561084957600080fd5b5061041e610858366004614bb7565b612c1a565b34801561086957600080fd5b50610351610878366004615003565b612c37565b34801561088957600080fd5b5061031b612e96565b34801561089e57600080fd5b506103516108ad366004615127565b612ea5565b3480156108be57600080fd5b5061041e613253565b3480156108d357600080fd5b506103516108e2366004614ccb565b613259565b6103516132b4565b3480156108fb57600080fd5b506103a8613498565b6000818154811061091457600080fd5b6000918252602090912001546001600160a01b0316905081565b6002601754141561095a5760405162461bcd60e51b81526004016109519061592e565b60405180910390fd5b60026017556012546040516301c6e7ff60e11b815282916001600160a01b03169063038dcffe9061098f9084906004016153d9565b60206040518083038186803b1580156109a757600080fd5b505afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190614ee4565b6109fb5760405162461bcd60e51b8152600401610951906157ae565b601260009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610a4957600080fd5b505afa158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a819190614ee4565b15610a9e5760405162461bcd60e51b81526004016109519061598c565b8383610aaa8282612a64565b6001600160a01b0316610ac36080840160608501614a35565b6001600160a01b031614610ae95760405162461bcd60e51b81526004016109519061573b565b610af46107056134ef565b610b105760405162461bcd60e51b8152600401610951906158de565b6000610b226080880160608901614a35565b6001600160a01b038116600090815260166020526040902054909150421015610b5d5760405162461bcd60e51b8152600401610951906158a6565b8660800135600a541115610b835760405162461bcd60e51b815260040161095190615613565b60008881526001602052604090205460ff16158015610bbe57506314a6a35b60e21b610bb26020890189614f00565b6001600160e01b031916145b610bda5760405162461bcd60e51b8152600401610951906158c1565b6000888152600160208181526040808420805460ff1916909317909255601254825163dffda16360e01b81529251610c8a936001600160a01b039092169263dffda1639260048082019391829003018186803b158015610c3957600080fd5b505afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190614a51565b6001600160a01b0316876001600160a01b0316146117b1565b905080610c9a4262278d006134f3565b6001600160a01b038085166000908152601660205260409020919091556006541615610ce857600754610ce590610cd3906127106134f3565b610cdf8461271061353c565b90613576565b90505b6001600160a01b0380841660009081526015602090815260408083208b851684529091529020546005546006546007549293610d30938c9389938893918216929116906135b8565b506001600160a01b038085166000908152601560209081526040808320938c1683529290522054610d659085908a9084613dc3565b506001600160a01b038416600090815260166020526040908190205490517f36468bb69cf35301290533742acb0f5890fc576141b4884532cf11f7b29c240a91610db4918e9188918890615acd565b60405180910390a150506001601755505050505050505050565b838383836040518060400160405280600e81526020016d7769746864726177546f6b656e7360901b815250610e0233611288565b610e1e5760405162461bcd60e51b8152600401610951906156e2565b6000610e2c86868686612554565b90506001600160a01b0381163314801590610e4b5750610e4b81611288565b8015610e5f57506001600160a01b03811615155b610e7b5760405162461bcd60e51b815260040161095190615792565b60008080610e8b888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015610ec55750845160208601206001600160e01b03198481169116145b610ee15760405162461bcd60e51b8152600401610951906159d3565b428111610f005760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055610f278d8f018f614f1a565b935050505060008082806020019051810190610f439190614a6d565b60125460405163c037934760e01b81529294509092506001600160a01b03169063c037934790610f779085906004016153d9565b60206040518083038186803b158015610f8f57600080fd5b505afa158015610fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc79190614ee4565b15610fe45760405162461bcd60e51b815260040161095190615759565b60006001600160a01b0383166110055750476110008282613f43565b61108e565b6040516370a0823160e01b81526001600160a01b038416906370a08231906110319030906004016153d9565b60206040518083038186803b15801561104957600080fd5b505afa15801561105d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611081919061510f565b905061108e838383613fd5565b7f70082d08c003c5341f2401bec1c2ae1dbcdc29ae17e9cc5633fa617caa8acd4c8383836040516110c1939291906153ed565b60405180910390a15050505050505050505050505050505050565b60185460ff16156110ff5760405162461bcd60e51b81526004016109519061594a565b600f80546001600160a01b03199081166001600160a01b039e8f16179091556010805482169c8e169c909c17909b55601180548c169a8d169a909a17909955601280548b16988c1698909817909755601380548a16968b169690961790955560028054610100600160a81b031916610100938b16939093029290921790915560038054881693891693909317909255600480548716918816919091179055601480548616918716919091179055600580548516918616919091179055600680548416918516919091179055600e80549092169216919091179055600160178190556106bd60075560fa6008556709b6e64a8ec60000600c55600060095567610177f723fb0000600a556103e8600b556018805460ff19169091179055565b632155447360e21b81565b6013546001600160a01b031681565b600f546001600160a01b031681565b6006546001600160a01b031681565b6014546001600160a01b031681565b6101f481565b6011546001600160a01b031681565b600e546001600160a01b031681565b600080805b6000548110156112d657836001600160a01b0316600082815481106112ae57fe5b6000918252602090912001546001600160a01b031614156112ce57600191505b60010161128d565b5090505b919050565b6325110a1760e11b81565b60075481565b6001600160a01b038082166000908152601560209081526040808320601254825163dffda16360e01b81529251949591948694919092169263dffda1639260048083019392829003018186803b15801561134957600080fd5b505afa15801561135d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113819190614a51565b6001600160a01b0316815260208101919091526040016000205492915050565b6012546001600160a01b031681565b83838383604051806040016040528060138152602001727365744d616e6167657241646472657373657360681b8152506113e933611288565b6114055760405162461bcd60e51b8152600401610951906156e2565b600061141386868686612554565b90506001600160a01b0381163314801590611432575061143281611288565b801561144657506001600160a01b03811615155b6114625760405162461bcd60e51b815260040161095190615792565b60008080611472888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156114ac5750845160208601206001600160e01b03198481169116145b6114c85760405162461bcd60e51b8152600401610951906159d3565b4281116114e75760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff1916909117905561150e8d8f018f614f1a565b93505050506000806000808480602001905181019061152d9190614aa6565b60028054610100600160a81b0319166101006001600160a01b0387811682029290921792839055600380546001600160a01b031990811688851617918290556004805482168886161790819055600580549092168786161791829055604051999d50979b509599509397507f471bd784db5079421761b0728e4d7bd73efe27958f0bc3452bada7799f0d3457966115d59691909304821694938216939082169291169061542b565b60405180910390a1505050505050505050505050505050505050565b6012546040516301c6e7ff60e11b815283916001600160a01b03169063038dcffe906116219084906004016153d9565b60206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116719190614ee4565b61168d5760405162461bcd60e51b8152600401610951906157ae565b600260175414156116b05760405162461bcd60e51b81526004016109519061592e565b6002601755601254604080516318e9666960e21b815290516001600160a01b03909216916363a599a491600480820192602092909190829003018186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190614ee4565b1561174f5760405162461bcd60e51b81526004016109519061598c565b61175b833330856140ca565b6117668333846141c2565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a16689582338484604051611799939291906153ed565b60405180910390a15050600160175550565b60095481565b60008082156117ea576117e36117da612710610cdf600b54600a5461353c90919063ffffffff16565b600a54906142c4565b90506117ef565b50600a545b92915050565b6005546001600160a01b031681565b600260175414156118275760405162461bcd60e51b81526004016109519061592e565b600260175561183c6060830160408401614a35565b6012546040516301c6e7ff60e11b81526001600160a01b039091169063038dcffe9061186c9084906004016153d9565b60206040518083038186803b15801561188457600080fd5b505afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190614ee4565b6118d85760405162461bcd60e51b8152600401610951906157ae565b6118e86080840160608501614a35565b6118f181611dd2565b1561190e5760405162461bcd60e51b815260040161095190615966565b601260009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561195c57600080fd5b505afa158015611970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119949190614ee4565b156119b15760405162461bcd60e51b81526004016109519061598c565b600060405180604001604052806119d887876000600281106119cf57fe5b60600201612a64565b6001600160a01b031681526020016119f2878760016119cf565b6001600160a01b031690529050611a108160005b602002015161260d565b8015611a225750611a22816001611a06565b8015611a405750602081015181516001600160a01b03908116911614155b611a5c5760405162461bcd60e51b815260040161095190615792565b60208086013560009081526001909152604090205460ff16158015611a9d575063547e8cf960e11b611a916020870187614f00565b6001600160e01b031916145b611ab95760405162461bcd60e51b8152600401610951906158c1565b60208086013560009081526001808352604091829020805460ff19169091179055601254815163dffda16360e01b815291516001600160a01b039091169263dffda1639260048082019391829003018186803b158015611b1857600080fd5b505afa158015611b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b509190614a51565b6001600160a01b0316611b696060870160408801614a35565b6001600160a01b03161415611c1a57601260009054906101000a90046001600160a01b03166001600160a01b0316638aa7ba676040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfe9190614ee4565b611c1a5760405162461bcd60e51b815260040161095190615775565b611c2a6060860160408701614a35565b6012546001600160a01b03918216911663be2ec3bc611c4f6080890160608a01614a35565b6040518263ffffffff1660e01b8152600401611c6b91906153d9565b60206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbb9190614a51565b6001600160a01b031614611ce15760405162461bcd60e51b8152600401610951906157e8565b6000611d10611cf66060880160408901614a35565b611d066080890160608a01614a35565b8860800135614306565b9050611d2b611d256080880160608901614a35565b826143f7565b81516020838101517f68c88f2d1b180ac31c1b89c8a25db195d669e6d352368be8ae4bb1ade1e7f64792918901359190611d6b60608b0160408c01614a35565b611d7b60808c0160608d01614a35565b8b60800135604051611d9296959493929190615a68565b60405180910390a15050600160175550505050565b6001600160a01b03918216600090815260156020908152604080832093909416825291909152205490565b6000600a5460001415611de7575060006112da565b6001600160a01b0382166000908152601660205260409020544290611e0f906220f5806134f3565b1115611e1d575060006112da565b506001919050565b60166020526000908152604090205481565b6040516000904690611e53903090839087908790602001615315565b6040516020818303038152906040528051906020012091505092915050565b600b5481565b838383836040518060400160405280600c81526020016b73657446656556616c75657360a01b815250611eaa33611288565b611ec65760405162461bcd60e51b8152600401610951906156e2565b6000611ed486868686612554565b90506001600160a01b0381163314801590611ef35750611ef381611288565b8015611f0757506001600160a01b03811615155b611f235760405162461bcd60e51b815260040161095190615792565b60008080611f33888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015611f6d5750845160208601206001600160e01b03198481169116145b611f895760405162461bcd60e51b8152600401610951906159d3565b428111611fa85760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055611fcf8d8f018f614f1a565b9350505050600080600080600085806020019051810190611ff0919061522b565b9450945094509450945061271084111561201c5760405162461bcd60e51b8152600401610951906159ad565b6101f483111561203e5760405162461bcd60e51b81526004016109519061568c565b600a859055600b84905560098390556101f482111561206f5760405162461bcd60e51b81526004016109519061566f565b6008829055600c819055600a54600b546009546040517fba5e401ce259802da9c7838f9696cd1079b2eb2a0ea245e551c978b5d33069c9936120b8939092909186908890615b0a565b60405180910390a150505050505050505050505050505050505050565b8383838360405180604001604052806012815260200171736574436f6e74726163744164647265737360701b81525061210d33611288565b6121295760405162461bcd60e51b8152600401610951906156e2565b600061213786868686612554565b90506001600160a01b0381163314801590612156575061215681611288565b801561216a57506001600160a01b03811615155b6121865760405162461bcd60e51b815260040161095190615792565b60008080612196888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156121d05750845160208601206001600160e01b03198481169116145b6121ec5760405162461bcd60e51b8152600401610951906159d3565b42811161220b5760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff191690911790556122328d8f018f614f1a565b9350505050600080600080600080868060200190518101906122549190614b04565b95509550955095509550955085600f60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084600e60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083601060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082601160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081601260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080601360006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f4366821234a42b582d7d66472fd7d6d5a4d783381ba060215a83e1c3ce0c6db8600f60009054906101000a90046001600160a01b0316600e60009054906101000a90046001600160a01b0316601060009054906101000a90046001600160a01b0316601160009054906101000a90046001600160a01b0316601260009054906101000a90046001600160a01b0316601360009054906101000a90046001600160a01b031660405161240196959493929190615456565b60405180910390a15050505050505050505050505050505050505050565b600046306124306020850185614f00565b60208501356124456080870160608801614a35565b6124556060880160408901614a35565b8588608001358960a00135604051602001612477989796959493929190615348565b60405160208183030381529060405280519060200120915050919050565b62278d0081565b60025460ff161580156124b8575080516001600160a01b031615155b80156124d0575060208101516001600160a01b031615155b80156124e8575060408101516001600160a01b031615155b6125045760405162461bcd60e51b81526004016109519061594a565b6040805160608101825282516001600160a01b039081168252602080850151821690830152838301511691810191909152612543906000906003614919565b50506002805460ff19166001179055565b60004681808061256686880188615284565b92509250925060016125a330868c8c6040516020016125889493929190615315565b60405160208183030381529060405280519060200120614768565b848484604051600081526020016040526040516125c3949392919061555a565b6020604051602081039080840390855afa1580156125e5573d6000803e3d6000fd5b505050602060405103519450505050505b949350505050565b6010546001600160a01b031681565b60006117ef600d83614798565b6003546001600160a01b031681565b600033905060004690506126b3600161266230634a22142e60e01b8c878d8860008f604051602001612588989796959493929190615348565b87878760405160008152602001604052604051612682949392919061555a565b6020604051602081039080840390855afa1580156126a4573d6000803e3d6000fd5b5050506020604051035161260d565b6126cf5760405162461bcd60e51b8152600401610951906159f0565b60008881526001602052604090205460ff16156126fe5760405162461bcd60e51b8152600401610951906158c1565b6000888152600160208190526040909120805460ff191690911790554286116127395760405162461bcd60e51b8152600401610951906156fe565b601254604051632f8bb0ef60e21b81526000916001600160a01b03169063be2ec3bc9061276a9086906004016153d9565b60206040518083038186803b15801561278257600080fd5b505afa158015612796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ba9190614a51565b60125460405163e8b624ad60e01b81529192506001600160a01b03169063e8b624ad906127ed9086908c90600401615411565b600060405180830381600087803b15801561280757600080fd5b505af115801561281b573d6000803e3d6000fd5b505050507f6d41219ad121d8734cd4bf7d276c6e3ef10c1a9b4e0e2245dd02ec458599cdb789848a846040516128549493929190615a41565b60405180910390a1505050505050505050565b83838383604051806040016040528060168152602001757365745374616b65436f6e7472616374506172616d7360501b8152506128a333611288565b6128bf5760405162461bcd60e51b8152600401610951906156e2565b60006128cd86868686612554565b90506001600160a01b03811633148015906128ec57506128ec81611288565b801561290057506001600160a01b03811615155b61291c5760405162461bcd60e51b815260040161095190615792565b6000808061292c888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156129665750845160208601206001600160e01b03198481169116145b6129825760405162461bcd60e51b8152600401610951906159d3565b4281116129a15760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff191690911790556129c88d8f018f614f1a565b9350505050600080828060200190518101906129e49190614b8a565b600680546001600160a01b0319166001600160a01b03848116919091179182905560078390556040519395509193507f81e80fe065ce07af29c0ce5b1c050c0a153937cfc80aade3416745b8d15a24e292612a459291909116908490615490565b60405180910390a150505050505050505050505050505050565b600581565b6000466001612ac130612a7a6020880188614f00565b6020880135612a8f60808a0160608b01614a35565b612a9f60608b0160408c01614a35565b878b608001358c60a00135604051602001612588989796959493929190615348565b612ace602086018661526a565b8560200135866040013560405160008152602001604052604051612af5949392919061555a565b6020604051602081039080840390855afa158015612b17573d6000803e3d6000fd5b5050604051601f19015195945050505050565b63547e8cf960e11b81565b60016020526000908152604090205460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6014546001600160a01b0316612b826134ef565b6001600160a01b031614612ba85760405162461bcd60e51b815260040161095190615a0e565b601480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f92caf80b3b287e058d945a90272035dd5f5eb1fee321aced853a991d9ab315ad90600090a35050565b60025461010090046001600160a01b031681565b600a5481565b60085481565b601560209081526000928352604080842090915290825290205481565b838383836040518060400160405280601181526020017007472616e736665724f776e65727368697607c1b815250612c6e33611288565b612c8a5760405162461bcd60e51b8152600401610951906156e2565b6000612c9886868686612554565b90506001600160a01b0381163314801590612cb75750612cb781611288565b8015612ccb57506001600160a01b03811615155b612ce75760405162461bcd60e51b815260040161095190615792565b60008080612cf7888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015612d315750845160208601206001600160e01b03198481169116145b612d4d5760405162461bcd60e51b8152600401610951906159d3565b428111612d6c5760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055612d938d8f018f614f1a565b9350505050600081806020019051810190612dae9190614a51565b90506000805b600054811015612dfc57336001600160a01b031660008281548110612dd557fe5b6000918252602090912001546001600160a01b03161415612df4578091505b600101612db4565b506000808281548110612e0b57fe5b600091825260208220015481546001600160a01b03909116925084919084908110612e3257fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051858316928416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050505050505050505050505050505050565b6004546001600160a01b031681565b60026017541415612ec85760405162461bcd60e51b81526004016109519061592e565b600260178190555060003390506000469050612f0860016126623063855511cc60e01b8d878e888f8f604051602001612588989796959493929190615348565b612f245760405162461bcd60e51b81526004016109519061573b565b60008981526001602052604090205460ff1615612f535760405162461bcd60e51b8152600401610951906158c1565b6000898152600160208190526040909120805460ff19169091179055428611612f8e5760405162461bcd60e51b8152600401610951906156fe565b6001600160a01b038083166000908152601560209081526040808320938c1683529290522054612fbe81896142c4565b6001600160a01b0380851660009081526015602090815260408083208e8516845282528083209490945560125484516315ab88c960e31b81529451929493169263ad5c46489260048083019392829003018186803b15801561301f57600080fd5b505afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190614a51565b9050806001600160a01b03168a6001600160a01b0316141561315157604051632e1a7d4d60e01b81526001600160a01b03821690632e1a7d4d9061309f908c90600401615551565b600060405180830381600087803b1580156130b957600080fd5b505af11580156130cd573d6000803e3d6000fd5b505060025461010090046001600160a01b03161591506131429050576000613106612710610cdf6009548d61353c90919063ffffffff16565b90508015613129576002546131299061010090046001600160a01b031682613f43565b61313c336131378c846142c4565b613f43565b5061314c565b61314c338a613f43565b6131ce565b60025461010090046001600160a01b0316156131c3576000613184612710610cdf6009548d61353c90919063ffffffff16565b905080156131a9576002546131a9908c9061010090046001600160a01b031683613fd5565b6131bd8b336131b88d856142c4565b613fd5565b506131ce565b6131ce8a338b613fd5565b6001600160a01b038085166000908152601560209081526040808320938e1683529290522054613200858c8386613dc3565b507f43b573ac1c738f28df57dc3e1fea317d5c9d932501be02f3f096f617e3e5c5d78c868d8d85604051613238959493929190615a9e565b60405180910390a15050600160175550505050505050505050565b600c5481565b6014546001600160a01b031661326d6134ef565b6001600160a01b0316146132935760405162461bcd60e51b815260040161095190615a0e565b80156132a7576132a2826147e0565b6132b0565b6132b082614822565b5050565b600260175414156132d75760405162461bcd60e51b81526004016109519061592e565b6002601755601254604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561332157600080fd5b505afa158015613335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133599190614a51565b6012546040516301c6e7ff60e11b81529192506001600160a01b03169063038dcffe9061338a9084906004016153d9565b60206040518083038186803b1580156133a257600080fd5b505afa1580156133b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133da9190614ee4565b6133f65760405162461bcd60e51b815260040161095190615759565b806001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561343157600080fd5b505af1158015613445573d6000803e3d6000fd5b50505050506134558133346141c2565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a16689582338234604051613488939291906153ed565b60405180910390a1506001601755565b6314a6a35b60e21b81565b6134ad8282614798565b156134ca5760405162461bcd60e51b8152600401610951906155dc565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3390565b600061353583836040518060400160405280601b81526020017f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815250614864565b9392505050565b60008261354b575060006117ef565b8282028284828161355857fe5b04146135355760405162461bcd60e51b815260040161095190615806565b600061353583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614894565b6000806000601260009054906101000a90046001600160a01b03166001600160a01b03166389a302716040518163ffffffff1660e01b815260040160206040518083038186803b15801561360b57600080fd5b505afa15801561361f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136439190614a51565b90506001600160a01b0385161561368257600c5461367b9061367561366e612710610cdf8c8a61353c565b8a906134f3565b906134f3565b9150613686565b8691505b600f54604051631228942160e21b81526000916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926348a25084926136df928f928992909116906004016154a9565b60206040518083038186803b1580156136f757600080fd5b505afa15801561370b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372f919061510f565b90506137d16137ca612710610cdf601260009054906101000a90046001600160a01b03166001600160a01b0316633e032a3b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561378b57600080fd5b505afa15801561379f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c3919061510f565b859061353c565b82906134f3565b604051634da431e960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b4863d2906138229086908690600401615a2a565b60206040518083038186803b15801561383a57600080fd5b505afa15801561384e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613872919061510f565b6001600160a01b03808b1660009081526015602090815260408083208f851680855292529091205492955090841614613b8257600e5460405163361b48eb60e11b81526000916001600160a01b031690636c3691d6906138d8908f908890600401615411565b60006040518083038186803b1580156138f057600080fd5b505afa158015613904573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261392c9190810190614da8565b600e546040516307c0329d60e21b81529192506000916001600160a01b0390911690631f00ca74906139649089908690600401615af1565b60006040518083038186803b15801561397c57600080fd5b505afa158015613990573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526139b89190810190614e45565b905083816000815181106139c857fe5b6020026020010151106139ed5760405162461bcd60e51b815260040161095190615636565b613a14816000815181106139fd57fe5b6020026020010151846142c490919063ffffffff16565b601560008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002081905550613b1582600081518110613a7057fe5b6020908102919091010151600e54604051630137e32360e31b81526001600160a01b03909116906309bf191890613aab9087906004016154cc565b60206040518083038186803b158015613ac357600080fd5b505afa158015613ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613afb9190614a51565b83600081518110613b0857fe5b6020026020010151613fd5565b600e5460405163f5901d4d60e01b81526001600160a01b039091169063f5901d4d90613b49908490869030906004016154df565b600060405180830381600087803b158015613b6357600080fd5b505af1158015613b77573d6000803e3d6000fd5b505050505050613bf8565b818410613ba15760405162461bcd60e51b8152600401610951906155c0565b613bab81856142c4565b601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055505b6001600160a01b038816613c1e5760405162461bcd60e51b815260040161095190615652565b604051634da431e960e11b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b4863d290613c6f908d908890600401615a2a565b60206040518083038186803b158015613c8757600080fd5b505afa158015613c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cbf919061510f565b905080851015613ce15760405162461bcd60e51b8152600401610951906156c6565b613cec848a83613fd5565b6000613cf886836142c4565b90506001600160a01b03891615613d1457613d14858a83613fd5565b60405163791f99a560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791f99a590613d629089908990600401615a2a565b60206040518083038186803b158015613d7a57600080fd5b505afa158015613d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db2919061510f565b9d9c50505050505050505050505050565b6000836001600160a01b0316856001600160a01b03167f47006484f2df633ac2a5063887c3edaae5a0a3cdf585767bc494e1a3180e5d6f85604051613e089190615551565b60405180910390a3601260009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b158015613e5e57600080fd5b505afa158015613e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e969190614a51565b6001600160a01b0316846001600160a01b031614613eb6575060016125f6565b60115460405163256a3ccb60e11b81526001600160a01b0390911690634ad4799690613ee89088908690600401615490565b602060405180830381600087803b158015613f0257600080fd5b505af1158015613f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3a9190614ee4565b95945050505050565b604080516000808252602082019092526001600160a01b038416908390604051613f6d91906152f9565b60006040518083038185875af1925050503d8060008114613faa576040519150601f19603f3d011682016040523d82523d6000602084013e613faf565b606091505b5050905080613fd05760405162461bcd60e51b8152600401610951906156a9565b505050565b600080846001600160a01b031663a9059cbb60e01b8585604051602401613ffd929190615490565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161403b91906152f9565b6000604051808303816000865af19150503d8060008114614078576040519150601f19603f3d011682016040523d82523d6000602084013e61407d565b606091505b50915091508180156140a75750805115806140a75750808060200190518101906140a79190614ee4565b6140c35760405162461bcd60e51b8152600401610951906157cc565b5050505050565b600080856001600160a01b03166323b872dd60e01b8686866040516024016140f4939291906153ed565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161413291906152f9565b6000604051808303816000865af19150503d806000811461416f576040519150601f19603f3d011682016040523d82523d6000602084013e614174565b606091505b509150915081801561419e57508051158061419e57508080602001905181019061419e9190614ee4565b6141ba5760405162461bcd60e51b815260040161095190615889565b505050505050565b6012546040516301c6e7ff60e11b815284916001600160a01b03169063038dcffe906141f29084906004016153d9565b60206040518083038186803b15801561420a57600080fd5b505afa15801561421e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142429190614ee4565b61425e5760405162461bcd60e51b8152600401610951906157ae565b6001600160a01b0383811660009081526015602090815260408083209388168352929052205461428e81846134f3565b6001600160a01b038581166000908152601560209081526040808320938a168352929052208190556141ba908590879084613dc3565b600061353583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506148cb565b6001600160a01b038083166000908152601560209081526040808320878516845290915281205460045460025460085493949293614355938993899389939183169261010090910416906135b8565b6010546040516339ec2d6360e21b81529193506001600160a01b03169063e7b0b58c906143889087908790600401615490565b600060405180830381600087803b1580156143a257600080fd5b505af11580156143b6573d6000803e3d6000fd5b5050506001600160a01b038086166000908152601560209081526040808320938a16835292905220546143ee91508590879084613dc3565b50509392505050565b601360009054906101000a90046001600160a01b03166001600160a01b031663f130af696040518163ffffffff1660e01b815260040160206040518083038186803b15801561444557600080fd5b505afa158015614459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061447d9190614ee4565b614486576132b0565b6013546011546040516310c91def60e11b81526000926001600160a01b03908116926318d885c2929116906321923bde906144c59088906004016153d9565b60206040518083038186803b1580156144dd57600080fd5b505afa1580156144f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614515919061510f565b6040518263ffffffff1660e01b81526004016145319190615551565b60206040518083038186803b15801561454957600080fd5b505afa15801561455d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614581919061510f565b90506000601260009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b1580156145d357600080fd5b505afa1580156145e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061460b9190614a51565b905060006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166348a250848361464f612710610cdf898961353c565b600f546040516001600160e01b031960e086901b16815261467e9392916001600160a01b0316906004016154a9565b60206040518083038186803b15801561469657600080fd5b505afa1580156146aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146ce919061510f565b6003546001600160a01b039081166000908152601560209081526040808320938716835292905220549091508110156140c3576003546001600160a01b0390811660009081526015602090815260408083209386168352929052205461473490826142c4565b6003546001600160a01b039081166000908152601560209081526040808320938716835292905220556140c38286836141c2565b60008160405160200161477b91906153a8565b604051602081830303815290604052805190602001209050919050565b60006001600160a01b0382166147c05760405162461bcd60e51b815260040161095190615847565b506001600160a01b03166000908152602091909152604090205460ff1690565b6147eb600d826134a3565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b61482d600d826148f7565b6040516001600160a01b038216907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a250565b6000838301828582101561488b5760405162461bcd60e51b8152600401610951919061558d565b50949350505050565b600081836148b55760405162461bcd60e51b8152600401610951919061558d565b5060008385816148c157fe5b0495945050505050565b600081848411156148ef5760405162461bcd60e51b8152600401610951919061558d565b505050900390565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b82805482825590600052602060002090810192821561496e579160200282015b8281111561496e57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614939565b5061497a92915061497e565b5090565b5b8082111561497a576000815560010161497f565b80356112da81615b9d565b80356001600160e01b0319811681146112da57600080fd5b60008083601f8401126149c7578182fd5b5081356001600160401b038111156149dd578182fd5b6020830191508360208285010111156149f557600080fd5b9250929050565b600060c08284031215614a0d578081fd5b50919050565b600060608284031215614a0d578081fd5b803560ff811681146112da57600080fd5b600060208284031215614a46578081fd5b813561353581615b9d565b600060208284031215614a62578081fd5b815161353581615b9d565b60008060408385031215614a7f578081fd5b8251614a8a81615b9d565b6020840151909250614a9b81615b9d565b809150509250929050565b60008060008060808587031215614abb578182fd5b8451614ac681615b9d565b6020860151909450614ad781615b9d565b6040860151909350614ae881615b9d565b6060860151909250614af981615b9d565b939692955090935050565b60008060008060008060c08789031215614b1c578384fd5b8651614b2781615b9d565b6020880151909650614b3881615b9d565b6040880151909550614b4981615b9d565b6060880151909450614b5a81615b9d565b6080880151909350614b6b81615b9d565b60a0880151909250614b7c81615b9d565b809150509295509295509295565b60008060408385031215614b9c578182fd5b8251614ba781615b9d565b6020939093015192949293505050565b60008060408385031215614bc9578182fd5b8235614bd481615b9d565b91506020830135614a9b81615b9d565b6000806000806000806000806000806000806101808d8f031215614c0657898afd5b8c35614c1181615b9d565b9b5060208d0135614c2181615b9d565b9a5060408d0135614c3181615b9d565b995060608d0135614c4181615b9d565b985060808d0135614c5181615b9d565b975060a08d0135614c6181615b9d565b9650614c6f60c08e01614993565b9550614c7d60e08e01614993565b9450614c8c6101008e01614993565b9350614c9b6101208e01614993565b9250614caa6101408e01614993565b9150614cb96101608e01614993565b90509295989b509295989b509295989b565b60008060408385031215614cdd578182fd5b8235614ce881615b9d565b91506020830135614a9b81615bb5565b60008060408385031215614d0a578182fd5b8235614d1581615b9d565b946020939093013593505050565b600060608284031215614d34578081fd5b82601f830112614d42578081fd5b604051606081018181106001600160401b0382111715614d5e57fe5b604052808360608101861015614d72578384fd5b835b6003811015614d9d578135614d8881615b9d565b83526020928301929190910190600101614d74565b509195945050505050565b60006020808385031215614dba578182fd5b82516001600160401b03811115614dcf578283fd5b8301601f81018513614ddf578283fd5b8051614df2614ded82615b50565b615b2d565b8181528381019083850185840285018601891015614e0e578687fd5b8694505b83851015614e39578051614e2581615b9d565b835260019490940193918501918501614e12565b50979650505050505050565b60006020808385031215614e57578182fd5b82516001600160401b03811115614e6c578283fd5b8301601f81018513614e7c578283fd5b8051614e8a614ded82615b50565b8181528381019083850185840285018601891015614ea6578687fd5b8694505b83851015614e39578051835260019490940193918501918501614eaa565b600060208284031215614ed9578081fd5b813561353581615bb5565b600060208284031215614ef5578081fd5b815161353581615bb5565b600060208284031215614f11578081fd5b6135358261499e565b60008060008060808587031215614f2f578182fd5b614f388561499e565b935060208086013593506040860135925060608601356001600160401b0380821115614f62578384fd5b818801915088601f830112614f75578384fd5b813581811115614f8157fe5b614f93601f8201601f19168501615b2d565b91508082528984828501011115614fa8578485fd5b8084840185840137810190920192909252939692955090935050565b60008060208385031215614fd6578182fd5b82356001600160401b03811115614feb578283fd5b614ff7858286016149b6565b90969095509350505050565b60008060008060408587031215615018578182fd5b84356001600160401b038082111561502e578384fd5b61503a888389016149b6565b90965094506020870135915080821115615052578384fd5b5061505f878288016149b6565b95989497509550505050565b600060c0828403121561507c578081fd5b61353583836149fc565b60008061018080848603121561509a578283fd5b6150a485856149fc565b92508481850111156150b4578182fd5b5060c0830190509250929050565b60008061012083850312156150d5578182fd5b6150df84846149fc565b91506150ee8460c08501614a13565b90509250929050565b600060208284031215615108578081fd5b5035919050565b600060208284031215615120578081fd5b5051919050565b600080600080600080600060e0888a031215615141578081fd5b87359650602088013561515381615b9d565b9550604088013594506060880135935061516f60808901614a24565b925060a0880135915060c0880135905092959891949750929550565b60008060008060008060c087890312156151a3578384fd5b8635955060208701356151b581615b9d565b9450604087013593506151ca60608801614a24565b92506080870135915060a087013590509295509295509295565b60008060008061016085870312156151fa578182fd5b8435935061520b86602087016149fc565b925061521a8660e08701614a13565b9150610140850135614af981615b9d565b600080600080600060a08688031215615242578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b60006020828403121561527b578081fd5b61353582614a24565b600080600060608486031215615298578081fd5b6152a184614a24565b95602085013595506040909401359392505050565b6000815180845260208085019450808401835b838110156152ee5781516001600160a01b0316875295820195908201906001016152c9565b509495945050505050565b6000825161530b818460208701615b6d565b9190910192915050565b60006bffffffffffffffffffffffff198660601b1682528460148301528284603484013791016034019081529392505050565b6bffffffffffffffffffffffff196060998a1b811682526001600160e01b0319989098166014820152601881019690965293871b8616603886015291861b909416604c84015293820192909252608081019290925260a082015260c00190565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03948516815292841660208401529083166040830152909116606082015260800190565b6001600160a01b0396871681529486166020860152928516604085015290841660608401528316608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60006020825261353560208301846152b6565b606080825284519082018190526000906020906080840190828801845b82811015615518578151845292840192908401906001016154fc565b5050508381038285015261552c81876152b6565b9250505060018060a01b0383166040830152949350505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526155ac816040850160208701615b6d565b601f01601f19169190910160400192915050565b602080825260029082015261617560f01b604082015260600190565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b6020808252600990820152681bdd995c881c185a5960ba1b604082015260600190565b602080825260029082015261756160f01b604082015260600190565b6020808252600390820152626d697360e81b604082015260600190565b6020808252600390820152626d706f60e81b604082015260600190565b6020808252600390820152626d666f60e81b604082015260600190565b60208082526003908201526253544560e81b604082015260600190565b602080825260029082015261073760f41b604082015260600190565b60208082526002908201526137b760f11b604082015260600190565b602080825260079082015266195e1c1a5c995960ca1b604082015260600190565b602080825260029082015261065760f41b604082015260600190565b6020808252600490820152631cdcdcdd60e21b604082015260600190565b6020808252600290820152616d6560f01b604082015260600190565b6020808252600390820152626a737960e81b604082015260600190565b602080825260029082015261697360f01b604082015260600190565b6020808252600490820152631b591b9960e21b604082015260600190565b60208082526002908201526114d560f21b604082015260600190565b6020808252600490820152633539bc9960e11b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526003908201526229aa2360e91b604082015260600190565b6020808252600190820152606560f81b604082015260600190565b60208082526003908201526270727560e81b604082015260600190565b60208082526030908201527f5369676e6572526f6c653a2063616c6c657220646f6573206e6f74206861766560408201526f20746865205369676e657220726f6c6560801b606082015260800190565b602080825260029082015261726360f01b604082015260600190565b602080825260029082015261616960f01b604082015260600190565b6020808252600c908201526b1d5cd95c88195e1c1a5c995960a21b604082015260600190565b6020808252600790820152661cdd1bdc1c195960ca1b604082015260600190565b6020808252600c908201526b1bdd995c881c195c98d95b9d60a21b604082015260600190565b60208082526003908201526273727560e81b604082015260600190565b60208082526004908201526373756d6d60e01b604082015260600190565b6020808252600290820152616f6760f01b604082015260600190565b9182526001600160a01b0316602082015260400190565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b9586526001600160a01b03948516602087015292841660408601529083166060850152909116608083015260a082015260c00190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b6000838252604060208301526125f660408301846152b6565b948552602085019390935260408401919091526060830152608082015260a00190565b6040518181016001600160401b0381118282101715615b4857fe5b604052919050565b60006001600160401b03821115615b6357fe5b5060209081020190565b60005b83811015615b88578181015183820152602001615b70565b83811115615b97576000848401525b50505050565b6001600160a01b0381168114615bb257600080fd5b50565b8015158114615bb257600080fdfea2646970667358221220aa32cc4f0b9d48b357e0c1c5b11ee64a12e631c5e5c235c62bdd99202e92eed964736f6c63430007060033000000000000000000000000fa3e7d864cf426381af1a990fd2e19d56b03df330000000000000000000000005126ea3894671e1c6cce47d3fb462e3c270e499e

Deployed Bytecode

0x6080604052600436106102ef5760003560e01c80636ac7bca011610186578063b2b9f0ed116100d7578063d1f21f4f11610085578063d1f21f4f1461085d578063d365a08e1461087d578063d73d8b9014610892578063e9b786cb146108b2578063f460590b146108c7578063f6326fb3146108e7578063f6e71bc8146108ef576102f6565b8063b2b9f0ed146107a9578063bd38837b146107c9578063c42cf535146107de578063c5f956af146107fe578063c8a68c9614610813578063cc3fdd4c14610828578063cefd071b1461083d576102f6565b80637df73e27116101345780637df73e27146106ea57806389c9cbc01461070a5780638a0afa771461071f578063947977a81461073f578063a49062d41461075f578063a89b7ed614610774578063af14944414610794576102f6565b80636ac7bca0146106205780636c3fc891146106405780636e933c74146106605780636f1a65e0146106805780636f9e4f0b1461069557806375e16b17146106b55780637b7b0820146106d5576102f6565b806334a6cdc5116102405780635d70557c116101ee5780635d70557c146105565780635e3260471461056b57806361e3c5231461058b57806362c3c2e5146105ab5780636309daf5146105cb57806368af81e6146105eb57806368d3ae831461060b576102f6565b806334a6cdc5146104975780633d5c2644146104ac57806341ed2c12146104cc578063459a1782146104e157806347e7ef2414610501578063495ef705146105215780634e24127714610536576102f6565b8063272caf691161029d578063272caf69146103df578063276f1c41146103f45780632a54caba146104095780632a8d950c1461042b5780632b3297f9146104405780632f54bf6e1461045557806332c2e8d714610482576102f6565b8063025e7c27146102fb5780630885ad571461033157806308b14011146103535780630b800f481461037357806316ba71971461039357806321f8fba7146103b55780632630c12f146103ca576102f6565b366102f657005b600080fd5b34801561030757600080fd5b5061031b6103163660046150f7565b610904565b60405161032891906153d9565b60405180910390f35b34801561033d57600080fd5b5061035161034c3660046151e4565b61092e565b005b34801561035f57600080fd5b5061035161036e366004615003565b610dce565b34801561037f57600080fd5b5061035161038e366004614be4565b6110dc565b34801561039f57600080fd5b506103a861121d565b6040516103289190615578565b3480156103c157600080fd5b5061031b611228565b3480156103d657600080fd5b5061031b611237565b3480156103eb57600080fd5b5061031b611246565b34801561040057600080fd5b5061031b611255565b34801561041557600080fd5b5061041e611264565b6040516103289190615551565b34801561043757600080fd5b5061031b61126a565b34801561044c57600080fd5b5061031b611279565b34801561046157600080fd5b50610475610470366004614a35565b611288565b6040516103289190615546565b34801561048e57600080fd5b506103a86112df565b3480156104a357600080fd5b5061041e6112ea565b3480156104b857600080fd5b5061041e6104c7366004614a35565b6112f0565b3480156104d857600080fd5b5061031b6113a1565b3480156104ed57600080fd5b506103516104fc366004615003565b6113b0565b34801561050d57600080fd5b5061035161051c366004614cf8565b6115f1565b34801561052d57600080fd5b5061041e6117ab565b34801561054257600080fd5b5061041e610551366004614ec8565b6117b1565b34801561056257600080fd5b5061031b6117f5565b34801561057757600080fd5b50610351610586366004615086565b611804565b34801561059757600080fd5b5061041e6105a6366004614bb7565b611da7565b3480156105b757600080fd5b506104756105c6366004614a35565b611dd2565b3480156105d757600080fd5b5061041e6105e6366004614a35565b611e25565b3480156105f757600080fd5b5061041e610606366004614fc4565b611e37565b34801561061757600080fd5b5061041e611e72565b34801561062c57600080fd5b5061035161063b366004615003565b611e78565b34801561064c57600080fd5b5061035161065b366004615003565b6120d5565b34801561066c57600080fd5b5061041e61067b36600461506b565b61241f565b34801561068c57600080fd5b5061041e612495565b3480156106a157600080fd5b506103516106b0366004614d23565b61249c565b3480156106c157600080fd5b5061031b6106d0366004615003565b612554565b3480156106e157600080fd5b5061031b6125fe565b3480156106f657600080fd5b50610475610705366004614a35565b61260d565b34801561071657600080fd5b5061031b61261a565b34801561072b57600080fd5b5061035161073a36600461518b565b612629565b34801561074b57600080fd5b5061035161075a366004615003565b612867565b34801561076b57600080fd5b5061041e612a5f565b34801561078057600080fd5b5061031b61078f3660046150c2565b612a64565b3480156107a057600080fd5b506103a8612b2a565b3480156107b557600080fd5b506104756107c43660046150f7565b612b35565b3480156107d557600080fd5b5061031b612b4a565b3480156107ea57600080fd5b506103516107f9366004614a35565b612b6e565b34801561080a57600080fd5b5061031b612bfa565b34801561081f57600080fd5b5061041e612c0e565b34801561083457600080fd5b5061041e612c14565b34801561084957600080fd5b5061041e610858366004614bb7565b612c1a565b34801561086957600080fd5b50610351610878366004615003565b612c37565b34801561088957600080fd5b5061031b612e96565b34801561089e57600080fd5b506103516108ad366004615127565b612ea5565b3480156108be57600080fd5b5061041e613253565b3480156108d357600080fd5b506103516108e2366004614ccb565b613259565b6103516132b4565b3480156108fb57600080fd5b506103a8613498565b6000818154811061091457600080fd5b6000918252602090912001546001600160a01b0316905081565b6002601754141561095a5760405162461bcd60e51b81526004016109519061592e565b60405180910390fd5b60026017556012546040516301c6e7ff60e11b815282916001600160a01b03169063038dcffe9061098f9084906004016153d9565b60206040518083038186803b1580156109a757600080fd5b505afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190614ee4565b6109fb5760405162461bcd60e51b8152600401610951906157ae565b601260009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610a4957600080fd5b505afa158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a819190614ee4565b15610a9e5760405162461bcd60e51b81526004016109519061598c565b8383610aaa8282612a64565b6001600160a01b0316610ac36080840160608501614a35565b6001600160a01b031614610ae95760405162461bcd60e51b81526004016109519061573b565b610af46107056134ef565b610b105760405162461bcd60e51b8152600401610951906158de565b6000610b226080880160608901614a35565b6001600160a01b038116600090815260166020526040902054909150421015610b5d5760405162461bcd60e51b8152600401610951906158a6565b8660800135600a541115610b835760405162461bcd60e51b815260040161095190615613565b60008881526001602052604090205460ff16158015610bbe57506314a6a35b60e21b610bb26020890189614f00565b6001600160e01b031916145b610bda5760405162461bcd60e51b8152600401610951906158c1565b6000888152600160208181526040808420805460ff1916909317909255601254825163dffda16360e01b81529251610c8a936001600160a01b039092169263dffda1639260048082019391829003018186803b158015610c3957600080fd5b505afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190614a51565b6001600160a01b0316876001600160a01b0316146117b1565b905080610c9a4262278d006134f3565b6001600160a01b038085166000908152601660205260409020919091556006541615610ce857600754610ce590610cd3906127106134f3565b610cdf8461271061353c565b90613576565b90505b6001600160a01b0380841660009081526015602090815260408083208b851684529091529020546005546006546007549293610d30938c9389938893918216929116906135b8565b506001600160a01b038085166000908152601560209081526040808320938c1683529290522054610d659085908a9084613dc3565b506001600160a01b038416600090815260166020526040908190205490517f36468bb69cf35301290533742acb0f5890fc576141b4884532cf11f7b29c240a91610db4918e9188918890615acd565b60405180910390a150506001601755505050505050505050565b838383836040518060400160405280600e81526020016d7769746864726177546f6b656e7360901b815250610e0233611288565b610e1e5760405162461bcd60e51b8152600401610951906156e2565b6000610e2c86868686612554565b90506001600160a01b0381163314801590610e4b5750610e4b81611288565b8015610e5f57506001600160a01b03811615155b610e7b5760405162461bcd60e51b815260040161095190615792565b60008080610e8b888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015610ec55750845160208601206001600160e01b03198481169116145b610ee15760405162461bcd60e51b8152600401610951906159d3565b428111610f005760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055610f278d8f018f614f1a565b935050505060008082806020019051810190610f439190614a6d565b60125460405163c037934760e01b81529294509092506001600160a01b03169063c037934790610f779085906004016153d9565b60206040518083038186803b158015610f8f57600080fd5b505afa158015610fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc79190614ee4565b15610fe45760405162461bcd60e51b815260040161095190615759565b60006001600160a01b0383166110055750476110008282613f43565b61108e565b6040516370a0823160e01b81526001600160a01b038416906370a08231906110319030906004016153d9565b60206040518083038186803b15801561104957600080fd5b505afa15801561105d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611081919061510f565b905061108e838383613fd5565b7f70082d08c003c5341f2401bec1c2ae1dbcdc29ae17e9cc5633fa617caa8acd4c8383836040516110c1939291906153ed565b60405180910390a15050505050505050505050505050505050565b60185460ff16156110ff5760405162461bcd60e51b81526004016109519061594a565b600f80546001600160a01b03199081166001600160a01b039e8f16179091556010805482169c8e169c909c17909b55601180548c169a8d169a909a17909955601280548b16988c1698909817909755601380548a16968b169690961790955560028054610100600160a81b031916610100938b16939093029290921790915560038054881693891693909317909255600480548716918816919091179055601480548616918716919091179055600580548516918616919091179055600680548416918516919091179055600e80549092169216919091179055600160178190556106bd60075560fa6008556709b6e64a8ec60000600c55600060095567610177f723fb0000600a556103e8600b556018805460ff19169091179055565b632155447360e21b81565b6013546001600160a01b031681565b600f546001600160a01b031681565b6006546001600160a01b031681565b6014546001600160a01b031681565b6101f481565b6011546001600160a01b031681565b600e546001600160a01b031681565b600080805b6000548110156112d657836001600160a01b0316600082815481106112ae57fe5b6000918252602090912001546001600160a01b031614156112ce57600191505b60010161128d565b5090505b919050565b6325110a1760e11b81565b60075481565b6001600160a01b038082166000908152601560209081526040808320601254825163dffda16360e01b81529251949591948694919092169263dffda1639260048083019392829003018186803b15801561134957600080fd5b505afa15801561135d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113819190614a51565b6001600160a01b0316815260208101919091526040016000205492915050565b6012546001600160a01b031681565b83838383604051806040016040528060138152602001727365744d616e6167657241646472657373657360681b8152506113e933611288565b6114055760405162461bcd60e51b8152600401610951906156e2565b600061141386868686612554565b90506001600160a01b0381163314801590611432575061143281611288565b801561144657506001600160a01b03811615155b6114625760405162461bcd60e51b815260040161095190615792565b60008080611472888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156114ac5750845160208601206001600160e01b03198481169116145b6114c85760405162461bcd60e51b8152600401610951906159d3565b4281116114e75760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff1916909117905561150e8d8f018f614f1a565b93505050506000806000808480602001905181019061152d9190614aa6565b60028054610100600160a81b0319166101006001600160a01b0387811682029290921792839055600380546001600160a01b031990811688851617918290556004805482168886161790819055600580549092168786161791829055604051999d50979b509599509397507f471bd784db5079421761b0728e4d7bd73efe27958f0bc3452bada7799f0d3457966115d59691909304821694938216939082169291169061542b565b60405180910390a1505050505050505050505050505050505050565b6012546040516301c6e7ff60e11b815283916001600160a01b03169063038dcffe906116219084906004016153d9565b60206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116719190614ee4565b61168d5760405162461bcd60e51b8152600401610951906157ae565b600260175414156116b05760405162461bcd60e51b81526004016109519061592e565b6002601755601254604080516318e9666960e21b815290516001600160a01b03909216916363a599a491600480820192602092909190829003018186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190614ee4565b1561174f5760405162461bcd60e51b81526004016109519061598c565b61175b833330856140ca565b6117668333846141c2565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a16689582338484604051611799939291906153ed565b60405180910390a15050600160175550565b60095481565b60008082156117ea576117e36117da612710610cdf600b54600a5461353c90919063ffffffff16565b600a54906142c4565b90506117ef565b50600a545b92915050565b6005546001600160a01b031681565b600260175414156118275760405162461bcd60e51b81526004016109519061592e565b600260175561183c6060830160408401614a35565b6012546040516301c6e7ff60e11b81526001600160a01b039091169063038dcffe9061186c9084906004016153d9565b60206040518083038186803b15801561188457600080fd5b505afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190614ee4565b6118d85760405162461bcd60e51b8152600401610951906157ae565b6118e86080840160608501614a35565b6118f181611dd2565b1561190e5760405162461bcd60e51b815260040161095190615966565b601260009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561195c57600080fd5b505afa158015611970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119949190614ee4565b156119b15760405162461bcd60e51b81526004016109519061598c565b600060405180604001604052806119d887876000600281106119cf57fe5b60600201612a64565b6001600160a01b031681526020016119f2878760016119cf565b6001600160a01b031690529050611a108160005b602002015161260d565b8015611a225750611a22816001611a06565b8015611a405750602081015181516001600160a01b03908116911614155b611a5c5760405162461bcd60e51b815260040161095190615792565b60208086013560009081526001909152604090205460ff16158015611a9d575063547e8cf960e11b611a916020870187614f00565b6001600160e01b031916145b611ab95760405162461bcd60e51b8152600401610951906158c1565b60208086013560009081526001808352604091829020805460ff19169091179055601254815163dffda16360e01b815291516001600160a01b039091169263dffda1639260048082019391829003018186803b158015611b1857600080fd5b505afa158015611b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b509190614a51565b6001600160a01b0316611b696060870160408801614a35565b6001600160a01b03161415611c1a57601260009054906101000a90046001600160a01b03166001600160a01b0316638aa7ba676040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfe9190614ee4565b611c1a5760405162461bcd60e51b815260040161095190615775565b611c2a6060860160408701614a35565b6012546001600160a01b03918216911663be2ec3bc611c4f6080890160608a01614a35565b6040518263ffffffff1660e01b8152600401611c6b91906153d9565b60206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbb9190614a51565b6001600160a01b031614611ce15760405162461bcd60e51b8152600401610951906157e8565b6000611d10611cf66060880160408901614a35565b611d066080890160608a01614a35565b8860800135614306565b9050611d2b611d256080880160608901614a35565b826143f7565b81516020838101517f68c88f2d1b180ac31c1b89c8a25db195d669e6d352368be8ae4bb1ade1e7f64792918901359190611d6b60608b0160408c01614a35565b611d7b60808c0160608d01614a35565b8b60800135604051611d9296959493929190615a68565b60405180910390a15050600160175550505050565b6001600160a01b03918216600090815260156020908152604080832093909416825291909152205490565b6000600a5460001415611de7575060006112da565b6001600160a01b0382166000908152601660205260409020544290611e0f906220f5806134f3565b1115611e1d575060006112da565b506001919050565b60166020526000908152604090205481565b6040516000904690611e53903090839087908790602001615315565b6040516020818303038152906040528051906020012091505092915050565b600b5481565b838383836040518060400160405280600c81526020016b73657446656556616c75657360a01b815250611eaa33611288565b611ec65760405162461bcd60e51b8152600401610951906156e2565b6000611ed486868686612554565b90506001600160a01b0381163314801590611ef35750611ef381611288565b8015611f0757506001600160a01b03811615155b611f235760405162461bcd60e51b815260040161095190615792565b60008080611f33888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015611f6d5750845160208601206001600160e01b03198481169116145b611f895760405162461bcd60e51b8152600401610951906159d3565b428111611fa85760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055611fcf8d8f018f614f1a565b9350505050600080600080600085806020019051810190611ff0919061522b565b9450945094509450945061271084111561201c5760405162461bcd60e51b8152600401610951906159ad565b6101f483111561203e5760405162461bcd60e51b81526004016109519061568c565b600a859055600b84905560098390556101f482111561206f5760405162461bcd60e51b81526004016109519061566f565b6008829055600c819055600a54600b546009546040517fba5e401ce259802da9c7838f9696cd1079b2eb2a0ea245e551c978b5d33069c9936120b8939092909186908890615b0a565b60405180910390a150505050505050505050505050505050505050565b8383838360405180604001604052806012815260200171736574436f6e74726163744164647265737360701b81525061210d33611288565b6121295760405162461bcd60e51b8152600401610951906156e2565b600061213786868686612554565b90506001600160a01b0381163314801590612156575061215681611288565b801561216a57506001600160a01b03811615155b6121865760405162461bcd60e51b815260040161095190615792565b60008080612196888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156121d05750845160208601206001600160e01b03198481169116145b6121ec5760405162461bcd60e51b8152600401610951906159d3565b42811161220b5760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff191690911790556122328d8f018f614f1a565b9350505050600080600080600080868060200190518101906122549190614b04565b95509550955095509550955085600f60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084600e60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555083601060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082601160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081601260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080601360006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f4366821234a42b582d7d66472fd7d6d5a4d783381ba060215a83e1c3ce0c6db8600f60009054906101000a90046001600160a01b0316600e60009054906101000a90046001600160a01b0316601060009054906101000a90046001600160a01b0316601160009054906101000a90046001600160a01b0316601260009054906101000a90046001600160a01b0316601360009054906101000a90046001600160a01b031660405161240196959493929190615456565b60405180910390a15050505050505050505050505050505050505050565b600046306124306020850185614f00565b60208501356124456080870160608801614a35565b6124556060880160408901614a35565b8588608001358960a00135604051602001612477989796959493929190615348565b60405160208183030381529060405280519060200120915050919050565b62278d0081565b60025460ff161580156124b8575080516001600160a01b031615155b80156124d0575060208101516001600160a01b031615155b80156124e8575060408101516001600160a01b031615155b6125045760405162461bcd60e51b81526004016109519061594a565b6040805160608101825282516001600160a01b039081168252602080850151821690830152838301511691810191909152612543906000906003614919565b50506002805460ff19166001179055565b60004681808061256686880188615284565b92509250925060016125a330868c8c6040516020016125889493929190615315565b60405160208183030381529060405280519060200120614768565b848484604051600081526020016040526040516125c3949392919061555a565b6020604051602081039080840390855afa1580156125e5573d6000803e3d6000fd5b505050602060405103519450505050505b949350505050565b6010546001600160a01b031681565b60006117ef600d83614798565b6003546001600160a01b031681565b600033905060004690506126b3600161266230634a22142e60e01b8c878d8860008f604051602001612588989796959493929190615348565b87878760405160008152602001604052604051612682949392919061555a565b6020604051602081039080840390855afa1580156126a4573d6000803e3d6000fd5b5050506020604051035161260d565b6126cf5760405162461bcd60e51b8152600401610951906159f0565b60008881526001602052604090205460ff16156126fe5760405162461bcd60e51b8152600401610951906158c1565b6000888152600160208190526040909120805460ff191690911790554286116127395760405162461bcd60e51b8152600401610951906156fe565b601254604051632f8bb0ef60e21b81526000916001600160a01b03169063be2ec3bc9061276a9086906004016153d9565b60206040518083038186803b15801561278257600080fd5b505afa158015612796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ba9190614a51565b60125460405163e8b624ad60e01b81529192506001600160a01b03169063e8b624ad906127ed9086908c90600401615411565b600060405180830381600087803b15801561280757600080fd5b505af115801561281b573d6000803e3d6000fd5b505050507f6d41219ad121d8734cd4bf7d276c6e3ef10c1a9b4e0e2245dd02ec458599cdb789848a846040516128549493929190615a41565b60405180910390a1505050505050505050565b83838383604051806040016040528060168152602001757365745374616b65436f6e7472616374506172616d7360501b8152506128a333611288565b6128bf5760405162461bcd60e51b8152600401610951906156e2565b60006128cd86868686612554565b90506001600160a01b03811633148015906128ec57506128ec81611288565b801561290057506001600160a01b03811615155b61291c5760405162461bcd60e51b815260040161095190615792565b6000808061292c888a018a614f1a565b50600082815260016020526040902054929550909350915060ff161580156129665750845160208601206001600160e01b03198481169116145b6129825760405162461bcd60e51b8152600401610951906159d3565b4281116129a15760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff191690911790556129c88d8f018f614f1a565b9350505050600080828060200190518101906129e49190614b8a565b600680546001600160a01b0319166001600160a01b03848116919091179182905560078390556040519395509193507f81e80fe065ce07af29c0ce5b1c050c0a153937cfc80aade3416745b8d15a24e292612a459291909116908490615490565b60405180910390a150505050505050505050505050505050565b600581565b6000466001612ac130612a7a6020880188614f00565b6020880135612a8f60808a0160608b01614a35565b612a9f60608b0160408c01614a35565b878b608001358c60a00135604051602001612588989796959493929190615348565b612ace602086018661526a565b8560200135866040013560405160008152602001604052604051612af5949392919061555a565b6020604051602081039080840390855afa158015612b17573d6000803e3d6000fd5b5050604051601f19015195945050505050565b63547e8cf960e11b81565b60016020526000908152604090205460ff1681565b7f000000000000000000000000fa3e7d864cf426381af1a990fd2e19d56b03df3381565b6014546001600160a01b0316612b826134ef565b6001600160a01b031614612ba85760405162461bcd60e51b815260040161095190615a0e565b601480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f92caf80b3b287e058d945a90272035dd5f5eb1fee321aced853a991d9ab315ad90600090a35050565b60025461010090046001600160a01b031681565b600a5481565b60085481565b601560209081526000928352604080842090915290825290205481565b838383836040518060400160405280601181526020017007472616e736665724f776e65727368697607c1b815250612c6e33611288565b612c8a5760405162461bcd60e51b8152600401610951906156e2565b6000612c9886868686612554565b90506001600160a01b0381163314801590612cb75750612cb781611288565b8015612ccb57506001600160a01b03811615155b612ce75760405162461bcd60e51b815260040161095190615792565b60008080612cf7888a018a614f1a565b50600082815260016020526040902054929550909350915060ff16158015612d315750845160208601206001600160e01b03198481169116145b612d4d5760405162461bcd60e51b8152600401610951906159d3565b428111612d6c5760405162461bcd60e51b81526004016109519061571f565b60008281526001602081905260408220805460ff19169091179055612d938d8f018f614f1a565b9350505050600081806020019051810190612dae9190614a51565b90506000805b600054811015612dfc57336001600160a01b031660008281548110612dd557fe5b6000918252602090912001546001600160a01b03161415612df4578091505b600101612db4565b506000808281548110612e0b57fe5b600091825260208220015481546001600160a01b03909116925084919084908110612e3257fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051858316928416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050505050505050505050505050505050565b6004546001600160a01b031681565b60026017541415612ec85760405162461bcd60e51b81526004016109519061592e565b600260178190555060003390506000469050612f0860016126623063855511cc60e01b8d878e888f8f604051602001612588989796959493929190615348565b612f245760405162461bcd60e51b81526004016109519061573b565b60008981526001602052604090205460ff1615612f535760405162461bcd60e51b8152600401610951906158c1565b6000898152600160208190526040909120805460ff19169091179055428611612f8e5760405162461bcd60e51b8152600401610951906156fe565b6001600160a01b038083166000908152601560209081526040808320938c1683529290522054612fbe81896142c4565b6001600160a01b0380851660009081526015602090815260408083208e8516845282528083209490945560125484516315ab88c960e31b81529451929493169263ad5c46489260048083019392829003018186803b15801561301f57600080fd5b505afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190614a51565b9050806001600160a01b03168a6001600160a01b0316141561315157604051632e1a7d4d60e01b81526001600160a01b03821690632e1a7d4d9061309f908c90600401615551565b600060405180830381600087803b1580156130b957600080fd5b505af11580156130cd573d6000803e3d6000fd5b505060025461010090046001600160a01b03161591506131429050576000613106612710610cdf6009548d61353c90919063ffffffff16565b90508015613129576002546131299061010090046001600160a01b031682613f43565b61313c336131378c846142c4565b613f43565b5061314c565b61314c338a613f43565b6131ce565b60025461010090046001600160a01b0316156131c3576000613184612710610cdf6009548d61353c90919063ffffffff16565b905080156131a9576002546131a9908c9061010090046001600160a01b031683613fd5565b6131bd8b336131b88d856142c4565b613fd5565b506131ce565b6131ce8a338b613fd5565b6001600160a01b038085166000908152601560209081526040808320938e1683529290522054613200858c8386613dc3565b507f43b573ac1c738f28df57dc3e1fea317d5c9d932501be02f3f096f617e3e5c5d78c868d8d85604051613238959493929190615a9e565b60405180910390a15050600160175550505050505050505050565b600c5481565b6014546001600160a01b031661326d6134ef565b6001600160a01b0316146132935760405162461bcd60e51b815260040161095190615a0e565b80156132a7576132a2826147e0565b6132b0565b6132b082614822565b5050565b600260175414156132d75760405162461bcd60e51b81526004016109519061592e565b6002601755601254604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561332157600080fd5b505afa158015613335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133599190614a51565b6012546040516301c6e7ff60e11b81529192506001600160a01b03169063038dcffe9061338a9084906004016153d9565b60206040518083038186803b1580156133a257600080fd5b505afa1580156133b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133da9190614ee4565b6133f65760405162461bcd60e51b815260040161095190615759565b806001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561343157600080fd5b505af1158015613445573d6000803e3d6000fd5b50505050506134558133346141c2565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a16689582338234604051613488939291906153ed565b60405180910390a1506001601755565b6314a6a35b60e21b81565b6134ad8282614798565b156134ca5760405162461bcd60e51b8152600401610951906155dc565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3390565b600061353583836040518060400160405280601b81526020017f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815250614864565b9392505050565b60008261354b575060006117ef565b8282028284828161355857fe5b04146135355760405162461bcd60e51b815260040161095190615806565b600061353583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614894565b6000806000601260009054906101000a90046001600160a01b03166001600160a01b03166389a302716040518163ffffffff1660e01b815260040160206040518083038186803b15801561360b57600080fd5b505afa15801561361f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136439190614a51565b90506001600160a01b0385161561368257600c5461367b9061367561366e612710610cdf8c8a61353c565b8a906134f3565b906134f3565b9150613686565b8691505b600f54604051631228942160e21b81526000916001600160a01b037f000000000000000000000000fa3e7d864cf426381af1a990fd2e19d56b03df338116926348a25084926136df928f928992909116906004016154a9565b60206040518083038186803b1580156136f757600080fd5b505afa15801561370b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372f919061510f565b90506137d16137ca612710610cdf601260009054906101000a90046001600160a01b03166001600160a01b0316633e032a3b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561378b57600080fd5b505afa15801561379f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c3919061510f565b859061353c565b82906134f3565b604051634da431e960e11b81529091506001600160a01b037f000000000000000000000000fa3e7d864cf426381af1a990fd2e19d56b03df331690639b4863d2906138229086908690600401615a2a565b60206040518083038186803b15801561383a57600080fd5b505afa15801561384e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613872919061510f565b6001600160a01b03808b1660009081526015602090815260408083208f851680855292529091205492955090841614613b8257600e5460405163361b48eb60e11b81526000916001600160a01b031690636c3691d6906138d8908f908890600401615411565b60006040518083038186803b1580156138f057600080fd5b505afa158015613904573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261392c9190810190614da8565b600e546040516307c0329d60e21b81529192506000916001600160a01b0390911690631f00ca74906139649089908690600401615af1565b60006040518083038186803b15801561397c57600080fd5b505afa158015613990573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526139b89190810190614e45565b905083816000815181106139c857fe5b6020026020010151106139ed5760405162461bcd60e51b815260040161095190615636565b613a14816000815181106139fd57fe5b6020026020010151846142c490919063ffffffff16565b601560008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002081905550613b1582600081518110613a7057fe5b6020908102919091010151600e54604051630137e32360e31b81526001600160a01b03909116906309bf191890613aab9087906004016154cc565b60206040518083038186803b158015613ac357600080fd5b505afa158015613ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613afb9190614a51565b83600081518110613b0857fe5b6020026020010151613fd5565b600e5460405163f5901d4d60e01b81526001600160a01b039091169063f5901d4d90613b49908490869030906004016154df565b600060405180830381600087803b158015613b6357600080fd5b505af1158015613b77573d6000803e3d6000fd5b505050505050613bf8565b818410613ba15760405162461bcd60e51b8152600401610951906155c0565b613bab81856142c4565b601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055505b6001600160a01b038816613c1e5760405162461bcd60e51b815260040161095190615652565b604051634da431e960e11b81526000906001600160a01b037f000000000000000000000000fa3e7d864cf426381af1a990fd2e19d56b03df331690639b4863d290613c6f908d908890600401615a2a565b60206040518083038186803b158015613c8757600080fd5b505afa158015613c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cbf919061510f565b905080851015613ce15760405162461bcd60e51b8152600401610951906156c6565b613cec848a83613fd5565b6000613cf886836142c4565b90506001600160a01b03891615613d1457613d14858a83613fd5565b60405163791f99a560e01b81526001600160a01b037f000000000000000000000000fa3e7d864cf426381af1a990fd2e19d56b03df33169063791f99a590613d629089908990600401615a2a565b60206040518083038186803b158015613d7a57600080fd5b505afa158015613d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db2919061510f565b9d9c50505050505050505050505050565b6000836001600160a01b0316856001600160a01b03167f47006484f2df633ac2a5063887c3edaae5a0a3cdf585767bc494e1a3180e5d6f85604051613e089190615551565b60405180910390a3601260009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b158015613e5e57600080fd5b505afa158015613e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e969190614a51565b6001600160a01b0316846001600160a01b031614613eb6575060016125f6565b60115460405163256a3ccb60e11b81526001600160a01b0390911690634ad4799690613ee89088908690600401615490565b602060405180830381600087803b158015613f0257600080fd5b505af1158015613f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3a9190614ee4565b95945050505050565b604080516000808252602082019092526001600160a01b038416908390604051613f6d91906152f9565b60006040518083038185875af1925050503d8060008114613faa576040519150601f19603f3d011682016040523d82523d6000602084013e613faf565b606091505b5050905080613fd05760405162461bcd60e51b8152600401610951906156a9565b505050565b600080846001600160a01b031663a9059cbb60e01b8585604051602401613ffd929190615490565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161403b91906152f9565b6000604051808303816000865af19150503d8060008114614078576040519150601f19603f3d011682016040523d82523d6000602084013e61407d565b606091505b50915091508180156140a75750805115806140a75750808060200190518101906140a79190614ee4565b6140c35760405162461bcd60e51b8152600401610951906157cc565b5050505050565b600080856001600160a01b03166323b872dd60e01b8686866040516024016140f4939291906153ed565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161413291906152f9565b6000604051808303816000865af19150503d806000811461416f576040519150601f19603f3d011682016040523d82523d6000602084013e614174565b606091505b509150915081801561419e57508051158061419e57508080602001905181019061419e9190614ee4565b6141ba5760405162461bcd60e51b815260040161095190615889565b505050505050565b6012546040516301c6e7ff60e11b815284916001600160a01b03169063038dcffe906141f29084906004016153d9565b60206040518083038186803b15801561420a57600080fd5b505afa15801561421e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142429190614ee4565b61425e5760405162461bcd60e51b8152600401610951906157ae565b6001600160a01b0383811660009081526015602090815260408083209388168352929052205461428e81846134f3565b6001600160a01b038581166000908152601560209081526040808320938a168352929052208190556141ba908590879084613dc3565b600061353583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506148cb565b6001600160a01b038083166000908152601560209081526040808320878516845290915281205460045460025460085493949293614355938993899389939183169261010090910416906135b8565b6010546040516339ec2d6360e21b81529193506001600160a01b03169063e7b0b58c906143889087908790600401615490565b600060405180830381600087803b1580156143a257600080fd5b505af11580156143b6573d6000803e3d6000fd5b5050506001600160a01b038086166000908152601560209081526040808320938a16835292905220546143ee91508590879084613dc3565b50509392505050565b601360009054906101000a90046001600160a01b03166001600160a01b031663f130af696040518163ffffffff1660e01b815260040160206040518083038186803b15801561444557600080fd5b505afa158015614459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061447d9190614ee4565b614486576132b0565b6013546011546040516310c91def60e11b81526000926001600160a01b03908116926318d885c2929116906321923bde906144c59088906004016153d9565b60206040518083038186803b1580156144dd57600080fd5b505afa1580156144f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614515919061510f565b6040518263ffffffff1660e01b81526004016145319190615551565b60206040518083038186803b15801561454957600080fd5b505afa15801561455d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614581919061510f565b90506000601260009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b1580156145d357600080fd5b505afa1580156145e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061460b9190614a51565b905060006001600160a01b037f000000000000000000000000fa3e7d864cf426381af1a990fd2e19d56b03df33166348a250848361464f612710610cdf898961353c565b600f546040516001600160e01b031960e086901b16815261467e9392916001600160a01b0316906004016154a9565b60206040518083038186803b15801561469657600080fd5b505afa1580156146aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146ce919061510f565b6003546001600160a01b039081166000908152601560209081526040808320938716835292905220549091508110156140c3576003546001600160a01b0390811660009081526015602090815260408083209386168352929052205461473490826142c4565b6003546001600160a01b039081166000908152601560209081526040808320938716835292905220556140c38286836141c2565b60008160405160200161477b91906153a8565b604051602081830303815290604052805190602001209050919050565b60006001600160a01b0382166147c05760405162461bcd60e51b815260040161095190615847565b506001600160a01b03166000908152602091909152604090205460ff1690565b6147eb600d826134a3565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b61482d600d826148f7565b6040516001600160a01b038216907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a250565b6000838301828582101561488b5760405162461bcd60e51b8152600401610951919061558d565b50949350505050565b600081836148b55760405162461bcd60e51b8152600401610951919061558d565b5060008385816148c157fe5b0495945050505050565b600081848411156148ef5760405162461bcd60e51b8152600401610951919061558d565b505050900390565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b82805482825590600052602060002090810192821561496e579160200282015b8281111561496e57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614939565b5061497a92915061497e565b5090565b5b8082111561497a576000815560010161497f565b80356112da81615b9d565b80356001600160e01b0319811681146112da57600080fd5b60008083601f8401126149c7578182fd5b5081356001600160401b038111156149dd578182fd5b6020830191508360208285010111156149f557600080fd5b9250929050565b600060c08284031215614a0d578081fd5b50919050565b600060608284031215614a0d578081fd5b803560ff811681146112da57600080fd5b600060208284031215614a46578081fd5b813561353581615b9d565b600060208284031215614a62578081fd5b815161353581615b9d565b60008060408385031215614a7f578081fd5b8251614a8a81615b9d565b6020840151909250614a9b81615b9d565b809150509250929050565b60008060008060808587031215614abb578182fd5b8451614ac681615b9d565b6020860151909450614ad781615b9d565b6040860151909350614ae881615b9d565b6060860151909250614af981615b9d565b939692955090935050565b60008060008060008060c08789031215614b1c578384fd5b8651614b2781615b9d565b6020880151909650614b3881615b9d565b6040880151909550614b4981615b9d565b6060880151909450614b5a81615b9d565b6080880151909350614b6b81615b9d565b60a0880151909250614b7c81615b9d565b809150509295509295509295565b60008060408385031215614b9c578182fd5b8251614ba781615b9d565b6020939093015192949293505050565b60008060408385031215614bc9578182fd5b8235614bd481615b9d565b91506020830135614a9b81615b9d565b6000806000806000806000806000806000806101808d8f031215614c0657898afd5b8c35614c1181615b9d565b9b5060208d0135614c2181615b9d565b9a5060408d0135614c3181615b9d565b995060608d0135614c4181615b9d565b985060808d0135614c5181615b9d565b975060a08d0135614c6181615b9d565b9650614c6f60c08e01614993565b9550614c7d60e08e01614993565b9450614c8c6101008e01614993565b9350614c9b6101208e01614993565b9250614caa6101408e01614993565b9150614cb96101608e01614993565b90509295989b509295989b509295989b565b60008060408385031215614cdd578182fd5b8235614ce881615b9d565b91506020830135614a9b81615bb5565b60008060408385031215614d0a578182fd5b8235614d1581615b9d565b946020939093013593505050565b600060608284031215614d34578081fd5b82601f830112614d42578081fd5b604051606081018181106001600160401b0382111715614d5e57fe5b604052808360608101861015614d72578384fd5b835b6003811015614d9d578135614d8881615b9d565b83526020928301929190910190600101614d74565b509195945050505050565b60006020808385031215614dba578182fd5b82516001600160401b03811115614dcf578283fd5b8301601f81018513614ddf578283fd5b8051614df2614ded82615b50565b615b2d565b8181528381019083850185840285018601891015614e0e578687fd5b8694505b83851015614e39578051614e2581615b9d565b835260019490940193918501918501614e12565b50979650505050505050565b60006020808385031215614e57578182fd5b82516001600160401b03811115614e6c578283fd5b8301601f81018513614e7c578283fd5b8051614e8a614ded82615b50565b8181528381019083850185840285018601891015614ea6578687fd5b8694505b83851015614e39578051835260019490940193918501918501614eaa565b600060208284031215614ed9578081fd5b813561353581615bb5565b600060208284031215614ef5578081fd5b815161353581615bb5565b600060208284031215614f11578081fd5b6135358261499e565b60008060008060808587031215614f2f578182fd5b614f388561499e565b935060208086013593506040860135925060608601356001600160401b0380821115614f62578384fd5b818801915088601f830112614f75578384fd5b813581811115614f8157fe5b614f93601f8201601f19168501615b2d565b91508082528984828501011115614fa8578485fd5b8084840185840137810190920192909252939692955090935050565b60008060208385031215614fd6578182fd5b82356001600160401b03811115614feb578283fd5b614ff7858286016149b6565b90969095509350505050565b60008060008060408587031215615018578182fd5b84356001600160401b038082111561502e578384fd5b61503a888389016149b6565b90965094506020870135915080821115615052578384fd5b5061505f878288016149b6565b95989497509550505050565b600060c0828403121561507c578081fd5b61353583836149fc565b60008061018080848603121561509a578283fd5b6150a485856149fc565b92508481850111156150b4578182fd5b5060c0830190509250929050565b60008061012083850312156150d5578182fd5b6150df84846149fc565b91506150ee8460c08501614a13565b90509250929050565b600060208284031215615108578081fd5b5035919050565b600060208284031215615120578081fd5b5051919050565b600080600080600080600060e0888a031215615141578081fd5b87359650602088013561515381615b9d565b9550604088013594506060880135935061516f60808901614a24565b925060a0880135915060c0880135905092959891949750929550565b60008060008060008060c087890312156151a3578384fd5b8635955060208701356151b581615b9d565b9450604087013593506151ca60608801614a24565b92506080870135915060a087013590509295509295509295565b60008060008061016085870312156151fa578182fd5b8435935061520b86602087016149fc565b925061521a8660e08701614a13565b9150610140850135614af981615b9d565b600080600080600060a08688031215615242578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b60006020828403121561527b578081fd5b61353582614a24565b600080600060608486031215615298578081fd5b6152a184614a24565b95602085013595506040909401359392505050565b6000815180845260208085019450808401835b838110156152ee5781516001600160a01b0316875295820195908201906001016152c9565b509495945050505050565b6000825161530b818460208701615b6d565b9190910192915050565b60006bffffffffffffffffffffffff198660601b1682528460148301528284603484013791016034019081529392505050565b6bffffffffffffffffffffffff196060998a1b811682526001600160e01b0319989098166014820152601881019690965293871b8616603886015291861b909416604c84015293820192909252608081019290925260a082015260c00190565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03948516815292841660208401529083166040830152909116606082015260800190565b6001600160a01b0396871681529486166020860152928516604085015290841660608401528316608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60006020825261353560208301846152b6565b606080825284519082018190526000906020906080840190828801845b82811015615518578151845292840192908401906001016154fc565b5050508381038285015261552c81876152b6565b9250505060018060a01b0383166040830152949350505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526155ac816040850160208701615b6d565b601f01601f19169190910160400192915050565b602080825260029082015261617560f01b604082015260600190565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b6020808252600990820152681bdd995c881c185a5960ba1b604082015260600190565b602080825260029082015261756160f01b604082015260600190565b6020808252600390820152626d697360e81b604082015260600190565b6020808252600390820152626d706f60e81b604082015260600190565b6020808252600390820152626d666f60e81b604082015260600190565b60208082526003908201526253544560e81b604082015260600190565b602080825260029082015261073760f41b604082015260600190565b60208082526002908201526137b760f11b604082015260600190565b602080825260079082015266195e1c1a5c995960ca1b604082015260600190565b602080825260029082015261065760f41b604082015260600190565b6020808252600490820152631cdcdcdd60e21b604082015260600190565b6020808252600290820152616d6560f01b604082015260600190565b6020808252600390820152626a737960e81b604082015260600190565b602080825260029082015261697360f01b604082015260600190565b6020808252600490820152631b591b9960e21b604082015260600190565b60208082526002908201526114d560f21b604082015260600190565b6020808252600490820152633539bc9960e11b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526003908201526229aa2360e91b604082015260600190565b6020808252600190820152606560f81b604082015260600190565b60208082526003908201526270727560e81b604082015260600190565b60208082526030908201527f5369676e6572526f6c653a2063616c6c657220646f6573206e6f74206861766560408201526f20746865205369676e657220726f6c6560801b606082015260800190565b602080825260029082015261726360f01b604082015260600190565b602080825260029082015261616960f01b604082015260600190565b6020808252600c908201526b1d5cd95c88195e1c1a5c995960a21b604082015260600190565b6020808252600790820152661cdd1bdc1c195960ca1b604082015260600190565b6020808252600c908201526b1bdd995c881c195c98d95b9d60a21b604082015260600190565b60208082526003908201526273727560e81b604082015260600190565b60208082526004908201526373756d6d60e01b604082015260600190565b6020808252600290820152616f6760f01b604082015260600190565b9182526001600160a01b0316602082015260400190565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b9586526001600160a01b03948516602087015292841660408601529083166060850152909116608083015260a082015260c00190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b6000838252604060208301526125f660408301846152b6565b948552602085019390935260408401919091526060830152608082015260a00190565b6040518181016001600160401b0381118282101715615b4857fe5b604052919050565b60006001600160401b03821115615b6357fe5b5060209081020190565b60005b83811015615b88578181015183820152602001615b70565b83811115615b97576000848401525b50505050565b6001600160a01b0381168114615bb257600080fd5b50565b8015158114615bb257600080fdfea2646970667358221220aa32cc4f0b9d48b357e0c1c5b11ee64a12e631c5e5c235c62bdd99202e92eed964736f6c63430007060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000fa3e7d864cf426381af1a990fd2e19d56b03df330000000000000000000000005126ea3894671e1c6cce47d3fb462e3c270e499e

-----Decoded View---------------
Arg [0] : _converter (address): 0xfA3E7d864cf426381aF1A990FD2E19d56b03dF33
Arg [1] : _initialSigner (address): 0x5126EA3894671E1c6cce47D3fB462E3C270e499e

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000fa3e7d864cf426381af1a990fd2e19d56b03df33
Arg [1] : 0000000000000000000000005126ea3894671e1c6cce47d3fb462e3c270e499e


Deployed ByteCode Sourcemap

30847:26279:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18771:23;;;;;;;;;;-1:-1:-1;18771:23:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42506:1674;;;;;;;;;;-1:-1:-1;42506:1674:0;;;;;:::i;:::-;;:::i;:::-;;56301:822;;;;;;;;;;-1:-1:-1;56301:822:0;;;;;:::i;:::-;;:::i;34783:1417::-;;;;;;;;;;-1:-1:-1;34783:1417:0;;;;;:::i;:::-;;:::i;31134:44::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31992:30::-;;;;;;;;;;;;;:::i;31856:26::-;;;;;;;;;;;;;:::i;23177:35::-;;;;;;;;;;;;;:::i;32068:30::-;;;;;;;;;;;;;:::i;23396:44::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31923:27::-;;;;;;;;;;;;;:::i;31738:22::-;;;;;;;;;;;;;:::i;19846:277::-;;;;;;;;;;-1:-1:-1;19846:277:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31419:56::-;;;;;;;;;;;;;:::i;23258:27::-;;;;;;;;;;;;;:::i;37876:197::-;;;;;;;;;;-1:-1:-1;37876:197:0;;;;;:::i;:::-;;:::i;31957:28::-;;;;;;;;;;;;;:::i;24882:909::-;;;;;;;;;;-1:-1:-1;24882:909:0;;;;;:::i;:::-;;:::i;39666:409::-;;;;;;;;;;-1:-1:-1;39666:409:0;;;;;:::i;:::-;;:::i;23551:33::-;;;;;;;;;;;;;:::i;24481:393::-;;;;;;;;;;-1:-1:-1;24481:393:0;;;;;:::i;:::-;;:::i;23006:32::-;;;;;;;;;;;;;:::i;47231:1407::-;;;;;;;;;;-1:-1:-1;47231:1407:0;;;;;:::i;:::-;;:::i;53449:181::-;;;;;;;;;;-1:-1:-1;53449:181:0;;;;;:::i;:::-;;:::i;38098:349::-;;;;;;;;;;-1:-1:-1;38098:349:0;;;;;:::i;:::-;;:::i;32307:49::-;;;;;;;;;;-1:-1:-1;32307:49:0;;;;;:::i;:::-;;:::i;21129:276::-;;;;;;;;;;-1:-1:-1;21129:276:0;;;;;:::i;:::-;;:::i;23846:32::-;;;;;;;;;;;;;:::i;25816:1175::-;;;;;;;;;;-1:-1:-1;25816:1175:0;;;;;:::i;:::-;;:::i;55169:1101::-;;;;;;;;;;-1:-1:-1;55169:1101:0;;;;;:::i;:::-;;:::i;53655:589::-;;;;;;;;;;-1:-1:-1;53655:589:0;;;;;:::i;:::-;;:::i;31576:54::-;;;;;;;;;;;;;:::i;20155:363::-;;;;;;;;;;-1:-1:-1;20155:363:0;;;;;:::i;:::-;;:::i;20526:595::-;;;;;;;;;;-1:-1:-1;20526:595:0;;;;;:::i;:::-;;:::i;31889:27::-;;;;;;;;;;;;;:::i;30161:103::-;;;;;;;;;;-1:-1:-1;30161:103:0;;;;;:::i;:::-;;:::i;22824:31::-;;;;;;;;;;;;;:::i;41001:1480::-;;;;;;;;;;-1:-1:-1;41001:1480:0;;;;;:::i;:::-;;:::i;26999:624::-;;;;;;;;;;-1:-1:-1;26999:624:0;;;;;:::i;:::-;;:::i;22562:37::-;;;;;;;;;;;;;:::i;54269:875::-;;;;;;;;;;-1:-1:-1;54269:875:0;;;;;:::i;:::-;;:::i;31266:44::-;;;;;;;;;;;;;:::i;18801:43::-;;;;;;;;;;-1:-1:-1;18801:43:0;;;;;:::i;:::-;;:::i;31697:34::-;;;;;;;;;;;;;:::i;38486:222::-;;;;;;;;;;-1:-1:-1;38486:222:0;;;;;:::i;:::-;;:::i;22682:30::-;;;;;;;;;;;;;:::i;23682:31::-;;;;;;;;;;;;;:::i;23478:28::-;;;;;;;;;;;;;:::i;32230:68::-;;;;;;;;;;-1:-1:-1;32230:68:0;;;;;:::i;:::-;;:::i;21710:668::-;;;;;;;;;;-1:-1:-1;21710:668:0;;;;;:::i;:::-;;:::i;22934:28::-;;;;;;;;;;;;;:::i;44211:2954::-;;;;;;;;;;-1:-1:-1;44211:2954:0;;;;;:::i;:::-;;:::i;23918:23::-;;;;;;;;;;;;;:::i;38733:238::-;;;;;;;;;;-1:-1:-1;38733:238:0;;;;;:::i;:::-;;:::i;40106:356::-;;;:::i;30995:51::-;;;;;;;;;;;;;:::i;18771:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18771:23:0;;-1:-1:-1;18771:23:0;:::o;42506:1674::-;32482:1;37174:7;;:19;;37166:34;;;;-1:-1:-1;;;37166:34:0;;;;;;;:::i;:::-;;;;;;;;;32482:1;37278:7;:18;36453:13:::1;::::0;36438:50:::1;::::0;-1:-1:-1;;;36438:50:0;;42714:6;;-1:-1:-1;;;;;36453:13:0::1;::::0;36438:42:::1;::::0;:50:::1;::::0;42714:6;;36438:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36430:67;;;;-1:-1:-1::0;;;36430:67:0::1;;;;;;;:::i;:::-;37806:13:::2;;;;;;;;;-1:-1:-1::0;;;;;37806:13:0::2;-1:-1:-1::0;;;;;37791:43:0::2;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37790:46;37782:66;;;;-1:-1:-1::0;;;37782:66:0::2;;;;;;;:::i;:::-;42768:5:::3;42775:8;37657:33;37670:9;37681:8;37657:12;:33::i;:::-;-1:-1:-1::0;;;;;37635:55:0::3;:18;::::0;;;::::3;::::0;::::3;;:::i;:::-;-1:-1:-1::0;;;;;37635:55:0::3;;37613:109;;;;-1:-1:-1::0;;;37613:109:0::3;;;;;;;:::i;:::-;30053:22:::4;30062:12;:10;:12::i;30053:22::-;30037:104;;;;-1:-1:-1::0;;;30037:104:0::4;;;;;;;:::i;:::-;42821:16:::5;42840:14;::::0;;;::::5;::::0;::::5;;:::i;:::-;-1:-1:-1::0;;;;;42873:24:0;::::5;;::::0;;;:14:::5;:24;::::0;;;;;42821:33;;-1:-1:-1;42901:15:0::5;-1:-1:-1::0;42873:43:0::5;42865:57;;;;-1:-1:-1::0;;;42865:57:0::5;;;;;;;:::i;:::-;42961:5;:12;;;42941:16;;:32;;42933:54;;;;-1:-1:-1::0;;;42933:54:0::5;;;;;;;:::i;:::-;43020:15;::::0;;;:11:::5;:15;::::0;;;;;::::5;;:24;::::0;::::5;:59;;-1:-1:-1::0;;;;43048:12:0::5;;::::0;::::5;:5:::0;:12:::5;:::i;:::-;-1:-1:-1::0;;;;;;43048:31:0::5;;43020:59;42998:112;;;;-1:-1:-1::0;;;42998:112:0::5;;;;;;;:::i;:::-;43121:15;::::0;;;43139:4:::5;43121:15;::::0;;;;;;;:22;;-1:-1:-1;;43121:22:0::5;::::0;;::::5;::::0;;;43308:13:::5;::::0;43293:36;;-1:-1:-1;;;43293:36:0;;;;43249:91:::5;::::0;-1:-1:-1;;;;;43308:13:0;;::::5;::::0;43293:34:::5;::::0;:36:::5;::::0;;::::5;::::0;;;;;;;43308:13;43293:36;::::5;;::::0;::::5;;;;::::0;::::5;;;;;;;;;;;;::::0;::::5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43283:46:0::5;:6;-1:-1:-1::0;;;;;43283:46:0::5;;43249:19;:91::i;:::-;43227:113:::0;-1:-1:-1;43227:113:0;43419:41:::5;:15;31623:7;43419:19;:41::i;:::-;-1:-1:-1::0;;;;;43392:24:0;;::::5;;::::0;;;:14:::5;:24;::::0;;;;:68;;;;43477:20:::5;::::0;::::5;:34:::0;43473:131:::5;;43568:12;::::0;43539:53:::5;::::0;43568:23:::5;::::0;43585:5:::5;43568:16;:23::i;:::-;43540:22;:11:::0;43556:5:::5;43540:15;:22::i;:::-;43539:28:::0;::::5;:53::i;:::-;43528:64;;43473:131;-1:-1:-1::0;;;;;43639:23:0;;::::5;43616:20;43639:23:::0;;;:13:::5;:23;::::0;;;;;;;:31;;::::5;::::0;;;;;;;;43778:17:::5;::::0;43810:20:::5;::::0;43845:12:::5;::::0;43639:31;;43681:187:::5;::::0;43663:6;;43653:8;;43755;;43778:17;;::::5;::::0;43810:20;::::5;::::0;43681:15:::5;:187::i;:::-;-1:-1:-1::0;;;;;;43957:23:0;;::::5;;::::0;;;:13:::5;:23;::::0;;;;;;;:31;;::::5;::::0;;;;;;;43879:147:::5;::::0;43913:8;;43936:6;;44003:12;43879:19:::5;:147::i;:::-;-1:-1:-1::0;;;;;;44111:24:0;::::5;;::::0;;;:14:::5;:24;::::0;;;;;;;44042:130;;::::5;::::0;::::5;::::0;44071:2;;44088:8;;44150:11;;44042:130:::5;:::i;:::-;;;;;;;;-1:-1:-1::0;;32438:1:0;37457:7;:22;-1:-1:-1;;;;;;;;;42506:1674:0:o;56301:822::-;56413:8;;56423:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;56493:92:::1;::::0;;::::1;56518:8:::0;56493:92:::1;:::i;:::-;56463:122;;;;;56597:13;56612:10:::0;56637:6:::1;56626:38;;;;;;;;;;;;:::i;:::-;56701:13;::::0;56686:50:::1;::::0;-1:-1:-1;;;56686:50:0;;56596:68;;-1:-1:-1;56596:68:0;;-1:-1:-1;;;;;;56701:13:0::1;::::0;56686:43:::1;::::0;:50:::1;::::0;56596:68;;56686:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56685:51;56677:66;;;;-1:-1:-1::0;;;56677:66:0::1;;;;;;;:::i;:::-;56754:14;-1:-1:-1::0;;;;;56783:19:0;::::1;56779:288;;-1:-1:-1::0;56828:21:0::1;56864:42;56895:2:::0;56828:21;56864:30:::1;:42::i;:::-;56779:288;;;56948:46;::::0;-1:-1:-1;;;56948:46:0;;-1:-1:-1;;;;;56948:31:0;::::1;::::0;::::1;::::0;:46:::1;::::0;56988:4:::1;::::0;56948:46:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56939:55;;57009:46;57037:5;57044:2;57048:6;57009:27;:46::i;:::-;57082:33;57097:5;57104:2;57108:6;57082:33;;;;;;;;:::i;:::-;;;;;;;;19829:1;;;;56301:822:::0;;;;;;;;;;;;;:::o;34783:1417::-;35243:11;;;;35242:12;35234:27;;;;-1:-1:-1;;;35234:27:0;;;;;;;:::i;:::-;35332:11;:26;;-1:-1:-1;;;;;;35332:26:0;;;-1:-1:-1;;;;;35332:26:0;;;;;;;35369:12;:28;;;;;;;;;;;;;;35408:12;:28;;;;;;;;;;;;;;35447:13;:30;;;;;;;;;;;;;;35488:15;:34;;;;;;;;;;;;;;35533:15;:34;;-1:-1:-1;;;;;;35533:34:0;35332:26;35533:34;;;;;;;;;;;;;;35578:16;:36;;;;;;;;;;;;;;35625:13;:30;;;;;;;;;;;;;35666:15;:34;;;;;;;;;;;;;35711:17;:38;;;;;;;;;;;;;35760:20;:44;;;;;;;;;;;;;-1:-1:-1;35815:18:0;;;;;;;;;;;;;-1:-1:-1;35885:7:0;:22;;;35979:15;35964:12;:30;36021:3;-1:-1:-1;36005:19:0;36046:9;-1:-1:-1;36035:20:0;-1:-1:-1;;36066:22:0;36118:10;-1:-1:-1;36099:29:0;36159:4;-1:-1:-1;36139:24:0;36174:11;:18;;-1:-1:-1;;36174:18:0;;;;;;34783:1417::o;31134:44::-;-1:-1:-1;;;31134:44:0;:::o;31992:30::-;;;-1:-1:-1;;;;;31992:30:0;;:::o;31856:26::-;;;-1:-1:-1;;;;;31856:26:0;;:::o;23177:35::-;;;-1:-1:-1;;;;;23177:35:0;;:::o;32068:30::-;;;-1:-1:-1;;;;;32068:30:0;;:::o;23396:44::-;23437:3;23396:44;:::o;31923:27::-;;;-1:-1:-1;;;;;31923:27:0;;:::o;31738:22::-;;;-1:-1:-1;;;;;31738:22:0;;:::o;19846:277::-;19898:4;;;19947:143;19971:6;:13;19967:17;;19947:143;;;20023:4;-1:-1:-1;;;;;20010:17:0;:6;20017:1;20010:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20010:9:0;:17;20006:73;;;20059:4;20048:15;;20006:73;19986:3;;19947:143;;;-1:-1:-1;20107:8:0;-1:-1:-1;19846:277:0;;;;:::o;31419:56::-;-1:-1:-1;;;31419:56:0;:::o;23258:27::-;;;;:::o;37876:197::-;-1:-1:-1;;;;;38004:23:0;;;37972:7;38004:23;;;:13;:23;;;;;;;;38043:13;;38028:36;;-1:-1:-1;;;38028:36:0;;;;37972:7;;38004:23;;37972:7;;38043:13;;;;;38028:34;;:36;;;;;38004:23;38028:36;;;;;38043:13;38028:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38004:61:0;;;;;;;;;;;;-1:-1:-1;38004:61:0;;;37876:197;-1:-1:-1;;37876:197:0:o;31957:28::-;;;-1:-1:-1;;;;;31957:28:0;;:::o;24882:909::-;24999:8;;25009:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;25084:92:::1;::::0;;::::1;25109:8:::0;25084:92:::1;:::i;:::-;25054:122;;;;;25202:27;25244:28:::0;25287:25:::1;25327::::0;25377:6:::1;25366:56;;;;;;;;;;;;:::i;:::-;25435:15;:37:::0;;-1:-1:-1;;;;;;25435:37:0::1;;-1:-1:-1::0;;;;;25435:37:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;25483:16:::1;:39:::0;;-1:-1:-1;;;;;;25483:39:0;;::::1;::::0;;::::1;;::::0;;;;25533:13:::1;:33:::0;;;::::1;::::0;;::::1;;::::0;;;;25577:17:::1;:37:::0;;;;::::1;::::0;;::::1;;::::0;;;;25630:153:::1;::::0;25435:37;;-1:-1:-1;25483:39:0;;-1:-1:-1;25533:33:0;;-1:-1:-1;25577:37:0;;-1:-1:-1;25630:153:0::1;::::0;::::1;::::0;25666:15;;;::::1;::::0;::::1;::::0;25696:16;;::::1;::::0;25727:13;;::::1;::::0;25755:17;::::1;::::0;25630:153:::1;:::i;:::-;;;;;;;;19829:1;;;;;24882:909:::0;;;;;;;;;;;;;:::o;39666:409::-;36453:13;;36438:50;;-1:-1:-1;;;36438:50:0;;39754:6;;-1:-1:-1;;;;;36453:13:0;;36438:42;;:50;;39754:6;;36438:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36430:67;;;;-1:-1:-1;;;36430:67:0;;;;;;;:::i;:::-;32482:1:::1;37174:7;;:19;;37166:34;;;;-1:-1:-1::0;;;37166:34:0::1;;;;;;;:::i;:::-;32482:1;37278:7;:18:::0;37806:13:::2;::::0;37791:45:::2;::::0;;-1:-1:-1;;;37791:45:0;;;;-1:-1:-1;;;;;37806:13:0;;::::2;::::0;37791:43:::2;::::0;:45:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;37806:13;37791:45;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37790:46;37782:66;;;;-1:-1:-1::0;;;37782:66:0::2;;;;;;;:::i;:::-;39821:137:::3;39867:6;39888:10;39921:4;39941:6;39821:31;:137::i;:::-;39969:43;39985:6;39993:10;40005:6;39969:15;:43::i;:::-;40028:39;40040:10;40052:6;40060;40028:39;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;32438:1:0::1;37457:7;:22:::0;-1:-1:-1;39666:409:0:o;23551:33::-;;;;:::o;24481:393::-;24576:7;24601:14;24630:11;24626:217;;;24667:106;24706:52;24752:5;24707:39;24728:17;;24707:16;;:20;;:39;;;;:::i;24706:52::-;24667:16;;;:20;:106::i;:::-;24658:115;;24626:217;;;-1:-1:-1;24815:16:0;;24626:217;24860:6;24481:393;-1:-1:-1;;24481:393:0:o;23006:32::-;;;-1:-1:-1;;;;;23006:32:0;;:::o;47231:1407::-;32482:1;37174:7;;:19;;37166:34;;;;-1:-1:-1;;;37166:34:0;;;;;;;:::i;:::-;32482:1;37278:7;:18;47370:12:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;36453:13;::::0;36438:50:::1;::::0;-1:-1:-1;;;36438:50:0;;-1:-1:-1;;;;;36453:13:0;;::::1;::::0;36438:42:::1;::::0;:50:::1;::::0;36481:6;;36438:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36430:67;;;;-1:-1:-1::0;;;36430:67:0::1;;;;;;;:::i;:::-;47403:14:::2;::::0;;;::::2;::::0;::::2;;:::i;:::-;36597:24;36612:8;36597:14;:24::i;:::-;36596:25;36588:50;;;;-1:-1:-1::0;;;36588:50:0::2;;;;;;;:::i;:::-;37806:13:::3;;;;;;;;;-1:-1:-1::0;;;;;37806:13:0::3;-1:-1:-1::0;;;;;37791:43:0::3;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37790:46;37782:66;;;;-1:-1:-1::0;;;37782:66:0::3;;;;;;;:::i;:::-;47456:25:::4;:137;;;;;;;;47499:34;47512:5;47519:10;47530:1;47519:13;;;;;;;;;;47499:12;:34::i;:::-;-1:-1:-1::0;;;;;47456:137:0::4;::::0;;::::4;;47548:34;47561:5:::0;47568:10;47579:1:::4;47568:13;::::0;47548:34:::4;-1:-1:-1::0;;;;;47456:137:0::4;::::0;;;-1:-1:-1;47626:20:0::4;47456:137:::0;47643:1:::4;47635:10;;;;;47626:8;:20::i;:::-;:61;;;;-1:-1:-1::0;47667:20:0::4;47676:7:::0;47684:1:::4;47676:10;::::0;47667:20:::4;47626:108;;;;-1:-1:-1::0;47723:10:0::4;::::0;::::4;::::0;47709;;-1:-1:-1;;;;;47709:24:0;;::::4;::::0;::::4;;;47626:108;47604:160;;;;-1:-1:-1::0;;;47604:160:0::4;;;;;;;:::i;:::-;47809:8;::::0;;::::4;;47797:21;::::0;;;:11:::4;:21:::0;;;;;;;::::4;;:30;::::0;::::4;:58;;-1:-1:-1::0;;;;47831:12:0::4;;::::0;::::4;:5:::0;:12:::4;:::i;:::-;-1:-1:-1::0;;;;;;47831:24:0::4;;47797:58;47775:111;;;;-1:-1:-1::0;;;47775:111:0::4;;;;;;;:::i;:::-;47909:8;::::0;;::::4;;47897:21;::::0;;;47921:4:::4;47897:21:::0;;;;;;;;:28;;-1:-1:-1;;47897:28:0::4;::::0;;::::4;::::0;;47971:13:::4;::::0;47956:36;;-1:-1:-1;;;47956:36:0;;;;-1:-1:-1;;;;;47971:13:0;;::::4;::::0;47956:34:::4;::::0;:36:::4;::::0;;::::4;::::0;;;;;;;47971:13;47956:36;::::4;;::::0;::::4;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47940:52:0::4;:12;::::0;;;::::4;::::0;::::4;;:::i;:::-;-1:-1:-1::0;;;;;47940:52:0::4;;47936:150;;;48032:13;;;;;;;;;-1:-1:-1::0;;;;;48032:13:0::4;-1:-1:-1::0;;;;;48017:47:0::4;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48009:65;;;;-1:-1:-1::0;;;48009:65:0::4;;;;;;;:::i;:::-;48202:12;::::0;;;::::4;::::0;::::4;;:::i;:::-;48133:13;::::0;-1:-1:-1;;;;;48118:96:0;;::::4;::::0;48133:13:::4;48118:47;48166:14;::::0;;;::::4;::::0;::::4;;:::i;:::-;48118:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48118:96:0::4;;48096:150;;;;-1:-1:-1::0;;;48096:150:0::4;;;;;;;:::i;:::-;48257:19;48279:106;48306:12;::::0;;;::::4;::::0;::::4;;:::i;:::-;48333:14;::::0;;;::::4;::::0;::::4;;:::i;:::-;48362:5;:12;;;48279;:106::i;:::-;48257:128:::0;-1:-1:-1;48396:37:0::4;48405:14;::::0;;;::::4;::::0;::::4;;:::i;:::-;48421:11;48396:8;:37::i;:::-;48501:10:::0;;48478:8:::4;48526:10:::0;;::::4;::::0;48449:181:::4;::::0;48478:8;;::::4;;::::0;48501:10;48551:12:::4;::::0;;;::::4;::::0;::::4;;:::i;:::-;48578:14;::::0;;;::::4;::::0;::::4;;:::i;:::-;48607:5;:12;;;48449:181;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;32438:1:0;37457:7;:22;-1:-1:-1;;;;47231:1407:0:o;53449:181::-;-1:-1:-1;;;;;53591:23:0;;;53559:7;53591:23;;;:13;:23;;;;;;;;:31;;;;;;;;;;;;;53449:181::o;38098:349::-;38162:4;38242:16;;38262:1;38242:21;38238:65;;;-1:-1:-1;38286:5:0;38279:12;;38238:65;-1:-1:-1;;;;;38317:25:0;;;;;;:14;:25;;;;;;38358:15;;38317:38;;38347:7;38317:29;:38::i;:::-;:56;38313:105;;;-1:-1:-1;38401:5:0;38394:12;;38313:105;-1:-1:-1;38435:4:0;38098:349;;;:::o;32307:49::-;;;;;;;;;;;;;:::o;21129:276::-;21358:38;;21225:7;;21311:9;;21358:38;;21375:4;;21311:9;;21390:5;;;;21358:38;;;:::i;:::-;;;;;;;;;;;;;21348:49;;;;;;21341:56;;;21129:276;;;;:::o;23846:32::-;;;;:::o;25816:1175::-;25926:8;;25936:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;26004:92:::1;::::0;;::::1;26029:8:::0;26004:92:::1;:::i;:::-;25974:122;;;;;26122:25;26162:26:::0;26203:27:::1;26245:24:::0;26284:19:::1;26328:6;26317:65;;;;;;;;;;;;:::i;:::-;26107:275;;;;;;;;;;26423:5;26401:18;:27;;26393:52;;;;-1:-1:-1::0;;;26393:52:0::1;;;;;;;:::i;:::-;23437:3;26464:19;:37;;26456:53;;;;-1:-1:-1::0;;;26456:53:0::1;;;;;;;:::i;:::-;26520:16;:36:::0;;;26567:17:::1;:38:::0;;;26616:18:::1;:40:::0;;;23437:3:::1;26675:34:::0;::::1;;26667:50;;;;-1:-1:-1::0;;;26667:50:0::1;;;;;;;:::i;:::-;26728:13;:32:::0;;;26771:8:::1;:22:::0;;;26840:16:::1;::::0;26871:17:::1;::::0;26903:18:::1;::::0;26809:174:::1;::::0;::::1;::::0;::::1;::::0;26840:16;;26871:17;;26782:11;;26744:16;;26809:174:::1;:::i;:::-;;;;;;;;19829:1;;;;;;25816:1175:::0;;;;;;;;;;;;;:::o;55169:1101::-;55285:8;;55295:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;55369:92:::1;::::0;;::::1;55394:8:::0;55369:92:::1;:::i;:::-;55339:122;;;;;55487:20;55522:16:::0;55553:21:::1;55589::::0;55625:22:::1;55662:24:::0;55729:6:::1;55700:123;;;;;;;;;;;;:::i;:::-;55472:351;;;;;;;;;;;;55848:12;55834:11;;:26;;;;;-1:-1:-1::0;;;;;55834:26:0::1;;;;;-1:-1:-1::0;;;;;55834:26:0::1;;;;;;55881:8;55871:7;;:18;;;;;-1:-1:-1::0;;;;;55871:18:0::1;;;;;-1:-1:-1::0;;;;;55871:18:0::1;;;;;;55915:13;55900:12;;:28;;;;;-1:-1:-1::0;;;;;55900:28:0::1;;;;;-1:-1:-1::0;;;;;55900:28:0::1;;;;;;55954:13;55939:12;;:28;;;;;-1:-1:-1::0;;;;;55939:28:0::1;;;;;-1:-1:-1::0;;;;;55939:28:0::1;;;;;;55994:14;55978:13;;:30;;;;;-1:-1:-1::0;;;;;55978:30:0::1;;;;;-1:-1:-1::0;;;;;55978:30:0::1;;;;;;56037:16;56019:15;;:34;;;;;-1:-1:-1::0;;;;;56019:34:0::1;;;;;-1:-1:-1::0;;;;;56019:34:0::1;;;;;;56069:193;56106:11;;;;;;;;;-1:-1:-1::0;;;;;56106:11:0::1;56132:7;;;;;;;;;-1:-1:-1::0;;;;;56132:7:0::1;56154:12;;;;;;;;;-1:-1:-1::0;;;;;56154:12:0::1;56181;;;;;;;;;-1:-1:-1::0;;;;;56181:12:0::1;56208:13;;;;;;;;;-1:-1:-1::0;;;;;56208:13:0::1;56236:15;;;;;;;;;-1:-1:-1::0;;;;;56236:15:0::1;56069:193;;;;;;;;;;;:::i;:::-;;;;;;;;19829:1;;;;;;;55169:1101:::0;;;;;;;;;;;;;:::o;53655:589::-;53754:7;53840:9;53957:4;53984:12;;;;:5;:12;:::i;:::-;54019:8;;;;54050:14;;;;;;;;:::i;:::-;54087:12;;;;;;;;:::i;:::-;54122:7;54152:5;:12;;;54187:5;:15;;;53918:303;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53890:346;;;;;;53870:366;;;53655:589;;;:::o;31576:54::-;31623:7;31576:54;:::o;20155:363::-;20249:11;;;;20248:12;:57;;;;-1:-1:-1;20281:10:0;;-1:-1:-1;;;;;20281:24:0;;;20248:57;:102;;;;-1:-1:-1;20326:10:0;;;;-1:-1:-1;;;;;20326:24:0;;;20248:102;:147;;;;-1:-1:-1;20371:10:0;;;;-1:-1:-1;;;;;20371:24:0;;;20248:147;20226:199;;;;-1:-1:-1;;;20226:199:0;;;;;;;:::i;:::-;20436:45;;;;;;;;20446:10;;-1:-1:-1;;;;;20436:45:0;;;;;20446:10;20458;;;;20436:45;;;;;;20470:10;;;;20436:45;;;;;;;;;;-1:-1:-1;;20436:45:0;;:::i;:::-;-1:-1:-1;;20492:11:0;:18;;-1:-1:-1;;20492:18:0;20506:4;20492:18;;;20155:363::o;20526:595::-;20636:7;20722:9;20636:7;;;20786:80;;;;20811:4;20786:80;:::i;:::-;20752:114;;;;;;20897:216;20925:113;20997:4;21003:7;21012:5;;20980:38;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20970:49;;;;;;20925:22;:113::i;:::-;21057:1;21077;21097;20897:216;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20877:236;;;;;;20526:595;;;;;;;:::o;31889:27::-;;;-1:-1:-1;;;;;31889:27:0;;:::o;30161:103::-;30217:4;30237:21;:8;30250:7;30237:12;:21::i;22824:31::-;;;-1:-1:-1;;;;;22824:31:0;;:::o;41001:1480::-;41185:16;41204:10;41185:29;;41225:15;41286:9;41275:20;;41338:697;41365:655;41397:532;41537:4;31465:10;41576:20;;41631:2;41668:8;41711:6;41752:7;41802:1;41839:9;41486:393;;;;;;;;;;;;;;;:::i;41397:532::-;41952:1;41976;42000;41365:655;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41338:8;:697::i;:::-;41316:751;;;;-1:-1:-1;;;41316:751:0;;;;;;;:::i;:::-;42086:15;;;;:11;:15;;;;;;;;:24;42078:40;;;;-1:-1:-1;;;42078:40:0;;;;;;;:::i;:::-;42129:15;;;;42147:4;42129:15;;;;;;;;:22;;-1:-1:-1;;42129:22:0;;;;;;42182:15;42170:27;;42162:47;;;;-1:-1:-1;;;42162:47:0;;;;;;;:::i;:::-;42258:13;;42243:81;;-1:-1:-1;;;42243:81:0;;42220:20;;-1:-1:-1;;;;;42258:13:0;;42243:47;;:81;;42305:8;;42243:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42350:13;;42335:65;;-1:-1:-1;;;42335:65:0;;42220:104;;-1:-1:-1;;;;;;42350:13:0;;42335:47;;:65;;42383:8;;42393:6;;42335:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42416:57;42438:2;42442:8;42452:6;42460:12;42416:57;;;;;;;;;:::i;:::-;;;;;;;;41001:1480;;;;;;;;;:::o;26999:624::-;27126:8;;27136:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;27209:92:::1;::::0;;::::1;27234:8:::0;27209:92:::1;:::i;:::-;27179:122;;;;;27313:29;27344:21:::0;27394:6:::1;27369:75;;;;;;;;;;;;:::i;:::-;27455:20;:44:::0;;-1:-1:-1;;;;;;27455:44:0::1;-1:-1:-1::0;;;;;27455:44:0;;::::1;::::0;;;::::1;::::0;;;;27510:12:::1;:28:::0;;;27554:61:::1;::::0;27455:44;;-1:-1:-1;27510:28:0;;-1:-1:-1;27554:61:0::1;::::0;::::1;::::0;27580:20;;;::::1;::::0;27510:28;;27554:61:::1;:::i;:::-;;;;;;;;19829:1;;;26999:624:::0;;;;;;;;;;;;;:::o;22562:37::-;22598:1;22562:37;:::o;54269:875::-;54387:7;54473:9;54523:613;54551:498;54679:4;54714:12;;;;:5;:12;:::i;:::-;54757:8;;;;54796:14;;;;;;;;:::i;:::-;54841:12;;;;;;;;:::i;:::-;54884:7;54922:5;:12;;;54965:5;:15;;;54632:375;;;;;;;;;;;;;;;:::i;54551:498::-;55068:5;;;;:3;:5;:::i;:::-;55092:3;:5;;;55116:3;:5;;;54523:613;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54523:613:0;;-1:-1:-1;;54523:613:0;;;54269:875;-1:-1:-1;;;;;54269:875:0:o;31266:44::-;-1:-1:-1;;;31266:44:0;:::o;18801:43::-;;;;;;;;;;;;;;;:::o;31697:34::-;;;:::o;38486:222::-;36312:15;;-1:-1:-1;;;;;36312:15:0;36296:12;:10;:12::i;:::-;-1:-1:-1;;;;;36296:31:0;;36288:46;;;;-1:-1:-1;;;36288:46:0;;;;;;;:::i;:::-;38581:15:::1;::::0;;-1:-1:-1;;;;;38607:29:0;;::::1;-1:-1:-1::0;;;;;;38607:29:0;::::1;::::0;::::1;::::0;;;38652:48:::1;::::0;38581:15;::::1;::::0;38607:29;38581:15;;38652:48:::1;::::0;38559:19:::1;::::0;38652:48:::1;36345:1;38486:222:::0;:::o;22682:30::-;;;;;;-1:-1:-1;;;;;22682:30:0;;:::o;23682:31::-;;;;:::o;23478:28::-;;;;:::o;32230:68::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;21710:668::-;21825:8;;21835:4;;19063:775;;;;;;;;;;;;;-1:-1:-1;;;19063:775:0;;;19216:19;19224:10;19216:7;:19::i;:::-;19208:34;;;;-1:-1:-1;;;19208:34:0;;;;;;;:::i;:::-;19253:14;19270:25;19280:8;;19290:4;;19270:9;:25::i;:::-;19253:42;-1:-1:-1;;;;;;19328:20:0;;19338:10;19328:20;;;;:39;;;19352:15;19360:6;19352:7;:15::i;:::-;19328:63;;;;-1:-1:-1;;;;;;19371:20:0;;;;19328:63;19306:115;;;;-1:-1:-1;;;19306:115:0;;;;;;;:::i;:::-;19433:13;;;19483:92;;;;19508:8;19483:92;:::i;:::-;-1:-1:-1;19608:15:0;;;;:11;:15;;;;;;19432:143;;-1:-1:-1;19432:143:0;;-1:-1:-1;19432:143:0;-1:-1:-1;19608:15:0;;:24;;;:93;;-1:-1:-1;19670:30:0;;;;;;-1:-1:-1;;;;;;19653:48:0;;;;;;19608:93;19586:146;;;;-1:-1:-1;;;19586:146:0;;;;;;;:::i;:::-;19763:15;19751:9;:27;19743:42;;;;-1:-1:-1;;;19743:42:0;;;;;;;:::i;:::-;19796:15;;;;19814:4;19796:15;;;;;;;:22;;-1:-1:-1;;19796:22:0;;;;;;21908:92:::1;::::0;;::::1;21933:8:::0;21908:92:::1;:::i;:::-;21878:122;;;;;22011:16;22041:6;22030:29;;;;;;;;;;;;:::i;:::-;22011:48:::0;-1:-1:-1;22070:13:0::1;::::0;22094:143:::1;22118:6;:13:::0;22114:17;::::1;22094:143;;;22170:10;-1:-1:-1::0;;;;;22157:23:0::1;:6;22164:1;22157:9;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;22157:9:0::1;:23;22153:73;;;22209:1;22201:9;;22153:73;22133:3;;22094:143;;;;22247:16;22266:6:::0;22273:5:::1;22266:13;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;22290;;-1:-1:-1;;;;;22266:13:0;;::::1;::::0;-1:-1:-1;22306:8:0;;22266:13;22297:5;;22290:13;::::1;;;;;;::::0;;;::::1;::::0;;::::1;:24:::0;;-1:-1:-1;;;;;;22290:24:0::1;-1:-1:-1::0;;;;;22290:24:0;;::::1;;::::0;;22330:40:::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;19829:1;;;;21710:668:::0;;;;;;;;;;;;;:::o;22934:28::-;;;-1:-1:-1;;;;;22934:28:0;;:::o;44211:2954::-;32482:1;37174:7;;:19;;37166:34;;;;-1:-1:-1;;;37166:34:0;;;;;;;:::i;:::-;32482:1;37278:7;:18;;;;44424:16:::1;44443:10;44424:29;;44464:15;44525:9;44514:20;;44577:681;44604:639;44636:516;44776:4;31168:10;44815:8;;44858:2;44895:8;44938:6;44979:7;45021:6;45062:9;44725:377;;;;;;;;;;;;;;;:::i;44577:681::-;44555:735;;;;-1:-1:-1::0;;;44555:735:0::1;;;;;;;:::i;:::-;45309:15;::::0;;;:11:::1;:15;::::0;;;;;::::1;;:24;45301:40;;;;-1:-1:-1::0;;;45301:40:0::1;;;;;;;:::i;:::-;45352:15;::::0;;;45370:4:::1;45352:15;::::0;;;;;;;:22;;-1:-1:-1;;45352:22:0::1;::::0;;::::1;::::0;;45405:15:::1;45393:27:::0;::::1;45385:47;;;;-1:-1:-1::0;;;45385:47:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45466:23:0;;::::1;45443:20;45466:23:::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;;45593:24:::1;45466:31:::0;45610:6;45593:16:::1;:24::i;:::-;-1:-1:-1::0;;;;;45559:23:0;;::::1;;::::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;;:58;;;;45658:13:::1;::::0;45643:36;;-1:-1:-1;;;45643:36:0;;;;45559:23;;45658:13;::::1;::::0;45643:34:::1;::::0;:36:::1;::::0;;::::1;::::0;45559:23;45643:36;;;;;45658:13;45643:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45628:51;;45704:4;-1:-1:-1::0;;;;;45694:14:0::1;:6;-1:-1:-1::0;;;;;45694:14:0::1;;45690:1270;;;45725:29;::::0;-1:-1:-1;;;45725:29:0;;-1:-1:-1;;;;;45725:21:0;::::1;::::0;::::1;::::0;:29:::1;::::0;45747:6;;45725:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;45773:15:0::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;45773:15:0::1;:29:::0;;-1:-1:-1;45769:507:0::1;::::0;-1:-1:-1;45769:507:0::1;45823:17;45843:43;45880:5;45844:30;45855:18;;45844:6;:10;;:30;;;;:::i;45843:43::-;45823:63:::0;-1:-1:-1;45909:13:0;;45905:120:::1;;45978:15;::::0;45947:58:::1;::::0;45978:15:::1;::::0;::::1;-1:-1:-1::0;;;;;45978:15:0::1;45995:9:::0;45947:30:::1;:58::i;:::-;46043:126;46096:10;46129:21;:6:::0;46140:9;46129:10:::1;:21::i;:::-;46043:30;:126::i;:::-;45769:507;;;;46210:50;46241:10;46253:6;46210:30;:50::i;:::-;45690:1270;;;46312:15;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;46312:15:0::1;:29:::0;46308:641:::1;;46362:17;46382:43;46419:5;46383:30;46394:18;;46383:6;:10;;:30;;;;:::i;46382:43::-;46362:63:::0;-1:-1:-1;46448:13:0;;46444:223:::1;;46573:15;::::0;46486:161:::1;::::0;46540:6;;46573:15:::1;::::0;::::1;-1:-1:-1::0;;;;;46573:15:0::1;46615:9:::0;46486:27:::1;:161::i;:::-;46685:152;46735:6:::0;46764:10:::1;46797:21;:6:::0;46808:9;46797:10:::1;:21::i;:::-;46685:27;:152::i;:::-;46308:641;;;;46878:55;46906:6;46914:10;46926:6;46878:27;:55::i;:::-;-1:-1:-1::0;;;;;46988:23:0;;::::1;46970:15;46988:23:::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;;47030:60:::1;47002:8:::0;47012:6;46988:31;47077:12;47030:19:::1;:60::i;:::-;;47106:51;47119:2;47123:8;47133:6;47141;47149:7;47106:51;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;32438:1:0;37457:7;:22;-1:-1:-1;;;;;;;;;;44211:2954:0:o;23918:23::-;;;;:::o;38733:238::-;36312:15;;-1:-1:-1;;;;;36312:15:0;36296:12;:10;:12::i;:::-;-1:-1:-1;;;;;36296:31:0;;36288:46;;;;-1:-1:-1;;;36288:46:0;;;;;;;:::i;:::-;38849:12:::1;38845:119;;;38878:19;38889:7;38878:10;:19::i;:::-;38845:119;;;38930:22;38944:7;38930:13;:22::i;:::-;38733:238:::0;;:::o;40106:356::-;32482:1;37174:7;;:19;;37166:34;;;;-1:-1:-1;;;37166:34:0;;;;;;;:::i;:::-;32482:1;37278:7;:18;40197:13:::1;::::0;40182:36:::1;::::0;;-1:-1:-1;;;40182:36:0;;;;40167:12:::1;::::0;-1:-1:-1;;;;;40197:13:0::1;::::0;40182:34:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;40197:13;40182:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40252:13;::::0;40237:48:::1;::::0;-1:-1:-1;;;40237:48:0;;40167:51;;-1:-1:-1;;;;;;40252:13:0::1;::::0;40237:42:::1;::::0;:48:::1;::::0;40167:51;;40237:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40229:63;;;;-1:-1:-1::0;;;40229:63:0::1;;;;;;;:::i;:::-;40310:4;-1:-1:-1::0;;;;;40303:20:0::1;;40331:9;40303:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;40354:44;40370:4;40376:10;40388:9;40354:15;:44::i;:::-;40414:40;40426:10;40438:4;40444:9;40414:40;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;32438:1:0;37457:7;:22;40106:356::o;30995:51::-;-1:-1:-1;;;30995:51:0;:::o;27923:168::-;27997:18;28001:4;28007:7;27997:3;:18::i;:::-;27996:19;27988:63;;;;-1:-1:-1;;;27988:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28058:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;28058:27:0;28081:4;28058:27;;;27923:168::o;29411:92::-;29487:10;29411:92;:::o;14018:127::-;14076:7;14099:40;14103:1;14106;14099:40;;;;;;;;;;;;;;;;;:3;:40::i;:::-;14092:47;14018:127;-1:-1:-1;;;14018:127:0:o;15667:431::-;15725:7;15954:6;15950:37;;-1:-1:-1;15978:1:0;15971:8;;15950:37;16007:5;;;16011:1;16007;:5;:1;16027:5;;;;;:10;16019:56;;;;-1:-1:-1;;;16019:56:0;;;;;;;:::i;16542:126::-;16600:7;16623:39;16627:1;16630;16623:39;;;;;;;;;;;;;;;;;:3;:39::i;49553:2825::-;49773:19;49805:15;49831:12;49861:13;;;;;;;;;-1:-1:-1;;;;;49861:13:0;-1:-1:-1;;;;;49846:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49831:51;-1:-1:-1;;;;;;49897:24:0;;;49893:226;;50028:8;;49948:107;;:53;49962:38;49994:5;49963:25;:9;49977:10;49963:13;:25::i;49962:38::-;49948:9;;:13;:53::i;:::-;:57;;:107::i;:::-;49938:117;;49893:226;;;50098:9;50088:19;;49893:226;50296:11;;50202:116;;-1:-1:-1;;;50202:116:0;;50178:21;;-1:-1:-1;;;;;50213:9:0;50202:36;;;;;:116;;50253:6;;50274:7;;50296:11;;;;50202:116;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50178:140;;50345:147;50377:104;50461:5;50378:59;50411:13;;;;;;;;;-1:-1:-1;;;;;50411:13:0;-1:-1:-1;;;;;50396:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50378:13;;:17;:59::i;50377:104::-;50345:13;;:17;:147::i;:::-;50513:103;;-1:-1:-1;;;50513:103:0;;50329:163;;-1:-1:-1;;;;;;50524:9:0;50513:51;;;;:103;;50579:7;;50601:4;;50513:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50645:23:0;;;50627:15;50645:23;;;:13;:23;;;;;;;;:31;;;;;;;;;;;;50503:113;;-1:-1:-1;50691:14:0;;;;50687:1118;;50984:7;;50975:95;;-1:-1:-1;;;50975:95:0;;50951:21;;-1:-1:-1;;;;;50984:7:0;;50975:32;;:95;;51026:6;;51051:4;;50975:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50975:95:0;;;;;;;;;;;;:::i;:::-;51121:7;;51112:94;;-1:-1:-1;;;51112:94:0;;50951:119;;-1:-1:-1;51085:24:0;;-1:-1:-1;;;;;51121:7:0;;;;51112:30;;:94;;51161:7;;50951:119;;51112:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51112:94:0;;;;;;;;;;;;:::i;:::-;51085:121;;51244:13;51231:7;51239:1;51231:10;;;;;;;;;;;;;;:26;51223:41;;;;-1:-1:-1;;;51223:41:0;;;;;;;:::i;:::-;51313:23;51325:7;51333:1;51325:10;;;;;;;;;;;;;;51313:7;:11;;:23;;;;:::i;:::-;51279:13;:23;51293:8;-1:-1:-1;;;;;51279:23:0;-1:-1:-1;;;;;51279:23:0;;;;;;;;;;;;:31;51303:6;-1:-1:-1;;;;;51279:31:0;-1:-1:-1;;;;;51279:31:0;;;;;;;;;;;;:57;;;;51351:158;51397:4;51402:1;51397:7;;;;;;;;;;;;;;;;;;51432;;51423:42;;-1:-1:-1;;;51423:42:0;;-1:-1:-1;;;;;51432:7:0;;;;51423:36;;:42;;51460:4;;51423:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51484:7;51492:1;51484:10;;;;;;;;;;;;;;51351:27;:158::i;:::-;51533:7;;51524:53;;-1:-1:-1;;;51524:53:0;;-1:-1:-1;;;;;51533:7:0;;;;51524:23;;:53;;51548:7;;51557:4;;51571;;51524:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50687:1118;;;;;51704:13;51694:7;:23;51686:38;;;;-1:-1:-1;;;51686:38:0;;;;;;;:::i;:::-;51773:20;:7;51785;51773:11;:20::i;:::-;51739:13;:23;51753:8;-1:-1:-1;;;;;51739:23:0;-1:-1:-1;;;;;51739:23:0;;;;;;;;;;;;:31;51763:6;-1:-1:-1;;;;;51739:31:0;-1:-1:-1;;;;;51739:31:0;;;;;;;;;;;;:54;;;;50687:1118;-1:-1:-1;;;;;51823:27:0;;51815:43;;;;-1:-1:-1;;;51815:43:0;;;;;;;:::i;:::-;51890:82;;-1:-1:-1;;;51890:82:0;;51869:18;;-1:-1:-1;;;;;51901:9:0;51890:65;;;;:82;;51956:9;;51967:4;;51890:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51869:103;;52002:10;51991:7;:21;;51983:36;;;;-1:-1:-1;;;51983:36:0;;;;;;;:::i;:::-;52030:60;52058:4;52064:13;52079:10;52030:27;:60::i;:::-;52101:11;52115:23;:7;52127:10;52115:11;:23::i;:::-;52101:37;-1:-1:-1;;;;;;52153:24:0;;;52149:93;;52192:50;52220:4;52226:10;52238:3;52192:27;:50::i;:::-;52267:103;;-1:-1:-1;;;52267:103:0;;-1:-1:-1;;;;;52278:9:0;52267:51;;;;:103;;52333:7;;52355:4;;52267:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52253:117;49553:2825;-1:-1:-1;;;;;;;;;;;;;49553:2825:0:o;39107:408::-;39269:4;39320:6;-1:-1:-1;;;;;39291:44:0;39310:8;-1:-1:-1;;;;;39291:44:0;;39328:6;39291:44;;;;;;:::i;:::-;;;;;;;;39375:13;;;;;;;;;-1:-1:-1;;;;;39375:13:0;-1:-1:-1;;;;;39360:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39350:46:0;:6;-1:-1:-1;;;;;39350:46:0;;39346:63;;-1:-1:-1;39405:4:0;39398:11;;39346:63;39454:12;;39440:67;;-1:-1:-1;;;39440:67:0;;-1:-1:-1;;;;;39454:12:0;;;;39440:43;;:67;;39484:8;;39494:12;;39440:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39420:87;39107:408;-1:-1:-1;;;;;39107:408:0:o;5283:168::-;5396:12;;;5356;5396;;;;;;;;;-1:-1:-1;;;;;5374:7:0;;;5389:5;;5374:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5355:54;;;5428:7;5420:23;;;;-1:-1:-1;;;5420:23:0;;;;;;;:::i;:::-;5283:168;;;:::o;4097:316::-;4216:12;4230:17;4251:5;-1:-1:-1;;;;;4251:10:0;4285:24;;;4311:2;4315:5;4262:59;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4262:59:0;;;;;;;;;;;;;;-1:-1:-1;;;;;4262:59:0;-1:-1:-1;;;;;;4262:59:0;;;;;;;;;;4251:71;;;;4262:59;4251:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4215:107;;;;4341:7;:57;;;;-1:-1:-1;4353:11:0;;:16;;:44;;;4384:4;4373:24;;;;;;;;;;;;:::i;:::-;4333:72;;;;-1:-1:-1;;;4333:72:0;;;;;;;:::i;:::-;4097:316;;;;;:::o;3431:367::-;3577:12;3591:17;3625:5;-1:-1:-1;;;;;3625:10:0;3659:28;;;3689:4;3695:2;3699:5;3636:69;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3636:69:0;;;;;;;;;;;;;;-1:-1:-1;;;;;3636:69:0;-1:-1:-1;;;;;;3636:69:0;;;;;;;;;;3625:81;;;;3636:69;3625:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3576:130;;;;3725:7;:57;;;;-1:-1:-1;3737:11:0;;:16;;:44;;;3768:4;3757:24;;;;;;;;;;;;:::i;:::-;3717:73;;;;-1:-1:-1;;;3717:73:0;;;;;;;:::i;:::-;3431:367;;;;;;:::o;40487:483::-;36453:13;;36438:50;;-1:-1:-1;;;36438:50:0;;40619:6;;-1:-1:-1;;;;;36453:13:0;;36438:42;;:50;;40619:6;;36438:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36430:67;;;;-1:-1:-1;;;36430:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40661:23:0;;::::1;40638:20;40661:23:::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;;40737:67:::1;40661:31:::0;40787:6;40737:35:::1;:67::i;:::-;-1:-1:-1::0;;;;;40703:23:0;;::::1;;::::0;;;:13:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;;;;;:101;;;40815:147:::1;::::0;40703:23;;:31;;40939:12;40815:19:::1;:147::i;14853:130::-:0;14911:7;14934:43;14938:1;14941;14934:43;;;;;;;;;;;;;;;;;:3;:43::i;48742:667::-;-1:-1:-1;;;;;48924:23:0;;;48869:19;48924:23;;;:13;:23;;;;;;;;:31;;;;;;;;;;;49078:13;;49106:15;;49136:13;;48869:19;;48924:31;;48980:180;;48948:6;;48938:8;;49054:9;;49078:13;;;;;49106:15;;;;;48980;:180::i;:::-;49185:12;;49171:70;;-1:-1:-1;;;49171:70:0;;48966:194;;-1:-1:-1;;;;;;49185:12:0;;49171:49;;:70;;49221:8;;49231:9;;49171:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;49332:23:0;;;;;;;:13;:23;;;;;;;;:31;;;;;;;;;;49254:147;;-1:-1:-1;49288:8:0;;49311:6;;49378:12;49254:19;:147::i;:::-;;48742:667;;;;;;:::o;52386:1038::-;52483:15;;;;;;;;;-1:-1:-1;;;;;52483:15:0;-1:-1:-1;;;;;52466:48:0;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52461:64;;52518:7;;52461:64;52578:15;;52660:12;;52646:50;;-1:-1:-1;;;52646:50:0;;52535:23;;-1:-1:-1;;;;;52578:15:0;;;;52561:66;;52660:12;;;52646:40;;:50;;52687:8;;52646:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52561:150;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52535:176;;52722:12;52752:13;;;;;;;;;-1:-1:-1;;;;;52752:13:0;-1:-1:-1;;;;;52737:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52722:51;-1:-1:-1;52784:18:0;-1:-1:-1;;;;;52816:9:0;52805:36;;52722:51;52875:43;52912:5;52876:30;:9;52890:15;52876:13;:30::i;52875:43::-;52933:11;;52805:150;;-1:-1:-1;;;;;;52805:150:0;;;;;;;;;;;-1:-1:-1;;;;;52933:11:0;;52805:150;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53088:16;;-1:-1:-1;;;;;53088:16:0;;;53074:31;;;;:13;:31;;;;;;;;:37;;;;;;;;;;52784:171;;-1:-1:-1;53074:50:0;-1:-1:-1;53070:347:0;;;53213:16;;-1:-1:-1;;;;;53213:16:0;;;53181:63;;;;:13;:63;;;;;;;;:69;;;;;;;;;;:85;;53255:10;53181:73;:85::i;:::-;53155:16;;-1:-1:-1;;;;;53155:16:0;;;53141:31;;;;:13;:31;;;;;;;;:37;;;;;;;;;:125;53362:43;53173:4;53384:8;53394:10;53362:15;:43::i;21413:250::-;21509:7;21635:4;21582:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;21554:101;;;;;;21534:121;;21413:250;;;:::o;28424:211::-;28511:4;-1:-1:-1;;;;;28535:21:0;;28527:68;;;;-1:-1:-1;;;28527:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;28609:20:0;:11;:20;;;;;;;;;;;;;;;28424:211::o;30270:112::-;30323:21;:8;30336:7;30323:12;:21::i;:::-;30356:20;;-1:-1:-1;;;;;30356:20:0;;;;;;;;30270:112;:::o;30388:120::-;30444:24;:8;30460:7;30444:15;:24::i;:::-;30480:22;;-1:-1:-1;;;;;30480:22:0;;;;;;;;30388:120;:::o;14420:178::-;14506:7;14534:5;;;14562:12;14554:6;;;;14546:29;;;;-1:-1:-1;;;14546:29:0;;;;;;;;:::i;:::-;-1:-1:-1;14591:1:0;14420:178;-1:-1:-1;;;;14420:178:0:o;17132:323::-;17218:7;17312:12;17305:5;17297:28;;;;-1:-1:-1;;;17297:28:0;;;;;;;;:::i;:::-;;17332:9;17348:1;17344;:5;;;;;;;17132:323;-1:-1:-1;;;;;17132:323:0:o;15258:178::-;15344:7;15376:12;15368:6;;;;15360:29;;;;-1:-1:-1;;;15360:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;15408:5:0;;;15258:178::o;28163:176::-;-1:-1:-1;;;;;28305:20:0;28328:5;28305:20;;;;;;;;;;;:28;;-1:-1:-1;;28305:28:0;;;28163:176::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:138:1;84:20;;113:33;84:20;113:33;:::i;157:175::-;226:20;;-1:-1:-1;;;;;;275:32:1;;265:43;;255:2;;322:1;319;312:12;337:377;;;454:3;447:4;439:6;435:17;431:27;421:2;;479:8;469;462:26;421:2;-1:-1:-1;509:20:1;;-1:-1:-1;;;;;541:30:1;;538:2;;;591:8;581;574:26;538:2;635:4;627:6;623:17;611:29;;687:3;680:4;671:6;663;659:19;655:30;652:39;649:2;;;704:1;701;694:12;649:2;411:303;;;;;:::o;719:168::-;;828:3;819:6;814:3;810:16;806:26;803:2;;;849:5;842;835:20;803:2;-1:-1:-1;875:6:1;793:94;-1:-1:-1;793:94:1:o;892:167::-;;1001:2;992:6;987:3;983:16;979:25;976:2;;;1021:5;1014;1007:20;1064:158;1132:20;;1192:4;1181:16;;1171:27;;1161:2;;1212:1;1209;1202:12;1227:259;;1339:2;1327:9;1318:7;1314:23;1310:32;1307:2;;;1360:6;1352;1345:22;1307:2;1404:9;1391:23;1423:33;1450:5;1423:33;:::i;1491:263::-;;1614:2;1602:9;1593:7;1589:23;1585:32;1582:2;;;1635:6;1627;1620:22;1582:2;1672:9;1666:16;1691:33;1718:5;1691:33;:::i;2035:415::-;;;2191:2;2179:9;2170:7;2166:23;2162:32;2159:2;;;2212:6;2204;2197:22;2159:2;2249:9;2243:16;2268:33;2295:5;2268:33;:::i;:::-;2370:2;2355:18;;2349:25;2320:5;;-1:-1:-1;2383:35:1;2349:25;2383:35;:::i;:::-;2437:7;2427:17;;;2149:301;;;;;:::o;2455:704::-;;;;;2661:3;2649:9;2640:7;2636:23;2632:33;2629:2;;;2683:6;2675;2668:22;2629:2;2720:9;2714:16;2739:33;2766:5;2739:33;:::i;:::-;2841:2;2826:18;;2820:25;2791:5;;-1:-1:-1;2854:35:1;2820:25;2854:35;:::i;:::-;2960:2;2945:18;;2939:25;2908:7;;-1:-1:-1;2973:35:1;2939:25;2973:35;:::i;:::-;3079:2;3064:18;;3058:25;3027:7;;-1:-1:-1;3092:35:1;3058:25;3092:35;:::i;:::-;2619:540;;;;-1:-1:-1;2619:540:1;;-1:-1:-1;;2619:540:1:o;3164:994::-;;;;;;;3420:3;3408:9;3399:7;3395:23;3391:33;3388:2;;;3442:6;3434;3427:22;3388:2;3479:9;3473:16;3498:33;3525:5;3498:33;:::i;:::-;3600:2;3585:18;;3579:25;3550:5;;-1:-1:-1;3613:35:1;3579:25;3613:35;:::i;:::-;3719:2;3704:18;;3698:25;3667:7;;-1:-1:-1;3732:35:1;3698:25;3732:35;:::i;:::-;3838:2;3823:18;;3817:25;3786:7;;-1:-1:-1;3851:35:1;3817:25;3851:35;:::i;:::-;3957:3;3942:19;;3936:26;3905:7;;-1:-1:-1;3971:35:1;3936:26;3971:35;:::i;:::-;4077:3;4062:19;;4056:26;4025:7;;-1:-1:-1;4091:35:1;4056:26;4091:35;:::i;:::-;4145:7;4135:17;;;3378:780;;;;;;;;:::o;4163:332::-;;;4311:2;4299:9;4290:7;4286:23;4282:32;4279:2;;;4332:6;4324;4317:22;4279:2;4369:9;4363:16;4388:33;4415:5;4388:33;:::i;:::-;4485:2;4470:18;;;;4464:25;4440:5;;4464:25;;-1:-1:-1;;;4269:226:1:o;4500:402::-;;;4629:2;4617:9;4608:7;4604:23;4600:32;4597:2;;;4650:6;4642;4635:22;4597:2;4694:9;4681:23;4713:33;4740:5;4713:33;:::i;:::-;4765:5;-1:-1:-1;4822:2:1;4807:18;;4794:32;4835:35;4794:32;4835:35;:::i;4907:1443::-;;;;;;;;;;;;;5208:3;5196:9;5187:7;5183:23;5179:33;5176:2;;;5230:6;5222;5215:22;5176:2;5274:9;5261:23;5293:33;5320:5;5293:33;:::i;:::-;5345:5;-1:-1:-1;5402:2:1;5387:18;;5374:32;5415:35;5374:32;5415:35;:::i;:::-;5469:7;-1:-1:-1;5528:2:1;5513:18;;5500:32;5541:35;5500:32;5541:35;:::i;:::-;5595:7;-1:-1:-1;5654:2:1;5639:18;;5626:32;5667:35;5626:32;5667:35;:::i;:::-;5721:7;-1:-1:-1;5780:3:1;5765:19;;5752:33;5794:35;5752:33;5794:35;:::i;:::-;5848:7;-1:-1:-1;5907:3:1;5892:19;;5879:33;5921:35;5879:33;5921:35;:::i;:::-;5975:7;-1:-1:-1;6001:41:1;6037:3;6022:19;;6001:41;:::i;:::-;5991:51;;6061:41;6097:3;6086:9;6082:19;6061:41;:::i;:::-;6051:51;;6121:41;6157:3;6146:9;6142:19;6121:41;:::i;:::-;6111:51;;6181:41;6217:3;6206:9;6202:19;6181:41;:::i;:::-;6171:51;;6242:41;6278:3;6267:9;6263:19;6242:41;:::i;:::-;6231:52;;6303:41;6339:3;6328:9;6324:19;6303:41;:::i;:::-;6292:52;;5166:1184;;;;;;;;;;;;;;:::o;6355:396::-;;;6481:2;6469:9;6460:7;6456:23;6452:32;6449:2;;;6502:6;6494;6487:22;6449:2;6546:9;6533:23;6565:33;6592:5;6565:33;:::i;:::-;6617:5;-1:-1:-1;6674:2:1;6659:18;;6646:32;6687;6646;6687;:::i;6756:327::-;;;6885:2;6873:9;6864:7;6860:23;6856:32;6853:2;;;6906:6;6898;6891:22;6853:2;6950:9;6937:23;6969:33;6996:5;6969:33;:::i;:::-;7021:5;7073:2;7058:18;;;;7045:32;;-1:-1:-1;;;6843:240:1:o;7088:897::-;;7223:2;7211:9;7202:7;7198:23;7194:32;7191:2;;;7244:6;7236;7229:22;7191:2;7298:7;7291:4;7280:9;7276:20;7272:34;7262:2;;7325:6;7317;7310:22;7262:2;7363;7357:9;7405:2;7397:6;7393:15;7474:6;7462:10;7459:22;-1:-1:-1;;;;;7426:10:1;7423:34;7420:62;7417:2;;;7485:9;7417:2;7512;7505:22;7547:6;7573:9;7612:2;7597:18;;7594:31;-1:-1:-1;7591:2:1;;;7643:6;7635;7628:22;7591:2;7670:6;7685:269;7699:4;7696:1;7693:11;7685:269;;;7772:3;7759:17;7789:33;7816:5;7789:33;:::i;:::-;7835:18;;7876:4;7900:12;;;;7932;;;;;7719:1;7712:9;7685:269;;;-1:-1:-1;7973:6:1;;7181:804;-1:-1:-1;;;;;7181:804:1:o;7990:1020::-;;8116:2;8159;8147:9;8138:7;8134:23;8130:32;8127:2;;;8180:6;8172;8165:22;8127:2;8218:9;8212:16;-1:-1:-1;;;;;8243:6:1;8240:30;8237:2;;;8288:6;8280;8273:22;8237:2;8316:22;;8369:4;8361:13;;8357:27;-1:-1:-1;8347:2:1;;8403:6;8395;8388:22;8347:2;8437;8431:9;8460:65;8475:49;8521:2;8475:49;:::i;:::-;8460:65;:::i;:::-;8559:15;;;8590:12;;;;8622:11;;;8660;;;8652:20;;8648:29;;8645:42;-1:-1:-1;8642:2:1;;;8705:6;8697;8690:22;8642:2;8732:6;8723:15;;8747:233;8761:2;8758:1;8755:9;8747:233;;;8825:3;8819:10;8842:33;8869:5;8842:33;:::i;:::-;8888:18;;8779:1;8772:9;;;;;8926:12;;;;8958;;8747:233;;;-1:-1:-1;8999:5:1;8096:914;-1:-1:-1;;;;;;;8096:914:1:o;9015:943::-;;9141:2;9184;9172:9;9163:7;9159:23;9155:32;9152:2;;;9205:6;9197;9190:22;9152:2;9243:9;9237:16;-1:-1:-1;;;;;9268:6:1;9265:30;9262:2;;;9313:6;9305;9298:22;9262:2;9341:22;;9394:4;9386:13;;9382:27;-1:-1:-1;9372:2:1;;9428:6;9420;9413:22;9372:2;9462;9456:9;9485:65;9500:49;9546:2;9500:49;:::i;9485:65::-;9584:15;;;9615:12;;;;9647:11;;;9685;;;9677:20;;9673:29;;9670:42;-1:-1:-1;9667:2:1;;;9730:6;9722;9715:22;9667:2;9757:6;9748:15;;9772:156;9786:2;9783:1;9780:9;9772:156;;;9843:10;;9831:23;;9804:1;9797:9;;;;;9874:12;;;;9906;;9772:156;;9963:253;;10072:2;10060:9;10051:7;10047:23;10043:32;10040:2;;;10093:6;10085;10078:22;10040:2;10137:9;10124:23;10156:30;10180:5;10156:30;:::i;10221:257::-;;10341:2;10329:9;10320:7;10316:23;10312:32;10309:2;;;10362:6;10354;10347:22;10309:2;10399:9;10393:16;10418:30;10442:5;10418:30;:::i;10483:196::-;;10594:2;10582:9;10573:7;10569:23;10565:32;10562:2;;;10615:6;10607;10600:22;10562:2;10643:30;10663:9;10643:30;:::i;10684:1009::-;;;;;10855:3;10843:9;10834:7;10830:23;10826:33;10823:2;;;10877:6;10869;10862:22;10823:2;10905:30;10925:9;10905:30;:::i;:::-;10895:40;;10954:2;11003;10992:9;10988:18;10975:32;10965:42;;11054:2;11043:9;11039:18;11026:32;11016:42;;11109:2;11098:9;11094:18;11081:32;-1:-1:-1;;;;;11173:2:1;11165:6;11162:14;11159:2;;;11194:6;11186;11179:22;11159:2;11237:6;11226:9;11222:22;11212:32;;11282:7;11275:4;11271:2;11267:13;11263:27;11253:2;;11309:6;11301;11294:22;11253:2;11350;11337:16;11372:2;11368;11365:10;11362:2;;;11378:9;11362:2;11411:52;11453:2;11434:13;;-1:-1:-1;;11430:27:1;11426:36;;11411:52;:::i;:::-;11398:65;;11486:2;11479:5;11472:17;11526:7;11521:2;11516;11512;11508:11;11504:20;11501:33;11498:2;;;11552:6;11544;11537:22;11498:2;11612;11607;11603;11599:11;11594:2;11587:5;11583:14;11570:45;11635:14;;11631:23;;;11624:39;;;;10813:880;;;;-1:-1:-1;10813:880:1;;-1:-1:-1;;10813:880:1:o;11698:431::-;;;11829:2;11817:9;11808:7;11804:23;11800:32;11797:2;;;11850:6;11842;11835:22;11797:2;11895:9;11882:23;-1:-1:-1;;;;;11920:6:1;11917:30;11914:2;;;11965:6;11957;11950:22;11914:2;12009:60;12061:7;12052:6;12041:9;12037:22;12009:60;:::i;:::-;12088:8;;11983:86;;-1:-1:-1;11787:342:1;-1:-1:-1;;;;11787:342:1:o;12134:751::-;;;;;12301:2;12289:9;12280:7;12276:23;12272:32;12269:2;;;12322:6;12314;12307:22;12269:2;12367:9;12354:23;-1:-1:-1;;;;;12437:2:1;12429:6;12426:14;12423:2;;;12458:6;12450;12443:22;12423:2;12502:60;12554:7;12545:6;12534:9;12530:22;12502:60;:::i;:::-;12581:8;;-1:-1:-1;12476:86:1;-1:-1:-1;12669:2:1;12654:18;;12641:32;;-1:-1:-1;12685:16:1;;;12682:2;;;12719:6;12711;12704:22;12682:2;;12763:62;12817:7;12806:8;12795:9;12791:24;12763:62;:::i;:::-;12259:626;;;;-1:-1:-1;12844:8:1;-1:-1:-1;;;;12259:626:1:o;12890:254::-;;13030:3;13018:9;13009:7;13005:23;13001:33;12998:2;;;13052:6;13044;13037:22;12998:2;13080:58;13130:7;13119:9;13080:58;:::i;13149:453::-;;;13337:3;13381:2;13369:9;13360:7;13356:23;13352:32;13349:2;;;13402:6;13394;13387:22;13349:2;13430:58;13480:7;13469:9;13430:58;:::i;:::-;13420:68;;13523:7;13518:2;13507:9;13503:18;13500:31;13497:2;;;13549:6;13541;13534:22;13497:2;;13592:3;13581:9;13577:19;13567:29;;13317:285;;;;;:::o;13607:386::-;;;13792:3;13780:9;13771:7;13767:23;13763:33;13760:2;;;13814:6;13806;13799:22;13760:2;13842:58;13892:7;13881:9;13842:58;:::i;:::-;13832:68;;13919;13979:7;13973:3;13962:9;13958:19;13919:68;:::i;:::-;13909:78;;13750:243;;;;;:::o;13998:190::-;;14110:2;14098:9;14089:7;14085:23;14081:32;14078:2;;;14131:6;14123;14116:22;14078:2;-1:-1:-1;14159:23:1;;14068:120;-1:-1:-1;14068:120:1:o;14193:194::-;;14316:2;14304:9;14295:7;14291:23;14287:32;14284:2;;;14337:6;14329;14322:22;14284:2;-1:-1:-1;14365:16:1;;14274:113;-1:-1:-1;14274:113:1:o;14392:675::-;;;;;;;;14604:3;14592:9;14583:7;14579:23;14575:33;14572:2;;;14626:6;14618;14611:22;14572:2;14667:9;14654:23;14644:33;;14727:2;14716:9;14712:18;14699:32;14740:33;14767:5;14740:33;:::i;:::-;14792:5;-1:-1:-1;14844:2:1;14829:18;;14816:32;;-1:-1:-1;14895:2:1;14880:18;;14867:32;;-1:-1:-1;14918:39:1;14952:3;14937:19;;14918:39;:::i;:::-;14908:49;;15004:3;14993:9;14989:19;14976:33;14966:43;;15056:3;15045:9;15041:19;15028:33;15018:43;;14562:505;;;;;;;;;;:::o;15072:606::-;;;;;;;15267:3;15255:9;15246:7;15242:23;15238:33;15235:2;;;15289:6;15281;15274:22;15235:2;15330:9;15317:23;15307:33;;15390:2;15379:9;15375:18;15362:32;15403:33;15430:5;15403:33;:::i;:::-;15455:5;-1:-1:-1;15507:2:1;15492:18;;15479:32;;-1:-1:-1;15530:38:1;15564:2;15549:18;;15530:38;:::i;:::-;15520:48;;15615:3;15604:9;15600:19;15587:33;15577:43;;15667:3;15656:9;15652:19;15639:33;15629:43;;15225:453;;;;;;;;:::o;15683:592::-;;;;;15902:3;15890:9;15881:7;15877:23;15873:33;15870:2;;;15924:6;15916;15909:22;15870:2;15965:9;15952:23;15942:33;;15994:67;16053:7;16048:2;16037:9;16033:18;15994:67;:::i;:::-;15984:77;;16080:68;16140:7;16134:3;16123:9;16119:19;16080:68;:::i;:::-;16070:78;;16198:3;16187:9;16183:19;16170:33;16212;16239:5;16212:33;:::i;16280:440::-;;;;;;16471:3;16459:9;16450:7;16446:23;16442:33;16439:2;;;16493:6;16485;16478:22;16439:2;-1:-1:-1;;16521:16:1;;16577:2;16562:18;;16556:25;16621:2;16606:18;;16600:25;16665:2;16650:18;;16644:25;16709:3;16694:19;;;16688:26;16521:16;;16556:25;;-1:-1:-1;16600:25:1;16644;-1:-1:-1;16688:26:1;;-1:-1:-1;16429:291:1;-1:-1:-1;16429:291:1:o;16725:194::-;;16835:2;16823:9;16814:7;16810:23;16806:32;16803:2;;;16856:6;16848;16841:22;16803:2;16884:29;16903:9;16884:29;:::i;16924:330::-;;;;17068:2;17056:9;17047:7;17043:23;17039:32;17036:2;;;17089:6;17081;17074:22;17036:2;17117:29;17136:9;17117:29;:::i;:::-;17107:39;17193:2;17178:18;;17165:32;;-1:-1:-1;17244:2:1;17229:18;;;17216:32;;17026:228;-1:-1:-1;;;17026:228:1:o;17259:469::-;;17356:5;17350:12;17383:6;17378:3;17371:19;17409:4;17438:2;17433:3;17429:12;17422:19;;17475:2;17468:5;17464:14;17496:3;17508:195;17522:6;17519:1;17516:13;17508:195;;;17587:13;;-1:-1:-1;;;;;17583:39:1;17571:52;;17643:12;;;;17678:15;;;;17619:1;17537:9;17508:195;;;-1:-1:-1;17719:3:1;;17326:402;-1:-1:-1;;;;;17326:402:1:o;17733:274::-;;17900:6;17894:13;17916:53;17962:6;17957:3;17950:4;17942:6;17938:17;17916:53;:::i;:::-;17985:16;;;;;17870:137;-1:-1:-1;;17870:137:1:o;18012:481::-;;18284:26;18280:31;18271:6;18267:2;18263:15;18259:53;18254:3;18247:66;18343:6;18338:2;18333:3;18329:12;18322:28;18394:6;18386;18381:2;18376:3;18372:12;18359:42;18424:16;;18442:2;18420:25;18454:15;;;18420:25;18237:256;-1:-1:-1;;;18237:256:1:o;18498:794::-;-1:-1:-1;;18916:2:1;18912:15;;;18908:24;;18896:37;;-1:-1:-1;;;;;;18963:33:1;;;;18958:2;18949:12;;18942:55;19022:2;19013:12;;19006:28;;;;19068:15;;;19064:24;;19059:2;19050:12;;19043:46;19123:15;;;19119:24;;;19114:2;19105:12;;19098:46;19160:12;;;19153:28;;;;19206:3;19197:13;;19190:29;;;;19244:3;19235:13;;19228:29;19282:3;19273:13;;18836:456::o;19297:380::-;19539:66;19527:79;;19631:2;19622:12;;19615:28;;;;19668:2;19659:12;;19517:160::o;19682:203::-;-1:-1:-1;;;;;19846:32:1;;;;19828:51;;19816:2;19801:18;;19783:102::o;20106:383::-;-1:-1:-1;;;;;20372:15:1;;;20354:34;;20424:15;;;;20419:2;20404:18;;20397:43;20471:2;20456:18;;20449:34;;;;20304:2;20289:18;;20271:218::o;20494:304::-;-1:-1:-1;;;;;20724:15:1;;;20706:34;;20776:15;;20771:2;20756:18;;20749:43;20656:2;20641:18;;20623:175::o;20803:465::-;-1:-1:-1;;;;;21090:15:1;;;21072:34;;21142:15;;;21137:2;21122:18;;21115:43;21194:15;;;21189:2;21174:18;;21167:43;21246:15;;;21241:2;21226:18;;21219:43;21021:3;21006:19;;20988:280::o;21273:627::-;-1:-1:-1;;;;;21616:15:1;;;21598:34;;21668:15;;;21663:2;21648:18;;21641:43;21720:15;;;21715:2;21700:18;;21693:43;21772:15;;;21767:2;21752:18;;21745:43;21825:15;;21819:3;21804:19;;21797:44;21878:15;;;21578:3;21857:19;;21850:44;21547:3;21532:19;;21514:386::o;22285:274::-;-1:-1:-1;;;;;22477:32:1;;;;22459:51;;22541:2;22526:18;;22519:34;22447:2;22432:18;;22414:145::o;22564:375::-;-1:-1:-1;;;;;22822:15:1;;;22804:34;;22869:2;22854:18;;22847:34;;;;22917:15;;;22912:2;22897:18;;22890:43;22754:2;22739:18;;22721:218::o;22944:267::-;;23123:2;23112:9;23105:21;23143:62;23201:2;23190:9;23186:18;23178:6;23143:62;:::i;23216:921::-;23520:2;23532:21;;;23602:13;;23505:18;;;23624:22;;;23216:921;;23700:4;;23677:3;23662:19;;;23727:15;;;23216:921;23773:169;23787:6;23784:1;23781:13;23773:169;;;23848:13;;23836:26;;23882:12;;;;23917:15;;;;23809:1;23802:9;23773:169;;;23777:3;;;23987:9;23982:3;23978:19;23973:2;23962:9;23958:18;23951:47;24015;24058:3;24050:6;24015:47;:::i;:::-;24007:55;;;;24127:1;24123;24118:3;24114:11;24110:19;24102:6;24098:32;24093:2;24082:9;24078:18;24071:60;23481:656;;;;;;:::o;24142:187::-;24307:14;;24300:22;24282:41;;24270:2;24255:18;;24237:92::o;24334:177::-;24480:25;;;24468:2;24453:18;;24435:76::o;24516:398::-;24743:25;;;24816:4;24804:17;;;;24799:2;24784:18;;24777:45;24853:2;24838:18;;24831:34;24896:2;24881:18;;24874:34;24730:3;24715:19;;24697:217::o;24919:202::-;-1:-1:-1;;;;;;25081:33:1;;;;25063:52;;25051:2;25036:18;;25018:103::o;25126:383::-;;25275:2;25264:9;25257:21;25307:6;25301:13;25350:6;25345:2;25334:9;25330:18;25323:34;25366:66;25425:6;25420:2;25409:9;25405:18;25400:2;25392:6;25388:15;25366:66;:::i;:::-;25493:2;25472:15;-1:-1:-1;;25468:29:1;25453:45;;;;25500:2;25449:54;;25247:262;-1:-1:-1;;25247:262:1:o;25514:325::-;25716:2;25698:21;;;25755:1;25735:18;;;25728:29;-1:-1:-1;;;25788:2:1;25773:18;;25766:32;25830:2;25815:18;;25688:151::o;25844:355::-;26046:2;26028:21;;;26085:2;26065:18;;;26058:30;26124:33;26119:2;26104:18;;26097:61;26190:2;26175:18;;26018:181::o;26204:332::-;26406:2;26388:21;;;26445:1;26425:18;;;26418:29;-1:-1:-1;;;26478:2:1;26463:18;;26456:39;26527:2;26512:18;;26378:158::o;26541:325::-;26743:2;26725:21;;;26782:1;26762:18;;;26755:29;-1:-1:-1;;;26815:2:1;26800:18;;26793:32;26857:2;26842:18;;26715:151::o;26871:326::-;27073:2;27055:21;;;27112:1;27092:18;;;27085:29;-1:-1:-1;;;27145:2:1;27130:18;;27123:33;27188:2;27173:18;;27045:152::o;27202:326::-;27404:2;27386:21;;;27443:1;27423:18;;;27416:29;-1:-1:-1;;;27476:2:1;27461:18;;27454:33;27519:2;27504:18;;27376:152::o;27533:326::-;27735:2;27717:21;;;27774:1;27754:18;;;27747:29;-1:-1:-1;;;27807:2:1;27792:18;;27785:33;27850:2;27835:18;;27707:152::o;27864:326::-;28066:2;28048:21;;;28105:1;28085:18;;;28078:29;-1:-1:-1;;;28138:2:1;28123:18;;28116:33;28181:2;28166:18;;28038:152::o;28195:325::-;28397:2;28379:21;;;28436:1;28416:18;;;28409:29;-1:-1:-1;;;28469:2:1;28454:18;;28447:32;28511:2;28496:18;;28369:151::o;28525:325::-;28727:2;28709:21;;;28766:1;28746:18;;;28739:29;-1:-1:-1;;;28799:2:1;28784:18;;28777:32;28841:2;28826:18;;28699:151::o;28855:330::-;29057:2;29039:21;;;29096:1;29076:18;;;29069:29;-1:-1:-1;;;29129:2:1;29114:18;;29107:37;29176:2;29161:18;;29029:156::o;29190:325::-;29392:2;29374:21;;;29431:1;29411:18;;;29404:29;-1:-1:-1;;;29464:2:1;29449:18;;29442:32;29506:2;29491:18;;29364:151::o;29520:327::-;29722:2;29704:21;;;29761:1;29741:18;;;29734:29;-1:-1:-1;;;29794:2:1;29779:18;;29772:34;29838:2;29823:18;;29694:153::o;29852:325::-;30054:2;30036:21;;;30093:1;30073:18;;;30066:29;-1:-1:-1;;;30126:2:1;30111:18;;30104:32;30168:2;30153:18;;30026:151::o;30182:326::-;30384:2;30366:21;;;30423:1;30403:18;;;30396:29;-1:-1:-1;;;30456:2:1;30441:18;;30434:33;30499:2;30484:18;;30356:152::o;30513:325::-;30715:2;30697:21;;;30754:1;30734:18;;;30727:29;-1:-1:-1;;;30787:2:1;30772:18;;30765:32;30829:2;30814:18;;30687:151::o;30843:327::-;31045:2;31027:21;;;31084:1;31064:18;;;31057:29;-1:-1:-1;;;31117:2:1;31102:18;;31095:34;31161:2;31146:18;;31017:153::o;31175:325::-;31377:2;31359:21;;;31416:1;31396:18;;;31389:29;-1:-1:-1;;;31449:2:1;31434:18;;31427:32;31491:2;31476:18;;31349:151::o;31505:327::-;31707:2;31689:21;;;31746:1;31726:18;;;31719:29;-1:-1:-1;;;31779:2:1;31764:18;;31757:34;31823:2;31808:18;;31679:153::o;31837:397::-;32039:2;32021:21;;;32078:2;32058:18;;;32051:30;32117:34;32112:2;32097:18;;32090:62;-1:-1:-1;;;32183:2:1;32168:18;;32161:31;32224:3;32209:19;;32011:223::o;32239:398::-;32441:2;32423:21;;;32480:2;32460:18;;;32453:30;32519:34;32514:2;32499:18;;32492:62;-1:-1:-1;;;32585:2:1;32570:18;;32563:32;32627:3;32612:19;;32413:224::o;32642:326::-;32844:2;32826:21;;;32883:1;32863:18;;;32856:29;-1:-1:-1;;;32916:2:1;32901:18;;32894:33;32959:2;32944:18;;32816:152::o;32973:324::-;33175:2;33157:21;;;33214:1;33194:18;;;33187:29;-1:-1:-1;;;33247:2:1;33232:18;;33225:31;33288:2;33273:18;;33147:150::o;33302:326::-;33504:2;33486:21;;;33543:1;33523:18;;;33516:29;-1:-1:-1;;;33576:2:1;33561:18;;33554:33;33619:2;33604:18;;33476:152::o;33633:412::-;33835:2;33817:21;;;33874:2;33854:18;;;33847:30;33913:34;33908:2;33893:18;;33886:62;-1:-1:-1;;;33979:2:1;33964:18;;33957:46;34035:3;34020:19;;33807:238::o;34050:325::-;34252:2;34234:21;;;34291:1;34271:18;;;34264:29;-1:-1:-1;;;34324:2:1;34309:18;;34302:32;34366:2;34351:18;;34224:151::o;34380:325::-;34582:2;34564:21;;;34621:1;34601:18;;;34594:29;-1:-1:-1;;;34654:2:1;34639:18;;34632:32;34696:2;34681:18;;34554:151::o;34710:336::-;34912:2;34894:21;;;34951:2;34931:18;;;34924:30;-1:-1:-1;;;34985:2:1;34970:18;;34963:42;35037:2;35022:18;;34884:162::o;35051:330::-;35253:2;35235:21;;;35292:1;35272:18;;;35265:29;-1:-1:-1;;;35325:2:1;35310:18;;35303:37;35372:2;35357:18;;35225:156::o;35386:336::-;35588:2;35570:21;;;35627:2;35607:18;;;35600:30;-1:-1:-1;;;35661:2:1;35646:18;;35639:42;35713:2;35698:18;;35560:162::o;35727:326::-;35929:2;35911:21;;;35968:1;35948:18;;;35941:29;-1:-1:-1;;;36001:2:1;35986:18;;35979:33;36044:2;36029:18;;35901:152::o;36058:327::-;36260:2;36242:21;;;36299:1;36279:18;;;36272:29;-1:-1:-1;;;36332:2:1;36317:18;;36310:34;36376:2;36361:18;;36232:153::o;36390:325::-;36592:2;36574:21;;;36631:1;36611:18;;;36604:29;-1:-1:-1;;;36664:2:1;36649:18;;36642:32;36706:2;36691:18;;36564:151::o;36902:274::-;37076:25;;;-1:-1:-1;;;;;37137:32:1;37132:2;37117:18;;37110:60;37064:2;37049:18;;37031:145::o;37181:456::-;37412:25;;;-1:-1:-1;;;;;37511:15:1;;;37506:2;37491:18;;37484:43;37563:15;;;37558:2;37543:18;;37536:43;37615:15;37610:2;37595:18;;37588:43;37399:3;37384:19;;37366:271::o;37642:609::-;37929:25;;;-1:-1:-1;;;;;38028:15:1;;;38023:2;38008:18;;38001:43;38080:15;;;38075:2;38060:18;;38053:43;38132:15;;;38127:2;38112:18;;38105:43;38185:15;;;38179:3;38164:19;;38157:44;37981:3;38217:19;;38210:35;37916:3;37901:19;;37883:368::o;38256:519::-;38515:25;;;-1:-1:-1;;;;;38614:15:1;;;38609:2;38594:18;;38587:43;38666:15;;;;38661:2;38646:18;;38639:43;38713:2;38698:18;;38691:34;;;;38756:3;38741:19;;38734:35;38502:3;38487:19;;38469:306::o;38780:417::-;39011:25;;;-1:-1:-1;;;;;39072:32:1;;;;39067:2;39052:18;;39045:60;39136:2;39121:18;;39114:34;39179:2;39164:18;;39157:34;38998:3;38983:19;;38965:232::o;39202:338::-;;39409:6;39398:9;39391:25;39452:2;39447;39436:9;39432:18;39425:30;39472:62;39530:2;39519:9;39515:18;39507:6;39472:62;:::i;39545:463::-;39804:25;;;39860:2;39845:18;;39838:34;;;;39903:2;39888:18;;39881:34;;;;39946:2;39931:18;;39924:34;39989:3;39974:19;;39967:35;39791:3;39776:19;;39758:250::o;40013:242::-;40083:2;40077:9;40113:17;;;-1:-1:-1;;;;;40145:34:1;;40181:22;;;40142:62;40139:2;;;40207:9;40139:2;40234;40227:22;40057:198;;-1:-1:-1;40057:198:1:o;40260:183::-;;-1:-1:-1;;;;;40351:6:1;40348:30;40345:2;;;40381:9;40345:2;-1:-1:-1;40432:4:1;40413:17;;;40409:28;;40335:108::o;40448:258::-;40520:1;40530:113;40544:6;40541:1;40538:13;40530:113;;;40620:11;;;40614:18;40601:11;;;40594:39;40566:2;40559:10;40530:113;;;40661:6;40658:1;40655:13;40652:2;;;40696:1;40687:6;40682:3;40678:16;40671:27;40652:2;;40501:205;;;:::o;40711:133::-;-1:-1:-1;;;;;40788:31:1;;40778:42;;40768:2;;40834:1;40831;40824:12;40768:2;40758:86;:::o;40849:120::-;40937:5;40930:13;40923:21;40916:5;40913:32;40903:2;;40959:1;40956;40949:12

Metadata Hash

aa32cc4f0b9d48b357e0c1c5b11ee64a12e631c5e5c235c62bdd99202e92eed9
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.