ETH Price: $3,342.13 (-3.64%)
Gas: 2 Gwei

Token

EtherFlex (FLEX)
 

Overview

Max Total Supply

100,000,000 FLEX

Holders

190

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
114,468.794905744361648253 FLEX

Value
$0.00
0xb0c0AA5EfF87AAe5654a0D5e27C63A0Ae0b618A6
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EthRewards

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-05
*/

// SPDX-License-Identifier: MIT    
// TG: https://t.me/EtherFlexPortal                                                                           
                                                    
pragma solidity 0.8.19;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function sendValue(address payable recipient, uint256 amt) internal {
        require(address(this).balance >= amt, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amt}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

library SafeERC20 {
    using Address for address;

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

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amt) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amt) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amt) external returns (bool);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

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

contract ERC20 is Context, IERC20 {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amt) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amt);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amt) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amt);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amt) public virtual override returns (bool) {
        _transfer(sender, recipient, amt);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amt, "ERC20: transfer amt exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amt);
        }

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(address sender, address recipient, uint256 amt) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amt, "ERC20: transfer amt exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amt;
        }
        _balances[recipient] += amt;

        emit Transfer(sender, recipient, amt);
    }

    function _createInitialSupply(address account, uint256 amt) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amt;
        _balances[account] += amt;
        emit Transfer(address(0), account, amt);
    }

    function _approve(address owner, address spender, uint256 amt) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amt;
        emit Approval(owner, spender, amt);
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, address referrer, uint deadline) external;
    function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function removeLiquidity(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB);
}

interface DividendPayingTokenOptionalInterface {
  /// @notice View the amt of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amt of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amt of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amt of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amt of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// @param _owner The address of a token holder.
  /// @return The amt of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) external view returns(uint256);
}

interface DividendPayingTokenInterface {
  /// @notice View the amt of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amt of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) external view returns(uint256);

  /// @notice Distributes ether to token holders as dividends.
  /// @dev SHOULD distribute the paid ether to token holders as dividends.
  ///  SHOULD NOT directly transfer ether to token holders in this function.
  ///  MUST emit a `DividendsDistributed` event when the amt of distributed ether is greater than 0.
  function distributeDividends() external payable;

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
  ///  MUST emit a `DividendWithdrawn` event if the amt of ether transferred is greater than 0.
  function withdrawDividend() external;

  /// @dev This event MUST emit when ether is distributed to token holders.
  /// @param from The address which sends ether to this contract.
  /// @param weiAmt The amt of distributed ether in wei.
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmt
  );

  /// @dev This event MUST emit when an address withdraws their dividend.
  /// @param to The address which withdraws ether from this contract.
  /// @param weiAmt The amt of withdrawn ether in wei.
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmt
  );
}

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  // With `magnitude`, we can properly distribute dividends even if the amt of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;
  
  // About dividendCorrection:
  // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
  // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
  //   `dividendOf(_user)` should not be changed,
  //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
  // To keep the `dividendOf(_user)` unchanged, we add a correction term:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
  //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
  //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
  // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
  
  mapping (address => uint256) public holderBalance;
  uint256 public totalBalance;

  uint256 public totalDividendsDistributed;

  /// @dev Distributes dividends whenever ether is paid to this contract.
  receive() external payable {
    distributeDividends();
  }

  /// @notice Distributes ether to token holders as dividends.
  /// @dev It reverts if the total supply of tokens is 0.
  /// It emits the `DividendsDistributed` event if the amt of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amt of ether not distributed,
  ///     the magnified amt of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amt of undistributed ether
  ///     (de-magnified) in a distribution can be less than 1 wei.
  ///   We can actually keep track of the undistributed ether in a distribution
  ///     and try to distribute it in the next distribution,
  ///     but keeping track of such data on-chain costs much more than
  ///     the saved ether, so we don't do that.
    
  function distributeDividends() public override payable {
    if(totalBalance > 0){
        uint256 amt = msg.value;
        if (amt > 0) {
        magnifiedDividendPerShare = magnifiedDividendPerShare.add(
            (amt).mul(magnitude) / totalBalance
        );
        emit DividendsDistributed(msg.sender, amt);

        totalDividendsDistributed = totalDividendsDistributed.add(amt);
        }
    }
  }


  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amt of withdrawn ether is greater than 0.
  function withdrawDividend() public virtual override {
    _withdrawDividendOfUser(payable(msg.sender));
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amt of withdrawn ether is greater than 0.
  function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      emit DividendWithdrawn(user, _withdrawableDividend);
      bool success;
      (success,) = address(user).call{value: _withdrawableDividend}("");

      return _withdrawableDividend;
    }

    return 0;
  }


  /// @notice View the amt of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amt of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) public view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  /// @notice View the amt of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amt of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  /// @notice View the amt of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amt of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) public view override returns(uint256) {
    return withdrawnDividends[_owner];
  }


  /// @notice View the amt of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
  /// @param _owner The address of a token holder.
  /// @return The amt of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    return magnifiedDividendPerShare.mul(holderBalance[_owner]).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }

  /// @dev Internal function that increases tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amt that will be created.
  function _increase(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  /// @dev Internal function that reduces an amt of the token of a given account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account whose tokens will be burnt.
  /// @param value The amt that will be burnt.
  function _reduce(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = holderBalance[account];
    holderBalance[account] = newBalance;
    if(newBalance > currentBalance) {
      uint256 increaseAmt = newBalance.sub(currentBalance);
      _increase(account, increaseAmt);
      totalBalance += increaseAmt;
    } else if(newBalance < currentBalance) {
      uint256 reduceAmt = currentBalance.sub(newBalance);
      _reduce(account, reduceAmt);
      totalBalance -= reduceAmt;
    }
  }
}

contract DividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event IncludeInDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(address indexed account, uint256 amt, bool indexed automatic);

    constructor() {
    	claimWait = 1;
        minimumTokenBalanceForDividends = 1;
    }

    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(address key) private view returns (uint) {
        return tokenHoldersMap.values[key];
    }

    function getIndexOfKey(address key) private view returns (int) {
        if(!tokenHoldersMap.inserted[key]) {
            return -1;
        }
        return int(tokenHoldersMap.indexOf[key]);
    }

    function getKeyAtIndex(uint index) private view returns (address) {
        return tokenHoldersMap.keys[index];
    }



    function size() private view returns (uint) {
        return tokenHoldersMap.keys.length;
    }

    function set(address key, uint val) private {
        if (tokenHoldersMap.inserted[key]) {
            tokenHoldersMap.values[key] = val;
        } else {
            tokenHoldersMap.inserted[key] = true;
            tokenHoldersMap.values[key] = val;
            tokenHoldersMap.indexOf[key] = tokenHoldersMap.keys.length;
            tokenHoldersMap.keys.push(key);
        }
    }

    function remove(address key) private {
        if (!tokenHoldersMap.inserted[key]) {
            return;
        }

        delete tokenHoldersMap.inserted[key];
        delete tokenHoldersMap.values[key];

        uint index = tokenHoldersMap.indexOf[key];
        uint lastIndex = tokenHoldersMap.keys.length - 1;
        address lastKey = tokenHoldersMap.keys[lastIndex];

        tokenHoldersMap.indexOf[lastKey] = index;
        delete tokenHoldersMap.indexOf[key];

        tokenHoldersMap.keys[index] = lastKey;
        tokenHoldersMap.keys.pop();
    }

    function excludeFromDividends(address account) external onlyOwner {
    	excludedFromDividends[account] = true;

    	_setBalance(account, 0);
    	remove(account);

    	emit ExcludeFromDividends(account);
    }
    
    function includeInDividends(address account) external onlyOwner {
    	require(excludedFromDividends[account]);
    	excludedFromDividends[account] = false;

    	emit IncludeInDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 1200 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;

        index = getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if(index >= 0) {
            if(uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;


                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }


        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	if(index >= size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
    	if(lastClaimTime > block.timestamp)  {
    		return false;
    	}

    	return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
    	if(excludedFromDividends[account]) {
    		return;
    	}

    	if(newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
    		set(account, newBalance);
    	}
    	else {
            _setBalance(account, 0);
    		remove(account);
    	}

    	processAccount(account, true);
    }
    
    
    function process(uint256 gas) public returns (uint256, uint256, uint256) {
    	uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

    	if(numberOfTokenHolders == 0) {
    		return (0, 0, lastProcessedIndex);
    	}

    	uint256 _lastProcessedIndex = lastProcessedIndex;

    	uint256 gasUsed = 0;

    	uint256 gasLeft = gasleft();

    	uint256 iterations = 0;
    	uint256 claims = 0;

    	while(gasUsed < gas && iterations < numberOfTokenHolders) {
    		_lastProcessedIndex++;

    		if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
    			_lastProcessedIndex = 0;
    		}

    		address account = tokenHoldersMap.keys[_lastProcessedIndex];

    		if(canAutoClaim(lastClaimTimes[account])) {
    			if(processAccount(payable(account), true)) {
    				claims++;
    			}
    		}

    		iterations++;

    		uint256 newGasLeft = gasleft();

    		if(gasLeft > newGasLeft) {
    			gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
    		}
    		gasLeft = newGasLeft;
    	}

    	lastProcessedIndex = _lastProcessedIndex;

    	return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amt = _withdrawDividendOfUser(account);

    	if(amt > 0) {
    		lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amt, automatic);
    		return true;
    	}

    	return false;
    }
}

interface IDexFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface ILpPair {
    function sync() external;
}

contract EthRewards is ERC20, Ownable {

    uint256 public maxBuyAmt;
    uint256 public maxSellAmt;
    uint256 public maxWalletAmt;

    DividendTracker public dividendTracker;

    IDexRouter public immutable dexRouter;
    address public lpPair;

    IERC20 public REWARDTOKEN; 
    address public REWARDPAIRTOKEN;

    bool private swapping;
    uint256 public swapTokensAtAmt;

    address public marketingAddress;

    uint256 public tradingLiveBlock = 0; // 0 means trading is not active
    uint256 private blockForPenaltyEnd;

    bool public limitsActive = true;
    bool public tradingLive = false;
    bool public swapEnabled = false;

    uint256 public constant FEE_DIVISOR = 10000;

    uint256 public buyTotalTax;
    uint256 public buyLiquidityTax;
    uint256 public buyMarketingTax;
    uint256 public buyRewardTax;

    uint256 public sellTotalTax;
    uint256 public sellMarketingTax;
    uint256 public sellLiquidityTax;
    uint256 public sellRewardTax;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForReward;
    
    mapping (address => bool) private _isExcludedFromTax;
    mapping (address => bool) public _isExcludedMaxTransactionAmt;

    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event StartedTrading();
    event RemovedLimits();
    event ExcludeFromTax(address indexed account, bool isExcluded);
    event UpdatedMaxBuyAmt(uint256 newAmt);
    event UpdatedMaxSellAmt(uint256 newAmt);
    event UpdatedMaxWalletAmt(uint256 newAmt);
    event UpdatedBuyTax(uint256 newAmt);
    event UpdatedSellTax(uint256 newAmt);
    event UpdatedMarketingAddress(address indexed newWallet);
    event MaxTransactionExclusion(address _address, bool excluded);
    event OwnerForcedSwapBack(uint256 timestamp);
    event TransferForeignToken(address token, uint256 amt);

    constructor() ERC20("EtherFlex", "FLEX") payable {

        address _dexRouter;

        if(block.chainid == 1){
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // Ethereum: Uniswap V2
        } else if(block.chainid == 56){
            _dexRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // PCS V2
        } else {
            revert("Chain not configured");
        }

        dividendTracker = new DividendTracker();

        address newOwner = msg.sender; // can leave alone if owner is deployer.

        dexRouter = IDexRouter(_dexRouter);

        uint256 totalSupply = 100000000 * 1e18;
        
        maxBuyAmt = totalSupply * 5 / 1000;
        maxSellAmt = totalSupply * 1/ 100;
        maxWalletAmt = totalSupply * 1 / 100;
        swapTokensAtAmt = totalSupply * 25 / 100000;

        buyMarketingTax = 1000;
        buyLiquidityTax = 0;
        buyRewardTax = 1000;
        buyTotalTax = buyMarketingTax + buyLiquidityTax + buyRewardTax;

        sellMarketingTax = 4000;
        sellLiquidityTax = 0;
        sellRewardTax = 4000;
        sellTotalTax = sellMarketingTax + sellLiquidityTax + sellRewardTax;

        // @dev update these!
        marketingAddress = address(msg.sender);

        // create pair
        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), dexRouter.WETH());
        _excludeFromMaxTransaction(address(lpPair), true);
        setAutomatedMarketMakerPair(address(lpPair), true);

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(dexRouter), true);
        _excludeFromMaxTransaction(address(0xdead), true);
        _excludeFromMaxTransaction(address(marketingAddress), true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(dexRouter));
        dividendTracker.excludeFromDividends(newOwner);
        dividendTracker.excludeFromDividends(address(0xdead));

        excludeFromTax(newOwner, true);
        excludeFromTax(address(this), true);
        excludeFromTax(address(dexRouter), true);
        excludeFromTax(address(0xdead), true);
        excludeFromTax(address(marketingAddress), true);

        transferOwnership(newOwner);

        _approve(address(this), address(dexRouter), type(uint256).max);

        _createInitialSupply(address(this), totalSupply - balanceOf(newOwner));
    }

    // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function includeInDividends(address account) external onlyOwner {
        dividendTracker.includeInDividends(account);
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsActive = false;
        emit RemovedLimits();
    }

    function updateMaxBuyAmt(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 100)/1e18, "Cannot set max sell amt lower than 1%");
        maxBuyAmt = newNum * (10**18);
        emit UpdatedMaxBuyAmt(maxBuyAmt);
    }
    
    function updateMaxSellAmt(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 100)/1e18, "Cannot set max sell amt lower than 1%");
        maxSellAmt = newNum * (10**18);
        emit UpdatedMaxSellAmt(maxSellAmt);
    }

    function removeMaxWallet() external onlyOwner {
        maxWalletAmt = totalSupply();
        emit UpdatedMaxWalletAmt(maxWalletAmt);
    }

    function updateSwapTokensAtAmt(uint256 newAmt) external onlyOwner {
  	    require(newAmt >= totalSupply() * 1 / 1000000, "Swap amt cannot be lower than 0.0001% total supply.");
  	    require(newAmt <= totalSupply() * 1 / 1000, "Swap amt cannot be higher than 0.1% total supply.");
  	    swapTokensAtAmt = newAmt;
  	}
    
    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmt[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function airdropToWallets(address[] memory wallets, uint256[] memory amountsInWei) external onlyOwner {
        require(wallets.length == amountsInWei.length, "arrays must be the same length");
        require(wallets.length < 600, "Can only airdrop 600 wallets per txn due to gas limits");
        for(uint256 i = 0; i < wallets.length; i++){
            super._transfer(msg.sender, wallets[i], amountsInWei[i]);
            dividendTracker.setBalance(payable(wallets[i]), balanceOf(wallets[i]));
        }
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != lpPair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmt[updAds] = isEx;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != lpPair || value, "The pair cannot be removed from automatedMarketMakerPairs");
        automatedMarketMakerPairs[pair] = value;
        _excludeFromMaxTransaction(pair, value);
        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateBuyTax(uint256 _marketingTax, uint256 _liquidityTax, uint256 _rewardTax) external onlyOwner {
        buyMarketingTax = _marketingTax;
        buyLiquidityTax = _liquidityTax;
        buyRewardTax = _rewardTax;
        buyTotalTax = buyMarketingTax + buyLiquidityTax + buyRewardTax;
        require(buyTotalTax <= 1000, "Must keep tax at 10% or less");
        emit UpdatedBuyTax(buyTotalTax);
    }

    function updateSellTax(uint256 _marketingTax, uint256 _liquidityTax, uint256 _rewardTax) external onlyOwner {
        sellMarketingTax = _marketingTax;
        sellLiquidityTax = _liquidityTax;
        sellRewardTax = _rewardTax;
        sellTotalTax = sellMarketingTax + sellLiquidityTax + sellRewardTax;
        require(sellTotalTax <= 1000, "Must keep tax at 10% or less");
        emit UpdatedSellTax(sellTotalTax);
    }

    function excludeFromTax(address account, bool excluded) public onlyOwner {
        _isExcludedFromTax[account] = excluded;
        emit ExcludeFromTax(account, excluded);
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function withdrawableDividendOf(address account) public view returns(uint256) {
    	return dividendTracker.withdrawableDividendOf(account);
  	}

	function dividendTokenBalanceOf(address account) public view returns (uint256) {
		return dividendTracker.holderBalance(account);
	}

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

	function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return dividendTracker.getAccountAtIndex(index);
    }

    function claim() external {
		dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
    
    function getNumberOfDividends() external view returns(uint256) {
        return dividendTracker.totalBalance();
    }
    
    function _transfer(address from, address to, uint256 amt) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        if(amt == 0){
            super._transfer(from, to, 0);
            return;
        }
        
        if(!tradingLive){
            require(_isExcludedFromTax[from] || _isExcludedFromTax[to], "Trading is not active.");
        }

        if(_isExcludedFromTax[from] || _isExcludedFromTax[to] || swapping){
            super._transfer(from, to, amt);
            dividendTracker.setBalance(payable(from), balanceOf(from));
            dividendTracker.setBalance(payable(to), balanceOf(to));
            return;
        }
        
        if(limitsActive){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_isExcludedFromTax[from] && !_isExcludedFromTax[to]){
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmt[to]) {
                    require(amt <= maxBuyAmt, "Buy transfer amt exceeds the max buy.");
                    require(amt + balanceOf(to) <= maxWalletAmt, "Cannot Exceed max wallet");
                } 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmt[from]) {
                    require(amt <= maxSellAmt, "Sell transfer amt exceeds the max sell.");
                } 
                else if (!_isExcludedMaxTransactionAmt[to]){
                    require(amt + balanceOf(to) <= maxWalletAmt, "Cannot Exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmt;

        if(canSwap && swapEnabled && !swapping && automatedMarketMakerPairs[to]) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeTax = true;
        // if any account belongs to _isExcludedFromTax account then remove the tax
        if(_isExcludedFromTax[from] || _isExcludedFromTax[to]) {
            takeTax = false;
        }
        
        uint256 tax = 0;
        // only take tax on buys/sells, do not take on wallet transfers
        if(takeTax){

            if(earlyBuyPenaltyInEffect() && automatedMarketMakerPairs[from] && !automatedMarketMakerPairs[to] && !_isExcludedFromTax[to] && buyTotalTax > 0){
                tax = amt * 9900 / FEE_DIVISOR;
        	    tokensForLiquidity += tax * buyLiquidityTax / buyTotalTax;
                tokensForMarketing += tax * buyMarketingTax / buyTotalTax;
                tokensForReward += tax * buyRewardTax / buyTotalTax;
            }
            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalTax > 0){
                tax = amt * sellTotalTax / FEE_DIVISOR;
                tokensForLiquidity += tax * sellLiquidityTax / sellTotalTax;
                tokensForMarketing += tax * sellMarketingTax / sellTotalTax;
                tokensForReward += tax * sellRewardTax / sellTotalTax;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalTax > 0) {
        	    tax = amt * buyTotalTax / FEE_DIVISOR;
        	    tokensForMarketing += tax * buyMarketingTax / buyTotalTax;
        	    tokensForLiquidity += tax * buyLiquidityTax / buyTotalTax;
                tokensForReward += tax * buyRewardTax / buyTotalTax;
            }
            
            if(tax > 0){    
                super._transfer(from, address(this), tax);
            }
        	
        	amt -= tax;
        }

        super._transfer(from, to, amt);

        dividendTracker.setBalance(payable(from), balanceOf(from));
        dividendTracker.setBalance(payable(to), balanceOf(to));
    }

    function swapTokenForETH(uint256 tokenAmt) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        // make the swap
        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmt,
            0, // accept any amt of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack() private {

        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForReward;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmt * 40){
            contractBalance = swapTokensAtAmt * 40;
        }
        
        if(tokensForLiquidity > 0){
            uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap;
            super._transfer(address(this), lpPair, liquidityTokens);
            try ILpPair(lpPair).sync(){} catch {}
            contractBalance -= liquidityTokens;
            totalTokensToSwap -= tokensForLiquidity;
            tokensForLiquidity = 0;
        }
        
        if(contractBalance > 0){
            bool success;
            swapTokenForETH(contractBalance);
            if(tokensForReward > 0){
                uint256 rewardTokens = tokensForReward * address(this).balance / totalTokensToSwap;
                (success,) = address(dividendTracker).call{value: rewardTokens}("");
            }

            if(tokensForMarketing > 0){
                (success,) = address(marketingAddress).call{value: address(this).balance}("");
            }

            tokensForMarketing = 0;
            tokensForReward = 0;
        }
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner {
        require(_marketingAddress != address(0), "address cannot be 0");
        marketingAddress = payable(_marketingAddress);
        emit UpdatedMarketingAddress(_marketingAddress);
    }

    // force Swap back if slippage issues.
    function forceSwapBack() external onlyOwner {
        require(balanceOf(address(this)) >= swapTokensAtAmt, "Can only swap when token amt is at or higher than restriction");
        swapping = true;
        swapBack();
        swapping = false;
        emit OwnerForcedSwapBack(block.timestamp);
    }

    function transferForeignToken(address _token, address _to) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this) || !tradingLive, "Can't withdraw native tokens");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        SafeERC20.safeTransfer(IERC20(_token),_to, _contractBalance);
        emit TransferForeignToken(_token, _contractBalance);
    }
    function enableTrading(uint256 blocksForPenalty) external onlyOwner {
        require(!tradingLive, "Trading is already active, cannot relaunch.");
        tradingLive = true;
        swapEnabled = true;
        tradingLiveBlock = block.number;
        blockForPenaltyEnd = tradingLiveBlock + blocksForPenalty;
    }

    function earlyBuyPenaltyInEffect() public view returns (bool){
        return block.number < blockForPenaltyEnd;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerForcedSwapBack","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":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[],"name":"StartedTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedBuyTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedMarketingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedMaxBuyAmt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedMaxSellAmt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedMaxWalletAmt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedSellTax","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDPAIRTOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDTOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInWei","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocksForPenalty","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingLiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingTax","type":"uint256"},{"internalType":"uint256","name":"_liquidityTax","type":"uint256"},{"internalType":"uint256","name":"_rewardTax","type":"uint256"}],"name":"updateBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingTax","type":"uint256"},{"internalType":"uint256","name":"_liquidityTax","type":"uint256"},{"internalType":"uint256","name":"_rewardTax","type":"uint256"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"updateSwapTokensAtAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6000600f556011805462ffffff19166001179055600960a09081526808ae8d0cae48cd8caf60bb1b60c052610120604052600460e09081526308c988ab60e31b61010052600362000051838262000d9e565b50600462000060828262000d9e565b5050506000620000756200072160201b60201c565b600580546001600160a01b0319166001600160a01b03831690811790915560405191925090600090600080516020620064fc833981519152908290a350600046600103620000d95750737a250d5630b4cf539739df2c5dacb4c659f2488d6200014b565b46603803620000fe57507310ed43c718714eb63d5aa57b78b54704e256024e6200014b565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b604051620001599062000ceb565b604051809103906000f08015801562000176573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b039283161790558116608052336a52b7d2dcc80cd2e40000006103e8620001b582600562000e80565b620001c1919062000ea0565b6006556064620001d382600162000e80565b620001df919062000ea0565b6007556064620001f182600162000e80565b620001fd919062000ea0565b600855620186a06200021182601962000e80565b6200021d919062000ea0565b600d556103e8601481905560006013819055601582905562000240908262000ec3565b6200024c919062000ec3565b601255610fa060178190556000601881905560198290556200026f908262000ec3565b6200027b919062000ec3565b601655600e80546001600160a01b031916331790556080516040805163c45a015560e01b815290516001600160a01b03929092169163c45a0155916004808201926020929091908290030181865afa158015620002dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000302919062000ed9565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000352573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000378919062000ed9565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ec919062000ed9565b600a80546001600160a01b0319166001600160a01b039290921691821790556200041890600162000725565b600a5462000431906001600160a01b0316600162000788565b6200043e82600162000725565b6200044b30600162000725565b6080516200045b90600162000725565b6200046a61dead600162000725565b600e5462000483906001600160a01b0316600162000725565b60095460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004ca57600080fd5b505af1158015620004df573d6000803e3d6000fd5b505060095460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200052957600080fd5b505af11580156200053e573d6000803e3d6000fd5b505060095460805160405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200058c57600080fd5b505af1158015620005a1573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015620005ed57600080fd5b505af115801562000602573d6000803e3d6000fd5b505060095460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200064e57600080fd5b505af115801562000663573d6000803e3d6000fd5b505050506200067a8260016200093760201b60201c565b6200068730600162000937565b6080516200069790600162000937565b620006a661dead600162000937565b600e54620006bf906001600160a01b0316600162000937565b620006ca82620009e1565b620006e13060805160001962000ade60201b60201c565b620007183062000706846001600160a01b031660009081526020819052604090205490565b62000712908462000f0b565b62000c06565b50505062000f21565b3390565b6001600160a01b0382166000818152601e6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6005546001600160a01b03163314620007d35760405162461bcd60e51b81526020600482018190526024820152600080516020620064dc833981519152604482015260640162000142565b600a546001600160a01b038381169116141580620007ee5750805b620008625760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840162000142565b6001600160a01b0382166000908152601f60205260409020805460ff191682151517905562000892828262000725565b8015620008fb5760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015620008e157600080fd5b505af1158015620008f6573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620009825760405162461bcd60e51b81526020600482018190526024820152600080516020620064dc833981519152604482015260640162000142565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b0316331462000a2c5760405162461bcd60e51b81526020600482018190526024820152600080516020620064dc833981519152604482015260640162000142565b6001600160a01b03811662000a935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000142565b6005546040516001600160a01b03808416921690600080516020620064fc83398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831662000b425760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000142565b6001600160a01b03821662000ba55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000142565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821662000c5e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000142565b806002600082825462000c72919062000ec3565b90915550506001600160a01b0382166000908152602081905260408120805483929062000ca190849062000ec3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b61181a8062004cc283390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000d2457607f821691505b60208210810362000d4557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000d9957600081815260208120601f850160051c8101602086101562000d745750805b601f850160051c820191505b8181101562000d955782815560010162000d80565b5050505b505050565b81516001600160401b0381111562000dba5762000dba62000cf9565b62000dd28162000dcb845462000d0f565b8462000d4b565b602080601f83116001811462000e0a576000841562000df15750858301515b600019600386901b1c1916600185901b17855562000d95565b600085815260208120601f198616915b8281101562000e3b5788860151825594840194600190910190840162000e1a565b508582101562000e5a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000e9a5762000e9a62000e6a565b92915050565b60008262000ebe57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000e9a5762000e9a62000e6a565b60006020828403121562000eec57600080fd5b81516001600160a01b038116811462000f0457600080fd5b9392505050565b8181038181111562000e9a5762000e9a62000e6a565b608051613d7762000f4b600039600081816104b30152818161333801526133f00152613d776000f3fe6080604052600436106104145760003560e01c806382aa7c681161021e578063ac1b129d11610123578063dd62ed3e116100ab578063e96db1ef1161007a578063e96db1ef14610c0a578063e98030c714610c20578063f1cb24f814610c40578063f27fd25414610c56578063f2fde38b14610c7657600080fd5b8063dd62ed3e14610b79578063e27a55fe14610bbf578063e634e70a14610bd5578063e7841ec014610bf557600080fd5b8063c0f306ef116100f2578063c0f306ef14610ade578063c6a3064714610afe578063c78d0fa014610b1e578063dae6a98214610b34578063dc07b61714610b6457600080fd5b8063ac1b129d14610a1d578063ad56c13c14610a33578063b62496f514610a98578063bb81150814610ac857600080fd5b80639e93ad8e116101a6578063a2cbba2811610175578063a2cbba2814610987578063a457c2d71461099d578063a5ece941146109bd578063a8b9d240146109dd578063a9059cbb146109fd57600080fd5b80639e93ad8e14610926578063a002959c1461093c578063a0a485ca14610952578063a26579ad1461097257600080fd5b80638da5cb5b116101ed5780638da5cb5b1461089d578063906e9dd0146108bb57806395d89b41146108db5780639a7a23d6146108f05780639cf551831461091057600080fd5b806382aa7c681461081d5780638366e79a1461083d57806384d5a0f11461085d578063894dc39b1461087d57600080fd5b806333cdacd91161032457806364b0f653116102ac57806370a082311161027b57806370a082311461079e578063715018a6146107be57806371778e7d146107d3578063751039fc146107e85780637571336a146107fd57600080fd5b806364b0f653146107335780636843cd84146107485780636ab91206146107685780636ddd17131461077e57600080fd5b80634e71d92d116102f35780634e71d92d146106bc57806351f205e4146106d157806358a6d531146106e65780635df6e68e146106fd578063607b4ef31461071357600080fd5b806333cdacd9146106505780633950935114610666578063452ed4f1146106865780634a75e73c146106a657600080fd5b80631cce34ee116103a75780632c1f5216116103765780632c1f5216146105c957806330bb4cff146105e9578063313ce567146105fe57806331e79db01461061a578063330124111461063a57600080fd5b80631cce34ee146105595780631f3fed8f146105735780632307b4411461058957806323b872dd146105a957600080fd5b8063095ea7b3116103e3578063095ea7b3146104d557806311704f521461050557806318160ddd146105245780631a8145bb1461054357600080fd5b8063032c32fc1461042057806305f936501461045d57806306fdde031461047f5780630758d924146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50600b54610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047d6104783660046136c8565b610c96565b005b34801561048b57600080fd5b50610494610d83565b6040516104549190613718565b3480156104ad57600080fd5b506104407f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e157600080fd5b506104f56104f0366004613760565b610e15565b6040519015158152602001610454565b34801561051157600080fd5b506011546104f590610100900460ff1681565b34801561053057600080fd5b506002545b604051908152602001610454565b34801561054f57600080fd5b50610535601b5481565b34801561056557600080fd5b506011546104f59060ff1681565b34801561057f57600080fd5b50610535601a5481565b34801561059557600080fd5b5061047d6105a4366004613862565b610e2c565b3480156105b557600080fd5b506104f56105c4366004613924565b61102a565b3480156105d557600080fd5b50600954610440906001600160a01b031681565b3480156105f557600080fd5b506105356110d1565b34801561060a57600080fd5b5060405160128152602001610454565b34801561062657600080fd5b5061047d610635366004613965565b611144565b34801561064657600080fd5b5061053560145481565b34801561065c57600080fd5b5061053560075481565b34801561067257600080fd5b506104f5610681366004613760565b6111d1565b34801561069257600080fd5b50600a54610440906001600160a01b031681565b3480156106b257600080fd5b5061053560155481565b3480156106c857600080fd5b5061047d61120d565b3480156106dd57600080fd5b5061047d611285565b3480156106f257600080fd5b5060105443106104f5565b34801561070957600080fd5b5061053560125481565b34801561071f57600080fd5b50600c54610440906001600160a01b031681565b34801561073f57600080fd5b5061053561138d565b34801561075457600080fd5b50610535610763366004613965565b6113d7565b34801561077457600080fd5b5061053560185481565b34801561078a57600080fd5b506011546104f59062010000900460ff1681565b3480156107aa57600080fd5b506105356107b9366004613965565b611447565b3480156107ca57600080fd5b5061047d611462565b3480156107df57600080fd5b506105356114d6565b3480156107f457600080fd5b5061047d611520565b34801561080957600080fd5b5061047d610818366004613997565b61157f565b34801561082957600080fd5b5061047d6108383660046139d0565b611647565b34801561084957600080fd5b5061047d6108583660046139e9565b611705565b34801561086957600080fd5b5061047d6108783660046139d0565b6118a8565b34801561088957600080fd5b5061047d6108983660046139d0565b611972565b3480156108a957600080fd5b506005546001600160a01b0316610440565b3480156108c757600080fd5b5061047d6108d6366004613965565b611ab8565b3480156108e757600080fd5b50610494611b78565b3480156108fc57600080fd5b5061047d61090b366004613997565b611b87565b34801561091c57600080fd5b50610535600f5481565b34801561093257600080fd5b5061053561271081565b34801561094857600080fd5b50610535601c5481565b34801561095e57600080fd5b5061047d61096d3660046136c8565b611d0d565b34801561097e57600080fd5b50610535611de4565b34801561099357600080fd5b5061053560135481565b3480156109a957600080fd5b506104f56109b8366004613760565b611e2e565b3480156109c957600080fd5b50600e54610440906001600160a01b031681565b3480156109e957600080fd5b506105356109f8366004613965565b611ec7565b348015610a0957600080fd5b506104f5610a18366004613760565b611efa565b348015610a2957600080fd5b5061053560065481565b348015610a3f57600080fd5b50610a53610a4e366004613965565b611f07565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610454565b348015610aa457600080fd5b506104f5610ab3366004613965565b601f6020526000908152604090205460ff1681565b348015610ad457600080fd5b5061053560085481565b348015610aea57600080fd5b5061047d610af9366004613965565b611fa2565b348015610b0a57600080fd5b5061047d610b19366004613997565b611ffe565b348015610b2a57600080fd5b50610535600d5481565b348015610b4057600080fd5b506104f5610b4f366004613965565b601e6020526000908152604090205460ff1681565b348015610b7057600080fd5b5061047d612087565b348015610b8557600080fd5b50610535610b943660046139e9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bcb57600080fd5b5061053560165481565b348015610be157600080fd5b5061047d610bf03660046139d0565b6120e9565b348015610c0157600080fd5b506105356121ac565b348015610c1657600080fd5b5061053560175481565b348015610c2c57600080fd5b5061047d610c3b3660046139d0565b6121f6565b348015610c4c57600080fd5b5061053560195481565b348015610c6257600080fd5b50610a53610c713660046139d0565b612251565b348015610c8257600080fd5b5061047d610c91366004613965565b612293565b6005546001600160a01b03163314610cc95760405162461bcd60e51b8152600401610cc090613a17565b60405180910390fd5b60178390556018829055601981905580610ce38385613a62565b610ced9190613a62565b60168190556103e81015610d435760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420313025206f72206c657373000000006044820152606401610cc0565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97601654604051610d7691815260200190565b60405180910390a1505050565b606060038054610d9290613a75565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90613a75565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b5050505050905090565b6000610e2233848461237e565b5060015b92915050565b6005546001600160a01b03163314610e565760405162461bcd60e51b8152600401610cc090613a17565b8051825114610ea75760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cc0565b610258825110610f185760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610cc0565b60005b825181101561102557610f6133848381518110610f3a57610f3a613aaf565b6020026020010151848481518110610f5457610f54613aaf565b60200260200101516124a2565b60095483516001600160a01b039091169063e30443bc90859084908110610f8a57610f8a613aaf565b6020026020010151610fb4868581518110610fa757610fa7613aaf565b6020026020010151611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b50505050808061101d90613ac5565b915050610f1b565b505050565b60006110378484846125f4565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156110b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e7366657220616d74206578636565647320616c6c6f60448201526477616e636560d81b6064820152608401610cc0565b6110c6853385840361237e565b506001949350505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113f9190613ade565b905090565b6005546001600160a01b0316331461116e5760405162461bcd60e51b8152600401610cc090613a17565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156111b657600080fd5b505af11580156111ca573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610e22918590611208908690613a62565b61237e565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561125e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112829190613af7565b50565b6005546001600160a01b031633146112af5760405162461bcd60e51b8152600401610cc090613a17565b600d546112bb30611447565b101561132f5760405162461bcd60e51b815260206004820152603d60248201527f43616e206f6e6c792073776170207768656e20746f6b656e20616d742069732060448201527f6174206f7220686967686572207468616e207265737472696374696f6e0000006064820152608401610cc0565b600c805460ff60a01b1916600160a01b17905561134a613003565b600c805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb32906020015b60405180910390a1565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b60095460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b602060405180830381865afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e269190613ade565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461148c5760405162461bcd60e51b8152600401610cc090613a17565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6009546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b6005546001600160a01b0316331461154a5760405162461bcd60e51b8152600401610cc090613a17565b6011805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146115a95760405162461bcd60e51b8152600401610cc090613a17565b8061161c57600a546001600160a01b039081169083160361161c5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610cc0565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116715760405162461bcd60e51b8152600401610cc090613a17565b601154610100900460ff16156116dd5760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610cc0565b6011805462ffff0019166201010017905543600f8190556116ff908290613a62565b60105550565b6005546001600160a01b0316331461172f5760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0382166117855760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610cc0565b6001600160a01b038216301415806117a55750601154610100900460ff16155b6117f15760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610cc0565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185c9190613ade565b905061186983838361322c565b604080516001600160a01b0385168152602081018390527fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e4389101610d76565b6005546001600160a01b031633146118d25760405162461bcd60e51b8152600401610cc090613a17565b670de0b6b3a764000060646118e660025490565b6118f1906001613b14565b6118fb9190613b2b565b6119059190613b2b565b8110156119245760405162461bcd60e51b8152600401610cc090613b4d565b61193681670de0b6b3a7640000613b14565b60068190556040519081527fbd0f1740caf821f78178ca26f0481f035268c600b91408a9a82dfb3a80b79a29906020015b60405180910390a150565b6005546001600160a01b0316331461199c5760405162461bcd60e51b8152600401610cc090613a17565b620f42406119a960025490565b6119b4906001613b14565b6119be9190613b2b565b811015611a295760405162461bcd60e51b815260206004820152603360248201527f5377617020616d742063616e6e6f74206265206c6f776572207468616e20302e6044820152721818181892903a37ba30b61039bab838363c9760691b6064820152608401610cc0565b6103e8611a3560025490565b611a40906001613b14565b611a4a9190613b2b565b811115611ab35760405162461bcd60e51b815260206004820152603160248201527f5377617020616d742063616e6e6f7420626520686967686572207468616e2030604482015270171892903a37ba30b61039bab838363c9760791b6064820152608401610cc0565b600d55565b6005546001600160a01b03163314611ae25760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b038116611b2e5760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610cc0565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a990600090a250565b606060048054610d9290613a75565b6005546001600160a01b03163314611bb15760405162461bcd60e51b8152600401610cc090613a17565b600a546001600160a01b038381169116141580611bcb5750805b611c3d5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610cc0565b6001600160a01b0382166000908152601f60205260409020805460ff1916821515179055611c6b828261327e565b8015611cd15760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015611cb857600080fd5b505af1158015611ccc573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611d375760405162461bcd60e51b8152600401610cc090613a17565b60148390556013829055601581905580611d518385613a62565b611d5b9190613a62565b60128190556103e81015611db15760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420313025206f72206c657373000000006044820152606401610cc0565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508601254604051610d7691815260200190565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611eb05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cc0565b611ebd338585840361237e565b5060019392505050565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611406565b6000610e223384846125f4565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f879190613b92565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611fcc5760405162461bcd60e51b8152600401610cc090613a17565b60095460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef9060240161119c565b6005546001600160a01b031633146120285760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b031633146120b15760405162461bcd60e51b8152600401610cc090613a17565b60025460088190556040519081527f5c2c6bbd255d68d22e47fbc0e1cbb9e5c5c2892d91144941f6b7f61d3b1c8a5590602001611383565b6005546001600160a01b031633146121135760405162461bcd60e51b8152600401610cc090613a17565b670de0b6b3a7640000606461212760025490565b612132906001613b14565b61213c9190613b2b565b6121469190613b2b565b8110156121655760405162461bcd60e51b8152600401610cc090613b4d565b61217781670de0b6b3a7640000613b14565b60078190556040519081527fda3f4fd2455d333278e3d4e42bf292b30da257f729437c6264f483617cbf73f790602001611967565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b6005546001600160a01b031633146122205760405162461bcd60e51b8152600401610cc090613a17565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c79060240161119c565b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611f45565b6005546001600160a01b031633146122bd5760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0381166123225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc0565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166123e05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc0565b6001600160a01b0382166124415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124c85760405162461bcd60e51b8152600401610cc090613bfc565b6001600160a01b0382166124ee5760405162461bcd60e51b8152600401610cc090613c41565b6001600160a01b038316600090815260208190526040902054818110156125635760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220616d7420657863656564732062616c616044820152626e636560e81b6064820152608401610cc0565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061259a908490613a62565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125e691815260200190565b60405180910390a350505050565b6001600160a01b03831661261a5760405162461bcd60e51b8152600401610cc090613bfc565b6001600160a01b0382166126405760405162461bcd60e51b8152600401610cc090613c41565b8060000361265457611025838360006124a2565b601154610100900460ff166126e7576001600160a01b0383166000908152601d602052604090205460ff16806126a257506001600160a01b0382166000908152601d602052604090205460ff165b6126e75760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610cc0565b6001600160a01b0383166000908152601d602052604090205460ff168061272657506001600160a01b0382166000908152601d602052604090205460ff165b8061273a5750600c54600160a01b900460ff165b156128435761274a8383836124a2565b6009546001600160a01b031663e30443bc8461276581611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127ab57600080fd5b505af11580156127bf573d6000803e3d6000fd5b50506009546001600160a01b0316915063e30443bc9050836127e081611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b50505050505050565b60115460ff1615612b25576005546001600160a01b0384811691161480159061287a57506005546001600160a01b03838116911614155b801561288e57506001600160a01b03821615155b80156128a557506001600160a01b03821661dead14155b80156128ca57506001600160a01b0383166000908152601d602052604090205460ff16155b80156128ef57506001600160a01b0382166000908152601d602052604090205460ff16155b15612b25576001600160a01b0383166000908152601f602052604090205460ff16801561293557506001600160a01b0382166000908152601e602052604090205460ff16155b156129fe5760065481111561299a5760405162461bcd60e51b815260206004820152602560248201527f427579207472616e7366657220616d74206578636565647320746865206d617860448201526410313abc9760d91b6064820152608401610cc0565b6008546129a683611447565b6129b09083613a62565b11156129f95760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b612b25565b6001600160a01b0382166000908152601f602052604090205460ff168015612a3f57506001600160a01b0383166000908152601e602052604090205460ff16155b15612aa6576007548111156129f95760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d74206578636565647320746865206d616044820152663c1039b2b6361760c91b6064820152608401610cc0565b6001600160a01b0382166000908152601e602052604090205460ff16612b2557600854612ad283611447565b612adc9083613a62565b1115612b255760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b6000612b3030611447565b600d5490915081108015908190612b4f575060115462010000900460ff165b8015612b655750600c54600160a01b900460ff16155b8015612b8957506001600160a01b0384166000908152601f602052604090205460ff165b15612bb757600c805460ff60a01b1916600160a01b179055612ba9613003565b600c805460ff60a01b191690555b6001600160a01b0385166000908152601d602052604090205460019060ff1680612bf957506001600160a01b0385166000908152601d602052604090205460ff165b15612c02575060005b60008115612efb5760105443108015612c3357506001600160a01b0387166000908152601f602052604090205460ff165b8015612c5857506001600160a01b0386166000908152601f602052604090205460ff16155b8015612c7d57506001600160a01b0386166000908152601d602052604090205460ff16155b8015612c8b57506000601254115b15612d4257612710612c9f866126ac613b14565b612ca99190613b2b565b905060125460135482612cbc9190613b14565b612cc69190613b2b565b601b6000828254612cd79190613a62565b9091555050601254601454612cec9083613b14565b612cf69190613b2b565b601a6000828254612d079190613a62565b9091555050601254601554612d1c9083613b14565b612d269190613b2b565b601c6000828254612d379190613a62565b90915550612edd9050565b6001600160a01b0386166000908152601f602052604090205460ff168015612d6c57506000601654115b15612dff5761271060165486612d829190613b14565b612d8c9190613b2b565b905060165460185482612d9f9190613b14565b612da99190613b2b565b601b6000828254612dba9190613a62565b9091555050601654601754612dcf9083613b14565b612dd99190613b2b565b601a6000828254612dea9190613a62565b9091555050601654601954612d1c9083613b14565b6001600160a01b0387166000908152601f602052604090205460ff168015612e2957506000601254115b15612edd5761271060125486612e3f9190613b14565b612e499190613b2b565b905060125460145482612e5c9190613b14565b612e669190613b2b565b601a6000828254612e779190613a62565b9091555050601254601354612e8c9083613b14565b612e969190613b2b565b601b6000828254612ea79190613a62565b9091555050601254601554612ebc9083613b14565b612ec69190613b2b565b601c6000828254612ed79190613a62565b90915550505b8015612eee57612eee8730836124a2565b612ef88186613c84565b94505b612f068787876124a2565b6009546001600160a01b031663e30443bc88612f2181611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6757600080fd5b505af1158015612f7b573d6000803e3d6000fd5b50506009546001600160a01b0316915063e30443bc905087612f9c81611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612fe257600080fd5b505af1158015612ff6573d6000803e3d6000fd5b5050505050505050505050565b600061300e30611447565b90506000601c54601a54601b546130259190613a62565b61302f9190613a62565b905081158061303c575080155b15613045575050565b600d54613053906028613b14565b82111561306b57600d54613068906028613b14565b91505b601b541561312e57600081601b54846130849190613b14565b61308e9190613b2b565b600a549091506130a99030906001600160a01b0316836124a2565b600a60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156130f957600080fd5b505af192505050801561310a575060015b506131158184613c84565b9250601b54826131259190613c84565b6000601b559150505b811561322857600061313f836132e1565b601c54156131bc5760008247601c546131589190613b14565b6131629190613b2b565b6009546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146131b0576040519150601f19603f3d011682016040523d82523d6000602084013e6131b5565b606091505b5090925050505b601a541561321c57600e546040516001600160a01b03909116904790600081818185875af1925050503d8060008114613211576040519150601f19603f3d011682016040523d82523d6000602084013e613216565b606091505b50909150505b506000601a819055601c555b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611025908490613466565b6001600160a01b0382166000818152601e6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061331657613316613aaf565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b89190613c97565b816001815181106133cb576133cb613aaf565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac94790613430908590600090869030904290600401613cb4565b600060405180830381600087803b15801561344a57600080fd5b505af115801561345e573d6000803e3d6000fd5b505050505050565b60006134bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135389092919063ffffffff16565b80519091501561102557808060200190518101906134d99190613af7565b6110255760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cc0565b6060613547848460008561354f565b949350505050565b6060824710156135b05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cc0565b600080866001600160a01b031685876040516135cc9190613d25565b60006040518083038185875af1925050503d8060008114613609576040519150601f19603f3d011682016040523d82523d6000602084013e61360e565b606091505b509150915061361f8783838761362a565b979650505050505050565b60608315613699578251600003613692576001600160a01b0385163b6136925760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cc0565b5081613547565b61354783838151156136ae5781518083602001fd5b8060405162461bcd60e51b8152600401610cc09190613718565b6000806000606084860312156136dd57600080fd5b505081359360208301359350604090920135919050565b60005b8381101561370f5781810151838201526020016136f7565b50506000910152565b60208152600082518060208401526137378160408501602087016136f4565b601f01601f19169190910160400192915050565b6001600160a01b038116811461128257600080fd5b6000806040838503121561377357600080fd5b823561377e8161374b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137cb576137cb61378c565b604052919050565b600067ffffffffffffffff8211156137ed576137ed61378c565b5060051b60200190565b600082601f83011261380857600080fd5b8135602061381d613818836137d3565b6137a2565b82815260059290921b8401810191818101908684111561383c57600080fd5b8286015b848110156138575780358352918301918301613840565b509695505050505050565b6000806040838503121561387557600080fd5b823567ffffffffffffffff8082111561388d57600080fd5b818501915085601f8301126138a157600080fd5b813560206138b1613818836137d3565b82815260059290921b840181019181810190898411156138d057600080fd5b948201945b838610156138f75785356138e88161374b565b825294820194908201906138d5565b9650508601359250508082111561390d57600080fd5b5061391a858286016137f7565b9150509250929050565b60008060006060848603121561393957600080fd5b83356139448161374b565b925060208401356139548161374b565b929592945050506040919091013590565b60006020828403121561397757600080fd5b81356139828161374b565b9392505050565b801515811461128257600080fd5b600080604083850312156139aa57600080fd5b82356139b58161374b565b915060208301356139c581613989565b809150509250929050565b6000602082840312156139e257600080fd5b5035919050565b600080604083850312156139fc57600080fd5b8235613a078161374b565b915060208301356139c58161374b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e2657610e26613a4c565b600181811c90821680613a8957607f821691505b602082108103613aa957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201613ad757613ad7613a4c565b5060010190565b600060208284031215613af057600080fd5b5051919050565b600060208284031215613b0957600080fd5b815161398281613989565b8082028115828204841417610e2657610e26613a4c565b600082613b4857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f43616e6e6f7420736574206d61782073656c6c20616d74206c6f776572207468604082015264616e20312560d81b606082015260800190565b600080600080600080600080610100898b031215613baf57600080fd5b8851613bba8161374b565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610e2657610e26613a4c565b600060208284031215613ca957600080fd5b81516139828161374b565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613d045784516001600160a01b031683529383019391830191600101613cdf565b50506001600160a01b03969096166060850152505050608001529392505050565b60008251613d378184602087016136f4565b919091019291505056fea26469706673582212206b5daf8b7184999a75aeda975c250f478a77222304e75ae46c5770a8483f037c64736f6c6343000813003360a060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600e81905560805260805161179c61007e6000396000818161047101526109b8015261179c6000f3fe6080604052600436106101a05760003560e01c806391b89fba116100ec578063c0f306ef1161008a578063e98030c711610064578063e98030c7146104e8578063f2fde38b14610508578063fbcbc0f114610528578063ffb2c4791461054857600080fd5b8063c0f306ef14610493578063e30443bc146104b3578063e7841ec0146104d357600080fd5b8063ab6ddfa8116100c6578063ab6ddfa8146103fc578063ad7a672f14610429578063bc4c4b371461043f578063be10b6141461045f57600080fd5b806391b89fba14610386578063a8b9d240146103a6578063aafd847a146103c657600080fd5b80634e7b827f116101595780636f2789ec116101335780636f2789ec1461031d578063715018a61461033357806385a6b3ae146103485780638da5cb5b1461035e57600080fd5b80634e7b827f146102635780635183d6fd146102a35780636a4740021461030857600080fd5b806303c83302146101b457806309bbedde146101bc578063226cfa3d146101e057806327ce01471461020d5780633009a6091461022d57806331e79db01461024357600080fd5b366101af576101ad610583565b005b600080fd5b6101ad610583565b3480156101c857600080fd5b506007545b6040519081526020015b60405180910390f35b3480156101ec57600080fd5b506101cd6101fb36600461153a565b600d6020526000908152604090205481565b34801561021957600080fd5b506101cd61022836600461153a565b610607565b34801561023957600080fd5b506101cd600b5481565b34801561024f57600080fd5b506101ad61025e36600461153a565b61066a565b34801561026f57600080fd5b5061029361027e36600461153a565b600c6020526000908152604090205460ff1681565b60405190151581526020016101d7565b3480156102af57600080fd5b506102c36102be366004611557565b61070b565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101d7565b34801561031457600080fd5b506101ad610778565b34801561032957600080fd5b506101cd600e5481565b34801561033f57600080fd5b506101ad610781565b34801561035457600080fd5b506101cd60065481565b34801561036a57600080fd5b506000546040516001600160a01b0390911681526020016101d7565b34801561039257600080fd5b506101cd6103a136600461153a565b6107f5565b3480156103b257600080fd5b506101cd6103c136600461153a565b6107fc565b3480156103d257600080fd5b506101cd6103e136600461153a565b6001600160a01b031660009081526003602052604090205490565b34801561040857600080fd5b506101cd61041736600461153a565b60046020526000908152604090205481565b34801561043557600080fd5b506101cd60055481565b34801561044b57600080fd5b5061029361045a366004611570565b610828565b34801561046b57600080fd5b506101cd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561049f57600080fd5b506101ad6104ae36600461153a565b6108d4565b3480156104bf57600080fd5b506101ad6104ce3660046115ae565b61096c565b3480156104df57600080fd5b50600b546101cd565b3480156104f457600080fd5b506101ad610503366004611557565b610a1b565b34801561051457600080fd5b506101ad61052336600461153a565b610b84565b34801561053457600080fd5b506102c361054336600461153a565b610c6e565b34801561055457600080fd5b50610568610563366004611557565b610d55565b604080519384526020840192909252908201526060016101d7565b6005541561060557348015610603576005546105ba906105a783600160801b610e72565b6105b191906115f0565b60015490610efb565b60015560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26006546105ff9082610efb565b6006555b505b565b6001600160a01b0381166000908152600260209081526040808320546004909252822054600154600160801b9261065a926106559261064f9161064a9190610e72565b610f5a565b90610f6a565b610fa8565b61066491906115f0565b92915050565b6000546001600160a01b0316331461069d5760405162461bcd60e51b815260040161069490611612565b60405180910390fd5b6001600160a01b0381166000908152600c60205260408120805460ff191660011790556106cb908290610fbb565b6106d481611054565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b60008060008060008060008061072060075490565b891061074557506000965060001995508594508693508392508291508190508061076d565b60006107508a611187565b905061075b81610c6e565b98509850985098509850985098509850505b919395975091939597565b610603336111ba565b6000546001600160a01b031633146107ab5760405162461bcd60e51b815260040161069490611612565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610664825b6001600160a01b0381166000908152600360205260408120546106649061082284610607565b906112ae565b600080546001600160a01b031633146108535760405162461bcd60e51b815260040161069490611612565b600061085e846111ba565b905080156108ca576001600160a01b0384166000818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906108b89085815260200190565b60405180910390a36001915050610664565b5060009392505050565b6000546001600160a01b031633146108fe5760405162461bcd60e51b815260040161069490611612565b6001600160a01b0381166000908152600c602052604090205460ff1661092357600080fd5b6001600160a01b0381166000818152600c6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000546001600160a01b031633146109965760405162461bcd60e51b815260040161069490611612565b6001600160a01b0382166000908152600c602052604090205460ff16610a17577f000000000000000000000000000000000000000000000000000000000000000081106109f6576109e78282610fbb565b6109f182826112f0565b610a0a565b610a01826000610fbb565b610a0a82611054565b610a15826001610828565b505b5050565b6000546001600160a01b03163314610a455760405162461bcd60e51b815260040161069490611612565b6104b08110158015610a5a5750620151808111155b610ada5760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610694565b600e548103610b515760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610694565b600e5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600e55565b6000546001600160a01b03163314610bae5760405162461bcd60e51b815260040161069490611612565b6001600160a01b038116610c135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610694565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080808080610c80886113ae565b9650600019955060008712610ce257600b54871115610cae57600b54610ca79088906113f3565b9550610ce2565b600b5460075460009110610cc3576000610cd2565b600b54600754610cd2916112ae565b9050610cde8882610f6a565b9650505b610ceb886107fc565b9450610cf688610607565b6001600160a01b0389166000908152600d6020526040902054909450925082610d20576000610d2e565b600e54610d2e908490610efb565b9150428211610d3e576000610d48565b610d4882426112ae565b9050919395975091939597565b60075460009081908190808203610d77575050600b5460009250829150610e6b565b600b546000805a90506000805b8984108015610d9257508582105b15610e5a5784610da181611647565b60075490965086109050610db457600094505b600060076000018681548110610dcc57610dcc611660565b60009182526020808320909101546001600160a01b0316808352600d909152604090912054909150610dfd90611430565b15610e2057610e0d816001610828565b15610e205781610e1c81611647565b9250505b82610e2a81611647565b93505060005a905080851115610e5157610e4e610e4786836112ae565b8790610efb565b95505b9350610d849050565b600b85905590975095509193505050505b9193909250565b600082600003610e8457506000610664565b6000610e908385611676565b905082610e9d85836115f0565b14610ef45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610694565b9392505050565b600080610f08838561168d565b905083811015610ef45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610694565b6000818181121561066457600080fd5b600080610f7783856116a0565b905060008312158015610f8a5750838112155b80610f9f5750600083128015610f9f57508381125b610ef457600080fd5b600080821215610fb757600080fd5b5090565b6001600160a01b038216600090815260046020526040902080549082905580821115611017576000610fed83836112ae565b9050610ff98482611457565b806005600082825461100b919061168d565b90915550610a15915050565b80821015610a1557600061102b82846112ae565b905061103784826114b1565b806005600082825461104991906116c8565b909155505050505050565b6001600160a01b0381166000908152600a602052604090205460ff166110775750565b6001600160a01b0381166000908152600a60209081526040808320805460ff191690556008825280832083905560099091528120546007549091906110be906001906116c8565b90506000600760000182815481106110d8576110d8611660565b60009182526020808320909101546001600160a01b039081168084526009909252604080842087905590871683528220919091556007805491925082918590811061112557611125611660565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600780548061115f5761115f6116db565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b60006007600001828154811061119f5761119f611660565b6000918252602090912001546001600160a01b031692915050565b6000806111c6836107fc565b905080156112a5576001600160a01b0383166000908152600360205260409020546111f19082610efb565b6001600160a01b038416600081815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906112409084815260200190565b60405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114611295576040519150601f19603f3d011682016040523d82523d6000602084013e61129a565b606091505b509295945050505050565b50600092915050565b6000610ef483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114eb565b6001600160a01b0382166000908152600a602052604090205460ff161561132e576001600160a01b0391909116600090815260086020526040902055565b6001600160a01b0382166000818152600a60209081526040808320805460ff1916600190811790915560088352818420869055600780546009909452918420839055820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555050565b6001600160a01b0381166000908152600a602052604081205460ff166113d75750600019919050565b506001600160a01b031660009081526009602052604090205490565b60008061140083856116f1565b9050600083121580156114135750838113155b80610f9f5750600083128015610f9f5750838113610ef457600080fd5b60004282111561144257506000919050565b600e5461144f42846112ae565b101592915050565b61149161147261064a83600154610e7290919063ffffffff16565b6001600160a01b038416600090815260026020526040902054906113f3565b6001600160a01b0390921660009081526002602052604090209190915550565b6114916114cc61064a83600154610e7290919063ffffffff16565b6001600160a01b03841660009081526002602052604090205490610f6a565b6000818484111561150f5760405162461bcd60e51b81526004016106949190611718565b50600061151c84866116c8565b95945050505050565b6001600160a01b038116811461060357600080fd5b60006020828403121561154c57600080fd5b8135610ef481611525565b60006020828403121561156957600080fd5b5035919050565b6000806040838503121561158357600080fd5b823561158e81611525565b9150602083013580151581146115a357600080fd5b809150509250929050565b600080604083850312156115c157600080fd5b82356115cc81611525565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b60008261160d57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201611659576116596115da565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610664576106646115da565b80820180821115610664576106646115da565b80820182811260008312801582168215821617156116c0576116c06115da565b505092915050565b81810381811115610664576106646115da565b634e487b7160e01b600052603160045260246000fd5b8181036000831280158383131683831282161715611711576117116115da565b5092915050565b600060208083528351808285015260005b8181101561174557858101830151858201604001528201611729565b506000604082860101526040601f19601f830116850101925050509291505056fea26469706673582212207f837a79b9bcc7ea0afc370212232c56c016583cf01dcd7bdf7bff8ff1b4dd5664736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106104145760003560e01c806382aa7c681161021e578063ac1b129d11610123578063dd62ed3e116100ab578063e96db1ef1161007a578063e96db1ef14610c0a578063e98030c714610c20578063f1cb24f814610c40578063f27fd25414610c56578063f2fde38b14610c7657600080fd5b8063dd62ed3e14610b79578063e27a55fe14610bbf578063e634e70a14610bd5578063e7841ec014610bf557600080fd5b8063c0f306ef116100f2578063c0f306ef14610ade578063c6a3064714610afe578063c78d0fa014610b1e578063dae6a98214610b34578063dc07b61714610b6457600080fd5b8063ac1b129d14610a1d578063ad56c13c14610a33578063b62496f514610a98578063bb81150814610ac857600080fd5b80639e93ad8e116101a6578063a2cbba2811610175578063a2cbba2814610987578063a457c2d71461099d578063a5ece941146109bd578063a8b9d240146109dd578063a9059cbb146109fd57600080fd5b80639e93ad8e14610926578063a002959c1461093c578063a0a485ca14610952578063a26579ad1461097257600080fd5b80638da5cb5b116101ed5780638da5cb5b1461089d578063906e9dd0146108bb57806395d89b41146108db5780639a7a23d6146108f05780639cf551831461091057600080fd5b806382aa7c681461081d5780638366e79a1461083d57806384d5a0f11461085d578063894dc39b1461087d57600080fd5b806333cdacd91161032457806364b0f653116102ac57806370a082311161027b57806370a082311461079e578063715018a6146107be57806371778e7d146107d3578063751039fc146107e85780637571336a146107fd57600080fd5b806364b0f653146107335780636843cd84146107485780636ab91206146107685780636ddd17131461077e57600080fd5b80634e71d92d116102f35780634e71d92d146106bc57806351f205e4146106d157806358a6d531146106e65780635df6e68e146106fd578063607b4ef31461071357600080fd5b806333cdacd9146106505780633950935114610666578063452ed4f1146106865780634a75e73c146106a657600080fd5b80631cce34ee116103a75780632c1f5216116103765780632c1f5216146105c957806330bb4cff146105e9578063313ce567146105fe57806331e79db01461061a578063330124111461063a57600080fd5b80631cce34ee146105595780631f3fed8f146105735780632307b4411461058957806323b872dd146105a957600080fd5b8063095ea7b3116103e3578063095ea7b3146104d557806311704f521461050557806318160ddd146105245780631a8145bb1461054357600080fd5b8063032c32fc1461042057806305f936501461045d57806306fdde031461047f5780630758d924146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50600b54610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047d6104783660046136c8565b610c96565b005b34801561048b57600080fd5b50610494610d83565b6040516104549190613718565b3480156104ad57600080fd5b506104407f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156104e157600080fd5b506104f56104f0366004613760565b610e15565b6040519015158152602001610454565b34801561051157600080fd5b506011546104f590610100900460ff1681565b34801561053057600080fd5b506002545b604051908152602001610454565b34801561054f57600080fd5b50610535601b5481565b34801561056557600080fd5b506011546104f59060ff1681565b34801561057f57600080fd5b50610535601a5481565b34801561059557600080fd5b5061047d6105a4366004613862565b610e2c565b3480156105b557600080fd5b506104f56105c4366004613924565b61102a565b3480156105d557600080fd5b50600954610440906001600160a01b031681565b3480156105f557600080fd5b506105356110d1565b34801561060a57600080fd5b5060405160128152602001610454565b34801561062657600080fd5b5061047d610635366004613965565b611144565b34801561064657600080fd5b5061053560145481565b34801561065c57600080fd5b5061053560075481565b34801561067257600080fd5b506104f5610681366004613760565b6111d1565b34801561069257600080fd5b50600a54610440906001600160a01b031681565b3480156106b257600080fd5b5061053560155481565b3480156106c857600080fd5b5061047d61120d565b3480156106dd57600080fd5b5061047d611285565b3480156106f257600080fd5b5060105443106104f5565b34801561070957600080fd5b5061053560125481565b34801561071f57600080fd5b50600c54610440906001600160a01b031681565b34801561073f57600080fd5b5061053561138d565b34801561075457600080fd5b50610535610763366004613965565b6113d7565b34801561077457600080fd5b5061053560185481565b34801561078a57600080fd5b506011546104f59062010000900460ff1681565b3480156107aa57600080fd5b506105356107b9366004613965565b611447565b3480156107ca57600080fd5b5061047d611462565b3480156107df57600080fd5b506105356114d6565b3480156107f457600080fd5b5061047d611520565b34801561080957600080fd5b5061047d610818366004613997565b61157f565b34801561082957600080fd5b5061047d6108383660046139d0565b611647565b34801561084957600080fd5b5061047d6108583660046139e9565b611705565b34801561086957600080fd5b5061047d6108783660046139d0565b6118a8565b34801561088957600080fd5b5061047d6108983660046139d0565b611972565b3480156108a957600080fd5b506005546001600160a01b0316610440565b3480156108c757600080fd5b5061047d6108d6366004613965565b611ab8565b3480156108e757600080fd5b50610494611b78565b3480156108fc57600080fd5b5061047d61090b366004613997565b611b87565b34801561091c57600080fd5b50610535600f5481565b34801561093257600080fd5b5061053561271081565b34801561094857600080fd5b50610535601c5481565b34801561095e57600080fd5b5061047d61096d3660046136c8565b611d0d565b34801561097e57600080fd5b50610535611de4565b34801561099357600080fd5b5061053560135481565b3480156109a957600080fd5b506104f56109b8366004613760565b611e2e565b3480156109c957600080fd5b50600e54610440906001600160a01b031681565b3480156109e957600080fd5b506105356109f8366004613965565b611ec7565b348015610a0957600080fd5b506104f5610a18366004613760565b611efa565b348015610a2957600080fd5b5061053560065481565b348015610a3f57600080fd5b50610a53610a4e366004613965565b611f07565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610454565b348015610aa457600080fd5b506104f5610ab3366004613965565b601f6020526000908152604090205460ff1681565b348015610ad457600080fd5b5061053560085481565b348015610aea57600080fd5b5061047d610af9366004613965565b611fa2565b348015610b0a57600080fd5b5061047d610b19366004613997565b611ffe565b348015610b2a57600080fd5b50610535600d5481565b348015610b4057600080fd5b506104f5610b4f366004613965565b601e6020526000908152604090205460ff1681565b348015610b7057600080fd5b5061047d612087565b348015610b8557600080fd5b50610535610b943660046139e9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bcb57600080fd5b5061053560165481565b348015610be157600080fd5b5061047d610bf03660046139d0565b6120e9565b348015610c0157600080fd5b506105356121ac565b348015610c1657600080fd5b5061053560175481565b348015610c2c57600080fd5b5061047d610c3b3660046139d0565b6121f6565b348015610c4c57600080fd5b5061053560195481565b348015610c6257600080fd5b50610a53610c713660046139d0565b612251565b348015610c8257600080fd5b5061047d610c91366004613965565b612293565b6005546001600160a01b03163314610cc95760405162461bcd60e51b8152600401610cc090613a17565b60405180910390fd5b60178390556018829055601981905580610ce38385613a62565b610ced9190613a62565b60168190556103e81015610d435760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420313025206f72206c657373000000006044820152606401610cc0565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97601654604051610d7691815260200190565b60405180910390a1505050565b606060038054610d9290613a75565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90613a75565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b5050505050905090565b6000610e2233848461237e565b5060015b92915050565b6005546001600160a01b03163314610e565760405162461bcd60e51b8152600401610cc090613a17565b8051825114610ea75760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cc0565b610258825110610f185760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610cc0565b60005b825181101561102557610f6133848381518110610f3a57610f3a613aaf565b6020026020010151848481518110610f5457610f54613aaf565b60200260200101516124a2565b60095483516001600160a01b039091169063e30443bc90859084908110610f8a57610f8a613aaf565b6020026020010151610fb4868581518110610fa757610fa7613aaf565b6020026020010151611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b50505050808061101d90613ac5565b915050610f1b565b505050565b60006110378484846125f4565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156110b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e7366657220616d74206578636565647320616c6c6f60448201526477616e636560d81b6064820152608401610cc0565b6110c6853385840361237e565b506001949350505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113f9190613ade565b905090565b6005546001600160a01b0316331461116e5760405162461bcd60e51b8152600401610cc090613a17565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156111b657600080fd5b505af11580156111ca573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610e22918590611208908690613a62565b61237e565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561125e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112829190613af7565b50565b6005546001600160a01b031633146112af5760405162461bcd60e51b8152600401610cc090613a17565b600d546112bb30611447565b101561132f5760405162461bcd60e51b815260206004820152603d60248201527f43616e206f6e6c792073776170207768656e20746f6b656e20616d742069732060448201527f6174206f7220686967686572207468616e207265737472696374696f6e0000006064820152608401610cc0565b600c805460ff60a01b1916600160a01b17905561134a613003565b600c805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb32906020015b60405180910390a1565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b60095460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b602060405180830381865afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e269190613ade565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461148c5760405162461bcd60e51b8152600401610cc090613a17565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6009546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b6005546001600160a01b0316331461154a5760405162461bcd60e51b8152600401610cc090613a17565b6011805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146115a95760405162461bcd60e51b8152600401610cc090613a17565b8061161c57600a546001600160a01b039081169083160361161c5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610cc0565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146116715760405162461bcd60e51b8152600401610cc090613a17565b601154610100900460ff16156116dd5760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b6064820152608401610cc0565b6011805462ffff0019166201010017905543600f8190556116ff908290613a62565b60105550565b6005546001600160a01b0316331461172f5760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0382166117855760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610cc0565b6001600160a01b038216301415806117a55750601154610100900460ff16155b6117f15760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610cc0565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185c9190613ade565b905061186983838361322c565b604080516001600160a01b0385168152602081018390527fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e4389101610d76565b6005546001600160a01b031633146118d25760405162461bcd60e51b8152600401610cc090613a17565b670de0b6b3a764000060646118e660025490565b6118f1906001613b14565b6118fb9190613b2b565b6119059190613b2b565b8110156119245760405162461bcd60e51b8152600401610cc090613b4d565b61193681670de0b6b3a7640000613b14565b60068190556040519081527fbd0f1740caf821f78178ca26f0481f035268c600b91408a9a82dfb3a80b79a29906020015b60405180910390a150565b6005546001600160a01b0316331461199c5760405162461bcd60e51b8152600401610cc090613a17565b620f42406119a960025490565b6119b4906001613b14565b6119be9190613b2b565b811015611a295760405162461bcd60e51b815260206004820152603360248201527f5377617020616d742063616e6e6f74206265206c6f776572207468616e20302e6044820152721818181892903a37ba30b61039bab838363c9760691b6064820152608401610cc0565b6103e8611a3560025490565b611a40906001613b14565b611a4a9190613b2b565b811115611ab35760405162461bcd60e51b815260206004820152603160248201527f5377617020616d742063616e6e6f7420626520686967686572207468616e2030604482015270171892903a37ba30b61039bab838363c9760791b6064820152608401610cc0565b600d55565b6005546001600160a01b03163314611ae25760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b038116611b2e5760405162461bcd60e51b81526020600482015260136024820152720616464726573732063616e6e6f74206265203606c1b6044820152606401610cc0565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517fd1e7d6a3390dd5008bd1c57798817b9f806e4c417264e7d3d67e42e784dc24a990600090a250565b606060048054610d9290613a75565b6005546001600160a01b03163314611bb15760405162461bcd60e51b8152600401610cc090613a17565b600a546001600160a01b038381169116141580611bcb5750805b611c3d5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610cc0565b6001600160a01b0382166000908152601f60205260409020805460ff1916821515179055611c6b828261327e565b8015611cd15760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015611cb857600080fd5b505af1158015611ccc573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314611d375760405162461bcd60e51b8152600401610cc090613a17565b60148390556013829055601581905580611d518385613a62565b611d5b9190613a62565b60128190556103e81015611db15760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702074617820617420313025206f72206c657373000000006044820152606401610cc0565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508601254604051610d7691815260200190565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611eb05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cc0565b611ebd338585840361237e565b5060019392505050565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611406565b6000610e223384846125f4565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f879190613b92565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611fcc5760405162461bcd60e51b8152600401610cc090613a17565b60095460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef9060240161119c565b6005546001600160a01b031633146120285760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b031633146120b15760405162461bcd60e51b8152600401610cc090613a17565b60025460088190556040519081527f5c2c6bbd255d68d22e47fbc0e1cbb9e5c5c2892d91144941f6b7f61d3b1c8a5590602001611383565b6005546001600160a01b031633146121135760405162461bcd60e51b8152600401610cc090613a17565b670de0b6b3a7640000606461212760025490565b612132906001613b14565b61213c9190613b2b565b6121469190613b2b565b8110156121655760405162461bcd60e51b8152600401610cc090613b4d565b61217781670de0b6b3a7640000613b14565b60078190556040519081527fda3f4fd2455d333278e3d4e42bf292b30da257f729437c6264f483617cbf73f790602001611967565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b6005546001600160a01b031633146122205760405162461bcd60e51b8152600401610cc090613a17565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c79060240161119c565b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611f45565b6005546001600160a01b031633146122bd5760405162461bcd60e51b8152600401610cc090613a17565b6001600160a01b0381166123225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc0565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166123e05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc0565b6001600160a01b0382166124415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124c85760405162461bcd60e51b8152600401610cc090613bfc565b6001600160a01b0382166124ee5760405162461bcd60e51b8152600401610cc090613c41565b6001600160a01b038316600090815260208190526040902054818110156125635760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220616d7420657863656564732062616c616044820152626e636560e81b6064820152608401610cc0565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061259a908490613a62565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125e691815260200190565b60405180910390a350505050565b6001600160a01b03831661261a5760405162461bcd60e51b8152600401610cc090613bfc565b6001600160a01b0382166126405760405162461bcd60e51b8152600401610cc090613c41565b8060000361265457611025838360006124a2565b601154610100900460ff166126e7576001600160a01b0383166000908152601d602052604090205460ff16806126a257506001600160a01b0382166000908152601d602052604090205460ff165b6126e75760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610cc0565b6001600160a01b0383166000908152601d602052604090205460ff168061272657506001600160a01b0382166000908152601d602052604090205460ff165b8061273a5750600c54600160a01b900460ff165b156128435761274a8383836124a2565b6009546001600160a01b031663e30443bc8461276581611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127ab57600080fd5b505af11580156127bf573d6000803e3d6000fd5b50506009546001600160a01b0316915063e30443bc9050836127e081611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b50505050505050565b60115460ff1615612b25576005546001600160a01b0384811691161480159061287a57506005546001600160a01b03838116911614155b801561288e57506001600160a01b03821615155b80156128a557506001600160a01b03821661dead14155b80156128ca57506001600160a01b0383166000908152601d602052604090205460ff16155b80156128ef57506001600160a01b0382166000908152601d602052604090205460ff16155b15612b25576001600160a01b0383166000908152601f602052604090205460ff16801561293557506001600160a01b0382166000908152601e602052604090205460ff16155b156129fe5760065481111561299a5760405162461bcd60e51b815260206004820152602560248201527f427579207472616e7366657220616d74206578636565647320746865206d617860448201526410313abc9760d91b6064820152608401610cc0565b6008546129a683611447565b6129b09083613a62565b11156129f95760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b612b25565b6001600160a01b0382166000908152601f602052604090205460ff168015612a3f57506001600160a01b0383166000908152601e602052604090205460ff16155b15612aa6576007548111156129f95760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d74206578636565647320746865206d616044820152663c1039b2b6361760c91b6064820152608401610cc0565b6001600160a01b0382166000908152601e602052604090205460ff16612b2557600854612ad283611447565b612adc9083613a62565b1115612b255760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610cc0565b6000612b3030611447565b600d5490915081108015908190612b4f575060115462010000900460ff165b8015612b655750600c54600160a01b900460ff16155b8015612b8957506001600160a01b0384166000908152601f602052604090205460ff165b15612bb757600c805460ff60a01b1916600160a01b179055612ba9613003565b600c805460ff60a01b191690555b6001600160a01b0385166000908152601d602052604090205460019060ff1680612bf957506001600160a01b0385166000908152601d602052604090205460ff165b15612c02575060005b60008115612efb5760105443108015612c3357506001600160a01b0387166000908152601f602052604090205460ff165b8015612c5857506001600160a01b0386166000908152601f602052604090205460ff16155b8015612c7d57506001600160a01b0386166000908152601d602052604090205460ff16155b8015612c8b57506000601254115b15612d4257612710612c9f866126ac613b14565b612ca99190613b2b565b905060125460135482612cbc9190613b14565b612cc69190613b2b565b601b6000828254612cd79190613a62565b9091555050601254601454612cec9083613b14565b612cf69190613b2b565b601a6000828254612d079190613a62565b9091555050601254601554612d1c9083613b14565b612d269190613b2b565b601c6000828254612d379190613a62565b90915550612edd9050565b6001600160a01b0386166000908152601f602052604090205460ff168015612d6c57506000601654115b15612dff5761271060165486612d829190613b14565b612d8c9190613b2b565b905060165460185482612d9f9190613b14565b612da99190613b2b565b601b6000828254612dba9190613a62565b9091555050601654601754612dcf9083613b14565b612dd99190613b2b565b601a6000828254612dea9190613a62565b9091555050601654601954612d1c9083613b14565b6001600160a01b0387166000908152601f602052604090205460ff168015612e2957506000601254115b15612edd5761271060125486612e3f9190613b14565b612e499190613b2b565b905060125460145482612e5c9190613b14565b612e669190613b2b565b601a6000828254612e779190613a62565b9091555050601254601354612e8c9083613b14565b612e969190613b2b565b601b6000828254612ea79190613a62565b9091555050601254601554612ebc9083613b14565b612ec69190613b2b565b601c6000828254612ed79190613a62565b90915550505b8015612eee57612eee8730836124a2565b612ef88186613c84565b94505b612f068787876124a2565b6009546001600160a01b031663e30443bc88612f2181611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6757600080fd5b505af1158015612f7b573d6000803e3d6000fd5b50506009546001600160a01b0316915063e30443bc905087612f9c81611447565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612fe257600080fd5b505af1158015612ff6573d6000803e3d6000fd5b5050505050505050505050565b600061300e30611447565b90506000601c54601a54601b546130259190613a62565b61302f9190613a62565b905081158061303c575080155b15613045575050565b600d54613053906028613b14565b82111561306b57600d54613068906028613b14565b91505b601b541561312e57600081601b54846130849190613b14565b61308e9190613b2b565b600a549091506130a99030906001600160a01b0316836124a2565b600a60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156130f957600080fd5b505af192505050801561310a575060015b506131158184613c84565b9250601b54826131259190613c84565b6000601b559150505b811561322857600061313f836132e1565b601c54156131bc5760008247601c546131589190613b14565b6131629190613b2b565b6009546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146131b0576040519150601f19603f3d011682016040523d82523d6000602084013e6131b5565b606091505b5090925050505b601a541561321c57600e546040516001600160a01b03909116904790600081818185875af1925050503d8060008114613211576040519150601f19603f3d011682016040523d82523d6000602084013e613216565b606091505b50909150505b506000601a819055601c555b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611025908490613466565b6001600160a01b0382166000818152601e6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061331657613316613aaf565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b89190613c97565b816001815181106133cb576133cb613aaf565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac94790613430908590600090869030904290600401613cb4565b600060405180830381600087803b15801561344a57600080fd5b505af115801561345e573d6000803e3d6000fd5b505050505050565b60006134bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135389092919063ffffffff16565b80519091501561102557808060200190518101906134d99190613af7565b6110255760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cc0565b6060613547848460008561354f565b949350505050565b6060824710156135b05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cc0565b600080866001600160a01b031685876040516135cc9190613d25565b60006040518083038185875af1925050503d8060008114613609576040519150601f19603f3d011682016040523d82523d6000602084013e61360e565b606091505b509150915061361f8783838761362a565b979650505050505050565b60608315613699578251600003613692576001600160a01b0385163b6136925760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cc0565b5081613547565b61354783838151156136ae5781518083602001fd5b8060405162461bcd60e51b8152600401610cc09190613718565b6000806000606084860312156136dd57600080fd5b505081359360208301359350604090920135919050565b60005b8381101561370f5781810151838201526020016136f7565b50506000910152565b60208152600082518060208401526137378160408501602087016136f4565b601f01601f19169190910160400192915050565b6001600160a01b038116811461128257600080fd5b6000806040838503121561377357600080fd5b823561377e8161374b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137cb576137cb61378c565b604052919050565b600067ffffffffffffffff8211156137ed576137ed61378c565b5060051b60200190565b600082601f83011261380857600080fd5b8135602061381d613818836137d3565b6137a2565b82815260059290921b8401810191818101908684111561383c57600080fd5b8286015b848110156138575780358352918301918301613840565b509695505050505050565b6000806040838503121561387557600080fd5b823567ffffffffffffffff8082111561388d57600080fd5b818501915085601f8301126138a157600080fd5b813560206138b1613818836137d3565b82815260059290921b840181019181810190898411156138d057600080fd5b948201945b838610156138f75785356138e88161374b565b825294820194908201906138d5565b9650508601359250508082111561390d57600080fd5b5061391a858286016137f7565b9150509250929050565b60008060006060848603121561393957600080fd5b83356139448161374b565b925060208401356139548161374b565b929592945050506040919091013590565b60006020828403121561397757600080fd5b81356139828161374b565b9392505050565b801515811461128257600080fd5b600080604083850312156139aa57600080fd5b82356139b58161374b565b915060208301356139c581613989565b809150509250929050565b6000602082840312156139e257600080fd5b5035919050565b600080604083850312156139fc57600080fd5b8235613a078161374b565b915060208301356139c58161374b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e2657610e26613a4c565b600181811c90821680613a8957607f821691505b602082108103613aa957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201613ad757613ad7613a4c565b5060010190565b600060208284031215613af057600080fd5b5051919050565b600060208284031215613b0957600080fd5b815161398281613989565b8082028115828204841417610e2657610e26613a4c565b600082613b4857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f43616e6e6f7420736574206d61782073656c6c20616d74206c6f776572207468604082015264616e20312560d81b606082015260800190565b600080600080600080600080610100898b031215613baf57600080fd5b8851613bba8161374b565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610e2657610e26613a4c565b600060208284031215613ca957600080fd5b81516139828161374b565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613d045784516001600160a01b031683529383019391830191600101613cdf565b50506001600160a01b03969096166060850152505050608001529392505050565b60008251613d378184602087016136f4565b919091019291505056fea26469706673582212206b5daf8b7184999a75aeda975c250f478a77222304e75ae46c5770a8483f037c64736f6c63430008130033

Deployed Bytecode Sourcemap

39182:18174:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39449:25;;;;;;;;;;-1:-1:-1;39449:25:0;;;;-1:-1:-1;;;;;39449:25:0;;;;;;-1:-1:-1;;;;;192:32:1;;;174:51;;162:2;147:18;39449:25:0;;;;;;;;47358:432;;;;;;;;;;-1:-1:-1;47358:432:0;;;;;:::i;:::-;;:::i;:::-;;8562:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39375:37::-;;;;;;;;;;;;;;;9470:163;;;;;;;;;;-1:-1:-1;9470:163:0;;;;;:::i;:::-;;:::i;:::-;;;2061:14:1;;2054:22;2036:41;;2024:2;2009:18;9470:163:0;1896:187:1;39784:31:0;;;;;;;;;;-1:-1:-1;39784:31:0;;;;;;;;;;;8883:108;;;;;;;;;;-1:-1:-1;8971:12:0;;8883:108;;;2234:25:1;;;2222:2;2207:18;8883:108:0;2088:177:1;40244:33:0;;;;;;;;;;;;;;;;39746:31;;;;;;;;;;-1:-1:-1;39746:31:0;;;;;;;;40204:33;;;;;;;;;;;;;;;;45687:520;;;;;;;;;;-1:-1:-1;45687:520:0;;;;;:::i;:::-;;:::i;9641:443::-;;;;;;;;;;-1:-1:-1;9641:443:0;;;;;:::i;:::-;;:::i;39328:38::-;;;;;;;;;;-1:-1:-1;39328:38:0;;;;-1:-1:-1;;;;;39328:38:0;;;48233:141;;;;;;;;;;;;;:::i;8782:93::-;;;;;;;;;;-1:-1:-1;8782:93:0;;8865:2;5600:36:1;;5588:2;5573:18;8782:93:0;5458:184:1;43927:130:0;;;;;;;;;;-1:-1:-1;43927:130:0;;;;;:::i;:::-;;:::i;39984:30::-;;;;;;;;;;;;;;;;39260:25;;;;;;;;;;;;;;;;10092:215;;;;;;;;;;-1:-1:-1;10092:215:0;;;;;:::i;:::-;;:::i;39419:21::-;;;;;;;;;;-1:-1:-1;39419:21:0;;;;-1:-1:-1;;;;;39419:21:0;;;40021:27;;;;;;;;;;;;;;;;49332:97;;;;;;;;;;;;;:::i;56089:306::-;;;;;;;;;;;;;:::i;57196:120::-;;;;;;;;;;-1:-1:-1;57290:18:0;;57275:12;:33;57196:120;;39914:26;;;;;;;;;;;;;;;;39482:30;;;;;;;;;;-1:-1:-1;39482:30:0;;;;-1:-1:-1;;;;;39482:30:0;;;49571:141;;;;;;;;;;;;;:::i;48534:134::-;;;;;;;;;;-1:-1:-1;48534:134:0;;;;;:::i;:::-;;:::i;40129:31::-;;;;;;;;;;;;;;;;39822;;;;;;;;;;-1:-1:-1;39822:31:0;;;;;;;;;;;8999:127;;;;;;;;;;-1:-1:-1;8999:127:0;;;;;:::i;:::-;;:::i;12475:150::-;;;;;;;;;;;;;:::i;49724:119::-;;;;;;;;;;;;;:::i;44340:113::-;;;;;;;;;;;;;:::i;46219:257::-;;;;;;;;;;-1:-1:-1;46219:257:0;;;;;:::i;:::-;;:::i;56866:322::-;;;;;;;;;;-1:-1:-1;56866:322:0;;;;;:::i;:::-;;:::i;56403:457::-;;;;;;;;;;-1:-1:-1;56403:457:0;;;;;:::i;:::-;;:::i;44461:252::-;;;;;;;;;;-1:-1:-1;44461:252:0;;;;;:::i;:::-;;:::i;45139:324::-;;;;;;;;;;-1:-1:-1;45139:324:0;;;;;:::i;:::-;;:::i;12261:79::-;;;;;;;;;;-1:-1:-1;12326:6:0;;-1:-1:-1;;;;;12326:6:0;12261:79;;55766:271;;;;;;;;;;-1:-1:-1;55766:271:0;;;;;:::i;:::-;;:::i;8670:104::-;;;;;;;;;;;;;:::i;46484:437::-;;;;;;;;;;-1:-1:-1;46484:437:0;;;;;:::i;:::-;;:::i;39628:35::-;;;;;;;;;;;;;;;;39862:43;;;;;;;;;;;;39900:5;39862:43;;40284:30;;;;;;;;;;;;;;;;46929:421;;;;;;;;;;-1:-1:-1;46929:421:0;;;;;:::i;:::-;;:::i;48117:108::-;;;;;;;;;;;;;:::i;39947:30::-;;;;;;;;;;;;;;;;10315:413;;;;;;;;;;-1:-1:-1;10315:413:0;;;;;:::i;:::-;;:::i;39588:31::-;;;;;;;;;;-1:-1:-1;39588:31:0;;;;-1:-1:-1;;;;;39588:31:0;;;48382:147;;;;;;;;;;-1:-1:-1;48382:147:0;;;;;:::i;:::-;;:::i;9134:169::-;;;;;;;;;;-1:-1:-1;9134:169:0;;;;;:::i;:::-;;:::i;39229:24::-;;;;;;;;;;;;;;;;48676:318;;;;;;;;;;-1:-1:-1;48676:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7552:32:1;;;7534:51;;7616:2;7601:18;;7594:34;;;;7644:18;;;7637:34;;;;7702:2;7687:18;;7680:34;;;;7745:3;7730:19;;7723:35;7572:3;7774:19;;7767:35;7833:3;7818:19;;7811:35;7877:3;7862:19;;7855:35;7521:3;7506:19;48676:318:0;7195:701:1;40456:58:0;;;;;;;;;;-1:-1:-1;40456:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39292:27;;;;;;;;;;;;;;;;44162:126;;;;;;;;;;-1:-1:-1;44162:126:0;;;;;:::i;:::-;;:::i;47798:179::-;;;;;;;;;;-1:-1:-1;47798:179:0;;;;;:::i;:::-;;:::i;39549:30::-;;;;;;;;;;;;;;;;40386:61;;;;;;;;;;-1:-1:-1;40386:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44989:142;;;;;;;;;;;;;:::i;9311:151::-;;;;;;;;;;-1:-1:-1;9311:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;9427:18:0;;;9400:7;9427:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9311:151;40057:27;;;;;;;;;;;;;;;;44725:256;;;;;;;;;;-1:-1:-1;44725:256:0;;;;;:::i;:::-;;:::i;49437:126::-;;;;;;;;;;;;;:::i;40091:31::-;;;;;;;;;;;;;;;;47985:124;;;;;;;;;;-1:-1:-1;47985:124:0;;;;;:::i;:::-;;:::i;40167:28::-;;;;;;;;;;;;;;;;48999:325;;;;;;;;;;-1:-1:-1;48999:325:0;;;;;:::i;:::-;;:::i;12633:244::-;;;;;;;;;;-1:-1:-1;12633:244:0;;;;;:::i;:::-;;:::i;47358:432::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;;;;;;;;;47477:16:::1;:32:::0;;;47520:16:::1;:32:::0;;;47563:13:::1;:26:::0;;;47579:10;47615:35:::1;47539:13:::0;47496;47615:35:::1;:::i;:::-;:51;;;;:::i;:::-;47600:12;:66:::0;;;47701:4:::1;-1:-1:-1::0;47685:20:0::1;47677:61;;;::::0;-1:-1:-1;;;47677:61:0;;8726:2:1;47677:61:0::1;::::0;::::1;8708:21:1::0;8765:2;8745:18;;;8738:30;8804;8784:18;;;8777:58;8852:18;;47677:61:0::1;8524:352:1::0;47677:61:0::1;47754:28;47769:12;;47754:28;;;;2234:25:1::0;;2222:2;2207:18;;2088:177;47754:28:0::1;;;;;;;;47358:432:::0;;;:::o;8562:100::-;8616:13;8649:5;8642:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8562:100;:::o;9470:163::-;9550:4;9567:36;343:10;9590:7;9599:3;9567:8;:36::i;:::-;-1:-1:-1;9621:4:0;9470:163;;;;;:::o;45687:520::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;45826:12:::1;:19;45808:7;:14;:37;45800:80;;;::::0;-1:-1:-1;;;45800:80:0;;9468:2:1;45800:80:0::1;::::0;::::1;9450:21:1::0;9507:2;9487:18;;;9480:30;9546:32;9526:18;;;9519:60;9596:18;;45800:80:0::1;9266:354:1::0;45800:80:0::1;45916:3;45899:7;:14;:20;45891:87;;;::::0;-1:-1:-1;;;45891:87:0;;9827:2:1;45891:87:0::1;::::0;::::1;9809:21:1::0;9866:2;9846:18;;;9839:30;9905:34;9885:18;;;9878:62;-1:-1:-1;;;9956:18:1;;;9949:52;10018:19;;45891:87:0::1;9625:418:1::0;45891:87:0::1;45993:9;45989:211;46012:7;:14;46008:1;:18;45989:211;;;46047:56;46063:10;46075:7;46083:1;46075:10;;;;;;;;:::i;:::-;;;;;;;46087:12;46100:1;46087:15;;;;;;;;:::i;:::-;;;;;;;46047;:56::i;:::-;46118:15;::::0;46153:10;;-1:-1:-1;;;;;46118:15:0;;::::1;::::0;:26:::1;::::0;46153:7;;46161:1;;46153:10;::::1;;;;;:::i;:::-;;;;;;;46166:21;46176:7;46184:1;46176:10;;;;;;;;:::i;:::-;;;;;;;46166:9;:21::i;:::-;46118:70;::::0;-1:-1:-1;;;;;;46118:70:0::1;::::0;;;;;;-1:-1:-1;;;;;10388:32:1;;;46118:70:0::1;::::0;::::1;10370:51:1::0;10437:18;;;10430:34;10343:18;;46118:70:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46028:3;;;;;:::i;:::-;;;;45989:211;;;;45687:520:::0;;:::o;9641:443::-;9744:4;9761:33;9771:6;9779:9;9790:3;9761:9;:33::i;:::-;-1:-1:-1;;;;;9834:19:0;;9807:24;9834:19;;;:11;:19;;;;;;;;343:10;9834:33;;;;;;;;9886:23;;;;9878:73;;;;-1:-1:-1;;;9878:73:0;;10817:2:1;9878:73:0;;;10799:21:1;10856:2;10836:18;;;10829:30;10895:34;10875:18;;;10868:62;-1:-1:-1;;;10946:18:1;;;10939:35;10991:19;;9878:73:0;10615:401:1;9878:73:0;9987:54;9996:6;343:10;10037:3;10018:16;:22;9987:8;:54::i;:::-;-1:-1:-1;10072:4:0;;9641:443;-1:-1:-1;;;;9641:443:0:o;48233:141::-;48323:15;;:43;;;-1:-1:-1;;;48323:43:0;;;;48296:7;;-1:-1:-1;;;;;48323:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48316:50;;48233:141;:::o;43927:130::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;44004:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;44004:45:0;;-1:-1:-1;;;;;192:32:1;;;44004:45:0::1;::::0;::::1;174:51:1::0;44004:15:0;;::::1;::::0;:36:::1;::::0;147:18:1;;44004:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43927:130:::0;:::o;10092:215::-;343:10;10180:4;10229:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10229:34:0;;;;;;;;;;10180:4;;10197:80;;10220:7;;10229:47;;10266:10;;10229:47;:::i;:::-;10197:8;:80::i;49332:97::-;49363:15;;:58;;-1:-1:-1;;;49363:58:0;;49402:10;49363:58;;;11394:51:1;49363:15:0;11461:18:1;;;11454:50;-1:-1:-1;;;;;49363:15:0;;;;:30;;11367:18:1;;49363:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49332:97::o;56089:306::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;56180:15:::1;;56152:24;56170:4;56152:9;:24::i;:::-;:43;;56144:117;;;::::0;-1:-1:-1;;;56144:117:0;;11967:2:1;56144:117:0::1;::::0;::::1;11949:21:1::0;12006:2;11986:18;;;11979:30;12045:34;12025:18;;;12018:62;12116:31;12096:18;;;12089:59;12165:19;;56144:117:0::1;11765:425:1::0;56144:117:0::1;56272:8;:15:::0;;-1:-1:-1;;;;56272:15:0::1;-1:-1:-1::0;;;56272:15:0::1;::::0;;56298:10:::1;:8;:10::i;:::-;56319:8;:16:::0;;-1:-1:-1;;;;56319:16:0::1;::::0;;56351:36:::1;::::0;56371:15:::1;2234:25:1::0;;56351:36:0::1;::::0;2222:2:1;2207:18;56351:36:0::1;;;;;;;;56089:306::o:0;49571:141::-;49663:15;;:41;;;-1:-1:-1;;;49663:41:0;;;;49636:7;;-1:-1:-1;;;;;49663:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;48534:134;48625:15;;:38;;-1:-1:-1;;;48625:38:0;;-1:-1:-1;;;;;192:32:1;;;48625:38:0;;;174:51:1;48604:7:0;;48625:15;;:29;;147:18:1;;48625:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8999:127::-;-1:-1:-1;;;;;9100:18:0;9073:7;9100:18;;;;;;;;;;;;8999:127::o;12475:150::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;12568:6:::1;::::0;12547:40:::1;::::0;12584:1:::1;::::0;-1:-1:-1;;;;;12568:6:0::1;::::0;12547:40:::1;::::0;12584:1;;12547:40:::1;12598:6;:19:::0;;-1:-1:-1;;;;;;12598:19:0::1;::::0;;12475:150::o;49724:119::-;49805:15;;:30;;;-1:-1:-1;;;49805:30:0;;;;49778:7;;-1:-1:-1;;;;;49805:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;44340:113;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;44394:12:::1;:20:::0;;-1:-1:-1;;44394:20:0::1;::::0;;44430:15:::1;::::0;::::1;::::0;44409:5:::1;::::0;44430:15:::1;44340:113::o:0;46219:257::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;46315:4:::1;46311:104;;46353:6;::::0;-1:-1:-1;;;;;46353:6:0;;::::1;46343:16:::0;;::::1;::::0;46335:68:::1;;;::::0;-1:-1:-1;;;46335:68:0;;12397:2:1;46335:68:0::1;::::0;::::1;12379:21:1::0;12436:2;12416:18;;;12409:30;12475:34;12455:18;;;12448:62;-1:-1:-1;;;12526:18:1;;;12519:37;12573:19;;46335:68:0::1;12195:403:1::0;46335:68:0::1;-1:-1:-1::0;;;;;46425:36:0;;;::::1;;::::0;;;:28:::1;:36;::::0;;;;:43;;-1:-1:-1;;46425:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46219:257::o;56866:322::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;56954:11:::1;::::0;::::1;::::0;::::1;;;56953:12;56945:68;;;::::0;-1:-1:-1;;;56945:68:0;;12805:2:1;56945:68:0::1;::::0;::::1;12787:21:1::0;12844:2;12824:18;;;12817:30;12883:34;12863:18;;;12856:62;-1:-1:-1;;;12934:18:1;;;12927:41;12985:19;;56945:68:0::1;12603:407:1::0;56945:68:0::1;57024:11;:18:::0;;-1:-1:-1;;57053:18:0;;;;;57101:12:::1;57082:16;:31:::0;;;57145:35:::1;::::0;57164:16;;57145:35:::1;:::i;:::-;57124:18;:56:::0;-1:-1:-1;56866:322:0:o;56403:457::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56500:20:0;::::1;56492:59;;;::::0;-1:-1:-1;;;56492:59:0;;13217:2:1;56492:59:0::1;::::0;::::1;13199:21:1::0;13256:2;13236:18;;;13229:30;13295:28;13275:18;;;13268:56;13341:18;;56492:59:0::1;13015:350:1::0;56492:59:0::1;-1:-1:-1::0;;;;;56570:23:0;::::1;56588:4;56570:23;;::::0;:39:::1;;-1:-1:-1::0;56598:11:0::1;::::0;::::1;::::0;::::1;;;56597:12;56570:39;56562:80;;;::::0;-1:-1:-1;;;56562:80:0;;13572:2:1;56562:80:0::1;::::0;::::1;13554:21:1::0;13611:2;13591:18;;;13584:30;13650;13630:18;;;13623:58;13698:18;;56562:80:0::1;13370:352:1::0;56562:80:0::1;56680:39;::::0;-1:-1:-1;;;56680:39:0;;56713:4:::1;56680:39;::::0;::::1;174:51:1::0;56653:24:0::1;::::0;-1:-1:-1;;;;;56680:24:0;::::1;::::0;::::1;::::0;147:18:1;;56680:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56653:66;;56730:60;56760:6;56768:3;56773:16;56730:22;:60::i;:::-;56806:46;::::0;;-1:-1:-1;;;;;10388:32:1;;10370:51;;10452:2;10437:18;;10430:34;;;56806:46:0::1;::::0;10343:18:1;56806:46:0::1;10180:290:1::0;44461:252:0;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;44576:4:::1;44571:3;44551:13;8971:12:::0;;;8883:108;44551:13:::1;:17;::::0;44567:1:::1;44551:17;:::i;:::-;:23;;;;:::i;:::-;44550:30;;;;:::i;:::-;44540:6;:40;;44532:90;;;;-1:-1:-1::0;;;44532:90:0::1;;;;;;;:::i;:::-;44645:17;:6:::0;44655::::1;44645:17;:::i;:::-;44633:9;:29:::0;;;44678:27:::1;::::0;2234:25:1;;;44678:27:0::1;::::0;2222:2:1;2207:18;44678:27:0::1;;;;;;;;44461:252:::0;:::o;45139:324::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;45253:7:::1;45233:13;8971:12:::0;;;8883:108;45233:13:::1;:17;::::0;45249:1:::1;45233:17;:::i;:::-;:27;;;;:::i;:::-;45223:6;:37;;45215:101;;;::::0;-1:-1:-1;;;45215:101:0;;15009:2:1;45215:101:0::1;::::0;::::1;14991:21:1::0;15048:2;15028:18;;;15021:30;15087:34;15067:18;;;15060:62;-1:-1:-1;;;15138:18:1;;;15131:49;15197:19;;45215:101:0::1;14807:415:1::0;45215:101:0::1;45364:4;45344:13;8971:12:::0;;;8883:108;45344:13:::1;:17;::::0;45360:1:::1;45344:17;:::i;:::-;:24;;;;:::i;:::-;45334:6;:34;;45326:96;;;::::0;-1:-1:-1;;;45326:96:0;;15429:2:1;45326:96:0::1;::::0;::::1;15411:21:1::0;15468:2;15448:18;;;15441:30;15507:34;15487:18;;;15480:62;-1:-1:-1;;;15558:18:1;;;15551:47;15615:19;;45326:96:0::1;15227:413:1::0;45326:96:0::1;45432:15;:24:::0;45139:324::o;55766:271::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55860:31:0;::::1;55852:63;;;::::0;-1:-1:-1;;;55852:63:0;;15847:2:1;55852:63:0::1;::::0;::::1;15829:21:1::0;15886:2;15866:18;;;15859:30;-1:-1:-1;;;15905:18:1;;;15898:49;15964:18;;55852:63:0::1;15645:343:1::0;55852:63:0::1;55926:16;:45:::0;;-1:-1:-1;;;;;;55926:45:0::1;-1:-1:-1::0;;;;;55926:45:0;::::1;::::0;;::::1;::::0;;;55987:42:::1;::::0;::::1;::::0;-1:-1:-1;;55987:42:0::1;55766:271:::0;:::o;8670:104::-;8726:13;8759:7;8752:14;;;;;:::i;46484:437::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;46591:6:::1;::::0;-1:-1:-1;;;;;46583:14:0;;::::1;46591:6:::0;::::1;46583:14;;::::0;:23:::1;;;46601:5;46583:23;46575:93;;;::::0;-1:-1:-1;;;46575:93:0;;16195:2:1;46575:93:0::1;::::0;::::1;16177:21:1::0;16234:2;16214:18;;;16207:30;16273:34;16253:18;;;16246:62;16344:27;16324:18;;;16317:55;16389:19;;46575:93:0::1;15993:421:1::0;46575:93:0::1;-1:-1:-1::0;;;;;46679:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;:39;;-1:-1:-1;;46679:39:0::1;::::0;::::1;;;::::0;;46729::::1;46679:31:::0;:39;46729:26:::1;:39::i;:::-;46782:5;46779:79;;;46804:15;::::0;:42:::1;::::0;-1:-1:-1;;;46804:42:0;;-1:-1:-1;;;;;192:32:1;;;46804:42:0::1;::::0;::::1;174:51:1::0;46804:15:0;;::::1;::::0;:36:::1;::::0;147:18:1;;46804:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46779:79;46873:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;46873:40:0;::::1;::::0;::::1;::::0;;;::::1;46484:437:::0;;:::o;46929:421::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;47047:15:::1;:31:::0;;;47089:15:::1;:31:::0;;;47131:12:::1;:25:::0;;;47146:10;47181:33:::1;47107:13:::0;47065;47181:33:::1;:::i;:::-;:48;;;;:::i;:::-;47167:11;:62:::0;;;47263:4:::1;-1:-1:-1::0;47248:19:0::1;47240:60;;;::::0;-1:-1:-1;;;47240:60:0;;8726:2:1;47240:60:0::1;::::0;::::1;8708:21:1::0;8765:2;8745:18;;;8738:30;8804;8784:18;;;8777:58;8852:18;;47240:60:0::1;8524:352:1::0;47240:60:0::1;47316:26;47330:11;;47316:26;;;;2234:25:1::0;;2222:2;2207:18;;2088:177;48117:108:0;48190:15;;:27;;;-1:-1:-1;;;48190:27:0;;;;48163:7;;-1:-1:-1;;;;;48190:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;10315:413;343:10;10408:4;10452:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10452:34:0;;;;;;;;;;10505:35;;;;10497:85;;;;-1:-1:-1;;;10497:85:0;;16621:2:1;10497:85:0;;;16603:21:1;16660:2;16640:18;;;16633:30;16699:34;16679:18;;;16672:62;-1:-1:-1;;;16750:18:1;;;16743:35;16795:19;;10497:85:0;16419:401:1;10497:85:0;10618:67;343:10;10641:7;10669:15;10650:16;:34;10618:8;:67::i;:::-;-1:-1:-1;10716:4:0;;10315:413;-1:-1:-1;;;10315:413:0:o;48382:147::-;48475:15;;:47;;-1:-1:-1;;;48475:47:0;;-1:-1:-1;;;;;192:32:1;;;48475:47:0;;;174:51:1;48451:7:0;;48475:15;;:38;;147:18:1;;48475:47:0;14:217:1;9134:169:0;9217:4;9234:39;343:10;9258:9;9269:3;9234:9;:39::i;48676:318::-;48951:15;;:35;;-1:-1:-1;;;48951:35:0;;-1:-1:-1;;;;;192:32:1;;;48951:35:0;;;174:51:1;48772:7:0;;;;;;;;;;;;;;;;48951:15;;;:26;;147:18:1;;48951:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48944:42;;;;;;;;;;;;;;;;48676:318;;;;;;;;;:::o;44162:126::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;44237:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;44237:43:0;;-1:-1:-1;;;;;192:32:1;;;44237:43:0::1;::::0;::::1;174:51:1::0;44237:15:0;;::::1;::::0;:34:::1;::::0;147:18:1;;44237:43:0::1;14:217:1::0;47798:179:0;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47882:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;47882:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47936:33;;2036:41:1;;;47936:33:0::1;::::0;2009:18:1;47936:33:0::1;;;;;;;47798:179:::0;;:::o;44989:142::-;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;8971:12;;45046::::1;:28:::0;;;45090:33:::1;::::0;2234:25:1;;;45090:33:0::1;::::0;2222:2:1;2207:18;45090:33:0::1;2088:177:1::0;44725:256:0;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;44841:4:::1;44836:3;44816:13;8971:12:::0;;;8883:108;44816:13:::1;:17;::::0;44832:1:::1;44816:17;:::i;:::-;:23;;;;:::i;:::-;44815:30;;;;:::i;:::-;44805:6;:40;;44797:90;;;;-1:-1:-1::0;;;44797:90:0::1;;;;;;;:::i;:::-;44911:17;:6:::0;44921::::1;44911:17;:::i;:::-;44898:10;:30:::0;;;44944:29:::1;::::0;2234:25:1;;;44944:29:0::1;::::0;2222:2:1;2207:18;44944:29:0::1;2088:177:1::0;49437:126:0;49516:15;;:39;;;-1:-1:-1;;;49516:39:0;;;;49492:7;;-1:-1:-1;;;;;49516:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;47985:124;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;48059:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;48059:42:0;;::::1;::::0;::::1;2234:25:1::0;;;-1:-1:-1;;;;;48059:15:0;;::::1;::::0;:31:::1;::::0;2207:18:1;;48059:42:0::1;2088:177:1::0;48999:325:0;49276:15;;:40;;-1:-1:-1;;;49276:40:0;;;;;2234:25:1;;;49100:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49276:15:0;;;;:33;;2207:18:1;;49276:40:0;2088:177:1;12633:244:0;12388:6;;-1:-1:-1;;;;;12388:6:0;343:10;12388:22;12380:67;;;;-1:-1:-1;;;12380:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12722:22:0;::::1;12714:73;;;::::0;-1:-1:-1;;;12714:73:0;;17713:2:1;12714:73:0::1;::::0;::::1;17695:21:1::0;17752:2;17732:18;;;17725:30;17791:34;17771:18;;;17764:62;-1:-1:-1;;;17842:18:1;;;17835:36;17888:19;;12714:73:0::1;17511:402:1::0;12714:73:0::1;12824:6;::::0;12803:38:::1;::::0;-1:-1:-1;;;;;12803:38:0;;::::1;::::0;12824:6:::1;::::0;12803:38:::1;::::0;12824:6:::1;::::0;12803:38:::1;12852:6;:17:::0;;-1:-1:-1;;;;;;12852:17:0::1;-1:-1:-1::0;;;;;12852:17:0;;;::::1;::::0;;;::::1;::::0;;12633:244::o;11593:337::-;-1:-1:-1;;;;;11692:19:0;;11684:68;;;;-1:-1:-1;;;11684:68:0;;18120:2:1;11684:68:0;;;18102:21:1;18159:2;18139:18;;;18132:30;18198:34;18178:18;;;18171:62;-1:-1:-1;;;18249:18:1;;;18242:34;18293:19;;11684:68:0;17918:400:1;11684:68:0;-1:-1:-1;;;;;11771:21:0;;11763:68;;;;-1:-1:-1;;;11763:68:0;;18525:2:1;11763:68:0;;;18507:21:1;18564:2;18544:18;;;18537:30;18603:34;18583:18;;;18576:62;-1:-1:-1;;;18654:18:1;;;18647:32;18696:19;;11763:68:0;18323:398:1;11763:68:0;-1:-1:-1;;;;;11844:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:33;;;11893:29;;2234:25:1;;;11893:29:0;;2207:18:1;11893:29:0;;;;;;;11593:337;;;:::o;10736:562::-;-1:-1:-1;;;;;10839:20:0;;10831:70;;;;-1:-1:-1;;;10831:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10920:23:0;;10912:71;;;;-1:-1:-1;;;10912:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11020:17:0;;10996:21;11020:17;;;;;;;;;;;11056:20;;;;11048:68;;;;-1:-1:-1;;;11048:68:0;;19738:2:1;11048:68:0;;;19720:21:1;19777:2;19757:18;;;19750:30;19816:34;19796:18;;;19789:62;-1:-1:-1;;;19867:18:1;;;19860:33;19910:19;;11048:68:0;19536:399:1;11048:68:0;-1:-1:-1;;;;;11152:17:0;;;:9;:17;;;;;;;;;;;11172:19;;;11152:39;;11213:20;;;;;;;;:27;;11188:3;;11152:9;11213:27;;11188:3;;11213:27;:::i;:::-;;;;;;;;11275:9;-1:-1:-1;;;;;11258:32:0;11267:6;-1:-1:-1;;;;;11258:32:0;;11286:3;11258:32;;;;2234:25:1;;2222:2;2207:18;;2088:177;11258:32:0;;;;;;;;10820:478;10736:562;;;:::o;49855:3987::-;-1:-1:-1;;;;;49952:18:0;;49944:68;;;;-1:-1:-1;;;49944:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50031:16:0;;50023:64;;;;-1:-1:-1;;;50023:64:0;;;;;;;:::i;:::-;50101:3;50108:1;50101:8;50098:88;;50125:28;50141:4;50147:2;50151:1;50125:15;:28::i;50098:88::-;50210:11;;;;;;;50206:128;;-1:-1:-1;;;;;50245:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;50273:22:0;;;;;;:18;:22;;;;;;;;50245:50;50237:85;;;;-1:-1:-1;;;50237:85:0;;20142:2:1;50237:85:0;;;20124:21:1;20181:2;20161:18;;;20154:30;-1:-1:-1;;;20200:18:1;;;20193:52;20262:18;;50237:85:0;19940:346:1;50237:85:0;-1:-1:-1;;;;;50349:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;50377:22:0;;;;;;:18;:22;;;;;;;;50349:50;:62;;;-1:-1:-1;50403:8:0;;-1:-1:-1;;;50403:8:0;;;;50349:62;50346:286;;;50427:30;50443:4;50449:2;50453:3;50427:15;:30::i;:::-;50472:15;;-1:-1:-1;;;;;50472:15:0;:26;50507:4;50514:15;50507:4;50514:9;:15::i;:::-;50472:58;;-1:-1:-1;;;;;;50472:58:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;50472:58:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;50472:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50545:15:0;;-1:-1:-1;;;;;50545:15:0;;-1:-1:-1;50545:26:0;;-1:-1:-1;50580:2:0;50585:13;50580:2;50585:9;:13::i;:::-;50545:54;;-1:-1:-1;;;;;;50545:54:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;50545:54:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;50545:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49855:3987;;;:::o;50346:286::-;50655:12;;;;50652:936;;;12326:6;;-1:-1:-1;;;;;50687:15:0;;;12326:6;;50687:15;;;;:32;;-1:-1:-1;12326:6:0;;-1:-1:-1;;;;;50706:13:0;;;12326:6;;50706:13;;50687:32;:52;;;;-1:-1:-1;;;;;;50723:16:0;;;;50687:52;:77;;;;-1:-1:-1;;;;;;50743:21:0;;50757:6;50743:21;;50687:77;:106;;;;-1:-1:-1;;;;;;50769:24:0;;;;;;:18;:24;;;;;;;;50768:25;50687:106;:133;;;;-1:-1:-1;;;;;;50798:22:0;;;;;;:18;:22;;;;;;;;50797:23;50687:133;50683:894;;;-1:-1:-1;;;;;50872:31:0;;;;;;:25;:31;;;;;;;;:68;;;;-1:-1:-1;;;;;;50908:32:0;;;;;;:28;:32;;;;;;;;50907:33;50872:68;50868:694;;;50980:9;;50973:3;:16;;50965:66;;;;-1:-1:-1;;;50965:66:0;;20493:2:1;50965:66:0;;;20475:21:1;20532:2;20512:18;;;20505:30;20571:34;20551:18;;;20544:62;-1:-1:-1;;;20622:18:1;;;20615:35;20667:19;;50965:66:0;20291:401:1;50965:66:0;51085:12;;51068:13;51078:2;51068:9;:13::i;:::-;51062:19;;:3;:19;:::i;:::-;:35;;51054:72;;;;-1:-1:-1;;;51054:72:0;;20899:2:1;51054:72:0;;;20881:21:1;20938:2;20918:18;;;20911:30;-1:-1:-1;;;20957:18:1;;;20950:54;21021:18;;51054:72:0;20697:348:1;51054:72:0;50868:694;;;-1:-1:-1;;;;;51203:29:0;;;;;;:25;:29;;;;;;;;:68;;;;-1:-1:-1;;;;;;51237:34:0;;;;;;:28;:34;;;;;;;;51236:35;51203:68;51199:363;;;51311:10;;51304:3;:17;;51296:69;;;;-1:-1:-1;;;51296:69:0;;21252:2:1;51296:69:0;;;21234:21:1;21291:2;21271:18;;;21264:30;21330:34;21310:18;;;21303:62;-1:-1:-1;;;21381:18:1;;;21374:37;21428:19;;51296:69:0;21050:403:1;51199:363:0;-1:-1:-1;;;;;51414:32:0;;;;;;:28;:32;;;;;;;;51409:153;;51501:12;;51484:13;51494:2;51484:9;:13::i;:::-;51478:19;;:3;:19;:::i;:::-;:35;;51470:72;;;;-1:-1:-1;;;51470:72:0;;20899:2:1;51470:72:0;;;20881:21:1;20938:2;20918:18;;;20911:30;-1:-1:-1;;;20957:18:1;;;20950:54;21021:18;;51470:72:0;20697:348:1;51470:72:0;51600:28;51631:24;51649:4;51631:9;:24::i;:::-;51715:15;;51600:55;;-1:-1:-1;51691:39:0;;;;;;;51746:22;;-1:-1:-1;51757:11:0;;;;;;;51746:22;:35;;;;-1:-1:-1;51773:8:0;;-1:-1:-1;;;51773:8:0;;;;51772:9;51746:35;:68;;;;-1:-1:-1;;;;;;51785:29:0;;;;;;:25;:29;;;;;;;;51746:68;51743:171;;;51831:8;:15;;-1:-1:-1;;;;51831:15:0;-1:-1:-1;;;51831:15:0;;;51861:10;:8;:10::i;:::-;51886:8;:16;;-1:-1:-1;;;;51886:16:0;;;51743:171;-1:-1:-1;;;;;52044:24:0;;51926:12;52044:24;;;:18;:24;;;;;;51941:4;;52044:24;;;:50;;-1:-1:-1;;;;;;52072:22:0;;;;;;:18;:22;;;;;;;;52044:50;52041:97;;;-1:-1:-1;52121:5:0;52041:97;52158:11;52260:7;52257:1399;;;57290:18;;57275:12;:33;52288:60;;;;-1:-1:-1;;;;;;52317:31:0;;;;;;:25;:31;;;;;;;;52288:60;:94;;;;-1:-1:-1;;;;;;52353:29:0;;;;;;:25;:29;;;;;;;;52352:30;52288:94;:121;;;;-1:-1:-1;;;;;;52387:22:0;;;;;;:18;:22;;;;;;;;52386:23;52288:121;:140;;;;;52427:1;52413:11;;:15;52288:140;52285:1208;;;39900:5;52454:10;:3;52460:4;52454:10;:::i;:::-;:24;;;;:::i;:::-;52448:30;;52540:11;;52522:15;;52516:3;:21;;;;:::i;:::-;:35;;;;:::i;:::-;52494:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;52616:11:0;;52598:15;;52592:21;;:3;:21;:::i;:::-;:35;;;;:::i;:::-;52570:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;52686:11:0;;52671:12;;52665:18;;:3;:18;:::i;:::-;:32;;;;:::i;:::-;52646:15;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;52285:1208:0;;-1:-1:-1;52285:1208:0;;-1:-1:-1;;;;;52760:29:0;;;;;;:25;:29;;;;;;;;:49;;;;;52808:1;52793:12;;:16;52760:49;52756:737;;;39900:5;52841:12;;52835:3;:18;;;;:::i;:::-;:32;;;;:::i;:::-;52829:38;;52933:12;;52914:16;;52908:3;:22;;;;:::i;:::-;:37;;;;:::i;:::-;52886:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;53011:12:0;;52992:16;;52986:22;;:3;:22;:::i;:::-;:37;;;;:::i;:::-;52964:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;53083:12:0;;53067:13;;53061:19;;:3;:19;:::i;52756:737::-;-1:-1:-1;;;;;53156:31:0;;;;;;:25;:31;;;;;;;;:50;;;;;53205:1;53191:11;;:15;53156:50;53153:340;;;39900:5;53236:11;;53230:3;:17;;;;:::i;:::-;:31;;;;:::i;:::-;53224:37;;53323:11;;53305:15;;53299:3;:21;;;;:::i;:::-;:35;;;;:::i;:::-;53277:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;53396:11:0;;53378:15;;53372:21;;:3;:21;:::i;:::-;:35;;;;:::i;:::-;53350:18;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;53466:11:0;;53451:12;;53445:18;;:3;:18;:::i;:::-;:32;;;;:::i;:::-;53426:15;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;53153:340:0;53524:7;;53521:91;;53555:41;53571:4;53585;53592:3;53555:15;:41::i;:::-;53634:10;53641:3;53634:10;;:::i;:::-;;;52257:1399;53668:30;53684:4;53690:2;53694:3;53668:15;:30::i;:::-;53711:15;;-1:-1:-1;;;;;53711:15:0;:26;53746:4;53753:15;53746:4;53753:9;:15::i;:::-;53711:58;;-1:-1:-1;;;;;;53711:58:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;53711:58:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;53711:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53780:15:0;;-1:-1:-1;;;;;53780:15:0;;-1:-1:-1;53780:26:0;;-1:-1:-1;53815:2:0;53820:13;53815:2;53820:9;:13::i;:::-;53780:54;;-1:-1:-1;;;;;;53780:54:0;;;;;;;-1:-1:-1;;;;;10388:32:1;;;53780:54:0;;;10370:51:1;10437:18;;;10430:34;10343:18;;53780:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49931:3911;;;;49855:3987;;;:::o;54352:1406::-;54393:23;54419:24;54437:4;54419:9;:24::i;:::-;54393:50;;54454:25;54524:15;;54503:18;;54482;;:39;;;;:::i;:::-;:57;;;;:::i;:::-;54454:85;-1:-1:-1;54563:20:0;;;:46;;-1:-1:-1;54587:22:0;;54563:46;54560:60;;;54612:7;;54352:1406::o;54560:60::-;54653:15;;:20;;54671:2;54653:20;:::i;:::-;54635:15;:38;54632:107;;;54707:15;;:20;;54725:2;54707:20;:::i;:::-;54689:38;;54632:107;54762:18;;:22;54759:396;;54800:23;54865:17;54844:18;;54826:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;54928:6;;54800:82;;-1:-1:-1;54897:55:0;;54921:4;;-1:-1:-1;;;;;54928:6:0;54800:82;54897:15;:55::i;:::-;54979:6;;;;;;;;;-1:-1:-1;;;;;54979:6:0;-1:-1:-1;;;;;54971:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54967:37;55018:34;55037:15;55018:34;;:::i;:::-;;;55088:18;;55067:39;;;;;:::i;:::-;55142:1;55121:18;:22;55067:39;-1:-1:-1;;54759:396:0;55178:19;;55175:576;;55213:12;55240:32;55256:15;55240;:32::i;:::-;55290:15;;:19;55287:226;;55329:20;55394:17;55370:21;55352:15;;:39;;;;:::i;:::-;:59;;;;:::i;:::-;55451:15;;55443:54;;55329:82;;-1:-1:-1;;;;;;55451:15:0;;55329:82;;55443:54;;;;55329:82;55451:15;55443:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55430:67:0;;-1:-1:-1;;;55287:226:0;55532:18;;:22;55529:138;;55595:16;;55587:64;;-1:-1:-1;;;;;55595:16:0;;;;55625:21;;55587:64;;;;55625:21;55595:16;55587:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55574:77:0;;-1:-1:-1;;55529:138:0;-1:-1:-1;55704:1:0;55683:18;:22;;;55720:15;:19;55175:576;54380:1378;;54352:1406::o;6765:211::-;6909:58;;;-1:-1:-1;;;;;10388:32:1;;6909:58:0;;;10370:51:1;10437:18;;;;10430:34;;;6909:58:0;;;;;;;;;;10343:18:1;;;;6909:58:0;;;;;;;;-1:-1:-1;;;;;6909:58:0;-1:-1:-1;;;6909:58:0;;;6882:86;;6902:5;;6882:19;:86::i;45475:204::-;-1:-1:-1;;;;;45563:36:0;;;;;;:28;:36;;;;;;;;;:49;;-1:-1:-1;;45563:49:0;;;;;;;;;;45628:43;;11394:51:1;;;11461:18;;;11454:50;45628:43:0;;11367:18:1;45628:43:0;;;;;;;45475:204;;:::o;53850:494::-;53998:16;;;54012:1;53998:16;;;;;;;;53974:21;;53998:16;;;;;;;;;;-1:-1:-1;53998:16:0;53974:40;;54043:4;54025;54030:1;54025:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;54025:23:0;;;-1:-1:-1;;;;;54025:23:0;;;;;54069:9;-1:-1:-1;;;;;54069:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54059:4;54064:1;54059:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54059:26:0;;;:7;;;;;;;;;:26;54124:212;;-1:-1:-1;;;54124:212:0;;:9;:60;;;;;;:212;;54199:8;;54222:1;;54263:4;;54290;;54310:15;;54124:212;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53901:443;53850:494;:::o;6984:333::-;7065:23;7091:69;7119:4;7091:69;;;;;;;;;;;;;;;;;7099:5;-1:-1:-1;;;;;7091:27:0;;;:69;;;;;:::i;:::-;7175:17;;7065:95;;-1:-1:-1;7175:21:0;7171:139;;7232:10;7221:30;;;;;;;;;;;;:::i;:::-;7213:85;;;;-1:-1:-1;;;7213:85:0;;23533:2:1;7213:85:0;;;23515:21:1;23572:2;23552:18;;;23545:30;23611:34;23591:18;;;23584:62;-1:-1:-1;;;23662:18:1;;;23655:40;23712:19;;7213:85:0;23331:406:1;1268:229:0;1405:12;1437:52;1459:6;1467:4;1473:1;1476:12;1437:21;:52::i;:::-;1430:59;1268:229;-1:-1:-1;;;;1268:229:0:o;2388:455::-;2558:12;2616:5;2591:21;:30;;2583:81;;;;-1:-1:-1;;;2583:81:0;;23944:2:1;2583:81:0;;;23926:21:1;23983:2;23963:18;;;23956:30;24022:34;24002:18;;;23995:62;-1:-1:-1;;;24073:18:1;;;24066:36;24119:19;;2583:81:0;23742:402:1;2583:81:0;2676:12;2690:23;2717:6;-1:-1:-1;;;;;2717:11:0;2736:5;2743:4;2717:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2675:73;;;;2766:69;2793:6;2801:7;2810:10;2822:12;2766:26;:69::i;:::-;2759:76;2388:455;-1:-1:-1;;;;;;;2388:455:0:o;4961:644::-;5146:12;5175:7;5171:427;;;5203:10;:17;5224:1;5203:22;5199:290;;-1:-1:-1;;;;;718:19:0;;;5413:60;;;;-1:-1:-1;;;5413:60:0;;24643:2:1;5413:60:0;;;24625:21:1;24682:2;24662:18;;;24655:30;24721:31;24701:18;;;24694:59;24770:18;;5413:60:0;24441:353:1;5413:60:0;-1:-1:-1;5510:10:0;5503:17;;5171:427;5553:33;5561:10;5573:12;6308:17;;:21;6304:388;;6540:10;6534:17;6597:15;6584:10;6580:2;6576:19;6569:44;6304:388;6667:12;6660:20;;-1:-1:-1;;;6660:20:0;;;;;;;;:::i;236:316:1:-;313:6;321;329;382:2;370:9;361:7;357:23;353:32;350:52;;;398:1;395;388:12;350:52;-1:-1:-1;;421:23:1;;;491:2;476:18;;463:32;;-1:-1:-1;542:2:1;527:18;;;514:32;;236:316;-1:-1:-1;236:316:1:o;557:250::-;642:1;652:113;666:6;663:1;660:13;652:113;;;742:11;;;736:18;723:11;;;716:39;688:2;681:10;652:113;;;-1:-1:-1;;799:1:1;781:16;;774:27;557:250::o;812:396::-;961:2;950:9;943:21;924:4;993:6;987:13;1036:6;1031:2;1020:9;1016:18;1009:34;1052:79;1124:6;1119:2;1108:9;1104:18;1099:2;1091:6;1087:15;1052:79;:::i;:::-;1192:2;1171:15;-1:-1:-1;;1167:29:1;1152:45;;;;1199:2;1148:54;;812:396;-1:-1:-1;;812:396:1:o;1440:131::-;-1:-1:-1;;;;;1515:31:1;;1505:42;;1495:70;;1561:1;1558;1551:12;1576:315;1644:6;1652;1705:2;1693:9;1684:7;1680:23;1676:32;1673:52;;;1721:1;1718;1711:12;1673:52;1760:9;1747:23;1779:31;1804:5;1779:31;:::i;:::-;1829:5;1881:2;1866:18;;;;1853:32;;-1:-1:-1;;;1576:315:1:o;2270:127::-;2331:10;2326:3;2322:20;2319:1;2312:31;2362:4;2359:1;2352:15;2386:4;2383:1;2376:15;2402:275;2473:2;2467:9;2538:2;2519:13;;-1:-1:-1;;2515:27:1;2503:40;;2573:18;2558:34;;2594:22;;;2555:62;2552:88;;;2620:18;;:::i;:::-;2656:2;2649:22;2402:275;;-1:-1:-1;2402:275:1:o;2682:183::-;2742:4;2775:18;2767:6;2764:30;2761:56;;;2797:18;;:::i;:::-;-1:-1:-1;2842:1:1;2838:14;2854:4;2834:25;;2682:183::o;2870:662::-;2924:5;2977:3;2970:4;2962:6;2958:17;2954:27;2944:55;;2995:1;2992;2985:12;2944:55;3031:6;3018:20;3057:4;3081:60;3097:43;3137:2;3097:43;:::i;:::-;3081:60;:::i;:::-;3175:15;;;3261:1;3257:10;;;;3245:23;;3241:32;;;3206:12;;;;3285:15;;;3282:35;;;3313:1;3310;3303:12;3282:35;3349:2;3341:6;3337:15;3361:142;3377:6;3372:3;3369:15;3361:142;;;3443:17;;3431:30;;3481:12;;;;3394;;3361:142;;;-1:-1:-1;3521:5:1;2870:662;-1:-1:-1;;;;;;2870:662:1:o;3537:1215::-;3655:6;3663;3716:2;3704:9;3695:7;3691:23;3687:32;3684:52;;;3732:1;3729;3722:12;3684:52;3772:9;3759:23;3801:18;3842:2;3834:6;3831:14;3828:34;;;3858:1;3855;3848:12;3828:34;3896:6;3885:9;3881:22;3871:32;;3941:7;3934:4;3930:2;3926:13;3922:27;3912:55;;3963:1;3960;3953:12;3912:55;3999:2;3986:16;4021:4;4045:60;4061:43;4101:2;4061:43;:::i;4045:60::-;4139:15;;;4221:1;4217:10;;;;4209:19;;4205:28;;;4170:12;;;;4245:19;;;4242:39;;;4277:1;4274;4267:12;4242:39;4301:11;;;;4321:217;4337:6;4332:3;4329:15;4321:217;;;4417:3;4404:17;4434:31;4459:5;4434:31;:::i;:::-;4478:18;;4354:12;;;;4516;;;;4321:217;;;4557:5;-1:-1:-1;;4600:18:1;;4587:32;;-1:-1:-1;;4631:16:1;;;4628:36;;;4660:1;4657;4650:12;4628:36;;4683:63;4738:7;4727:8;4716:9;4712:24;4683:63;:::i;:::-;4673:73;;;3537:1215;;;;;:::o;4757:456::-;4834:6;4842;4850;4903:2;4891:9;4882:7;4878:23;4874:32;4871:52;;;4919:1;4916;4909:12;4871:52;4958:9;4945:23;4977:31;5002:5;4977:31;:::i;:::-;5027:5;-1:-1:-1;5084:2:1;5069:18;;5056:32;5097:33;5056:32;5097:33;:::i;:::-;4757:456;;5149:7;;-1:-1:-1;;;5203:2:1;5188:18;;;;5175:32;;4757:456::o;5647:247::-;5706:6;5759:2;5747:9;5738:7;5734:23;5730:32;5727:52;;;5775:1;5772;5765:12;5727:52;5814:9;5801:23;5833:31;5858:5;5833:31;:::i;:::-;5883:5;5647:247;-1:-1:-1;;;5647:247:1:o;6107:118::-;6193:5;6186:13;6179:21;6172:5;6169:32;6159:60;;6215:1;6212;6205:12;6230:382;6295:6;6303;6356:2;6344:9;6335:7;6331:23;6327:32;6324:52;;;6372:1;6369;6362:12;6324:52;6411:9;6398:23;6430:31;6455:5;6430:31;:::i;:::-;6480:5;-1:-1:-1;6537:2:1;6522:18;;6509:32;6550:30;6509:32;6550:30;:::i;:::-;6599:7;6589:17;;;6230:382;;;;;:::o;6617:180::-;6676:6;6729:2;6717:9;6708:7;6704:23;6700:32;6697:52;;;6745:1;6742;6735:12;6697:52;-1:-1:-1;6768:23:1;;6617:180;-1:-1:-1;6617:180:1:o;6802:388::-;6870:6;6878;6931:2;6919:9;6910:7;6906:23;6902:32;6899:52;;;6947:1;6944;6937:12;6899:52;6986:9;6973:23;7005:31;7030:5;7005:31;:::i;:::-;7055:5;-1:-1:-1;7112:2:1;7097:18;;7084:32;7125:33;7084:32;7125:33;:::i;7901:356::-;8103:2;8085:21;;;8122:18;;;8115:30;8181:34;8176:2;8161:18;;8154:62;8248:2;8233:18;;7901:356::o;8262:127::-;8323:10;8318:3;8314:20;8311:1;8304:31;8354:4;8351:1;8344:15;8378:4;8375:1;8368:15;8394:125;8459:9;;;8480:10;;;8477:36;;;8493:18;;:::i;8881:380::-;8960:1;8956:12;;;;9003;;;9024:61;;9078:4;9070:6;9066:17;9056:27;;9024:61;9131:2;9123:6;9120:14;9100:18;9097:38;9094:161;;9177:10;9172:3;9168:20;9165:1;9158:31;9212:4;9209:1;9202:15;9240:4;9237:1;9230:15;9094:161;;8881:380;;;:::o;10048:127::-;10109:10;10104:3;10100:20;10097:1;10090:31;10140:4;10137:1;10130:15;10164:4;10161:1;10154:15;10475:135;10514:3;10535:17;;;10532:43;;10555:18;;:::i;:::-;-1:-1:-1;10602:1:1;10591:13;;10475:135::o;11021:184::-;11091:6;11144:2;11132:9;11123:7;11119:23;11115:32;11112:52;;;11160:1;11157;11150:12;11112:52;-1:-1:-1;11183:16:1;;11021:184;-1:-1:-1;11021:184:1:o;11515:245::-;11582:6;11635:2;11623:9;11614:7;11610:23;11606:32;11603:52;;;11651:1;11648;11641:12;11603:52;11683:9;11677:16;11702:28;11724:5;11702:28;:::i;14006:168::-;14079:9;;;14110;;14127:15;;;14121:22;;14107:37;14097:71;;14148:18;;:::i;14179:217::-;14219:1;14245;14235:132;;14289:10;14284:3;14280:20;14277:1;14270:31;14324:4;14321:1;14314:15;14352:4;14349:1;14342:15;14235:132;-1:-1:-1;14381:9:1;;14179:217::o;14401:401::-;14603:2;14585:21;;;14642:2;14622:18;;;14615:30;14681:34;14676:2;14661:18;;14654:62;-1:-1:-1;;;14747:2:1;14732:18;;14725:35;14792:3;14777:19;;14401:401::o;16825:681::-;16956:6;16964;16972;16980;16988;16996;17004;17012;17065:3;17053:9;17044:7;17040:23;17036:33;17033:53;;;17082:1;17079;17072:12;17033:53;17114:9;17108:16;17133:31;17158:5;17133:31;:::i;:::-;17183:5;17173:15;;;17228:2;17217:9;17213:18;17207:25;17197:35;;17272:2;17261:9;17257:18;17251:25;17241:35;;17316:2;17305:9;17301:18;17295:25;17285:35;;17360:3;17349:9;17345:19;17339:26;17329:36;;17405:3;17394:9;17390:19;17384:26;17374:36;;17450:3;17439:9;17435:19;17429:26;17419:36;;17495:3;17484:9;17480:19;17474:26;17464:36;;16825:681;;;;;;;;;;;:::o;18726:401::-;18928:2;18910:21;;;18967:2;18947:18;;;18940:30;19006:34;19001:2;18986:18;;18979:62;-1:-1:-1;;;19072:2:1;19057:18;;19050:35;19117:3;19102:19;;18726:401::o;19132:399::-;19334:2;19316:21;;;19373:2;19353:18;;;19346:30;19412:34;19407:2;19392:18;;19385:62;-1:-1:-1;;;19478:2:1;19463:18;;19456:33;19521:3;19506:19;;19132:399::o;21458:128::-;21525:9;;;21546:11;;;21543:37;;;21560:18;;:::i;22090:251::-;22160:6;22213:2;22201:9;22192:7;22188:23;22184:32;22181:52;;;22229:1;22226;22219:12;22181:52;22261:9;22255:16;22280:31;22305:5;22280:31;:::i;22346:980::-;22608:4;22656:3;22645:9;22641:19;22687:6;22676:9;22669:25;22713:2;22751:6;22746:2;22735:9;22731:18;22724:34;22794:3;22789:2;22778:9;22774:18;22767:31;22818:6;22853;22847:13;22884:6;22876;22869:22;22922:3;22911:9;22907:19;22900:26;;22961:2;22953:6;22949:15;22935:29;;22982:1;22992:195;23006:6;23003:1;23000:13;22992:195;;;23071:13;;-1:-1:-1;;;;;23067:39:1;23055:52;;23162:15;;;;23127:12;;;;23103:1;23021:9;22992:195;;;-1:-1:-1;;;;;;;23243:32:1;;;;23238:2;23223:18;;23216:60;-1:-1:-1;;;23307:3:1;23292:19;23285:35;23204:3;22346:980;-1:-1:-1;;;22346:980:1:o;24149:287::-;24278:3;24316:6;24310:13;24332:66;24391:6;24386:3;24379:4;24371:6;24367:17;24332:66;:::i;:::-;24414:16;;;;;24149:287;-1:-1:-1;;24149:287:1:o

Swarm Source

ipfs://7f837a79b9bcc7ea0afc370212232c56c016583cf01dcd7bdf7bff8ff1b4dd56
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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