ETH Price: $3,086.14 (-0.55%)
Gas: 2 Gwei

Token

StackedPepe (STACK)
 

Overview

Max Total Supply

420,690,000,000,000 STACK

Holders

115

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
200,000,000,000 STACK

Value
$0.00
0xdd77db52860c9573e77444737f06d0fb863f48ab
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:
StackedPepe

Compiler Version
v0.8.17+commit.8df45f5f

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-12
*/

// StackedPepe 
// The worlds first pure pepe reflections token
// https://t.me/stackedpepeportal
// SPDX-License-Identifier: MIT                                                                               
                                                    
pragma solidity 0.8.17;

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 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;
 
  address public token;
  
  // 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 {
    require(false, "Cannot send BNB directly to tracker as it is unrecoverable"); // 
  }
  
  function distributeTokenDividends(uint256 amt) public onlyOwner {
    require(totalBalance > 0);

        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);
      SafeERC20.safeTransfer(IERC20(token), user, _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(address _token) {
    	claimWait = 1200;
        minimumTokenBalanceForDividends = 1;
        token = _token;
    }

    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 TokenHandler is Ownable {
    function sendTokenToOwner(address token) external onlyOwner {
        if(IERC20(token).balanceOf(address(this)) > 0){
            SafeERC20.safeTransfer(IERC20(token), owner(), IERC20(token).balanceOf(address(this)));
        }
    }
}

contract StackedPepe is ERC20, Ownable {

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

    DividendTracker public immutable dividendTracker;
    address public immutable token;

    IDexRouter public immutable dexRouter;
    address public lpPair;

    IERC20 public immutable REWARDTOKEN; 

    bool private swapping;
    uint256 public swapTokensAtAmt;

    TokenHandler public tokenHandler;
    
    bool public limitsActive = true;
    bool public tradingLive = false;

    uint256 public constant FEE_DIVISOR = 10000;

    uint256 public buyTax;
    uint256 public sellTax;

    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 MaxTransactionExclusion(address _address, bool excluded);
    event OwnerForcedSwapBack(uint256 timestamp);
    event CaughtEarlyBuyer(address sniper);
    event TransferForeignToken(address token, uint256 amt);

    constructor() ERC20("StackedPepe", "STACK") {

        address rewardAddress;
        address _dexRouter;

        if(block.chainid == 1){
            rewardAddress  = 0x6982508145454Ce325dDbE47a25d4ec3d2311933; // PEPE
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // Ethereum: Uniswap V2
        } else if(block.chainid == 5){
            rewardAddress = 0x2f3A40A3db8a7e3D09B0adfEfbCe4f6F81927557; // Goerli USDC
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // Goerli Router
        } else {
            revert("Chain not configured");
        }

        token = rewardAddress;
        dividendTracker = new DividendTracker(token);

        REWARDTOKEN = IERC20(rewardAddress);
        require(REWARDTOKEN.decimals()  > 0 , "Incorrect liquidity token");

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

        dexRouter = IDexRouter(_dexRouter);

        uint256 totalSupply = 420690000000000 * 1e18;
        
        maxBuyAmt = totalSupply * 1 / 100;
        maxSellAmt = totalSupply * 1 / 100;
        maxWalletAmt = totalSupply * 1 / 100;
        swapTokensAtAmt = totalSupply * 25 / 100000;

        tokenHandler = new TokenHandler();

        buyTax = 0; // 100 = 1%
        sellTax = 9900; // 100 = 1%

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

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

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

        createPair();

        _createInitialSupply(address(newOwner), totalSupply);
        transferOwnership(newOwner);
        _approve(address(owner()), address(dexRouter), totalSupply);

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

    function createPair() internal {
        require(lpPair == address(0), "Pair Already Created");
        // create pair
        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), dexRouter.WETH());
        setAutomatedMarketMakerPair(address(lpPair), true);
    }

    function updateAllowanceForSwapping() external {
        REWARDTOKEN.approve(address(dexRouter), type(uint256).max);
        _approve(address(this), address(dexRouter), type(uint256).max);
    }

    function startTrading() external onlyOwner {
        require(!tradingLive, "Trading is already active, cannot relaunch.");
        require(lpPair != address(0), "Create Pair First");
        tradingLive = true;
        emit StartedTrading();
    }

    // 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 updateTax(uint256 _buyTax, uint256 _sellTax) external onlyOwner {
        buyTax = _buyTax;
        sellTax = _sellTax;
        emit UpdatedBuyTax(buyTax);
        emit UpdatedSellTax(sellTax);
    }

    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(_isExcludedFromTax[from] || _isExcludedFromTax[to] || swapping){
            super._transfer(from, to, amt);
            dividendTracker.setBalance(payable(from), balanceOf(from));
            dividendTracker.setBalance(payable(to), balanceOf(to));
            return;
        }

        require(tradingLive, "Trading is not active.");
        
        if(limitsActive){
            //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");
            }
        }

        if(balanceOf(address(this)) >= swapTokensAtAmt && automatedMarketMakerPairs[to]) {
            swapping = true;
            swapBack();
            swapping = false;
        }
        
        uint256 tax = 0;
        // on sell
        if (automatedMarketMakerPairs[to] && sellTax > 0){
            tax = amt * sellTax / FEE_DIVISOR;
        }

        // on buy
        else if(automatedMarketMakerPairs[from] && buyTax > 0) {
            tax = amt * buyTax / FEE_DIVISOR;
        }
        
        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 swapTokensForREWARDTOKEN(uint256 tokenAmt) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = address(dexRouter.WETH());
        path[2] = address(REWARDTOKEN);

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

        tokenHandler.sendTokenToOwner(address(REWARDTOKEN));
    }

    function swapBack() private {

        uint256 contractBalance = balanceOf(address(this));
        
        if(contractBalance == 0) {return;}

        if(contractBalance > swapTokensAtAmt * 40){
            contractBalance = swapTokensAtAmt * 40;
        }
        swapTokensForREWARDTOKEN(contractBalance);

        uint256 receivedTokens = REWARDTOKEN.balanceOf(address(this));
        if(receivedTokens > 0){ 
            SafeERC20.safeTransfer(REWARDTOKEN, address(dividendTracker), receivedTokens);
            dividendTracker.distributeTokenDividends(receivedTokens);
        }
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"}],"name":"CaughtEarlyBuyer","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":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":"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":"buyTax","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":[{"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":"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":"sellTax","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":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","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":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenHandler","outputs":[{"internalType":"contract TokenHandler","name":"","type":"address"}],"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":[{"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":[],"name":"updateAllowanceForSwapping","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":"newAmt","type":"uint256"}],"name":"updateSwapTokensAtAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"},{"internalType":"uint256","name":"_sellTax","type":"uint256"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

610100604052600b805461ffff60a01b1916600160a01b1790553480156200002657600080fd5b506040518060400160405280600b81526020016a537461636b65645065706560a81b81525060405180604001604052806005815260200164535441434b60d81b81525081600390816200007a919062000fad565b50600462000089828262000fad565b50505060006200009e6200074860201b60201c565b600580546001600160a01b0319166001600160a01b0383169081179091556040519192509060009060008051602062006d5c833981519152908290a350600080466001036200011a5750736982508145454ce325ddbe47a25d4ec3d23119339050737a250d5630b4cf539739df2c5dacb4c659f2488d620001a3565b46600503620001565750732f3a40a3db8a7e3d09b0adfefbce4f6f819275579050737a250d5630b4cf539739df2c5dacb4c659f2488d620001a3565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b03821660a0819052604051620001c09062000eec565b6001600160a01b039091168152602001604051809103906000f080158015620001ed573d6000803e3d6000fd5b506001600160a01b03908116608052821660e08190526040805163313ce56760e01b815290516000929163313ce5679160048083019260209291908290030181865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000268919062001079565b60ff1611620002ba5760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374206c697175696469747920746f6b656e0000000000000060448201526064016200019a565b6001600160a01b03811660c052336d14bddab3e51a57cff87a500000006064620002e6826001620010bb565b620002f29190620010db565b600655606462000304826001620010bb565b620003109190620010db565b600755606462000322826001620010bb565b6200032e9190620010db565b600855620186a062000342826019620010bb565b6200034e9190620010db565b600a556040516200035f9062000efa565b604051809103906000f0801580156200037c573d6000803e3d6000fd5b50600b80546001600160a01b0319166001600160a01b03929092169190911790556000600c556126ac600d55620003b58260016200074c565b620003c23060016200074c565b60c051620003d29060016200074c565b620003e161dead60016200074c565b60805160405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200042857600080fd5b505af11580156200043d573d6000803e3d6000fd5b505060805160405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200048757600080fd5b505af11580156200049c573d6000803e3d6000fd5b505060805160c05160405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620004ea57600080fd5b505af1158015620004ff573d6000803e3d6000fd5b505060805160405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200054b57600080fd5b505af115801562000560573d6000803e3d6000fd5b505060805160c05160405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620005ae57600080fd5b505af1158015620005c3573d6000803e3d6000fd5b505060805160405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200060f57600080fd5b505af115801562000624573d6000803e3d6000fd5b505050506200063b826001620007af60201b60201c565b62000648306001620007af565b60c05162000658906001620007af565b6200066761dead6001620007af565b6200067162000859565b6200067d828262000a33565b620006888262000b18565b620006a96200069f6005546001600160a01b031690565b60c0518362000c15565b60e05160c05160405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801562000700573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007269190620010fe565b506200073e3060c05160001962000c1560201b60201c565b5050505062001163565b3390565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6005546001600160a01b03163314620007fa5760405162461bcd60e51b8152602060048201819052602482015260008051602062006d3c83398151915260448201526064016200019a565b6001600160a01b0382166000818152600e6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6009546001600160a01b031615620008b45760405162461bcd60e51b815260206004820152601460248201527f5061697220416c7265616479204372656174656400000000000000000000000060448201526064016200019a565b60c0516001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620008f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200091b919062001122565b6001600160a01b031663c9c653963060c0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200096b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000991919062001122565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620009df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a05919062001122565b600980546001600160a01b0319166001600160a01b0392909216918217905562000a3190600162000d3d565b565b6001600160a01b03821662000a8b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200019a565b806002600082825462000a9f91906200114d565b90915550506001600160a01b0382166000908152602081905260408120805483929062000ace9084906200114d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b0316331462000b635760405162461bcd60e51b8152602060048201819052602482015260008051602062006d3c83398151915260448201526064016200019a565b6001600160a01b03811662000bca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200019a565b6005546040516001600160a01b0380841692169060008051602062006d5c83398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831662000c795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200019a565b6001600160a01b03821662000cdc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200019a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b0316331462000d885760405162461bcd60e51b8152602060048201819052602482015260008051602062006d3c83398151915260448201526064016200019a565b6009546001600160a01b03838116911614158062000da35750805b62000e175760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016200019a565b6001600160a01b0382166000908152601060205260409020805460ff191682151517905562000e4782826200074c565b801562000eb05760805160405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000e9657600080fd5b505af115801562000eab573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b611c52806200495f83390190565b61078b80620065b183390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000f3357607f821691505b60208210810362000f5457634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000fa857600081815260208120601f850160051c8101602086101562000f835750805b601f850160051c820191505b8181101562000fa45782815560010162000f8f565b5050505b505050565b81516001600160401b0381111562000fc95762000fc962000f08565b62000fe18162000fda845462000f1e565b8462000f5a565b602080601f831160018114620010195760008415620010005750858301515b600019600386901b1c1916600185901b17855562000fa4565b600085815260208120601f198616915b828110156200104a5788860151825594840194600190910190840162001029565b5085821015620010695787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200108c57600080fd5b815160ff811681146200109e57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620010d557620010d5620010a5565b92915050565b600082620010f957634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200111157600080fd5b815180151581146200109e57600080fd5b6000602082840312156200113557600080fd5b81516001600160a01b03811681146200109e57600080fd5b80820180821115620010d557620010d5620010a5565b60805160a05160c05160e0516136f06200126f6000396000818161039801528181610bc9015281816129c901528181612a4901528181612ccb0152612daf0152600081816103f101528181610b9901528181610c3d01528181612c160152612d25015260006107f10152600081816104c0015281816109fc01528181610e3201528181610f0001528181610fb80152818161113c015281816111ba015281816112bb01528181611916015281816119b301528181611aca01528181611b1601528181611c1501528181611df601528181611e9201528181611ed701528181612349015281816123e001528181612838015281816128cf01528181612a6a0152612aa501526136f06000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c80637571336a116101de578063b62496f51161010f578063dc07b617116100ad578063e98030c71161007c578063e98030c7146107b3578063f27fd254146107c6578063f2fde38b146107d9578063fc0c546a146107ec57600080fd5b8063dc07b61714610757578063dd62ed3e1461075f578063e634e70a14610798578063e7841ec0146107ab57600080fd5b8063c6a30647116100e9578063c6a306471461070f578063c78d0fa014610722578063cc1776d31461072b578063dae6a9821461073457600080fd5b8063b62496f5146106d0578063bb811508146106f3578063c0f306ef146106fc57600080fd5b80639e93ad8e1161017c578063a8b9d24011610156578063a8b9d24014610649578063a9059cbb1461065c578063ac1b129d1461066f578063ad56c13c1461067857600080fd5b80639e93ad8e14610625578063a26579ad1461062e578063a457c2d71461063657600080fd5b8063894dc39b116101b8578063894dc39b146105e65780638da5cb5b146105f957806395d89b411461060a5780639a7a23d61461061257600080fd5b80637571336a146105ad5780638366e79a146105c057806384d5a0f1146105d357600080fd5b806330bb4cff116102c35780634f7041a51161026157806370a082311161023057806370a0823114610582578063715018a61461059557806371778e7d1461059d578063751039fc146105a557600080fd5b80634f7041a51461055657806351f205e41461055f57806364b0f653146105675780636843cd841461056f57600080fd5b806333cdacd91161029d57806333cdacd91461051f5780633950935114610528578063452ed4f11461053b5780634e71d92d1461054e57600080fd5b806330bb4cff146104f5578063313ce567146104fd57806331e79db01461050c57600080fd5b80631cce34ee11610330578063254248961161030a57806325424896146104ab578063293230b8146104b35780632c1f5216146104bb5780632f37aa6d146104e257600080fd5b80631cce34ee1461046f5780632307b4411461048357806323b872dd1461049857600080fd5b8063095ea7b31161036c578063095ea7b31461041357806311704f521461043657806318160ddd1461044a5780631b3d6e871461045c57600080fd5b8063032c32fc1461039357806306fdde03146103d75780630758d924146103ec575b600080fd5b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6103df610813565b6040516103ce919061306f565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6104266104213660046130b7565b6108a5565b60405190151581526020016103ce565b600b5461042690600160a81b900460ff1681565b6002545b6040519081526020016103ce565b600b546103ba906001600160a01b031681565b600b5461042690600160a01b900460ff1681565b6104966104913660046131b9565b6108bc565b005b6104266104a636600461327b565b610adb565b610496610b82565b610496610c66565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6104966104f03660046132bc565b610d88565b61044e610e2e565b604051601281526020016103ce565b61049661051a3660046132de565b610eb7565b61044e60075481565b6104266105363660046130b7565b610f60565b6009546103ba906001600160a01b031681565b610496610f9c565b61044e600c5481565b610496611030565b61044e611138565b61044e61057d3660046132de565b611198565b61044e6105903660046132de565b611228565b610496611243565b61044e6112b7565b610496611317565b6104966105bb366004613310565b611379565b6104966105ce366004613349565b611441565b6104966105e1366004613377565b6115ee565b6104966105f4366004613377565b6116b8565b6005546001600160a01b03166103ba565b6103df6117fe565b610496610620366004613310565b61180d565b61044e61271081565b61044e6119af565b6104266106443660046130b7565b611a0f565b61044e6106573660046132de565b611aa8565b61042661066a3660046130b7565b611afb565b61044e60065481565b61068b6106863660046132de565b611b08565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103ce565b6104266106de3660046132de565b60106020526000908152604090205460ff1681565b61044e60085481565b61049661070a3660046132de565b611bcc565b61049661071d366004613310565b611c44565b61044e600a5481565b61044e600d5481565b6104266107423660046132de565b600f6020526000908152604090205460ff1681565b610496611ccd565b61044e61076d366004613349565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6104966107a6366004613377565b611d2f565b61044e611df2565b6104966107c1366004613377565b611e52565b61068b6107d4366004613377565b611ec9565b6104966107e73660046132de565b611f23565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b60606003805461082290613390565b80601f016020809104026020016040519081016040528092919081815260200182805461084e90613390565b801561089b5780601f106108705761010080835404028352916020019161089b565b820191906000526020600020905b81548152906001019060200180831161087e57829003601f168201915b5050505050905090565b60006108b233848461200e565b5060015b92915050565b6005546001600160a01b031633146108ef5760405162461bcd60e51b81526004016108e6906133ca565b60405180910390fd5b80518251146109405760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e677468000060448201526064016108e6565b6102588251106109b15760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b60648201526084016108e6565b60005b8251811015610ad6576109fa338483815181106109d3576109d36133ff565b60200260200101518484815181106109ed576109ed6133ff565b6020026020010151612132565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e30443bc848381518110610a3b57610a3b6133ff565b6020026020010151610a65868581518110610a5857610a586133ff565b6020026020010151611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610aab57600080fd5b505af1158015610abf573d6000803e3d6000fd5b505050508080610ace9061342b565b9150506109b4565b505050565b6000610ae8848484612284565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610b6a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e7366657220616d74206578636565647320616c6c6f60448201526477616e636560d81b60648201526084016108e6565b610b77853385840361200e565b506001949350505050565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260001960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015610c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c369190613444565b50610c64307f000000000000000000000000000000000000000000000000000000000000000060001961200e565b565b6005546001600160a01b03163314610c905760405162461bcd60e51b81526004016108e6906133ca565b600b54600160a81b900460ff1615610cfe5760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b60648201526084016108e6565b6009546001600160a01b0316610d4a5760405162461bcd60e51b815260206004820152601160248201527010dc99585d194814185a5c88119a5c9cdd607a1b60448201526064016108e6565b600b805460ff60a81b1916600160a81b1790556040517f9eed9b8b4340ef4b5c4a71328140c10d1e90f76d22a91ed6d1dd85eb3a4e1d9190600090a1565b6005546001600160a01b03163314610db25760405162461bcd60e51b81526004016108e6906133ca565b600c829055600d8190556040518281527f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece05089060200160405180910390a17fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97600d54604051610e2291815260200190565b60405180910390a15050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613461565b905090565b6005546001600160a01b03163314610ee15760405162461bcd60e51b81526004016108e6906133ca565b60405163031e79db60e41b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906331e79db0906024015b600060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108b2918590610f9790869061347a565b61200e565b60405163bc4c4b3760e01b8152336004820152600060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063bc4c4b37906044016020604051808303816000875af1158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190613444565b50565b6005546001600160a01b0316331461105a5760405162461bcd60e51b81526004016108e6906133ca565b600a5461106630611228565b10156110da5760405162461bcd60e51b815260206004820152603d60248201527f43616e206f6e6c792073776170207768656e20746f6b656e20616d742069732060448201527f6174206f7220686967686572207468616e207265737472696374696f6e00000060648201526084016108e6565b6009805460ff60a01b1916600160a01b1790556110f561296a565b6009805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb32906020015b60405180910390a1565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166309bbedde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b60405163156dbbf560e31b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063ab6ddfa8906024015b602060405180830381865afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b69190613461565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461126d5760405162461bcd60e51b81526004016108e6906133ca565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b6005546001600160a01b031633146113415760405162461bcd60e51b81526004016108e6906133ca565b600b805460ff60a01b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146113a35760405162461bcd60e51b81526004016108e6906133ca565b80611416576009546001600160a01b03908116908316036114165760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b60648201526084016108e6565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461146b5760405162461bcd60e51b81526004016108e6906133ca565b6001600160a01b0382166114c15760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016108e6565b6001600160a01b038216301415806114e35750600b54600160a81b900460ff16155b61152f5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e730000000060448201526064016108e6565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159a9190613461565b90506115a7838383612b0f565b604080516001600160a01b0385168152602081018390527fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a1505050565b6005546001600160a01b031633146116185760405162461bcd60e51b81526004016108e6906133ca565b670de0b6b3a7640000606461162c60025490565b61163790600161348d565b61164191906134a4565b61164b91906134a4565b81101561166a5760405162461bcd60e51b81526004016108e6906134c6565b61167c81670de0b6b3a764000061348d565b60068190556040519081527fbd0f1740caf821f78178ca26f0481f035268c600b91408a9a82dfb3a80b79a29906020015b60405180910390a150565b6005546001600160a01b031633146116e25760405162461bcd60e51b81526004016108e6906133ca565b620f42406116ef60025490565b6116fa90600161348d565b61170491906134a4565b81101561176f5760405162461bcd60e51b815260206004820152603360248201527f5377617020616d742063616e6e6f74206265206c6f776572207468616e20302e6044820152721818181892903a37ba30b61039bab838363c9760691b60648201526084016108e6565b6103e861177b60025490565b61178690600161348d565b61179091906134a4565b8111156117f95760405162461bcd60e51b815260206004820152603160248201527f5377617020616d742063616e6e6f7420626520686967686572207468616e2030604482015270171892903a37ba30b61039bab838363c9760791b60648201526084016108e6565b600a55565b60606004805461082290613390565b6005546001600160a01b031633146118375760405162461bcd60e51b81526004016108e6906133ca565b6009546001600160a01b0383811691161415806118515750805b6118c35760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016108e6565b6001600160a01b0382166000908152601060205260409020805460ff19168215151790556118f18282612b61565b80156119735760405163031e79db60e41b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906331e79db090602401600060405180830381600087803b15801561195a57600080fd5b505af115801561196e573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636f2789ec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611a915760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108e6565b611a9e338585840361200e565b5060019392505050565b6040516302a2e74960e61b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a8b9d240906024016111e7565b60006108b2338484612284565b6000806000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b8152600401611b6f91906001600160a01b0391909116815260200190565b61010060405180830381865afa158015611b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb1919061350b565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611bf65760405162461bcd60e51b81526004016108e6906133ca565b60405163c0f306ef60e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c0f306ef90602401610f2b565b6005546001600160a01b03163314611c6e5760405162461bcd60e51b81526004016108e6906133ca565b6001600160a01b0382166000818152600e6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b03163314611cf75760405162461bcd60e51b81526004016108e6906133ca565b60025460088190556040519081527f5c2c6bbd255d68d22e47fbc0e1cbb9e5c5c2892d91144941f6b7f61d3b1c8a559060200161112e565b6005546001600160a01b03163314611d595760405162461bcd60e51b81526004016108e6906133ca565b670de0b6b3a76400006064611d6d60025490565b611d7890600161348d565b611d8291906134a4565b611d8c91906134a4565b811015611dab5760405162461bcd60e51b81526004016108e6906134c6565b611dbd81670de0b6b3a764000061348d565b60078190556040519081527fda3f4fd2455d333278e3d4e42bf292b30da257f729437c6264f483617cbf73f7906020016116ad565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e7841ec06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b6005546001600160a01b03163314611e7c5760405162461bcd60e51b81526004016108e6906133ca565b60405163e98030c760e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e98030c790602401610f2b565b6000806000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401611b6f91815260200190565b6005546001600160a01b03163314611f4d5760405162461bcd60e51b81526004016108e6906133ca565b6001600160a01b038116611fb25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108e6565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166120705760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108e6565b6001600160a01b0382166120d15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108e6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121585760405162461bcd60e51b81526004016108e690613575565b6001600160a01b03821661217e5760405162461bcd60e51b81526004016108e6906135ba565b6001600160a01b038316600090815260208190526040902054818110156121f35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220616d7420657863656564732062616c616044820152626e636560e81b60648201526084016108e6565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061222a90849061347a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161227691815260200190565b60405180910390a350505050565b6001600160a01b0383166122aa5760405162461bcd60e51b81526004016108e690613575565b6001600160a01b0382166122d05760405162461bcd60e51b81526004016108e6906135ba565b806000036122e457610ad683836000612132565b6001600160a01b0383166000908152600e602052604090205460ff168061232357506001600160a01b0382166000908152600e602052604090205460ff165b806123375750600954600160a01b900460ff165b1561247a57612347838383612132565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e30443bc8461238086611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156123c657600080fd5b505af11580156123da573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e30443bc8361241785611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561245d57600080fd5b505af1158015612471573d6000803e3d6000fd5b50505050505050565b600b54600160a81b900460ff166124cc5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b60448201526064016108e6565b600b54600160a01b900460ff161561270f576001600160a01b03831660009081526010602052604090205460ff16801561251f57506001600160a01b0382166000908152600f602052604090205460ff16155b156125e8576006548111156125845760405162461bcd60e51b815260206004820152602560248201527f427579207472616e7366657220616d74206578636565647320746865206d617860448201526410313abc9760d91b60648201526084016108e6565b60085461259083611228565b61259a908361347a565b11156125e35760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b60448201526064016108e6565b61270f565b6001600160a01b03821660009081526010602052604090205460ff16801561262957506001600160a01b0383166000908152600f602052604090205460ff16155b15612690576007548111156125e35760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d74206578636565647320746865206d616044820152663c1039b2b6361760c91b60648201526084016108e6565b6001600160a01b0382166000908152600f602052604090205460ff1661270f576008546126bc83611228565b6126c6908361347a565b111561270f5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b60448201526064016108e6565b600a5461271b30611228565b1015801561274157506001600160a01b03821660009081526010602052604090205460ff165b1561276f576009805460ff60a01b1916600160a01b17905561276161296a565b6009805460ff60a01b191690555b6001600160a01b03821660009081526010602052604081205460ff16801561279957506000600d54115b156127c057612710600d54836127af919061348d565b6127b991906134a4565b905061280d565b6001600160a01b03841660009081526010602052604090205460ff1680156127ea57506000600c54115b1561280d57612710600c5483612800919061348d565b61280a91906134a4565b90505b801561282b5761281e843083612132565b61282881836135fd565b91505b612836848484612132565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e30443bc8561286f87611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156128b557600080fd5b505af11580156128c9573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e30443bc8461290686611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561294c57600080fd5b505af1158015612960573d6000803e3d6000fd5b5050505050505050565b600061297530611228565b9050806000036129825750565b600a5461299090602861348d565b8111156129a857600a546129a590602861348d565b90505b6129b181612bbd565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3c9190613461565b90508015612b0b57612a8f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000083612b0f565b60405163b0c7ce3760e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0c7ce37906024015b600060405180830381600087803b158015612af257600080fd5b505af1158015612b06573d6000803e3d6000fd5b505050505b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ad6908490612de9565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101610e22565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110612bf457612bf46133ff565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c969190613610565b81600181518110612ca957612ca96133ff565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600281518110612cfd57612cfd6133ff565b6001600160a01b039283166020918202929092010152600b54604051635c11d79560e01b81527f0000000000000000000000000000000000000000000000000000000000000000831692635c11d79592612d659287926000928892911690429060040161362d565b600060405180830381600087803b158015612d7f57600080fd5b505af1158015612d93573d6000803e3d6000fd5b5050600b546040516304fa881160e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015290911692506313ea20449150602401612ad8565b6000612e3e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ebb9092919063ffffffff16565b805190915015610ad65780806020019051810190612e5c9190613444565b610ad65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108e6565b6060612eca8484600085612ed2565b949350505050565b606082471015612f335760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108e6565b600080866001600160a01b03168587604051612f4f919061369e565b60006040518083038185875af1925050503d8060008114612f8c576040519150601f19603f3d011682016040523d82523d6000602084013e612f91565b606091505b5091509150612fa287838387612fad565b979650505050505050565b6060831561301c578251600003613015576001600160a01b0385163b6130155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108e6565b5081612eca565b612eca83838151156130315781518083602001fd5b8060405162461bcd60e51b81526004016108e6919061306f565b60005b8381101561306657818101518382015260200161304e565b50506000910152565b602081526000825180602084015261308e81604085016020870161304b565b601f01601f19169190910160400192915050565b6001600160a01b038116811461102d57600080fd5b600080604083850312156130ca57600080fd5b82356130d5816130a2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613122576131226130e3565b604052919050565b600067ffffffffffffffff821115613144576131446130e3565b5060051b60200190565b600082601f83011261315f57600080fd5b8135602061317461316f8361312a565b6130f9565b82815260059290921b8401810191818101908684111561319357600080fd5b8286015b848110156131ae5780358352918301918301613197565b509695505050505050565b600080604083850312156131cc57600080fd5b823567ffffffffffffffff808211156131e457600080fd5b818501915085601f8301126131f857600080fd5b8135602061320861316f8361312a565b82815260059290921b8401810191818101908984111561322757600080fd5b948201945b8386101561324e57853561323f816130a2565b8252948201949082019061322c565b9650508601359250508082111561326457600080fd5b506132718582860161314e565b9150509250929050565b60008060006060848603121561329057600080fd5b833561329b816130a2565b925060208401356132ab816130a2565b929592945050506040919091013590565b600080604083850312156132cf57600080fd5b50508035926020909101359150565b6000602082840312156132f057600080fd5b81356132fb816130a2565b9392505050565b801515811461102d57600080fd5b6000806040838503121561332357600080fd5b823561332e816130a2565b9150602083013561333e81613302565b809150509250929050565b6000806040838503121561335c57600080fd5b8235613367816130a2565b9150602083013561333e816130a2565b60006020828403121561338957600080fd5b5035919050565b600181811c908216806133a457607f821691505b6020821081036133c457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161343d5761343d613415565b5060010190565b60006020828403121561345657600080fd5b81516132fb81613302565b60006020828403121561347357600080fd5b5051919050565b808201808211156108b6576108b6613415565b80820281158282048414176108b6576108b6613415565b6000826134c157634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f43616e6e6f7420736574206d61782073656c6c20616d74206c6f776572207468604082015264616e20312560d81b606082015260800190565b600080600080600080600080610100898b03121561352857600080fd5b8851613533816130a2565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156108b6576108b6613415565b60006020828403121561362257600080fd5b81516132fb816130a2565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561367d5784516001600160a01b031683529383019391830191600101613658565b50506001600160a01b03969096166060850152505050608001529392505050565b600082516136b081846020870161304b565b919091019291505056fea2646970667358221220cdd7f4db1e7c1a019a817a9c0fb3be7b2e72791536f2867b8f56cbce6417420664736f6c6343000811003360a060405234801561001057600080fd5b50604051611c52380380611c5283398101604081905261002f916100a0565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506104b0600f556001608052600280546001600160a01b0319166001600160a01b03929092169190911790556100d0565b6000602082840312156100b257600080fd5b81516001600160a01b03811681146100c957600080fd5b9392505050565b608051611b606100f2600039600081816104c10152610ac30152611b606000f3fe6080604052600436106101c65760003560e01c8063a8b9d240116100f7578063c0f306ef11610095578063f2fde38b11610064578063f2fde38b14610558578063fbcbc0f114610578578063fc0c546a14610598578063ffb2c479146105b857600080fd5b8063c0f306ef146104e3578063e30443bc14610503578063e7841ec014610523578063e98030c71461053857600080fd5b8063ad7a672f116100d1578063ad7a672f14610459578063b0c7ce371461046f578063bc4c4b371461048f578063be10b614146104af57600080fd5b8063a8b9d240146103d6578063aafd847a146103f6578063ab6ddfa81461042c57600080fd5b80635183d6fd11610164578063715018a61161013e578063715018a61461035957806385a6b3ae1461036e5780638da5cb5b1461038457806391b89fba146103b657600080fd5b80635183d6fd146102c95780636a4740021461032e5780636f2789ec1461034357600080fd5b806327ce0147116101a057806327ce0147146102335780633009a6091461025357806331e79db0146102695780634e7b827f1461028957600080fd5b806303c83302146101da57806309bbedde146101e2578063226cfa3d1461020657600080fd5b366101d5576101d36105f3565b005b600080fd5b6101d36105f3565b3480156101ee57600080fd5b506008545b6040519081526020015b60405180910390f35b34801561021257600080fd5b506101f36102213660046118b3565b600e6020526000908152604090205481565b34801561023f57600080fd5b506101f361024e3660046118b3565b610666565b34801561025f57600080fd5b506101f3600c5481565b34801561027557600080fd5b506101d36102843660046118b3565b6106c9565b34801561029557600080fd5b506102b96102a43660046118b3565b600d6020526000908152604090205460ff1681565b60405190151581526020016101fd565b3480156102d557600080fd5b506102e96102e43660046118d0565b610761565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101fd565b34801561033a57600080fd5b506101d36107ce565b34801561034f57600080fd5b506101f3600f5481565b34801561036557600080fd5b506101d36107da565b34801561037a57600080fd5b506101f360075481565b34801561039057600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101fd565b3480156103c257600080fd5b506101f36103d13660046118b3565b61084e565b3480156103e257600080fd5b506101f36103f13660046118b3565b610855565b34801561040257600080fd5b506101f36104113660046118b3565b6001600160a01b031660009081526004602052604090205490565b34801561043857600080fd5b506101f36104473660046118b3565b60056020526000908152604090205481565b34801561046557600080fd5b506101f360065481565b34801561047b57600080fd5b506101d361048a3660046118d0565b610881565b34801561049b57600080fd5b506102b96104aa3660046118f7565b610933565b3480156104bb57600080fd5b506101f37f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ef57600080fd5b506101d36104fe3660046118b3565b6109df565b34801561050f57600080fd5b506101d361051e366004611930565b610a77565b34801561052f57600080fd5b50600c546101f3565b34801561054457600080fd5b506101d36105533660046118d0565b610b26565b34801561056457600080fd5b506101d36105733660046118b3565b610c8f565b34801561058457600080fd5b506102e96105933660046118b3565b610d79565b3480156105a457600080fd5b5060025461039e906001600160a01b031681565b3480156105c457600080fd5b506105d86105d33660046118d0565b610e60565b604080519384526020840192909252908201526060016101fd565b60405162461bcd60e51b815260206004820152603a60248201527f43616e6e6f742073656e6420424e42206469726563746c7920746f207472616360448201527f6b657220617320697420697320756e7265636f76657261626c6500000000000060648201526084015b60405180910390fd5b6001600160a01b0381166000908152600360209081526040808320546005909252822054600154600160801b926106b9926106b4926106ae916106a99190610f7d565b611006565b90611016565b611054565b6106c39190611972565b92915050565b6000546001600160a01b031633146106f35760405162461bcd60e51b815260040161065d90611994565b6001600160a01b0381166000908152600d60205260408120805460ff19166001179055610721908290611067565b61072a81611100565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b60008060008060008060008061077660085490565b891061079b5750600096506000199550859450869350839250829150819050806107c3565b60006107a68a611233565b90506107b181610d79565b98509850985098509850985098509850505b919395975091939597565b6107d733611266565b50565b6000546001600160a01b031633146108045760405162461bcd60e51b815260040161065d90611994565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006106c3825b6001600160a01b0381166000908152600460205260408120546106c39061087b84610666565b90611314565b6000546001600160a01b031633146108ab5760405162461bcd60e51b815260040161065d90611994565b6000600654116108ba57600080fd5b80156107d7576006546108e8906108d583600160801b610f7d565b6108df9190611972565b60015490611356565b60015560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a260075461092d9082611356565b60075550565b600080546001600160a01b0316331461095e5760405162461bcd60e51b815260040161065d90611994565b600061096984611266565b905080156109d5576001600160a01b0384166000818152600e6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906109c39085815260200190565b60405180910390a360019150506106c3565b5060009392505050565b6000546001600160a01b03163314610a095760405162461bcd60e51b815260040161065d90611994565b6001600160a01b0381166000908152600d602052604090205460ff16610a2e57600080fd5b6001600160a01b0381166000818152600d6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000546001600160a01b03163314610aa15760405162461bcd60e51b815260040161065d90611994565b6001600160a01b0382166000908152600d602052604090205460ff16610b22577f00000000000000000000000000000000000000000000000000000000000000008110610b0157610af28282611067565b610afc82826113b5565b610b15565b610b0c826000611067565b610b1582611100565b610b20826001610933565b505b5050565b6000546001600160a01b03163314610b505760405162461bcd60e51b815260040161065d90611994565b6104b08110158015610b655750620151808111155b610be55760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a40161065d565b600f548103610c5c5760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c7565000000000000000000606482015260840161065d565b600f5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600f55565b6000546001600160a01b03163314610cb95760405162461bcd60e51b815260040161065d90611994565b6001600160a01b038116610d1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161065d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080808080610d8b88611473565b9650600019955060008712610ded57600c54871115610db957600c54610db29088906114b8565b9550610ded565b600c5460085460009110610dce576000610ddd565b600c54600854610ddd91611314565b9050610de98882611016565b9650505b610df688610855565b9450610e0188610666565b6001600160a01b0389166000908152600e6020526040902054909450925082610e2b576000610e39565b600f54610e39908490611356565b9150428211610e49576000610e53565b610e538242611314565b9050919395975091939597565b60085460009081908190808203610e82575050600c5460009250829150610f76565b600c546000805a90506000805b8984108015610e9d57508582105b15610f655784610eac816119c9565b60085490965086109050610ebf57600094505b600060086000018681548110610ed757610ed76119e2565b60009182526020808320909101546001600160a01b0316808352600e909152604090912054909150610f08906114f5565b15610f2b57610f18816001610933565b15610f2b5781610f27816119c9565b9250505b82610f35816119c9565b93505060005a905080851115610f5c57610f59610f528683611314565b8790611356565b95505b9350610e8f9050565b600c85905590975095509193505050505b9193909250565b600082600003610f8f575060006106c3565b6000610f9b83856119f8565b905082610fa88583611972565b14610fff5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161065d565b9392505050565b600081818112156106c357600080fd5b6000806110238385611a0f565b9050600083121580156110365750838112155b8061104b575060008312801561104b57508381125b610fff57600080fd5b60008082121561106357600080fd5b5090565b6001600160a01b0382166000908152600560205260409020805490829055808211156110c35760006110998383611314565b90506110a5848261151c565b80600660008282546110b79190611a37565b90915550610b20915050565b80821015610b205760006110d78284611314565b90506110e38482611576565b80600660008282546110f59190611a4a565b909155505050505050565b6001600160a01b0381166000908152600b602052604090205460ff166111235750565b6001600160a01b0381166000908152600b60209081526040808320805460ff1916905560098252808320839055600a90915281205460085490919061116a90600190611a4a565b9050600060086000018281548110611184576111846119e2565b60009182526020808320909101546001600160a01b03908116808452600a90925260408084208790559087168352822091909155600880549192508291859081106111d1576111d16119e2565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600880548061120b5761120b611a5d565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b60006008600001828154811061124b5761124b6119e2565b6000918252602090912001546001600160a01b031692915050565b60008061127283610855565b9050801561130b576001600160a01b03831660009081526004602052604090205461129d9082611356565b6001600160a01b038416600081815260046020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906112ec9084815260200190565b60405180910390a26002546106c3906001600160a01b031684836115b0565b50600092915050565b6000610fff83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611602565b6000806113638385611a37565b905083811015610fff5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161065d565b6001600160a01b0382166000908152600b602052604090205460ff16156113f3576001600160a01b0391909116600090815260096020526040902055565b6001600160a01b0382166000818152600b60209081526040808320805460ff191660019081179091556009835281842086905560088054600a909452918420839055820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b03191690911790555050565b6001600160a01b0381166000908152600b602052604081205460ff1661149c5750600019919050565b506001600160a01b03166000908152600a602052604090205490565b6000806114c58385611a73565b9050600083121580156114d85750838113155b8061104b575060008312801561104b5750838113610fff57600080fd5b60004282111561150757506000919050565b600f546115144284611314565b101592915050565b6115566115376106a983600154610f7d90919063ffffffff16565b6001600160a01b038416600090815260036020526040902054906114b8565b6001600160a01b0390921660009081526003602052604090209190915550565b6115566115916106a983600154610f7d90919063ffffffff16565b6001600160a01b03841660009081526003602052604090205490611016565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b2090849061163c565b600081848411156116265760405162461bcd60e51b815260040161065d9190611abe565b5060006116338486611a4a565b95945050505050565b6000611691826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661170e9092919063ffffffff16565b805190915015610b2057808060200190518101906116af9190611af1565b610b205760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065d565b606061171d8484600085611725565b949350505050565b6060824710156117865760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161065d565b600080866001600160a01b031685876040516117a29190611b0e565b60006040518083038185875af1925050503d80600081146117df576040519150601f19603f3d011682016040523d82523d6000602084013e6117e4565b606091505b50915091506117f587838387611800565b979650505050505050565b6060831561186f578251600003611868576001600160a01b0385163b6118685760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065d565b508161171d565b61171d83838151156118845781518083602001fd5b8060405162461bcd60e51b815260040161065d9190611abe565b6001600160a01b03811681146107d757600080fd5b6000602082840312156118c557600080fd5b8135610fff8161189e565b6000602082840312156118e257600080fd5b5035919050565b80151581146107d757600080fd5b6000806040838503121561190a57600080fd5b82356119158161189e565b91506020830135611925816118e9565b809150509250929050565b6000806040838503121561194357600080fd5b823561194e8161189e565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b60008261198f57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000600182016119db576119db61195c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176106c3576106c361195c565b8082018281126000831280158216821582161715611a2f57611a2f61195c565b505092915050565b808201808211156106c3576106c361195c565b818103818111156106c3576106c361195c565b634e487b7160e01b600052603160045260246000fd5b8181036000831280158383131683831282161715611a9357611a9361195c565b5092915050565b60005b83811015611ab5578181015183820152602001611a9d565b50506000910152565b6020815260008251806020840152611add816040850160208701611a9a565b601f01601f19169190910160400192915050565b600060208284031215611b0357600080fd5b8151610fff816118e9565b60008251611b20818460208701611a9a565b919091019291505056fea26469706673582212207b62d836b635246cbd2e1d05b88a3db36a6e2bae64f89e2d32e23f58bedc261364736f6c63430008110033608060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061072a806100616000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806313ea204414610051578063715018a6146100665780638da5cb5b1461006e578063f2fde38b1461008d575b600080fd5b61006461005f3660046105e1565b6100a0565b005b6100646101ca565b600054604080516001600160a01b039092168252519081900360200190f35b61006461009b3660046105e1565b61023e565b6000546001600160a01b031633146100d35760405162461bcd60e51b81526004016100ca90610611565b60405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561011a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061013e9190610646565b11156101c7576101c78161015a6000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa15801561019e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c29190610646565b610328565b50565b6000546001600160a01b031633146101f45760405162461bcd60e51b81526004016100ca90610611565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146102685760405162461bcd60e51b81526004016100ca90610611565b6001600160a01b0381166102cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100ca565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261037a90849061037f565b505050565b60006103d4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166104519092919063ffffffff16565b80519091501561037a57808060200190518101906103f2919061065f565b61037a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016100ca565b60606104608484600085610468565b949350505050565b6060824710156104c95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016100ca565b600080866001600160a01b031685876040516104e591906106a5565b60006040518083038185875af1925050503d8060008114610522576040519150601f19603f3d011682016040523d82523d6000602084013e610527565b606091505b509150915061053887838387610543565b979650505050505050565b606083156105b25782516000036105ab576001600160a01b0385163b6105ab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016100ca565b5081610460565b61046083838151156105c75781518083602001fd5b8060405162461bcd60e51b81526004016100ca91906106c1565b6000602082840312156105f357600080fd5b81356001600160a01b038116811461060a57600080fd5b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561065857600080fd5b5051919050565b60006020828403121561067157600080fd5b8151801515811461060a57600080fd5b60005b8381101561069c578181015183820152602001610684565b50506000910152565b600082516106b7818460208701610681565b9190910192915050565b60208152600082518060208401526106e0816040850160208701610681565b601f01601f1916919091016040019291505056fea264697066735822122087a0805ee73acbb41e2bfb9e8a5ac2129344af3576b4c1b4234dfdb0539e7a8864736f6c634300081100334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061038e5760003560e01c80637571336a116101de578063b62496f51161010f578063dc07b617116100ad578063e98030c71161007c578063e98030c7146107b3578063f27fd254146107c6578063f2fde38b146107d9578063fc0c546a146107ec57600080fd5b8063dc07b61714610757578063dd62ed3e1461075f578063e634e70a14610798578063e7841ec0146107ab57600080fd5b8063c6a30647116100e9578063c6a306471461070f578063c78d0fa014610722578063cc1776d31461072b578063dae6a9821461073457600080fd5b8063b62496f5146106d0578063bb811508146106f3578063c0f306ef146106fc57600080fd5b80639e93ad8e1161017c578063a8b9d24011610156578063a8b9d24014610649578063a9059cbb1461065c578063ac1b129d1461066f578063ad56c13c1461067857600080fd5b80639e93ad8e14610625578063a26579ad1461062e578063a457c2d71461063657600080fd5b8063894dc39b116101b8578063894dc39b146105e65780638da5cb5b146105f957806395d89b411461060a5780639a7a23d61461061257600080fd5b80637571336a146105ad5780638366e79a146105c057806384d5a0f1146105d357600080fd5b806330bb4cff116102c35780634f7041a51161026157806370a082311161023057806370a0823114610582578063715018a61461059557806371778e7d1461059d578063751039fc146105a557600080fd5b80634f7041a51461055657806351f205e41461055f57806364b0f653146105675780636843cd841461056f57600080fd5b806333cdacd91161029d57806333cdacd91461051f5780633950935114610528578063452ed4f11461053b5780634e71d92d1461054e57600080fd5b806330bb4cff146104f5578063313ce567146104fd57806331e79db01461050c57600080fd5b80631cce34ee11610330578063254248961161030a57806325424896146104ab578063293230b8146104b35780632c1f5216146104bb5780632f37aa6d146104e257600080fd5b80631cce34ee1461046f5780632307b4411461048357806323b872dd1461049857600080fd5b8063095ea7b31161036c578063095ea7b31461041357806311704f521461043657806318160ddd1461044a5780631b3d6e871461045c57600080fd5b8063032c32fc1461039357806306fdde03146103d75780630758d924146103ec575b600080fd5b6103ba7f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193381565b6040516001600160a01b0390911681526020015b60405180910390f35b6103df610813565b6040516103ce919061306f565b6103ba7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6104266104213660046130b7565b6108a5565b60405190151581526020016103ce565b600b5461042690600160a81b900460ff1681565b6002545b6040519081526020016103ce565b600b546103ba906001600160a01b031681565b600b5461042690600160a01b900460ff1681565b6104966104913660046131b9565b6108bc565b005b6104266104a636600461327b565b610adb565b610496610b82565b610496610c66565b6103ba7f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce81565b6104966104f03660046132bc565b610d88565b61044e610e2e565b604051601281526020016103ce565b61049661051a3660046132de565b610eb7565b61044e60075481565b6104266105363660046130b7565b610f60565b6009546103ba906001600160a01b031681565b610496610f9c565b61044e600c5481565b610496611030565b61044e611138565b61044e61057d3660046132de565b611198565b61044e6105903660046132de565b611228565b610496611243565b61044e6112b7565b610496611317565b6104966105bb366004613310565b611379565b6104966105ce366004613349565b611441565b6104966105e1366004613377565b6115ee565b6104966105f4366004613377565b6116b8565b6005546001600160a01b03166103ba565b6103df6117fe565b610496610620366004613310565b61180d565b61044e61271081565b61044e6119af565b6104266106443660046130b7565b611a0f565b61044e6106573660046132de565b611aa8565b61042661066a3660046130b7565b611afb565b61044e60065481565b61068b6106863660046132de565b611b08565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103ce565b6104266106de3660046132de565b60106020526000908152604090205460ff1681565b61044e60085481565b61049661070a3660046132de565b611bcc565b61049661071d366004613310565b611c44565b61044e600a5481565b61044e600d5481565b6104266107423660046132de565b600f6020526000908152604090205460ff1681565b610496611ccd565b61044e61076d366004613349565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6104966107a6366004613377565b611d2f565b61044e611df2565b6104966107c1366004613377565b611e52565b61068b6107d4366004613377565b611ec9565b6104966107e73660046132de565b611f23565b6103ba7f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193381565b60606003805461082290613390565b80601f016020809104026020016040519081016040528092919081815260200182805461084e90613390565b801561089b5780601f106108705761010080835404028352916020019161089b565b820191906000526020600020905b81548152906001019060200180831161087e57829003601f168201915b5050505050905090565b60006108b233848461200e565b5060015b92915050565b6005546001600160a01b031633146108ef5760405162461bcd60e51b81526004016108e6906133ca565b60405180910390fd5b80518251146109405760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e677468000060448201526064016108e6565b6102588251106109b15760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b60648201526084016108e6565b60005b8251811015610ad6576109fa338483815181106109d3576109d36133ff565b60200260200101518484815181106109ed576109ed6133ff565b6020026020010151612132565b7f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b031663e30443bc848381518110610a3b57610a3b6133ff565b6020026020010151610a65868581518110610a5857610a586133ff565b6020026020010151611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610aab57600080fd5b505af1158015610abf573d6000803e3d6000fd5b505050508080610ace9061342b565b9150506109b4565b505050565b6000610ae8848484612284565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610b6a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e7366657220616d74206578636565647320616c6c6f60448201526477616e636560d81b60648201526084016108e6565b610b77853385840361200e565b506001949350505050565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8116600483015260001960248301527f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933169063095ea7b3906044016020604051808303816000875af1158015610c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c369190613444565b50610c64307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d60001961200e565b565b6005546001600160a01b03163314610c905760405162461bcd60e51b81526004016108e6906133ca565b600b54600160a81b900460ff1615610cfe5760405162461bcd60e51b815260206004820152602b60248201527f54726164696e6720697320616c7265616479206163746976652c2063616e6e6f60448201526a3a103932b630bab731b41760a91b60648201526084016108e6565b6009546001600160a01b0316610d4a5760405162461bcd60e51b815260206004820152601160248201527010dc99585d194814185a5c88119a5c9cdd607a1b60448201526064016108e6565b600b805460ff60a81b1916600160a81b1790556040517f9eed9b8b4340ef4b5c4a71328140c10d1e90f76d22a91ed6d1dd85eb3a4e1d9190600090a1565b6005546001600160a01b03163314610db25760405162461bcd60e51b81526004016108e6906133ca565b600c829055600d8190556040518281527f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece05089060200160405180910390a17fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97600d54604051610e2291815260200190565b60405180910390a15050565b60007f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b03166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190613461565b905090565b6005546001600160a01b03163314610ee15760405162461bcd60e51b81526004016108e6906133ca565b60405163031e79db60e41b81526001600160a01b0382811660048301527f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce16906331e79db0906024015b600060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108b2918590610f9790869061347a565b61200e565b60405163bc4c4b3760e01b8152336004820152600060248201527f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b03169063bc4c4b37906044016020604051808303816000875af1158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190613444565b50565b6005546001600160a01b0316331461105a5760405162461bcd60e51b81526004016108e6906133ca565b600a5461106630611228565b10156110da5760405162461bcd60e51b815260206004820152603d60248201527f43616e206f6e6c792073776170207768656e20746f6b656e20616d742069732060448201527f6174206f7220686967686572207468616e207265737472696374696f6e00000060648201526084016108e6565b6009805460ff60a01b1916600160a01b1790556110f561296a565b6009805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb32906020015b60405180910390a1565b60007f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b03166309bbedde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b60405163156dbbf560e31b81526001600160a01b0382811660048301526000917f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce9091169063ab6ddfa8906024015b602060405180830381865afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b69190613461565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461126d5760405162461bcd60e51b81526004016108e6906133ca565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60007f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b031663ad7a672f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b6005546001600160a01b031633146113415760405162461bcd60e51b81526004016108e6906133ca565b600b805460ff60a01b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146113a35760405162461bcd60e51b81526004016108e6906133ca565b80611416576009546001600160a01b03908116908316036114165760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b60648201526084016108e6565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461146b5760405162461bcd60e51b81526004016108e6906133ca565b6001600160a01b0382166114c15760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016108e6565b6001600160a01b038216301415806114e35750600b54600160a81b900460ff16155b61152f5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e730000000060448201526064016108e6565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159a9190613461565b90506115a7838383612b0f565b604080516001600160a01b0385168152602081018390527fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a1505050565b6005546001600160a01b031633146116185760405162461bcd60e51b81526004016108e6906133ca565b670de0b6b3a7640000606461162c60025490565b61163790600161348d565b61164191906134a4565b61164b91906134a4565b81101561166a5760405162461bcd60e51b81526004016108e6906134c6565b61167c81670de0b6b3a764000061348d565b60068190556040519081527fbd0f1740caf821f78178ca26f0481f035268c600b91408a9a82dfb3a80b79a29906020015b60405180910390a150565b6005546001600160a01b031633146116e25760405162461bcd60e51b81526004016108e6906133ca565b620f42406116ef60025490565b6116fa90600161348d565b61170491906134a4565b81101561176f5760405162461bcd60e51b815260206004820152603360248201527f5377617020616d742063616e6e6f74206265206c6f776572207468616e20302e6044820152721818181892903a37ba30b61039bab838363c9760691b60648201526084016108e6565b6103e861177b60025490565b61178690600161348d565b61179091906134a4565b8111156117f95760405162461bcd60e51b815260206004820152603160248201527f5377617020616d742063616e6e6f7420626520686967686572207468616e2030604482015270171892903a37ba30b61039bab838363c9760791b60648201526084016108e6565b600a55565b60606004805461082290613390565b6005546001600160a01b031633146118375760405162461bcd60e51b81526004016108e6906133ca565b6009546001600160a01b0383811691161415806118515750805b6118c35760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016108e6565b6001600160a01b0382166000908152601060205260409020805460ff19168215151790556118f18282612b61565b80156119735760405163031e79db60e41b81526001600160a01b0383811660048301527f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce16906331e79db090602401600060405180830381600087803b15801561195a57600080fd5b505af115801561196e573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60007f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b0316636f2789ec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611a915760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108e6565b611a9e338585840361200e565b5060019392505050565b6040516302a2e74960e61b81526001600160a01b0382811660048301526000917f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce9091169063a8b9d240906024016111e7565b60006108b2338484612284565b6000806000806000806000807f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b8152600401611b6f91906001600160a01b0391909116815260200190565b61010060405180830381865afa158015611b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb1919061350b565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b03163314611bf65760405162461bcd60e51b81526004016108e6906133ca565b60405163c0f306ef60e01b81526001600160a01b0382811660048301527f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce169063c0f306ef90602401610f2b565b6005546001600160a01b03163314611c6e5760405162461bcd60e51b81526004016108e6906133ca565b6001600160a01b0382166000818152600e6020908152604091829020805460ff191685151590811790915591519182527f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c910160405180910390a25050565b6005546001600160a01b03163314611cf75760405162461bcd60e51b81526004016108e6906133ca565b60025460088190556040519081527f5c2c6bbd255d68d22e47fbc0e1cbb9e5c5c2892d91144941f6b7f61d3b1c8a559060200161112e565b6005546001600160a01b03163314611d595760405162461bcd60e51b81526004016108e6906133ca565b670de0b6b3a76400006064611d6d60025490565b611d7890600161348d565b611d8291906134a4565b611d8c91906134a4565b811015611dab5760405162461bcd60e51b81526004016108e6906134c6565b611dbd81670de0b6b3a764000061348d565b60078190556040519081527fda3f4fd2455d333278e3d4e42bf292b30da257f729437c6264f483617cbf73f7906020016116ad565b60007f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b031663e7841ec06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e8e573d6000803e3d6000fd5b6005546001600160a01b03163314611e7c5760405162461bcd60e51b81526004016108e6906133ca565b60405163e98030c760e01b8152600481018290527f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b03169063e98030c790602401610f2b565b6000806000806000806000807f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401611b6f91815260200190565b6005546001600160a01b03163314611f4d5760405162461bcd60e51b81526004016108e6906133ca565b6001600160a01b038116611fb25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108e6565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166120705760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108e6565b6001600160a01b0382166120d15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108e6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121585760405162461bcd60e51b81526004016108e690613575565b6001600160a01b03821661217e5760405162461bcd60e51b81526004016108e6906135ba565b6001600160a01b038316600090815260208190526040902054818110156121f35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220616d7420657863656564732062616c616044820152626e636560e81b60648201526084016108e6565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061222a90849061347a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161227691815260200190565b60405180910390a350505050565b6001600160a01b0383166122aa5760405162461bcd60e51b81526004016108e690613575565b6001600160a01b0382166122d05760405162461bcd60e51b81526004016108e6906135ba565b806000036122e457610ad683836000612132565b6001600160a01b0383166000908152600e602052604090205460ff168061232357506001600160a01b0382166000908152600e602052604090205460ff165b806123375750600954600160a01b900460ff165b1561247a57612347838383612132565b7f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b031663e30443bc8461238086611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156123c657600080fd5b505af11580156123da573d6000803e3d6000fd5b505050507f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b031663e30443bc8361241785611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561245d57600080fd5b505af1158015612471573d6000803e3d6000fd5b50505050505050565b600b54600160a81b900460ff166124cc5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b60448201526064016108e6565b600b54600160a01b900460ff161561270f576001600160a01b03831660009081526010602052604090205460ff16801561251f57506001600160a01b0382166000908152600f602052604090205460ff16155b156125e8576006548111156125845760405162461bcd60e51b815260206004820152602560248201527f427579207472616e7366657220616d74206578636565647320746865206d617860448201526410313abc9760d91b60648201526084016108e6565b60085461259083611228565b61259a908361347a565b11156125e35760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b60448201526064016108e6565b61270f565b6001600160a01b03821660009081526010602052604090205460ff16801561262957506001600160a01b0383166000908152600f602052604090205460ff16155b15612690576007548111156125e35760405162461bcd60e51b815260206004820152602760248201527f53656c6c207472616e7366657220616d74206578636565647320746865206d616044820152663c1039b2b6361760c91b60648201526084016108e6565b6001600160a01b0382166000908152600f602052604090205460ff1661270f576008546126bc83611228565b6126c6908361347a565b111561270f5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b60448201526064016108e6565b600a5461271b30611228565b1015801561274157506001600160a01b03821660009081526010602052604090205460ff165b1561276f576009805460ff60a01b1916600160a01b17905561276161296a565b6009805460ff60a01b191690555b6001600160a01b03821660009081526010602052604081205460ff16801561279957506000600d54115b156127c057612710600d54836127af919061348d565b6127b991906134a4565b905061280d565b6001600160a01b03841660009081526010602052604090205460ff1680156127ea57506000600c54115b1561280d57612710600c5483612800919061348d565b61280a91906134a4565b90505b801561282b5761281e843083612132565b61282881836135fd565b91505b612836848484612132565b7f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b031663e30443bc8561286f87611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156128b557600080fd5b505af11580156128c9573d6000803e3d6000fd5b505050507f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b031663e30443bc8461290686611228565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561294c57600080fd5b505af1158015612960573d6000803e3d6000fd5b5050505050505050565b600061297530611228565b9050806000036129825750565b600a5461299090602861348d565b8111156129a857600a546129a590602861348d565b90505b6129b181612bbd565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b0316906370a0823190602401602060405180830381865afa158015612a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3c9190613461565b90508015612b0b57612a8f7f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119337f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce83612b0f565b60405163b0c7ce3760e01b8152600481018290527f0000000000000000000000006c359056e923411a67c49a2d2aa1c7a7e87b12ce6001600160a01b03169063b0c7ce37906024015b600060405180830381600087803b158015612af257600080fd5b505af1158015612b06573d6000803e3d6000fd5b505050505b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ad6908490612de9565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101610e22565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110612bf457612bf46133ff565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c969190613610565b81600181518110612ca957612ca96133ff565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193381600281518110612cfd57612cfd6133ff565b6001600160a01b039283166020918202929092010152600b54604051635c11d79560e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d831692635c11d79592612d659287926000928892911690429060040161362d565b600060405180830381600087803b158015612d7f57600080fd5b505af1158015612d93573d6000803e3d6000fd5b5050600b546040516304fa881160e21b81526001600160a01b037f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119338116600483015290911692506313ea20449150602401612ad8565b6000612e3e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ebb9092919063ffffffff16565b805190915015610ad65780806020019051810190612e5c9190613444565b610ad65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108e6565b6060612eca8484600085612ed2565b949350505050565b606082471015612f335760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108e6565b600080866001600160a01b03168587604051612f4f919061369e565b60006040518083038185875af1925050503d8060008114612f8c576040519150601f19603f3d011682016040523d82523d6000602084013e612f91565b606091505b5091509150612fa287838387612fad565b979650505050505050565b6060831561301c578251600003613015576001600160a01b0385163b6130155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108e6565b5081612eca565b612eca83838151156130315781518083602001fd5b8060405162461bcd60e51b81526004016108e6919061306f565b60005b8381101561306657818101518382015260200161304e565b50506000910152565b602081526000825180602084015261308e81604085016020870161304b565b601f01601f19169190910160400192915050565b6001600160a01b038116811461102d57600080fd5b600080604083850312156130ca57600080fd5b82356130d5816130a2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613122576131226130e3565b604052919050565b600067ffffffffffffffff821115613144576131446130e3565b5060051b60200190565b600082601f83011261315f57600080fd5b8135602061317461316f8361312a565b6130f9565b82815260059290921b8401810191818101908684111561319357600080fd5b8286015b848110156131ae5780358352918301918301613197565b509695505050505050565b600080604083850312156131cc57600080fd5b823567ffffffffffffffff808211156131e457600080fd5b818501915085601f8301126131f857600080fd5b8135602061320861316f8361312a565b82815260059290921b8401810191818101908984111561322757600080fd5b948201945b8386101561324e57853561323f816130a2565b8252948201949082019061322c565b9650508601359250508082111561326457600080fd5b506132718582860161314e565b9150509250929050565b60008060006060848603121561329057600080fd5b833561329b816130a2565b925060208401356132ab816130a2565b929592945050506040919091013590565b600080604083850312156132cf57600080fd5b50508035926020909101359150565b6000602082840312156132f057600080fd5b81356132fb816130a2565b9392505050565b801515811461102d57600080fd5b6000806040838503121561332357600080fd5b823561332e816130a2565b9150602083013561333e81613302565b809150509250929050565b6000806040838503121561335c57600080fd5b8235613367816130a2565b9150602083013561333e816130a2565b60006020828403121561338957600080fd5b5035919050565b600181811c908216806133a457607f821691505b6020821081036133c457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161343d5761343d613415565b5060010190565b60006020828403121561345657600080fd5b81516132fb81613302565b60006020828403121561347357600080fd5b5051919050565b808201808211156108b6576108b6613415565b80820281158282048414176108b6576108b6613415565b6000826134c157634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f43616e6e6f7420736574206d61782073656c6c20616d74206c6f776572207468604082015264616e20312560d81b606082015260800190565b600080600080600080600080610100898b03121561352857600080fd5b8851613533816130a2565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156108b6576108b6613415565b60006020828403121561362257600080fd5b81516132fb816130a2565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561367d5784516001600160a01b031683529383019391830191600101613658565b50506001600160a01b03969096166060850152505050608001529392505050565b600082516136b081846020870161304b565b919091019291505056fea2646970667358221220cdd7f4db1e7c1a019a817a9c0fb3be7b2e72791536f2867b8f56cbce6417420664736f6c63430008110033

Deployed Bytecode Sourcemap

39527:14519:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39842:35;;;;;;;;-1:-1:-1;;;;;192:32:1;;;174:51;;162:2;147:18;39842:35:0;;;;;;;;8626:100;;;:::i;:::-;;;;;;;:::i;39768:37::-;;;;;9534:163;;;;;;:::i;:::-;;:::i;:::-;;;1740:14:1;;1733:22;1715:41;;1703:2;1688:18;9534:163:0;1575:187:1;40037:31:0;;;;;-1:-1:-1;;;40037:31:0;;;;;;8947:108;9035:12;;8947:108;;;1913:25:1;;;1901:2;1886:18;8947:108:0;1767:177:1;39954:32:0;;;;;-1:-1:-1;;;;;39954:32:0;;;39999:31;;;;;-1:-1:-1;;;39999:31:0;;;;;;46191:520;;;;;;:::i;:::-;;:::i;:::-;;9705:443;;;;;;:::i;:::-;;:::i;43881:197::-;;;:::i;44086:252::-;;;:::i;39674:48::-;;;;;47433:213;;;;;;:::i;:::-;;:::i;48089:141::-;;;:::i;8846:93::-;;;8929:2;5761:36:1;;5749:2;5734:18;8846:93:0;5619:184:1;44431:130:0;;;;;;:::i;:::-;;:::i;39606:25::-;;;;;;10156:215;;;;;;:::i;:::-;;:::i;39812:21::-;;;;;-1:-1:-1;;;;;39812:21:0;;;49188:97;;;:::i;40129:21::-;;;;;;53272:306;;;:::i;49427:141::-;;;:::i;48390:134::-;;;;;;:::i;:::-;;:::i;9063:127::-;;;;;;:::i;:::-;;:::i;12539:150::-;;;:::i;49580:119::-;;;:::i;44844:113::-;;;:::i;46723:257::-;;;;;;:::i;:::-;;:::i;53586:457::-;;;;;;:::i;:::-;;:::i;44965:252::-;;;;;;:::i;:::-;;:::i;45643:324::-;;;;;;:::i;:::-;;:::i;12325:79::-;12390:6;;-1:-1:-1;;;;;12390:6:0;12325:79;;8734:104;;;:::i;46988:437::-;;;;;;:::i;:::-;;:::i;40077:43::-;;40115:5;40077:43;;47973:108;;;:::i;10379:413::-;;;;;;:::i;:::-;;:::i;48238:147::-;;;;;;:::i;:::-;;:::i;9198:169::-;;;;;;:::i;:::-;;:::i;39575:24::-;;;;;;48532:318;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7713:32:1;;;7695:51;;7777:2;7762:18;;7755:34;;;;7805:18;;;7798:34;;;;7863:2;7848:18;;7841:34;;;;7906:3;7891:19;;7884:35;7733:3;7935:19;;7928:35;7994:3;7979:19;;7972:35;8038:3;8023:19;;8016:35;7682:3;7667:19;48532:318:0;7356:701:1;40317:58:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39638:27;;;;;;44666:126;;;;;;:::i;:::-;;:::i;47654:179::-;;;;;;:::i;:::-;;:::i;39915:30::-;;;;;;40157:22;;;;;;40247:61;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45493:142;;;:::i;9375:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9491:18:0;;;9464:7;9491:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9375:151;45229:256;;;;;;:::i;:::-;;:::i;49293:126::-;;;:::i;47841:124::-;;;;;;:::i;:::-;;:::i;48855:325::-;;;;;;:::i;:::-;;:::i;12697:244::-;;;;;;:::i;:::-;;:::i;39729:30::-;;;;;8626:100;8680:13;8713:5;8706:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8626:100;:::o;9534:163::-;9614:4;9631:36;407:10;9654:7;9663:3;9631:8;:36::i;:::-;-1:-1:-1;9685:4:0;9534:163;;;;;:::o;46191:520::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;;;;;;;;;46330:12:::1;:19;46312:7;:14;:37;46304:80;;;::::0;-1:-1:-1;;;46304:80:0;;9010:2:1;46304:80:0::1;::::0;::::1;8992:21:1::0;9049:2;9029:18;;;9022:30;9088:32;9068:18;;;9061:60;9138:18;;46304:80:0::1;8808:354:1::0;46304:80:0::1;46420:3;46403:7;:14;:20;46395:87;;;::::0;-1:-1:-1;;;46395:87:0;;9369:2:1;46395:87:0::1;::::0;::::1;9351:21:1::0;9408:2;9388:18;;;9381:30;9447:34;9427:18;;;9420:62;-1:-1:-1;;;9498:18:1;;;9491:52;9560:19;;46395:87:0::1;9167:418:1::0;46395:87:0::1;46497:9;46493:211;46516:7;:14;46512:1;:18;46493:211;;;46551:56;46567:10;46579:7;46587:1;46579:10;;;;;;;;:::i;:::-;;;;;;;46591:12;46604:1;46591:15;;;;;;;;:::i;:::-;;;;;;;46551;:56::i;:::-;46622:15;-1:-1:-1::0;;;;;46622:26:0::1;;46657:7;46665:1;46657:10;;;;;;;;:::i;:::-;;;;;;;46670:21;46680:7;46688:1;46680:10;;;;;;;;:::i;:::-;;;;;;;46670:9;:21::i;:::-;46622:70;::::0;-1:-1:-1;;;;;;46622:70:0::1;::::0;;;;;;-1:-1:-1;;;;;9930:32:1;;;46622:70:0::1;::::0;::::1;9912:51:1::0;9979:18;;;9972:34;9885:18;;46622:70:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46532:3;;;;;:::i;:::-;;;;46493:211;;;;46191:520:::0;;:::o;9705:443::-;9808:4;9825:33;9835:6;9843:9;9854:3;9825:9;:33::i;:::-;-1:-1:-1;;;;;9898:19:0;;9871:24;9898:19;;;:11;:19;;;;;;;;407:10;9898:33;;;;;;;;9950:23;;;;9942:73;;;;-1:-1:-1;;;9942:73:0;;10491:2:1;9942:73:0;;;10473:21:1;10530:2;10510:18;;;10503:30;10569:34;10549:18;;;10542:62;-1:-1:-1;;;10620:18:1;;;10613:35;10665:19;;9942:73:0;10289:401:1;9942:73:0;10051:54;10060:6;407:10;10101:3;10082:16;:22;10051:8;:54::i;:::-;-1:-1:-1;10136:4:0;;9705:443;-1:-1:-1;;;;9705:443:0:o;43881:197::-;43939:58;;-1:-1:-1;;;43939:58:0;;-1:-1:-1;;;;;43967:9:0;9930:32:1;;43939:58:0;;;9912:51:1;-1:-1:-1;;9979:18:1;;;9972:34;43939:11:0;:19;;;;9885:18:1;;43939:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44008:62;44025:4;44040:9;-1:-1:-1;;44008:8:0;:62::i;:::-;43881:197::o;44086:252::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;44149:11:::1;::::0;-1:-1:-1;;;44149:11:0;::::1;;;44148:12;44140:68;;;::::0;-1:-1:-1;;;44140:68:0;;11426:2:1;44140:68:0::1;::::0;::::1;11408:21:1::0;11465:2;11445:18;;;11438:30;11504:34;11484:18;;;11477:62;-1:-1:-1;;;11555:18:1;;;11548:41;11606:19;;44140:68:0::1;11224:407:1::0;44140:68:0::1;44227:6;::::0;-1:-1:-1;;;;;44227:6:0::1;44219:50;;;::::0;-1:-1:-1;;;44219:50:0;;11838:2:1;44219:50:0::1;::::0;::::1;11820:21:1::0;11877:2;11857:18;;;11850:30;-1:-1:-1;;;11896:18:1;;;11889:47;11953:18;;44219:50:0::1;11636:341:1::0;44219:50:0::1;44280:11;:18:::0;;-1:-1:-1;;;;44280:18:0::1;-1:-1:-1::0;;;44280:18:0::1;::::0;;44314:16:::1;::::0;::::1;::::0;44280:18;;44314:16:::1;44086:252::o:0;47433:213::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;47517:6:::1;:16:::0;;;47544:7:::1;:18:::0;;;47578:21:::1;::::0;1913:25:1;;;47578:21:0::1;::::0;1901:2:1;1886:18;47578:21:0::1;;;;;;;47615:23;47630:7;;47615:23;;;;1913:25:1::0;;1901:2;1886:18;;1767:177;47615:23:0::1;;;;;;;;47433:213:::0;;:::o;48089:141::-;48152:7;48179:15;-1:-1:-1;;;;;48179:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48172:50;;48089:141;:::o;44431:130::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;44508:45:::1;::::0;-1:-1:-1;;;44508:45:0;;-1:-1:-1;;;;;192:32:1;;;44508:45:0::1;::::0;::::1;174:51:1::0;44508:15:0::1;:36;::::0;::::1;::::0;147:18:1;;44508:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44431:130:::0;:::o;10156:215::-;407:10;10244:4;10293:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10293:34:0;;;;;;;;;;10244:4;;10261:80;;10284:7;;10293:47;;10330:10;;10293:47;:::i;:::-;10261:8;:80::i;49188:97::-;49219:58;;-1:-1:-1;;;49219:58:0;;49258:10;49219:58;;;12485:51:1;49271:5:0;12552:18:1;;;12545:50;49219:15:0;-1:-1:-1;;;;;49219:30:0;;;;12458:18:1;;49219:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49188:97::o;53272:306::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;53363:15:::1;;53335:24;53353:4;53335:9;:24::i;:::-;:43;;53327:117;;;::::0;-1:-1:-1;;;53327:117:0;;12808:2:1;53327:117:0::1;::::0;::::1;12790:21:1::0;12847:2;12827:18;;;12820:30;12886:34;12866:18;;;12859:62;12957:31;12937:18;;;12930:59;13006:19;;53327:117:0::1;12606:425:1::0;53327:117:0::1;53455:8;:15:::0;;-1:-1:-1;;;;53455:15:0::1;-1:-1:-1::0;;;53455:15:0::1;::::0;;53481:10:::1;:8;:10::i;:::-;53502:8;:16:::0;;-1:-1:-1;;;;53502:16:0::1;::::0;;53534:36:::1;::::0;53554:15:::1;1913:25:1::0;;53534:36:0::1;::::0;1901:2:1;1886:18;53534:36:0::1;;;;;;;;53272:306::o:0;49427:141::-;49492:7;49519:15;-1:-1:-1;;;;;49519:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48390:134;48481:38;;-1:-1:-1;;;48481:38:0;;-1:-1:-1;;;;;192:32:1;;;48481:38:0;;;174:51:1;48460:7:0;;48481:15;:29;;;;;;147:18:1;;48481:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9063:127::-;-1:-1:-1;;;;;9164:18:0;9137:7;9164:18;;;;;;;;;;;;9063:127::o;12539:150::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;12632:6:::1;::::0;12611:40:::1;::::0;12648:1:::1;::::0;-1:-1:-1;;;;;12632:6:0::1;::::0;12611:40:::1;::::0;12648:1;;12611:40:::1;12662:6;:19:::0;;-1:-1:-1;;;;;;12662:19:0::1;::::0;;12539:150::o;49580:119::-;49634:7;49661:15;-1:-1:-1;;;;;49661:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44844:113;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;44898:12:::1;:20:::0;;-1:-1:-1;;;;44898:20:0::1;::::0;;44934:15:::1;::::0;::::1;::::0;44913:5:::1;::::0;44934:15:::1;44844:113::o:0;46723:257::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;46819:4:::1;46815:104;;46857:6;::::0;-1:-1:-1;;;;;46857:6:0;;::::1;46847:16:::0;;::::1;::::0;46839:68:::1;;;::::0;-1:-1:-1;;;46839:68:0;;13238:2:1;46839:68:0::1;::::0;::::1;13220:21:1::0;13277:2;13257:18;;;13250:30;13316:34;13296:18;;;13289:62;-1:-1:-1;;;13367:18:1;;;13360:37;13414:19;;46839:68:0::1;13036:403:1::0;46839:68:0::1;-1:-1:-1::0;;;;;46929:36:0;;;::::1;;::::0;;;:28:::1;:36;::::0;;;;:43;;-1:-1:-1;;46929:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46723:257::o;53586:457::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53683:20:0;::::1;53675:59;;;::::0;-1:-1:-1;;;53675:59:0;;13646:2:1;53675:59:0::1;::::0;::::1;13628:21:1::0;13685:2;13665:18;;;13658:30;13724:28;13704:18;;;13697:56;13770:18;;53675:59:0::1;13444:350:1::0;53675:59:0::1;-1:-1:-1::0;;;;;53753:23:0;::::1;53771:4;53753:23;;::::0;:39:::1;;-1:-1:-1::0;53781:11:0::1;::::0;-1:-1:-1;;;53781:11:0;::::1;;;53780:12;53753:39;53745:80;;;::::0;-1:-1:-1;;;53745:80:0;;14001:2:1;53745:80:0::1;::::0;::::1;13983:21:1::0;14040:2;14020:18;;;14013:30;14079;14059:18;;;14052:58;14127:18;;53745:80:0::1;13799:352:1::0;53745:80:0::1;53863:39;::::0;-1:-1:-1;;;53863:39:0;;53896:4:::1;53863:39;::::0;::::1;174:51:1::0;53836:24:0::1;::::0;-1:-1:-1;;;;;53863:24:0;::::1;::::0;::::1;::::0;147:18:1;;53863:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53836:66;;53913:60;53943:6;53951:3;53956:16;53913:22;:60::i;:::-;53989:46;::::0;;-1:-1:-1;;;;;9930:32:1;;9912:51;;9994:2;9979:18;;9972:34;;;53989:46:0::1;::::0;9885:18:1;53989:46:0::1;;;;;;;53664:379;53586:457:::0;;:::o;44965:252::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;45080:4:::1;45075:3;45055:13;9035:12:::0;;;8947:108;45055:13:::1;:17;::::0;45071:1:::1;45055:17;:::i;:::-;:23;;;;:::i;:::-;45054:30;;;;:::i;:::-;45044:6;:40;;45036:90;;;;-1:-1:-1::0;;;45036:90:0::1;;;;;;;:::i;:::-;45149:17;:6:::0;45159::::1;45149:17;:::i;:::-;45137:9;:29:::0;;;45182:27:::1;::::0;1913:25:1;;;45182:27:0::1;::::0;1901:2:1;1886:18;45182:27:0::1;;;;;;;;44965:252:::0;:::o;45643:324::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;45757:7:::1;45737:13;9035:12:::0;;;8947:108;45737:13:::1;:17;::::0;45753:1:::1;45737:17;:::i;:::-;:27;;;;:::i;:::-;45727:6;:37;;45719:101;;;::::0;-1:-1:-1;;;45719:101:0;;15159:2:1;45719:101:0::1;::::0;::::1;15141:21:1::0;15198:2;15178:18;;;15171:30;15237:34;15217:18;;;15210:62;-1:-1:-1;;;15288:18:1;;;15281:49;15347:19;;45719:101:0::1;14957:415:1::0;45719:101:0::1;45868:4;45848:13;9035:12:::0;;;8947:108;45848:13:::1;:17;::::0;45864:1:::1;45848:17;:::i;:::-;:24;;;;:::i;:::-;45838:6;:34;;45830:96;;;::::0;-1:-1:-1;;;45830:96:0;;15579:2:1;45830:96:0::1;::::0;::::1;15561:21:1::0;15618:2;15598:18;;;15591:30;15657:34;15637:18;;;15630:62;-1:-1:-1;;;15708:18:1;;;15701:47;15765:19;;45830:96:0::1;15377:413:1::0;45830:96:0::1;45936:15;:24:::0;45643:324::o;8734:104::-;8790:13;8823:7;8816:14;;;;;:::i;46988:437::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;47095:6:::1;::::0;-1:-1:-1;;;;;47087:14:0;;::::1;47095:6:::0;::::1;47087:14;;::::0;:23:::1;;;47105:5;47087:23;47079:93;;;::::0;-1:-1:-1;;;47079:93:0;;15997:2:1;47079:93:0::1;::::0;::::1;15979:21:1::0;16036:2;16016:18;;;16009:30;16075:34;16055:18;;;16048:62;16146:27;16126:18;;;16119:55;16191:19;;47079:93:0::1;15795:421:1::0;47079:93:0::1;-1:-1:-1::0;;;;;47183:31:0;::::1;;::::0;;;:25:::1;:31;::::0;;;;:39;;-1:-1:-1;;47183:39:0::1;::::0;::::1;;;::::0;;47233::::1;47183:31:::0;:39;47233:26:::1;:39::i;:::-;47286:5;47283:79;;;47308:42;::::0;-1:-1:-1;;;47308:42:0;;-1:-1:-1;;;;;192:32:1;;;47308:42:0::1;::::0;::::1;174:51:1::0;47308:15:0::1;:36;::::0;::::1;::::0;147:18:1;;47308:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47283:79;47377:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;47377:40:0;::::1;::::0;::::1;::::0;;;::::1;46988:437:::0;;:::o;47973:108::-;48019:7;48046:15;-1:-1:-1;;;;;48046:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10379:413;407:10;10472:4;10516:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10516:34:0;;;;;;;;;;10569:35;;;;10561:85;;;;-1:-1:-1;;;10561:85:0;;16423:2:1;10561:85:0;;;16405:21:1;16462:2;16442:18;;;16435:30;16501:34;16481:18;;;16474:62;-1:-1:-1;;;16552:18:1;;;16545:35;16597:19;;10561:85:0;16221:401:1;10561:85:0;10682:67;407:10;10705:7;10733:15;10714:16;:34;10682:8;:67::i;:::-;-1:-1:-1;10780:4:0;;10379:413;-1:-1:-1;;;10379:413:0:o;48238:147::-;48331:47;;-1:-1:-1;;;48331:47:0;;-1:-1:-1;;;;;192:32:1;;;48331:47:0;;;174:51:1;48307:7:0;;48331:15;:38;;;;;;147:18:1;;48331:47:0;14:217:1;9198:169:0;9281:4;9298:39;407:10;9322:9;9333:3;9298:9;:39::i;48532:318::-;48628:7;48650:6;48671;48692:7;48714;48736;48758;48780;48807:15;-1:-1:-1;;;;;48807:26:0;;48834:7;48807:35;;;;;;;;;;;;;;-1:-1:-1;;;;;192:32:1;;;;174:51;;162:2;147:18;;14:217;48807:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48800:42;;;;;;;;;;;;;;;;48532:318;;;;;;;;;:::o;44666:126::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;44741:43:::1;::::0;-1:-1:-1;;;44741:43:0;;-1:-1:-1;;;;;192:32:1;;;44741:43:0::1;::::0;::::1;174:51:1::0;44741:15:0::1;:34;::::0;::::1;::::0;147:18:1;;44741:43:0::1;14:217:1::0;47654:179:0;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47738:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;47738:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47792:33;;1715:41:1;;;47792:33:0::1;::::0;1688:18:1;47792:33:0::1;;;;;;;47654:179:::0;;:::o;45493:142::-;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;9035:12;;45550::::1;:28:::0;;;45594:33:::1;::::0;1913:25:1;;;45594:33:0::1;::::0;1901:2:1;1886:18;45594:33:0::1;1767:177:1::0;45229:256:0;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;45345:4:::1;45340:3;45320:13;9035:12:::0;;;8947:108;45320:13:::1;:17;::::0;45336:1:::1;45320:17;:::i;:::-;:23;;;;:::i;:::-;45319:30;;;;:::i;:::-;45309:6;:40;;45301:90;;;;-1:-1:-1::0;;;45301:90:0::1;;;;;;;:::i;:::-;45415:17;:6:::0;45425::::1;45415:17;:::i;:::-;45402:10;:30:::0;;;45448:29:::1;::::0;1913:25:1;;;45448:29:0::1;::::0;1901:2:1;1886:18;45448:29:0::1;1767:177:1::0;49293:126:0;49348:7;49372:15;-1:-1:-1;;;;;49372:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47841:124;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;47915:42:::1;::::0;-1:-1:-1;;;47915:42:0;;::::1;::::0;::::1;1913:25:1::0;;;47915:15:0::1;-1:-1:-1::0;;;;;47915:31:0::1;::::0;::::1;::::0;1886:18:1;;47915:42:0::1;1767:177:1::0;48855:325:0;48956:7;48978:6;48999;49020:7;49042;49064;49086;49108;49132:15;-1:-1:-1;;;;;49132:33:0;;49166:5;49132:40;;;;;;;;;;;;;1913:25:1;;1901:2;1886:18;;1767:177;12697:244:0;12452:6;;-1:-1:-1;;;;;12452:6:0;407:10;12452:22;12444:67;;;;-1:-1:-1;;;12444:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12786:22:0;::::1;12778:73;;;::::0;-1:-1:-1;;;12778:73:0;;17515:2:1;12778:73:0::1;::::0;::::1;17497:21:1::0;17554:2;17534:18;;;17527:30;17593:34;17573:18;;;17566:62;-1:-1:-1;;;17644:18:1;;;17637:36;17690:19;;12778:73:0::1;17313:402:1::0;12778:73:0::1;12888:6;::::0;12867:38:::1;::::0;-1:-1:-1;;;;;12867:38:0;;::::1;::::0;12888:6:::1;::::0;12867:38:::1;::::0;12888:6:::1;::::0;12867:38:::1;12916:6;:17:::0;;-1:-1:-1;;;;;;12916:17:0::1;-1:-1:-1::0;;;;;12916:17:0;;;::::1;::::0;;;::::1;::::0;;12697:244::o;11657:337::-;-1:-1:-1;;;;;11756:19:0;;11748:68;;;;-1:-1:-1;;;11748:68:0;;17922:2:1;11748:68:0;;;17904:21:1;17961:2;17941:18;;;17934:30;18000:34;17980:18;;;17973:62;-1:-1:-1;;;18051:18:1;;;18044:34;18095:19;;11748:68:0;17720:400:1;11748:68:0;-1:-1:-1;;;;;11835:21:0;;11827:68;;;;-1:-1:-1;;;11827:68:0;;18327:2:1;11827:68:0;;;18309:21:1;18366:2;18346:18;;;18339:30;18405:34;18385:18;;;18378:62;-1:-1:-1;;;18456:18:1;;;18449:32;18498:19;;11827:68:0;18125:398:1;11827:68:0;-1:-1:-1;;;;;11908:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:33;;;11957:29;;1913:25:1;;;11957:29:0;;1886:18:1;11957:29:0;;;;;;;11657:337;;;:::o;10800:562::-;-1:-1:-1;;;;;10903:20:0;;10895:70;;;;-1:-1:-1;;;10895:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10984:23:0;;10976:71;;;;-1:-1:-1;;;10976:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11084:17:0;;11060:21;11084:17;;;;;;;;;;;11120:20;;;;11112:68;;;;-1:-1:-1;;;11112:68:0;;19540:2:1;11112:68:0;;;19522:21:1;19579:2;19559:18;;;19552:30;19618:34;19598:18;;;19591:62;-1:-1:-1;;;19669:18:1;;;19662:33;19712:19;;11112:68:0;19338:399:1;11112:68:0;-1:-1:-1;;;;;11216:17:0;;;:9;:17;;;;;;;;;;;11236:19;;;11216:39;;11277:20;;;;;;;;:27;;11252:3;;11216:9;11277:27;;11252:3;;11277:27;:::i;:::-;;;;;;;;11339:9;-1:-1:-1;;;;;11322:32:0;11331:6;-1:-1:-1;;;;;11322:32:0;;11350:3;11322:32;;;;1913:25:1;;1901:2;1886:18;;1767:177;11322:32:0;;;;;;;;10884:478;10800:562;;;:::o;49711:2261::-;-1:-1:-1;;;;;49808:18:0;;49800:68;;;;-1:-1:-1;;;49800:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49887:16:0;;49879:64;;;;-1:-1:-1;;;49879:64:0;;;;;;;:::i;:::-;49957:3;49964:1;49957:8;49954:88;;49981:28;49997:4;50003:2;50007:1;49981:15;:28::i;49954:88::-;-1:-1:-1;;;;;50057:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;50085:22:0;;;;;;:18;:22;;;;;;;;50057:50;:62;;;-1:-1:-1;50111:8:0;;-1:-1:-1;;;50111:8:0;;;;50057:62;50054:286;;;50135:30;50151:4;50157:2;50161:3;50135:15;:30::i;:::-;50180:15;-1:-1:-1;;;;;50180:26:0;;50215:4;50222:15;50232:4;50222:9;:15::i;:::-;50180:58;;-1:-1:-1;;;;;;50180:58:0;;;;;;;-1:-1:-1;;;;;9930:32:1;;;50180:58:0;;;9912:51:1;9979:18;;;9972:34;9885:18;;50180:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50253:15;-1:-1:-1;;;;;50253:26:0;;50288:2;50293:13;50303:2;50293:9;:13::i;:::-;50253:54;;-1:-1:-1;;;;;;50253:54:0;;;;;;;-1:-1:-1;;;;;9930:32:1;;;50253:54:0;;;9912:51:1;9979:18;;;9972:34;9885:18;;50253:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49711:2261;;;:::o;50054:286::-;50360:11;;-1:-1:-1;;;50360:11:0;;;;50352:46;;;;-1:-1:-1;;;50352:46:0;;19944:2:1;50352:46:0;;;19926:21:1;19983:2;19963:18;;;19956:30;-1:-1:-1;;;20002:18:1;;;19995:52;20064:18;;50352:46:0;19742:346:1;50352:46:0;50422:12;;-1:-1:-1;;;50422:12:0;;;;50419:720;;;-1:-1:-1;;;;;50478:31:0;;;;;;:25;:31;;;;;;;;:68;;;;-1:-1:-1;;;;;;50514:32:0;;;;;;:28;:32;;;;;;;;50513:33;50478:68;50474:654;;;50582:9;;50575:3;:16;;50567:66;;;;-1:-1:-1;;;50567:66:0;;20295:2:1;50567:66:0;;;20277:21:1;20334:2;20314:18;;;20307:30;20373:34;20353:18;;;20346:62;-1:-1:-1;;;20424:18:1;;;20417:35;20469:19;;50567:66:0;20093:401:1;50567:66:0;50683:12;;50666:13;50676:2;50666:9;:13::i;:::-;50660:19;;:3;:19;:::i;:::-;:35;;50652:72;;;;-1:-1:-1;;;50652:72:0;;20701:2:1;50652:72:0;;;20683:21:1;20740:2;20720:18;;;20713:30;-1:-1:-1;;;20759:18:1;;;20752:54;20823:18;;50652:72:0;20499:348:1;50652:72:0;50474:654;;;-1:-1:-1;;;;;50789:29:0;;;;;;:25;:29;;;;;;;;:68;;;;-1:-1:-1;;;;;;50823:34:0;;;;;;:28;:34;;;;;;;;50822:35;50789:68;50785:343;;;50893:10;;50886:3;:17;;50878:69;;;;-1:-1:-1;;;50878:69:0;;21054:2:1;50878:69:0;;;21036:21:1;21093:2;21073:18;;;21066:30;21132:34;21112:18;;;21105:62;-1:-1:-1;;;21183:18:1;;;21176:37;21230:19;;50878:69:0;20852:403:1;50785:343:0;-1:-1:-1;;;;;50988:32:0;;;;;;:28;:32;;;;;;;;50983:145;;51071:12;;51054:13;51064:2;51054:9;:13::i;:::-;51048:19;;:3;:19;:::i;:::-;:35;;51040:72;;;;-1:-1:-1;;;51040:72:0;;20701:2:1;51040:72:0;;;20683:21:1;20740:2;20720:18;;;20713:30;-1:-1:-1;;;20759:18:1;;;20752:54;20823:18;;51040:72:0;20499:348:1;51040:72:0;51182:15;;51154:24;51172:4;51154:9;:24::i;:::-;:43;;:76;;;;-1:-1:-1;;;;;;51201:29:0;;;;;;:25;:29;;;;;;;;51154:76;51151:179;;;51247:8;:15;;-1:-1:-1;;;;51247:15:0;-1:-1:-1;;;51247:15:0;;;51277:10;:8;:10::i;:::-;51302:8;:16;;-1:-1:-1;;;;51302:16:0;;;51151:179;-1:-1:-1;;;;;51400:29:0;;51350:11;51400:29;;;:25;:29;;;;;;;;:44;;;;;51443:1;51433:7;;:11;51400:44;51396:254;;;40115:5;51472:7;;51466:3;:13;;;;:::i;:::-;:27;;;;:::i;:::-;51460:33;;51396:254;;;-1:-1:-1;;;;;51544:31:0;;;;;;:25;:31;;;;;;;;:45;;;;;51588:1;51579:6;;:10;51544:45;51541:109;;;40115:5;51618:6;;51612:3;:12;;;;:::i;:::-;:26;;;;:::i;:::-;51606:32;;51541:109;51673:7;;51670:108;;51700:41;51716:4;51730;51737:3;51700:15;:41::i;:::-;51756:10;51763:3;51756:10;;:::i;:::-;;;51670:108;51798:30;51814:4;51820:2;51824:3;51798:15;:30::i;:::-;51841:15;-1:-1:-1;;;;;51841:26:0;;51876:4;51883:15;51893:4;51883:9;:15::i;:::-;51841:58;;-1:-1:-1;;;;;;51841:58:0;;;;;;;-1:-1:-1;;;;;9930:32:1;;;51841:58:0;;;9912:51:1;9979:18;;;9972:34;9885:18;;51841:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51910:15;-1:-1:-1;;;;;51910:26:0;;51945:2;51950:13;51960:2;51950:9;:13::i;:::-;51910:54;;-1:-1:-1;;;;;;51910:54:0;;;;;;;-1:-1:-1;;;;;9930:32:1;;;51910:54:0;;;9912:51:1;9979:18;;;9972:34;9885:18;;51910:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49787:2185;49711:2261;;;:::o;52614:606::-;52655:23;52681:24;52699:4;52681:9;:24::i;:::-;52655:50;;52729:15;52748:1;52729:20;52726:34;;52752:7;52614:606::o;52726:34::-;52793:15;;:20;;52811:2;52793:20;:::i;:::-;52775:15;:38;52772:107;;;52847:15;;:20;;52865:2;52847:20;:::i;:::-;52829:38;;52772:107;52889:41;52914:15;52889:24;:41::i;:::-;52968:36;;-1:-1:-1;;;52968:36:0;;52998:4;52968:36;;;174:51:1;52943:22:0;;52968:11;-1:-1:-1;;;;;52968:21:0;;;;147:18:1;;52968:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52943:61;-1:-1:-1;53018:18:0;;53015:198;;53053:77;53076:11;53097:15;53115:14;53053:22;:77::i;:::-;53145:56;;-1:-1:-1;;;53145:56:0;;;;;1913:25:1;;;53145:15:0;-1:-1:-1;;;;;53145:40:0;;;;1886:18:1;;53145:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53015:198;52642:578;;52614:606::o;6829:211::-;6973:58;;;-1:-1:-1;;;;;9930:32:1;;6973:58:0;;;9912:51:1;9979:18;;;;9972:34;;;6973:58:0;;;;;;;;;;9885:18:1;;;;6973:58:0;;;;;;;;-1:-1:-1;;;;;6973:58:0;-1:-1:-1;;;6973:58:0;;;6946:86;;6966:5;;6946:19;:86::i;45979:204::-;-1:-1:-1;;;;;46067:36:0;;;;;;:28;:36;;;;;;;;;:49;;-1:-1:-1;;46067:49:0;;;;;;;;;;46132:43;;12485:51:1;;;12552:18;;;12545:50;46132:43:0;;12458:18:1;46132:43:0;12301:300:1;51980:626:0;52135:16;;;52149:1;52135:16;;;;;;;;;52111:21;;52135:16;;;;;;;;;;-1:-1:-1;52135:16:0;52111:40;;52180:4;52162;52167:1;52162:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;52162:23:0;;;-1:-1:-1;;;;;52162:23:0;;;;;52214:9;-1:-1:-1;;;;;52214:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52196:4;52201:1;52196:7;;;;;;;;:::i;:::-;;;;;;:35;-1:-1:-1;;;;;52196:35:0;;;-1:-1:-1;;;;;52196:35:0;;;;;52260:11;52242:4;52247:1;52242:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52242:30:0;;;:7;;;;;;;;;:30;52480:12;;52311:223;;-1:-1:-1;;;52311:223:0;;:9;:63;;;;;:223;;52389:8;;52412:1;;52453:4;;52480:12;;;52508:15;;52311:223;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52547:12:0;;:51;;-1:-1:-1;;;52547:51:0;;-1:-1:-1;;;;;52585:11:0;192:32:1;;52547:51:0;;;174::1;52547:12:0;;;;-1:-1:-1;52547:29:0;;-1:-1:-1;147:18:1;;52547:51:0;14:217:1;7048:333:0;7129:23;7155:69;7183:4;7155:69;;;;;;;;;;;;;;;;;7163:5;-1:-1:-1;;;;;7155:27:0;;;:69;;;;;:::i;:::-;7239:17;;7129:95;;-1:-1:-1;7239:21:0;7235:139;;7296:10;7285:30;;;;;;;;;;;;:::i;:::-;7277:85;;;;-1:-1:-1;;;7277:85:0;;23125:2:1;7277:85:0;;;23107:21:1;23164:2;23144:18;;;23137:30;23203:34;23183:18;;;23176:62;-1:-1:-1;;;23254:18:1;;;23247:40;23304:19;;7277:85:0;22923:406:1;1332:229:0;1469:12;1501:52;1523:6;1531:4;1537:1;1540:12;1501:21;:52::i;:::-;1494:59;1332:229;-1:-1:-1;;;;1332:229:0:o;2452:455::-;2622:12;2680:5;2655:21;:30;;2647:81;;;;-1:-1:-1;;;2647:81:0;;23536:2:1;2647:81:0;;;23518:21:1;23575:2;23555:18;;;23548:30;23614:34;23594:18;;;23587:62;-1:-1:-1;;;23665:18:1;;;23658:36;23711:19;;2647:81:0;23334:402:1;2647:81:0;2740:12;2754:23;2781:6;-1:-1:-1;;;;;2781:11:0;2800:5;2807:4;2781:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2739:73;;;;2830:69;2857:6;2865:7;2874:10;2886:12;2830:26;:69::i;:::-;2823:76;2452:455;-1:-1:-1;;;;;;;2452:455:0:o;5025:644::-;5210:12;5239:7;5235:427;;;5267:10;:17;5288:1;5267:22;5263:290;;-1:-1:-1;;;;;782:19:0;;;5477:60;;;;-1:-1:-1;;;5477:60:0;;24235:2:1;5477:60:0;;;24217:21:1;24274:2;24254:18;;;24247:30;24313:31;24293:18;;;24286:59;24362:18;;5477:60:0;24033:353:1;5477:60:0;-1:-1:-1;5574:10:0;5567:17;;5235:427;5617:33;5625:10;5637:12;6372:17;;:21;6368:388;;6604:10;6598:17;6661:15;6648:10;6644:2;6640:19;6633:44;6368:388;6731:12;6724:20;;-1:-1:-1;;;6724:20:0;;;;;;;;:::i;236:250:1:-;321:1;331:113;345:6;342:1;339:13;331:113;;;421:11;;;415:18;402:11;;;395:39;367:2;360:10;331:113;;;-1:-1:-1;;478:1:1;460:16;;453:27;236:250::o;491:396::-;640:2;629:9;622:21;603:4;672:6;666:13;715:6;710:2;699:9;695:18;688:34;731:79;803:6;798:2;787:9;783:18;778:2;770:6;766:15;731:79;:::i;:::-;871:2;850:15;-1:-1:-1;;846:29:1;831:45;;;;878:2;827:54;;491:396;-1:-1:-1;;491:396:1:o;1119:131::-;-1:-1:-1;;;;;1194:31:1;;1184:42;;1174:70;;1240:1;1237;1230:12;1255:315;1323:6;1331;1384:2;1372:9;1363:7;1359:23;1355:32;1352:52;;;1400:1;1397;1390:12;1352:52;1439:9;1426:23;1458:31;1483:5;1458:31;:::i;:::-;1508:5;1560:2;1545:18;;;;1532:32;;-1:-1:-1;;;1255:315:1:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:275;2381:2;2375:9;2446:2;2427:13;;-1:-1:-1;;2423:27:1;2411:40;;2481:18;2466:34;;2502:22;;;2463:62;2460:88;;;2528:18;;:::i;:::-;2564:2;2557:22;2310:275;;-1:-1:-1;2310:275:1:o;2590:183::-;2650:4;2683:18;2675:6;2672:30;2669:56;;;2705:18;;:::i;:::-;-1:-1:-1;2750:1:1;2746:14;2762:4;2742:25;;2590:183::o;2778:662::-;2832:5;2885:3;2878:4;2870:6;2866:17;2862:27;2852:55;;2903:1;2900;2893:12;2852:55;2939:6;2926:20;2965:4;2989:60;3005:43;3045:2;3005:43;:::i;:::-;2989:60;:::i;:::-;3083:15;;;3169:1;3165:10;;;;3153:23;;3149:32;;;3114:12;;;;3193:15;;;3190:35;;;3221:1;3218;3211:12;3190:35;3257:2;3249:6;3245:15;3269:142;3285:6;3280:3;3277:15;3269:142;;;3351:17;;3339:30;;3389:12;;;;3302;;3269:142;;;-1:-1:-1;3429:5:1;2778:662;-1:-1:-1;;;;;;2778:662:1:o;3445:1215::-;3563:6;3571;3624:2;3612:9;3603:7;3599:23;3595:32;3592:52;;;3640:1;3637;3630:12;3592:52;3680:9;3667:23;3709:18;3750:2;3742:6;3739:14;3736:34;;;3766:1;3763;3756:12;3736:34;3804:6;3793:9;3789:22;3779:32;;3849:7;3842:4;3838:2;3834:13;3830:27;3820:55;;3871:1;3868;3861:12;3820:55;3907:2;3894:16;3929:4;3953:60;3969:43;4009:2;3969:43;:::i;3953:60::-;4047:15;;;4129:1;4125:10;;;;4117:19;;4113:28;;;4078:12;;;;4153:19;;;4150:39;;;4185:1;4182;4175:12;4150:39;4209:11;;;;4229:217;4245:6;4240:3;4237:15;4229:217;;;4325:3;4312:17;4342:31;4367:5;4342:31;:::i;:::-;4386:18;;4262:12;;;;4424;;;;4229:217;;;4465:5;-1:-1:-1;;4508:18:1;;4495:32;;-1:-1:-1;;4539:16:1;;;4536:36;;;4568:1;4565;4558:12;4536:36;;4591:63;4646:7;4635:8;4624:9;4620:24;4591:63;:::i;:::-;4581:73;;;3445:1215;;;;;:::o;4665:456::-;4742:6;4750;4758;4811:2;4799:9;4790:7;4786:23;4782:32;4779:52;;;4827:1;4824;4817:12;4779:52;4866:9;4853:23;4885:31;4910:5;4885:31;:::i;:::-;4935:5;-1:-1:-1;4992:2:1;4977:18;;4964:32;5005:33;4964:32;5005:33;:::i;:::-;4665:456;;5057:7;;-1:-1:-1;;;5111:2:1;5096:18;;;;5083:32;;4665:456::o;5366:248::-;5434:6;5442;5495:2;5483:9;5474:7;5470:23;5466:32;5463:52;;;5511:1;5508;5501:12;5463:52;-1:-1:-1;;5534:23:1;;;5604:2;5589:18;;;5576:32;;-1:-1:-1;5366:248:1:o;5808:247::-;5867:6;5920:2;5908:9;5899:7;5895:23;5891:32;5888:52;;;5936:1;5933;5926:12;5888:52;5975:9;5962:23;5994:31;6019:5;5994:31;:::i;:::-;6044:5;5808:247;-1:-1:-1;;;5808:247:1:o;6268:118::-;6354:5;6347:13;6340:21;6333:5;6330:32;6320:60;;6376:1;6373;6366:12;6391:382;6456:6;6464;6517:2;6505:9;6496:7;6492:23;6488:32;6485:52;;;6533:1;6530;6523:12;6485:52;6572:9;6559:23;6591:31;6616:5;6591:31;:::i;:::-;6641:5;-1:-1:-1;6698:2:1;6683:18;;6670:32;6711:30;6670:32;6711:30;:::i;:::-;6760:7;6750:17;;;6391:382;;;;;:::o;6778:388::-;6846:6;6854;6907:2;6895:9;6886:7;6882:23;6878:32;6875:52;;;6923:1;6920;6913:12;6875:52;6962:9;6949:23;6981:31;7006:5;6981:31;:::i;:::-;7031:5;-1:-1:-1;7088:2:1;7073:18;;7060:32;7101:33;7060:32;7101:33;:::i;7171:180::-;7230:6;7283:2;7271:9;7262:7;7258:23;7254:32;7251:52;;;7299:1;7296;7289:12;7251:52;-1:-1:-1;7322:23:1;;7171:180;-1:-1:-1;7171:180:1:o;8062:380::-;8141:1;8137:12;;;;8184;;;8205:61;;8259:4;8251:6;8247:17;8237:27;;8205:61;8312:2;8304:6;8301:14;8281:18;8278:38;8275:161;;8358:10;8353:3;8349:20;8346:1;8339:31;8393:4;8390:1;8383:15;8421:4;8418:1;8411:15;8275:161;;8062:380;;;:::o;8447:356::-;8649:2;8631:21;;;8668:18;;;8661:30;8727:34;8722:2;8707:18;;8700:62;8794:2;8779:18;;8447:356::o;9590:127::-;9651:10;9646:3;9642:20;9639:1;9632:31;9682:4;9679:1;9672:15;9706:4;9703:1;9696:15;10017:127;10078:10;10073:3;10069:20;10066:1;10059:31;10109:4;10106:1;10099:15;10133:4;10130:1;10123:15;10149:135;10188:3;10209:17;;;10206:43;;10229:18;;:::i;:::-;-1:-1:-1;10276:1:1;10265:13;;10149:135::o;10974:245::-;11041:6;11094:2;11082:9;11073:7;11069:23;11065:32;11062:52;;;11110:1;11107;11100:12;11062:52;11142:9;11136:16;11161:28;11183:5;11161:28;:::i;11982:184::-;12052:6;12105:2;12093:9;12084:7;12080:23;12076:32;12073:52;;;12121:1;12118;12111:12;12073:52;-1:-1:-1;12144:16:1;;11982:184;-1:-1:-1;11982:184:1:o;12171:125::-;12236:9;;;12257:10;;;12254:36;;;12270:18;;:::i;14156:168::-;14229:9;;;14260;;14277:15;;;14271:22;;14257:37;14247:71;;14298:18;;:::i;14329:217::-;14369:1;14395;14385:132;;14439:10;14434:3;14430:20;14427:1;14420:31;14474:4;14471:1;14464:15;14502:4;14499:1;14492:15;14385:132;-1:-1:-1;14531:9:1;;14329:217::o;14551:401::-;14753:2;14735:21;;;14792:2;14772:18;;;14765:30;14831:34;14826:2;14811:18;;14804:62;-1:-1:-1;;;14897:2:1;14882:18;;14875:35;14942:3;14927:19;;14551:401::o;16627:681::-;16758:6;16766;16774;16782;16790;16798;16806;16814;16867:3;16855:9;16846:7;16842:23;16838:33;16835:53;;;16884:1;16881;16874:12;16835:53;16916:9;16910:16;16935:31;16960:5;16935:31;:::i;:::-;16985:5;16975:15;;;17030:2;17019:9;17015:18;17009:25;16999:35;;17074:2;17063:9;17059:18;17053:25;17043:35;;17118:2;17107:9;17103:18;17097:25;17087:35;;17162:3;17151:9;17147:19;17141:26;17131:36;;17207:3;17196:9;17192:19;17186:26;17176:36;;17252:3;17241:9;17237:19;17231:26;17221:36;;17297:3;17286:9;17282:19;17276:26;17266:36;;16627:681;;;;;;;;;;;:::o;18528:401::-;18730:2;18712:21;;;18769:2;18749:18;;;18742:30;18808:34;18803:2;18788:18;;18781:62;-1:-1:-1;;;18874:2:1;18859:18;;18852:35;18919:3;18904:19;;18528:401::o;18934:399::-;19136:2;19118:21;;;19175:2;19155:18;;;19148:30;19214:34;19209:2;19194:18;;19187:62;-1:-1:-1;;;19280:2:1;19265:18;;19258:33;19323:3;19308:19;;18934:399::o;21260:128::-;21327:9;;;21348:11;;;21345:37;;;21362:18;;:::i;21682:251::-;21752:6;21805:2;21793:9;21784:7;21780:23;21776:32;21773:52;;;21821:1;21818;21811:12;21773:52;21853:9;21847:16;21872:31;21897:5;21872:31;:::i;21938:980::-;22200:4;22248:3;22237:9;22233:19;22279:6;22268:9;22261:25;22305:2;22343:6;22338:2;22327:9;22323:18;22316:34;22386:3;22381:2;22370:9;22366:18;22359:31;22410:6;22445;22439:13;22476:6;22468;22461:22;22514:3;22503:9;22499:19;22492:26;;22553:2;22545:6;22541:15;22527:29;;22574:1;22584:195;22598:6;22595:1;22592:13;22584:195;;;22663:13;;-1:-1:-1;;;;;22659:39:1;22647:52;;22754:15;;;;22719:12;;;;22695:1;22613:9;22584:195;;;-1:-1:-1;;;;;;;22835:32:1;;;;22830:2;22815:18;;22808:60;-1:-1:-1;;;22899:3:1;22884:19;22877:35;22796:3;21938:980;-1:-1:-1;;;21938:980:1:o;23741:287::-;23870:3;23908:6;23902:13;23924:66;23983:6;23978:3;23971:4;23963:6;23959:17;23924:66;:::i;:::-;24006:16;;;;;23741:287;-1:-1:-1;;23741:287:1:o

Swarm Source

ipfs://87a0805ee73acbb41e2bfb9e8a5ac2129344af3576b4c1b4234dfdb0539e7a88
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.