ETH Price: $3,121.11 (+0.79%)

Token

ChainFactory (FACTORY)
 

Overview

Max Total Supply

67,000,000 FACTORY

Holders

832 (0.00%)

Market

Price

$0.07 @ 0.000023 ETH (-2.70%)

Onchain Market Cap

$4,757,804.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 FACTORY

Value
$0.00
0x8a24c705d4279394dac32f5bb5df7b9caba878fd
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

ChainFactory is a revolutionary software that offers a seamless, user-friendly experience for smart contract creation and provides additional support and strategic partnerships, providing you and your project the best chance to succeed.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ChainFactory

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 1000 runs

Other Settings:
shanghai EvmVersion, MIT license
File 1 of 14 : ChainFactory.sol
/*
   ________          _       ______           __                  
  / ____/ /_  ____ _(_)___  / ____/___ ______/ /_____  _______  __
 / /   / __ \/ __ `/ / __ \/ /_  / __ `/ ___/ __/ __ \/ ___/ / / /
/ /___/ / / / /_/ / / / / / __/ / /_/ / /__/ /_/ /_/ / /  / /_/ / 
\____/_/ /_/\__,_/_/_/ /_/_/    \__,_/\___/\__/\____/_/   \__, /  
                                                         /____/   
  Smart-Contract generated and deployed by ChainFactory

  Web:      https://chainfactory.app/
  X:        https://x.com/ChainFactoryApp
  Telegram: https://t.me/ChainFactory
  Discord:  https://discord.gg/fpjxD39v3k
  YouTube:  https://youtube.com/@UpfrontDeFi

  By using this Smart-Contract generated and deployed by ChainFactory,
  you acknowledge and agree that ChainFactory shall not be liable for any
  damages arising from the use of this Smart-Contract, including but not
  limited to any damages resulting from any malicious or illegal use of
  the Smart-Contract by any third party or by the owner.

  The owner of the Smart-Contract generated by ChainFactory agrees not to
  misuse the Smart-Contract, including but not limited to:

  - Using the Smart-Contract to engage in any illegal or fraudulent
    activity, including but not limited to scams, theft, or money
    laundering.

  - Using the Smart-Contract in any manner that could cause harm to
    others, including but not limited to disrupting financial
    markets or causing financial loss to others.

  - Using the Smart-Contract to infringe upon the intellectual
    property rights of others, including but not limited to
    copyright, trademark, or patent infringement.

  The owner of the Smart-Contract generated by ChainFactory acknowledges
  that any misuse of the Smart-Contract may result in legal action,
  and agrees to indemnify and hold harmless ChainFactory from any and all
  claims, damages, or expenses arising from any such misuse.

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";
import "./CF_ERC20.sol";
import "./CF_Recoverable.sol";
import "./CF_Burnable.sol";
import "./CF_Blacklist.sol";
import "./CF_Whitelist.sol";
import "./CF_Cooldown.sol";
import "./CF_MaxBalance.sol";
import "./CF_Taxable.sol";
import "./CF_DEXRouterV2.sol";

contract ChainFactory is CF_Ownable, CF_Common, CF_ERC20, CF_Recoverable, CF_Burnable, CF_Blacklist, CF_Whitelist, CF_Cooldown, CF_MaxBalance, CF_Taxable, CF_DEXRouterV2 {
  constructor() {
    _name = unicode"ChainFactory";
    _symbol = unicode"FACTORY";
    _decimals = 18;
    _totalSupply = 75000000000000000000000000; // 75,000,000 FACTORY
    _transferOwnership(0xb8F8a463a725502B5E0642bB0dc55CA8d1675434);
    _transferInitialSupply(0xb8F8a463a725502B5E0642bB0dc55CA8d1675434, 100000); // 100%
    _setEarlyPenaltyTime(120); // 2min
    _setDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0xb8F8a463a725502B5E0642bB0dc55CA8d1675434);
    _setReflection(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    _setMinSwapPercent(500); // 0.5% of totalSupply
    _setMinTaxDistributionPercent(500); // 0.5% of totalSupply
    _setTaxBeneficiary(0, 0x6Aa1f46Fd34dDAa9f5EFcaB3Ebd43c54a87Cbf8E, [ uint24(0), uint24(5000), uint24(5000) ], [ uint24(40000), uint24(40000), uint24(40000) ]);
    _initialWhitelist([ 0xb8F8a463a725502B5E0642bB0dc55CA8d1675434 ]);
    _setCooldown(5, 3600, 3600); // 5 tx in 1h will result in a 1h freeze
    _setMaxBalancePercent(2000); // 2% of totalSupply
    _domainSeparator = keccak256(abi.encode(keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes("1")), block.chainid, address(this)));
    _initialized = true;
  }

  function _transfer(address from, address to, uint256 amount) internal virtual override {
    require(!_blacklisted[from] && !_blacklisted[to], "Blacklisted");
    require(to != address(0xdEaD));

    if (!_distributing && !_swapping && (from != _dex.pair && from != _dex.router)) {
      _autoSwap(false);
      _autoTaxDistribute(false);
    }

    if (amount > 0 && !_whitelisted[from] && !_whitelisted[to] && from != address(this) && to != address(this) && to != _dex.router) {
      require((from != _dex.pair && to != _dex.pair) || ((from == _dex.pair || to == _dex.pair) && _tradingEnabled > 0), "Trading disabled");

      unchecked {
        if (_cooldownPeriod > 0 && from != _dex.pair) {
          require(remainingCooldownTime(from) == 0, "Cooldown");

          if (_holder[from].start + _cooldownTriggerTime < _timestamp()) {
            _holder[from].count = 1;
            _holder[from].start = _timestamp();
          } else {
            if (++_holder[from].count >= _cooldownTriggerCount) { _cooldown(from); }
          }
        }

        require(_maxBalanceAmount == 0 || to == address(this) || (to == _dex.pair || to == _dex.router) || _balance[to] + amount <= _maxBalanceAmount, "Exceeds maxBalance");

        if (!_suspendTaxes && !_distributing && !_swapping) {
          uint256 appliedTax;
          uint8 taxType;

          if (from == _dex.pair || to == _dex.pair) { taxType = from == _dex.pair ? 1 : 2; }

          address _account = taxType == 1 ? to : from;

          if (_tradingEnabled + _earlyPenaltyTime >= _timestamp() && !_holder[_account].penalty) { _holder[_account].penalty = true; }

          for (uint8 i; i < 5; i++) {
            uint256 percent = uint256(taxType > 0 ? (taxType == 1 ? (_holder[_account].penalty ? _taxBeneficiary[i].penalty[1] : _taxBeneficiary[i].percent[1]) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[2] : _taxBeneficiary[i].percent[2])) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[0] : _taxBeneficiary[i].percent[0]));

            if (percent == 0) { continue; }

            uint256 taxAmount = _percentage(amount, percent);

            super._transfer(from, address(this), taxAmount);

            if (_taxBeneficiary[i].account == _dex.pair) {
              _amountForLiquidity += taxAmount;
            } else if (_taxBeneficiary[i].account == address(0xdEaD)) {
              _burn(address(this), taxAmount);
            } else {
              _taxBeneficiary[i].unclaimed += taxAmount;
              _amountForTaxDistribution += taxAmount;
            }

            appliedTax += taxAmount;
          }

          if (appliedTax > 0) {
            _totalTaxCollected += appliedTax;

            amount -= appliedTax;
          }
        }
      }
    }

    super._transfer(from, to, amount);
  }

  function _burn(address account, uint256 amount) internal virtual override {
    super._burn(account, amount);

    _setMaxBalancePercent(_maxBalancePercent);
    _setMinTaxDistributionPercent(_minTaxDistributionPercent);
    _setMinSwapPercent(_minSwapPercent);
  }

  function _transferInitialSupply(address account, uint24 percent) private {
    require(!_initialized);

    uint256 amount = _percentage(_totalSupply, uint256(percent));
    _balance[account] = amount;

    emit Transfer(address(0), account, amount);
  }

  /// @notice Returns a list specifying the renounce status of each feature
  function renounced() external view returns (bool Blacklist, bool Whitelist, bool Cooldown, bool MaxBalance, bool Taxable, bool DEXRouterV2) {
    return (_renounced.Blacklist, _renounced.Whitelist, _renounced.Cooldown, _renounced.MaxBalance, _renounced.Taxable, _renounced.DEXRouterV2);
  }

  /// @notice Returns basic information about this Smart-Contract
  function info() external view returns (string memory name, string memory symbol, uint8 decimals, address owner, uint256 totalSupply, string memory version) {
    return (_name, _symbol, _decimals, _owner, _totalSupply, _version);
  }

  receive() external payable { }
  fallback() external payable { }
}

File 2 of 14 : CF_Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

abstract contract CF_Ownable {
  address internal _owner;

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

  modifier onlyOwner() {
    require(_owner == msg.sender, "Unauthorized");

    _;
  }

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

  function renounceOwnership() external onlyOwner {
    _transferOwnership(address(0));
  }

  function transferOwnership(address newOwner) external onlyOwner {
    require(newOwner != address(0));

    _transferOwnership(newOwner);
  }

  function _transferOwnership(address newOwner) internal {
    address oldOwner = _owner;
    _owner = newOwner;

    emit OwnershipTransferred(oldOwner, newOwner);
  }
}

File 3 of 14 : CF_Common.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./IDEXV2.sol";
import "./IERC20.sol";

abstract contract CF_Common {
  string internal constant _version = "1.0.0";

  mapping(address => uint256) internal _balance;
  mapping(address => mapping(address => uint256)) internal _allowance;
  mapping(address => bool) internal _blacklisted;
  mapping(address => bool) internal _whitelisted;
  mapping(address => holderAccount) internal _holder;
  mapping(uint8 => taxBeneficiary) internal _taxBeneficiary;

  address[] internal _holders;

  bool internal _swapEnabled;
  bool internal _swapping;
  bool internal _suspendTaxes;
  bool internal _distributing;
  bool internal immutable _initialized;

  uint8 internal immutable _decimals;
  uint8 internal _cooldownTriggerCount;
  uint24 internal constant _denominator = 1000;
  uint24 internal _maxBalancePercent;
  uint24 internal _totalTxTax;
  uint24 internal _totalBuyTax;
  uint24 internal _totalSellTax;
  uint24 internal _totalPenaltyTxTax;
  uint24 internal _totalPenaltyBuyTax;
  uint24 internal _totalPenaltySellTax;
  uint24 internal _minTaxDistributionPercent;
  uint24 internal _minSwapPercent;
  uint32 internal _lastTaxDistribution;
  uint32 internal _tradingEnabled;
  uint32 internal _lastSwap;
  uint32 internal _earlyPenaltyTime;
  uint32 internal _cooldownTriggerTime;
  uint32 internal _cooldownPeriod;
  uint256 internal _totalSupply;
  uint256 internal _totalBurned;
  uint256 internal _maxBalanceAmount;
  uint256 internal _totalTaxCollected;
  uint256 internal _minTaxDistributionAmount;
  uint256 internal _amountForTaxDistribution;
  uint256 internal _amountSwappedForTaxDistribution;
  uint256 internal _minSwapAmount;
  uint256 internal _amountForLiquidity;
  uint256 internal _ethForTaxDistribution;
  uint256 internal _reflectionTokensForTaxDistribution;

  struct Renounced {
    bool Blacklist;
    bool Whitelist;
    bool Cooldown;
    bool MaxBalance;
    bool Taxable;
    bool DEXRouterV2;
  }

  struct holderAccount {
    bool exists;
    bool penalty;
    uint32 count;
    uint32 start;
    uint32 cooldown;
  }

  struct taxBeneficiary {
    bool exists;
    address account;
    uint24[3] percent; // 0: tx, 1: buy, 2: sell
    uint24[3] penalty;
    uint256 unclaimed;
  }

  struct DEXRouterV2 {
    address router;
    address pair;
    address WETH;
    address receiver;
  }

  Renounced internal _renounced;
  DEXRouterV2 internal _dex;
  IERC20 internal _reflectionToken;

  function _percentage(uint256 amount, uint256 bps) internal pure returns (uint256) {
    unchecked {
      return (amount * bps) / (100 * uint256(_denominator));
    }
  }

  function _timestamp() internal view returns (uint32) {
    unchecked {
      return uint32(block.timestamp % 2**32);
    }
  }

  function version() external pure returns (string memory) {
    return _version;
  }

  function denominator() external view returns (uint24) {
    return _denominator;
  }
}

File 4 of 14 : CF_ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Common.sol";

abstract contract CF_ERC20 is CF_Common {
  string internal _name;
  string internal _symbol;
  bytes32 internal _domainSeparator;
  bytes32 private constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
  mapping(address => uint256) private _nonces;

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

  function name() external view returns (string memory) {
    return _name;
  }

  function symbol() external view returns (string memory) {
    return _symbol;
  }

  function decimals() external view returns (uint8) {
    return _decimals;
  }

  function totalSupply() external view returns (uint256) {
    return _totalSupply;
  }

  function balanceOf(address account) external view returns (uint256) {
    return _balance[account];
  }

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

  function approve(address spender, uint256 amount) external returns (bool) {
    _approve(msg.sender, spender, amount);

    return true;
  }

  function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {
    require(deadline >= block.timestamp, "Expired signature");

    unchecked {
      bytes32 digest = keccak256(abi.encodePacked(hex"1901", _domainSeparator, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, _nonces[owner]++, deadline))));
      address recoveredAddress = ecrecover(digest, v, r, s);

      require(recoveredAddress != address(0) && recoveredAddress == owner, "Invalid signature");
    }

    _approve(owner, spender, value);
  }

  function nonces(address owner) external view returns (uint256) {
    return _nonces[owner];
  }

  function DOMAIN_SEPARATOR() external view returns (bytes32) {
    return _domainSeparator;
  }

  function transfer(address to, uint256 amount) external returns (bool) {
    _transfer(msg.sender, to, amount);

    return true;
  }

  function transferFrom(address from, address to, uint256 amount) external returns (bool) {
    _spendAllowance(from, msg.sender, amount);
    _transfer(from, to, amount);

    return true;
  }

  function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
    unchecked {
      _approve(msg.sender, spender, allowance(msg.sender, spender) + addedValue);
    }

    return true;
  }

  function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
    uint256 currentAllowance = allowance(msg.sender, spender);

    require(currentAllowance >= subtractedValue, "Negative allowance");

    unchecked {
      _approve(msg.sender, spender, currentAllowance - subtractedValue);
    }

    return true;
  }

  function _approve(address owner, address spender, uint256 amount) internal {
    _allowance[owner][spender] = amount;

    emit Approval(owner, spender, amount);
  }

  function _spendAllowance(address owner, address spender, uint256 amount) internal {
    uint256 currentAllowance = allowance(owner, spender);

    require(currentAllowance >= amount, "Insufficient allowance");

    unchecked {
      _approve(owner, spender, currentAllowance - amount);
    }
  }

  function _transfer(address from, address to, uint256 amount) internal virtual {
    require(from != address(0) && to != address(0), "Transfer from/to zero address");
    require(_balance[from] >= amount, "Exceeds balance");

    if (amount > 0) {
      unchecked {
        _balance[from] -= amount;
        _balance[to] += amount;
      }
    }

    emit Transfer(from, to, amount);
  }
}

File 5 of 14 : CF_Recoverable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";

abstract contract CF_Recoverable is CF_Ownable, CF_Common {
  /// @notice Recovers a misplaced amount of an ERC-20 token sitting in the contract balance
  /// @dev Beware of scam tokens!
  /// @dev Amounts allocated for tax distribution and liquidity cannot be recovered unless forced
  /// @param token Address of the ERC-20 token
  /// @param to Recipient
  /// @param amount Amount to be transferred
  /// @param force Retrieve amounts allocated for tax distribution and liquidity if needed
  function recoverERC20(address token, address to, uint256 amount, bool force) external onlyOwner {
    unchecked {
      uint256 balance = IERC20(token).balanceOf(address(this));
      uint256 allocated = token == address(this) ? _amountForTaxDistribution + _amountForLiquidity : (address(_reflectionToken) == token ? _reflectionTokensForTaxDistribution : 0);

      require((!force && balance - (allocated >= balance ? balance : allocated) >= amount) || (force && balance >= amount), "Exceeds balance");

      if (force && (token == address(this) || address(_reflectionToken) == token) && balance - (allocated >= balance ? balance : allocated) < amount) {
        require(!_distributing && !_swapping);

        if (token == address(this)) {
          uint256 pickFromAmountForTaxDistribution = amount >= _amountForTaxDistribution ? _amountForTaxDistribution : _amountForTaxDistribution - amount;

          _amountForTaxDistribution -= pickFromAmountForTaxDistribution;
          allocated -= pickFromAmountForTaxDistribution;

          if (balance - (allocated >= balance ? balance : allocated) < amount) { _amountForLiquidity -= amount >= _amountForLiquidity ? _amountForLiquidity : _amountForLiquidity - amount; }
        } else if (address(_reflectionToken) == token) {
          _reflectionTokensForTaxDistribution -= amount >= _reflectionTokensForTaxDistribution ? _reflectionTokensForTaxDistribution : _reflectionTokensForTaxDistribution - amount;
        }
      }
    }

    IERC20(token).transfer(to, amount);
  }

  /// @notice Recovers a misplaced amount of native ETH sitting in the contract balance
  /// @dev Amounts allocated for tax distribution and/or liquidity cannot be recovered unless forced
  /// @param to Recipient
  /// @param amount Amount of ETH to be transferred
  /// @param force Retrieve amounts allocated for tax distribution and liquidity if needed
  function recoverETH(address payable to, uint256 amount, bool force) external onlyOwner {
    unchecked {
      uint256 balance = address(this).balance;
      uint256 allocated = address(_reflectionToken) == _dex.WETH ? _ethForTaxDistribution : 0;

      require((!force && balance - (allocated >= balance ? balance : allocated) >= amount) || (force && balance >= amount), "Exceeds balance");

      if (force && address(_reflectionToken) == _dex.WETH && balance - (allocated >= balance ? balance : allocated) < amount) {
        require(!_distributing && !_swapping);

        _ethForTaxDistribution -= amount >= _ethForTaxDistribution ? _ethForTaxDistribution : _ethForTaxDistribution - amount;
      }
    }

    (bool success, ) = to.call{ value: amount }("");

    require(success);
  }
}

File 6 of 14 : CF_Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Common.sol";
import "./CF_ERC20.sol";

abstract contract CF_Burnable is CF_Common, CF_ERC20 {
  /// @notice Total amount of tokens burned so far
  function totalBurned() external view returns (uint256) {
    return _totalBurned;
  }

  function burn(uint256 amount) external {
    _burn(msg.sender, amount);
  }

  function burnFrom(address account, uint256 amount) external {
    _spendAllowance(account, msg.sender, amount);
    _burn(account, amount);
  }

  function _burn(address account, uint256 amount) internal virtual {
    require(_balance[account] >= amount, "Exceeds balance");

    unchecked {
      _balance[account] -= amount;
      _totalSupply -= amount;
      _totalBurned += amount;
    }

    emit Transfer(account, address(0xdEaD), amount);
  }
}

File 7 of 14 : CF_Blacklist.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";

abstract contract CF_Blacklist is CF_Ownable, CF_Common {
  event Blacklisted(address indexed account, bool status);
  event RenouncedBlacklist();

  /// @notice Permanently renounce and prevent the owner from being able to update the blacklist
  /// @dev Existing entries will continue to be effective
  function renounceBlacklist() external onlyOwner {
    _renounced.Blacklist = true;

    emit RenouncedBlacklist();
  }

  /// @notice Check if an address is blacklisted.
  /// @param account Address to check
  function isBlacklisted(address account) external view returns (bool) {
    return _blacklisted[account];
  }

  /// @notice Add or remove an address from the blacklist
  /// @param status True for adding, False for removing
  function blacklist(address account, bool status) public onlyOwner {
    _blacklist(account, status);
  }

  function _blacklist(address account, bool status) internal {
    require(!_renounced.Blacklist);
    require(account != _owner && account != address(0) && account != address(0xdEaD));
    require(account != _dex.router && account != _dex.pair, "DEX router or pair");

    if (status) { require(!_whitelisted[account], "Whitelisted"); }

    _blacklisted[account] = status;

    emit Blacklisted(account, status);
  }

  /// @notice Add or remove multiple addresses from the blacklist
  /// @param status True for adding, False for removing
  function blacklist(address[] calldata accounts, bool status) external onlyOwner {
    unchecked {
      uint256 cnt = accounts.length;

      for (uint256 i; i < cnt; i++) { _blacklist(accounts[i], status); }
    }
  }
}

File 8 of 14 : CF_Whitelist.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";

abstract contract CF_Whitelist is CF_Ownable, CF_Common {
  event Whitelisted(address indexed account, bool status);
  event RenouncedWhitelist();

  /// @notice Permanently renounce and prevent the owner from being able to update the whitelist
  /// @dev Existing entries will continue to be effective
  function renounceWhitelist() external onlyOwner {
    _renounced.Whitelist = true;

    emit RenouncedWhitelist();
  }

  /// @notice Check if an address is whitelisted
  /// @param account Address to check
  function isWhitelisted(address account) external view returns (bool) {
    return _whitelisted[account];
  }

  /// @notice Add or remove an address from the whitelist
  /// @param status True for adding, False for removing
  function whitelist(address account, bool status) public onlyOwner {
    _whitelist(account, status);
  }

  function _whitelist(address account, bool status) internal {
    require(!_renounced.Whitelist);
    require(account != address(0) && account != address(0xdEaD));
    require(account != _dex.router && account != _dex.pair, "DEX router and pair are privileged");

    if (status) { require(!_blacklisted[account], "Blacklisted"); }

    _whitelisted[account] = status;

    emit Whitelisted(account, status);
  }

  /// @notice Add or remove multiple addresses from the whitelist
  /// @param status True for adding, False for removing
  function whitelist(address[] calldata accounts, bool status) external onlyOwner {
    unchecked {
      uint256 cnt = accounts.length;

      for (uint256 i; i < cnt; i++) { _whitelist(accounts[i], status); }
    }
  }

  function _initialWhitelist(address[1] memory accounts) internal {
    require(!_initialized);

    unchecked {
      for (uint256 i; i < 1; i++) { _whitelist(accounts[i], true); }
    }
  }
}

File 9 of 14 : CF_Cooldown.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";

abstract contract CF_Cooldown is CF_Ownable, CF_Common {
  event SetCooldown(uint8 count, uint32 time, uint32 period);
  event RenouncedCooldown();

  /// @notice Permanently renounce and prevent the owner from being able to update cooldown features
  /// @dev Existing settings will continue to be effective
  function renounceCooldown() external onlyOwner {
    _renounced.Cooldown = true;

    emit RenouncedCooldown();
  }

  /// @notice Set cooldown settings
  /// @param count Number of transfers
  /// @param time Seconds during which the number of transfers will be taken into account
  /// @param period Seconds during which the wallet will be in cooldown
  function setCooldown(uint8 count, uint32 time, uint32 period) external onlyOwner {
    require(!_renounced.Cooldown);

    _setCooldown(count, time, period);
  }

  function _setCooldown(uint8 count, uint32 time, uint32 period) internal {
    require(count > 1 && time > 5);

    _cooldownTriggerCount = count;
    _cooldownTriggerTime = time;
    _cooldownPeriod = period;

    emit SetCooldown(count, time, period);
  }

  function _cooldown(address account) internal {
    unchecked {
      _holder[account].cooldown = _timestamp() + _cooldownPeriod;
    }
  }

  /// @notice Removes the cooldown status of a wallet
  /// @param account Address to unfreeze
  function removeCooldown(address account) external onlyOwner {
    require(!_renounced.Cooldown);

    _holder[account].count = 0;
    _holder[account].start = 0;
    _holder[account].cooldown = 0;
  }

  /// @notice Check if a wallet is currently in cooldown
  /// @param account Address to check
  /// @return Remaining seconds in cooldown
  function remainingCooldownTime(address account) public view returns (uint32) {
    if (_cooldownPeriod == 0 || !_holder[account].exists || _holder[account].cooldown < _timestamp()) { return 0; }

    unchecked {
      return _holder[account].cooldown - _timestamp();
    }
  }
}

File 10 of 14 : CF_MaxBalance.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";

abstract contract CF_MaxBalance is CF_Ownable, CF_Common {
  event SetMaxBalancePercent(uint24 percent);
  event RenouncedMaxBalance();

  /// @notice Permanently renounce and prevent the owner from being able to update the max. balance
  /// @dev Existing settings will continue to be effective
  function renounceMaxBalance() external onlyOwner {
    _renounced.MaxBalance = true;

    emit RenouncedMaxBalance();
  }

  /// @notice Percentage of the max. balance per wallet, depending on total supply
  function getMaxBalancePercent() external view returns (uint24) {
    return _maxBalancePercent;
  }

  /// @notice Set the max. percentage of a wallet balance, depending on total supply
  /// @param percent Desired percentage, multiplied by denominator
  function setMaxBalancePercent(uint24 percent) external onlyOwner {
    require(!_renounced.MaxBalance);

    unchecked {
      require(percent <= 100 * _denominator);
    }

    _setMaxBalancePercent(percent);

    emit SetMaxBalancePercent(percent);
  }

  function _setMaxBalancePercent(uint24 percent) internal {
    _maxBalancePercent = percent;
    _maxBalanceAmount = percent > 0 ? _percentage(_totalSupply, uint256(percent)) : 0;

    if (!_initialized) { emit SetMaxBalancePercent(percent); }
  }
}

File 11 of 14 : CF_Taxable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";
import "./CF_ERC20.sol";

abstract contract CF_Taxable is CF_Ownable, CF_Common, CF_ERC20 {
  event SetTaxBeneficiary(uint8 slot, address account, uint24[3] percent, uint24[3] penalty);
  event SetEarlyPenaltyTime(uint32 time);
  event TaxDistributed(uint256 amount);
  event RenouncedTaxable();

  struct taxBeneficiaryView {
    address account;
    uint24[3] percent;
    uint24[3] penalty;
    uint256 unclaimed;
  }

  modifier lockDistributing {
    _distributing = true;
    _;
    _distributing = false;
  }

  /// @notice Permanently renounce and prevent the owner from being able to update the tax features
  /// @dev Existing settings will continue to be effective
  function renounceTaxable() external onlyOwner {
    _renounced.Taxable = true;

    emit RenouncedTaxable();
  }

  /// @notice Total amount of taxes collected so far
  function totalTaxCollected() external view returns (uint256) {
    return _totalTaxCollected;
  }

  /// @notice Tax applied per transfer
  /// @dev Taking in consideration your wallet address
  function txTax() external view returns (uint24) {
    return txTax(msg.sender);
  }

  /// @notice Tax applied per transfer
  /// @param from Sender address
  function txTax(address from) public view returns (uint24) {
    unchecked {
      return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyTxTax : _totalTxTax);
    }
  }

  /// @notice Tax applied for buying
  /// @dev Taking in consideration your wallet address
  function buyTax() external view returns (uint24) {
    return buyTax(msg.sender);
  }

  /// @notice Tax applied for buying
  /// @param from Buyer's address
  function buyTax(address from) public view returns (uint24) {
    unchecked {
      return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyBuyTax : _totalBuyTax);
    }
  }
  /// @notice Tax applied for selling
  /// @dev Taking in consideration your wallet address
  function sellTax() external view returns (uint24) {
    return sellTax(msg.sender);
  }

  /// @notice Tax applied for selling
  /// @param to Seller's address
  function sellTax(address to) public view returns (uint24) {
    unchecked {
      return to == address(this) || _whitelisted[to] || to == _dex.pair || to == _dex.router ? 0 : (_holder[to].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltySellTax : _totalSellTax);
    }
  }

  /// @notice List of all tax beneficiaries and their assigned percentage, according to type of transfer
  /// @custom:return `list[].account` Beneficiary address
  /// @custom:return `list[].percent[3]` Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator
  /// @custom:return `list[].penalty[3]` Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator
  function listTaxBeneficiaries() external view returns (taxBeneficiaryView[] memory list) {
    list = new taxBeneficiaryView[](5);

    unchecked {
      for (uint8 i; i < 5; i++) { list[i] = taxBeneficiaryView(_taxBeneficiary[i].account, _taxBeneficiary[i].percent, _taxBeneficiary[i].penalty, _taxBeneficiary[i].unclaimed); }
    }
  }

  /// @notice Sets a tax beneficiary
  /// @dev Maximum of 5 wallets can be assigned
  /// @param slot Slot number (0 to 4)
  /// @param account Beneficiary address
  /// @param percent[3] Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator
  /// @param penalty[3] Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator
  function setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) external onlyOwner {
    require(!_renounced.Taxable);

    _setTaxBeneficiary(slot, account, percent, penalty);
  }

  function _setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) internal {
    require(slot < 5);
    require(account != address(this) && account != address(0));

    taxBeneficiary storage _taxBeneficiary = _taxBeneficiary[slot];

    if (account == address(0xdEaD) && _taxBeneficiary.exists && _taxBeneficiary.unclaimed > 0) { revert("Unclaimed taxes"); }

    _taxBeneficiary.account = account;
    _taxBeneficiary.percent = percent;
    _taxBeneficiary.penalty = penalty;

    unchecked {
      _totalTxTax += percent[0] - (_taxBeneficiary.exists ? _taxBeneficiary.percent[0] : 0);
      _totalBuyTax += percent[1] - (_taxBeneficiary.exists ? _taxBeneficiary.percent[1] : 0);
      _totalSellTax += percent[2] - (_taxBeneficiary.exists ? _taxBeneficiary.percent[2] : 0);
      _totalPenaltyTxTax += penalty[0] - (_taxBeneficiary.exists ? _taxBeneficiary.penalty[0] : 0);
      _totalPenaltyBuyTax += penalty[1] - (_taxBeneficiary.exists ? _taxBeneficiary.penalty[1] : 0);
      _totalPenaltySellTax += penalty[2] - (_taxBeneficiary.exists ? _taxBeneficiary.penalty[2] : 0);

      require(_totalTxTax <= 25 * _denominator && _totalBuyTax <= 25 * _denominator && _totalSellTax <= 25 * _denominator, "High Tax");
      require(_totalPenaltyTxTax <= 50 * _denominator && _totalPenaltyBuyTax <= 50 * _denominator && _totalPenaltySellTax <= 50 * _denominator, "High Penalty");
    }

    if (!_taxBeneficiary.exists) { _taxBeneficiary.exists = true; }

    emit SetTaxBeneficiary(slot, account, percent, penalty);
  }

  /// @notice Triggers the tax distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached unless forced
  /// @param force Ignore the min. threshold amount
  function autoTaxDistribute(bool force) external onlyOwner {
    require(!_swapping && !_distributing);

    _autoTaxDistribute(force);
  }

  function _autoTaxDistribute(bool force) internal lockDistributing {
    if (!force) {
      if (address(_reflectionToken) == address(this) && (_amountForTaxDistribution == 0 || _balance[address(this)] < _amountForTaxDistribution || _amountForTaxDistribution < _minTaxDistributionAmount)) { return; }
      if (address(_reflectionToken) == _dex.WETH && (_ethForTaxDistribution == 0 || _ethForTaxDistribution < address(this).balance)) { return; }
      if (address(_reflectionToken) != address(this) && address(_reflectionToken) != _dex.WETH && (_reflectionTokensForTaxDistribution == 0 || _reflectionTokensForTaxDistribution < _reflectionToken.balanceOf(address(this)))) { return; }
    }

    unchecked {
      uint256 distributed;

      for (uint8 i; i < 5; i++) {
        address account = _taxBeneficiary[i].account;
        uint256 unclaimed = _taxBeneficiary[i].unclaimed;

        if (unclaimed == 0 || account == address(0xdEaD) || account == _dex.pair) { continue; }

        uint256 _distributed = _distribute(account, unclaimed);

        if (_distributed > 0) { _taxBeneficiary[i].unclaimed -= _distributed; }

        distributed += _distributed;
      }

      _lastTaxDistribution = _timestamp();

      emit TaxDistributed(distributed);
    }
  }

  function _distribute(address account, uint256 unclaimed) private returns (uint256) {
    if (address(_reflectionToken) == address(this)) {
      super._transfer(address(this), account, unclaimed);

      _amountForTaxDistribution -= unclaimed;
    } else {
      uint256 percent = (uint256(_denominator) * unclaimed * 100) / _amountSwappedForTaxDistribution;
      uint256 amount;

      if (address(_reflectionToken) == _dex.WETH) {
        amount = _percentage(_ethForTaxDistribution, percent);

        if (_ethForTaxDistribution < amount) { return 0; }

        (bool success, ) = payable(account).call{ value: amount, gas: 30000 }("");

        if (!success) { return 0; }

        _ethForTaxDistribution -= amount;
      } else {
        amount = _percentage(_reflectionTokensForTaxDistribution, percent);

        if (_reflectionTokensForTaxDistribution < unclaimed) { return 0; }

        _reflectionToken.transfer(account, amount);
        _reflectionTokensForTaxDistribution -= amount;
      }

      _amountSwappedForTaxDistribution -= unclaimed;
    }

    return unclaimed;
  }

  /// @notice Suspend or reinstate tax collection
  /// @dev Also applies to early penalties
  /// @param status True to suspend, False to reinstate existent taxes
  function suspendTaxes(bool status) external onlyOwner {
    require(!_renounced.Taxable);

    _suspendTaxes = status;
  }

  /// @notice Checks if tax collection is currently suspended
  function taxesSuspended() external view returns (bool) {
    return _suspendTaxes;
  }

  /// @notice Returns the minimum percentage of the total supply accumulated in the Smart-Contract balance to trigger tax distribution
  function getMinTaxDistributionPercent() external view returns (uint24) {
    return _minTaxDistributionPercent;
  }

  /// @notice Sets the minimum percentage of the total supply accumulated in the Smart-Contract balance to trigger tax distribution
  /// @param percent Desired percentage, multiplied by denominator
  function setMinTaxDistributionPercent(uint24 percent) external onlyOwner {
    require(!_renounced.Taxable);
    require(percent >= 1 && percent <= 1000, "0.001% to 1%");

    _setMinTaxDistributionPercent(percent);
  }

  function _setMinTaxDistributionPercent(uint24 percent) internal {
    _minTaxDistributionPercent = percent;
    _minTaxDistributionAmount = _percentage(_totalSupply, uint256(percent));
  }

  /// @notice Removes the penalty status of a wallet
  /// @param account Address to depenalize
  function removePenalty(address account) external onlyOwner {
    require(!_renounced.Taxable);

    _holder[account].penalty = false;
  }

  /// @notice Check if a wallet is penalized due to an early transaction
  /// @param account Address to check
  function isPenalized(address account) external view returns (bool) {
    return _holder[account].penalty;
  }

  /// @notice Defines the period of time from contract creation during which early buyers will be penalized
  /// @param time Time, in seconds
  function setEarlyPenaltyTime(uint32 time) external onlyOwner {
    require(!_renounced.Taxable);
    require(time <= 7 days);

    _setEarlyPenaltyTime(time);
  }

  function _setEarlyPenaltyTime(uint32 time) internal {
    _earlyPenaltyTime = time;

    emit SetEarlyPenaltyTime(time);
  }
}

File 12 of 14 : CF_DEXRouterV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";
import "./CF_ERC20.sol";

abstract contract CF_DEXRouterV2 is CF_Ownable, CF_Common, CF_ERC20 {
  event SwapAndLiquify(uint256 tokenAmount, uint256 ethAmount, uint256 liquidity);
  event SwappedTokensForETH(uint256 tokenAmount, uint256 ethAmount);
  event SwappedTokensForERC20(address token, uint256 token0Amount, uint256 token1Amount);
  event SetDEXRouter(address indexed router, address indexed pair, address receiver);
  event RenouncedDEXRouterV2();

  modifier lockSwapping {
    _swapping = true;
    _;
    _swapping = false;
  }

  /// @notice Permanently renounce and prevent the owner from being able to update the DEX features
  /// @dev Existing settings will continue to be effective
  function renounceDEXRouterV2() external onlyOwner {
    _renounced.DEXRouterV2 = true;

    emit RenouncedDEXRouterV2();
  }

  /// @notice Sets the DEX router and where to receive the LP tokens
  /// @param router Address of the DEX router
  /// @param receiver Address of the LP tokens receiver
  function setDEXRouter(address router, address receiver) external onlyOwner returns (address) {
    require(!_renounced.DEXRouterV2);

    return _setDEXRouter(router, receiver);
  }

  function _setDEXRouter(address router, address receiver) internal returns (address) {
    require(router != address(0));

    if (_dex.router != router) {
      IDEXRouterV2 _router = IDEXRouterV2(router);
      IDEXFactoryV2 factory = IDEXFactoryV2(_router.factory());
      address WETH = _router.WETH();
      address pair = factory.getPair(address(this), WETH);

      if (pair == address(0)) { pair = factory.createPair(address(this), WETH); }

      _dex = DEXRouterV2(router, pair, WETH, receiver);
    }

    if (receiver != _dex.receiver) { _dex.receiver = receiver; }

    emit SetDEXRouter(router, _dex.pair, receiver);

    return _dex.pair;
  }

  /// @notice Returns the DEX router currently in use
  function getDEXRouter() external view returns (address) {
    return _dex.router;
  }

  /// @notice Returns the trading pair
  function getDEXPair() external view returns (address) {
    return _dex.pair;
  }

  /// @notice Returns address of the LP tokens receiver
  function getDEXReceiver() external view returns (address) {
    return _dex.receiver;
  }

  /// @notice Returns address of the reflection token
  function getReflectionToken() external view returns (address) {
    return address(_reflectionToken);
  }

  /// @notice Checks the status of the auto-swapping feature
  function isSwapEnabled() external view returns (bool) {
    return _swapEnabled;
  }

  /// @notice Checks whether the token can be traded through the assigned DEX
  function isTradingEnabled() external view returns (bool) {
    return _tradingEnabled > 0;
  }

  /// @notice Assign the excess token balance of the Smart-Contract to liquidity
  function liquifyExcess() external onlyOwner {
    require(_swapEnabled && !_swapping);

    unchecked {
      uint256 assigned = _amountForTaxDistribution + _amountForLiquidity;

      require(_balance[address(this)] > assigned);

      uint256 excess = _balance[address(this)] - assigned;

      _amountForLiquidity += excess;
    }

    _autoSwap(false);
  }

  /// @notice Swaps the assigned amount for liquidity and taxes to the corresponding token
  /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached unless forced
  /// @param force Ignore the min. threshold amount
  function autoSwap(bool force) external onlyOwner {
    require(_swapEnabled && !_swapping && !_distributing);

    _autoSwap(force);
  }

  function _autoSwap(bool force) internal lockSwapping {
    if (!_swapEnabled) { return; }

    unchecked {
      if (force || ((address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + _amountForLiquidity / 2 >= _minSwapAmount && _balance[address(this)] >= (address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + _amountForLiquidity)) {
        uint256 tokenAmountForLiquidity = _amountForLiquidity / 2;
        uint256 ethBalance = address(this).balance;
        address[] memory pathToSwapExactTokensForETH = new address[](2);
        pathToSwapExactTokensForETH[0] = address(this);
        pathToSwapExactTokensForETH[1] = _dex.WETH;

        _approve(address(this), _dex.router, (address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + tokenAmountForLiquidity);

        try IDEXRouterV2(_dex.router).swapExactTokensForETHSupportingFeeOnTransferTokens((address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + tokenAmountForLiquidity, 0, pathToSwapExactTokensForETH, address(this), block.timestamp + 1) {
          _lastSwap = _timestamp();

          if (_amountForLiquidity > 0) { _amountForLiquidity /= 2; }

          uint256 ethAmount = address(this).balance - ethBalance;

          emit SwappedTokensForETH((address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + tokenAmountForLiquidity, ethAmount);

          if (ethAmount > 0) {
            uint256 ethForLiquidity = ethAmount;

            if (address(_reflectionToken) == _dex.WETH) {
              ethForLiquidity = _percentage(ethAmount, tokenAmountForLiquidity >= _amountForTaxDistribution ? (100 * uint256(_denominator)) - ((uint256(_denominator) * _amountForTaxDistribution * 100) / (tokenAmountForLiquidity + _amountForTaxDistribution)) : (uint256(_denominator) * tokenAmountForLiquidity * 100) / (tokenAmountForLiquidity + _amountForTaxDistribution));

              _amountSwappedForTaxDistribution += _amountForTaxDistribution;
              _amountForTaxDistribution = 0;
              _ethForTaxDistribution += ethAmount - ethForLiquidity;
            }

            if (tokenAmountForLiquidity > 0 && ethForLiquidity > 0) {
              _approve(address(this), _dex.router, tokenAmountForLiquidity);

              try IDEXRouterV2(_dex.router).addLiquidityETH{ value: ethForLiquidity }(address(this), tokenAmountForLiquidity, 0, 0, _dex.receiver, block.timestamp + 1) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {
                emit SwapAndLiquify(amountToken, amountETH, liquidity);

                _amountForLiquidity = 0;
              } catch {
                _approve(address(this), _dex.router, 0);
              }
            }
          }
        } catch {
          _approve(address(this), _dex.router, 0);
        }
      }

      if (force || (address(_reflectionToken) != address(this) && address(_reflectionToken) != _dex.WETH && _amountForTaxDistribution >= _minSwapAmount && _balance[address(this)] >= _amountForTaxDistribution)) {
        uint256 reflectionTokenBalance = _reflectionToken.balanceOf(address(this));
        address[] memory pathToSwapExactTokensForERC20 = new address[](3);
        pathToSwapExactTokensForERC20[0] = address(this);
        pathToSwapExactTokensForERC20[1] = _dex.WETH;
        pathToSwapExactTokensForERC20[2] = address(_reflectionToken);

        _reflectionToken.approve(_dex.router, _amountForTaxDistribution);

        try IDEXRouterV2(_dex.router).swapExactTokensForTokensSupportingFeeOnTransferTokens(_amountForTaxDistribution, 0, (pathToSwapExactTokensForERC20), address(this), block.timestamp + 1) {
          emit SwappedTokensForERC20(address(_reflectionToken), _amountForTaxDistribution, reflectionTokenBalance - _reflectionToken.balanceOf(address(this)));

          _amountSwappedForTaxDistribution += _amountForTaxDistribution;
          _amountForTaxDistribution = 0;
          _reflectionTokensForTaxDistribution += reflectionTokenBalance - _reflectionToken.balanceOf(address(this));
        } catch {
          _reflectionToken.approve(_dex.router, 0);
        }
      }
    }
  }

  /// @notice Sets the desired ERC-20 reflection token
  /// @dev If other token than WETH is specified, the pair WETH-token must already exist
  /// @param token Address of the ERC-20 token
  function setReflection(address token) external onlyOwner {
    require(!_renounced.DEXRouterV2);

    _setReflection(token);
  }

  function _setReflection(address token) internal {
    require(token == address(0) || token == address(this) || token == _dex.WETH || IDEXFactoryV2(IDEXRouterV2(_dex.router).factory()).getPair(_dex.WETH, token) != address(0), "No Pair");

    if (token == address(0)) { token == address(this); }

    _reflectionToken = IERC20(token);
  }

  /// @notice Returns the minimum percentage of the total supply in the Smart-Contract balance to trigger auto swap
  function getMinSwapPercent() external view returns (uint24) {
    return _minSwapPercent;
  }

  /// @notice Sets the minimum percentage of the total supply in the Smart-Contract balance to trigger auto swap
  /// @param percent Desired percentage, multiplied by denominator
  function setMinSwapPercent(uint24 percent) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(percent >= 1 && percent <= 1000, "0.001% to 1%");

    _setMinSwapPercent(percent);
  }

  function _setMinSwapPercent(uint24 percent) internal {
    _minSwapPercent = percent;
    _minSwapAmount = _percentage(_totalSupply, uint256(percent));
  }

  /// @notice Enables or disables the auto swap function
  /// @param status True to enable, False to disable
  function setSwapStatus(bool status) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(!status || _dex.router != address(0), "No DEX");

    _swapEnabled = status;
  }

  /// @notice Enables or disables the trading capability via the DEX set up
  /// @param status True to enable, False to disable
  function setTradingStatus(bool status) external onlyOwner {
    require(!_renounced.DEXRouterV2);

    _tradingEnabled = status ? _timestamp() : 0;
  }
}

File 13 of 14 : IDEXV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

interface IDEXRouterV2 {
  function factory() external pure returns (address);
  function WETH() external pure returns (address);
  function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
  function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
  function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
}

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

File 14 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

interface IERC20 {
  function balanceOf(address account) external view returns (uint256);
  function transfer(address to, uint256 amount) external returns (bool);
  function approve(address spender, uint256 amount) external returns (bool);
}

Settings
{
  "evmVersion": "shanghai",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "optimizer": {
    "enabled": true,
    "runs": 1000
  }
}

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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Blacklisted","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":"RenouncedBlacklist","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedCooldown","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxBalance","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedTaxable","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"count","type":"uint8"},{"indexed":false,"internalType":"uint32","name":"time","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"period","type":"uint32"}],"name":"SetCooldown","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"SetDEXRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"time","type":"uint32"}],"name":"SetEarlyPenaltyTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"percent","type":"uint24"}],"name":"SetMaxBalancePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"slot","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"indexed":false,"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"SetTaxBeneficiary","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token1Amount","type":"uint256"}],"name":"SwappedTokensForERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SwappedTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxDistributed","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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoTaxDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","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":"denominator","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxBalancePercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinSwapPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinTaxDistributionPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReflectionToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"info","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPenalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquifyExcess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"listTaxBeneficiaries","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"internalType":"struct CF_Taxable.taxBeneficiaryView[]","name":"list","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"force","type":"bool"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"force","type":"bool"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"remainingCooldownTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceDEXRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounced","outputs":[{"internalType":"bool","name":"Blacklist","type":"bool"},{"internalType":"bool","name":"Whitelist","type":"bool"},{"internalType":"bool","name":"Cooldown","type":"bool"},{"internalType":"bool","name":"MaxBalance","type":"bool"},{"internalType":"bool","name":"Taxable","type":"bool"},{"internalType":"bool","name":"DEXRouterV2","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"count","type":"uint8"},{"internalType":"uint32","name":"time","type":"uint32"},{"internalType":"uint32","name":"period","type":"uint32"}],"name":"setCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setDEXRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"time","type":"uint32"}],"name":"setEarlyPenaltyTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMaxBalancePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMinSwapPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMinTaxDistributionPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setReflection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSwapStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"slot","type":"uint8"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"setTaxBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setTradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"suspendTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesSuspended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTaxCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","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":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801562000010575f80fd5b5060408051808201909152600c81526b436861696e466163746f727960a01b6020820152601b9062000043908262001171565b50604080518082019091526007815266464143544f525960c81b6020820152601c9062000071908262001171565b50601260a0526a3e09de2596099e2b000000600a55620000a573b8f8a463a725502b5e0642bb0dc55ca8d1675434620002ba565b620000c873b8f8a463a725502b5e0642bb0dc55ca8d1675434620186a062000309565b620000d460786200038e565b62000108737a250d5630b4cf539739df2c5dacb4c659f2488d73b8f8a463a725502b5e0642bb0dc55ca8d1675434620003f2565b506200012873c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2620006e3565b60088054600a54620186a06101f49091020460118190556001600160d01b03909116637d00007d60d21b17909155600e5560408051606080820183525f80835261138860208085018290528486019190915284519283018552619c4080845290830181905293820193909352620001b69291736aa1f46fd34ddaa9f5efcab3ebd43c54a87cbf8e9162000871565b604080516020810190915273b8f8a463a725502b5e0642bb0dc55ca8d16754348152620001e39062000cf8565b620001f36005610e108062000d44565b620002006107d062000e09565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f601b6040516200023291906200123d565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120601d5560016080526200136a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6080511562000316575f80fd5b5f62000330600a548362ffffff1662000e8f60201b60201c565b6001600160a01b0384165f818152600160205260408082208490555192935090917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620003819085815260200190565b60405180910390a3505050565b6009805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020015b60405180910390a150565b5f6001600160a01b03831662000406575f80fd5b6016546001600160a01b0384811691161462000657575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200045e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004849190620012b7565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004c4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ea9190620012b7565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156200053b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005619190620012b7565b90506001600160a01b038116620005e7576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015620005be573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005e49190620012b7565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b038381169116146200068957601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806200070257506001600160a01b03811630145b806200071b57506018546001600160a01b038281169116145b806200081357506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156200076a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620007909190620012b7565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015620007e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620008079190620012b7565b6001600160a01b031614155b6200084f5760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b60448201526064015b60405180910390fd5b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b60058460ff161062000881575f80fd5b6001600160a01b0383163014801590620008a357506001600160a01b03831615155b620008ac575f80fd5b60ff84165f9081526006602052604090206001600160a01b03841661dead148015620008d95750805460ff165b8015620008e957505f8160030154115b156200092a5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b604482015260640162000846565b8054610100600160a81b0319166101006001600160a01b0386160217815562000959600182018460036200101e565b506200096b600282018360036200101e565b50805460ff166200097d575f62000988565b600181015462ffffff165b83516008805462ffffff60401b19811693909203680100000000000000009283900462ffffff9081169190910116909102919091179055805460ff16620009d0575f620009e2565b60018101546301000000900462ffffff165b60208401516008805462ffffff60581b198116939092036b0100000000000000000000009283900462ffffff9081169190910116909102919091179055805460ff1662000a30575f62000a45565b60018101546601000000000000900462ffffff165b60408401516008805462ffffff60701b19811693909203600160701b9283900462ffffff9081169190910116909102919091179055805460ff1662000a8b575f62000a96565b600281015462ffffff165b82516008805462ffffff60881b19811693909203600160881b9283900462ffffff9081169190910116909102919091179055805460ff1662000ad9575f62000aeb565b60028101546301000000900462ffffff165b60208301516008805462ffffff60a01b19811693909203600160a01b9283900462ffffff9081169190910116909102919091179055805460ff1662000b31575f62000b46565b60028101546601000000000000900462ffffff165b60408301516008805462ffffff60b81b19811693909203600160b81b9283900462ffffff90811691909101811690920292909217918290556161a868010000000000000000909204161180159062000bb757506008546161a86b01000000000000000000000090910462ffffff1611155b801562000bd557506008546161a8600160701b90910462ffffff1611155b62000c0e5760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b604482015260640162000846565b60085461c350600160881b90910462ffffff161180159062000c41575060085461c350600160a01b90910462ffffff1611155b801562000c5f575060085461c350600160b81b90910462ffffff1611155b62000c9c5760405162461bcd60e51b815260206004820152600c60248201526b486967682050656e616c747960a01b604482015260640162000846565b805460ff1662000cb257805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405162000ce9949392919062001329565b60405180910390a15050505050565b6080511562000d05575f80fd5b5f5b600181101562000d405762000d3782826001811062000d2a5762000d2a620012e6565b6020020151600162000e99565b60010162000d07565b5050565b60018360ff1611801562000d5e575060058263ffffffff16115b62000d67575f80fd5b6008805460ff60201b191664010000000060ff86169081029190911790915560098054600160801b600160c01b031916600160801b63ffffffff86811691820263ffffffff60a01b191692909217600160a01b92861692830217909255604080519384526020840192909252908201527f24b1343f86058af6b8e48d5f9ca6b4e206b72690500086e848cc587b2f4097149060600160405180910390a1505050565b6008805462ffffff60281b19166501000000000062ffffff84169081029190911790915562000e39575f62000e4b565b600a54620186a062ffffff8316909102045b600c5560805162000e8c5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001620003e7565b50565b620186a091020490565b601554610100900460ff161562000eae575f80fd5b6001600160a01b0382161580159062000ed257506001600160a01b03821661dead14155b62000edb575f80fd5b6016546001600160a01b0383811691161480159062000f0857506017546001600160a01b03838116911614155b62000f615760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b606482015260840162000846565b801562000fc0576001600160a01b0382165f9081526003602052604090205460ff161562000fc05760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b604482015260640162000846565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b600183019183908215620010ab579160200282015f5b838211156200107857835183826101000a81548162ffffff021916908362ffffff160217905550926020019260030160208160020104928301926001030262001034565b8015620010a95782816101000a81549062ffffff021916905560030160208160020104928301926001030262001078565b505b50620010b9929150620010bd565b5090565b5b80821115620010b9575f8155600101620010be565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620010fc57607f821691505b6020821081036200111b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200116c57805f5260205f20601f840160051c81016020851015620011485750805b601f840160051c820191505b8181101562001169575f815560010162001154565b50505b505050565b81516001600160401b038111156200118d576200118d620010d3565b620011a5816200119e8454620010e7565b8462001121565b602080601f831160018114620011db575f8415620011c35750858301515b5f19600386901b1c1916600185901b17855562001235565b5f85815260208120601f198616915b828110156200120b57888601518255948401946001909101908401620011ea565b50858210156200122957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8083546200124c81620010e7565b600182811680156200126757600181146200127d57620012ab565b60ff1984168752821515830287019450620012ab565b875f526020805f205f5b85811015620012a25781548a82015290840190820162001287565b50505082870194505b50929695505050505050565b5f60208284031215620012c8575f80fd5b81516001600160a01b0381168114620012df575f80fd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b805f5b60038110156200132357815162ffffff16845260209384019390910190600101620012fd565b50505050565b60ff851681526001600160a01b03841660208201526101008101620013526040830185620012fa565b6200136160a0830184620012fa565b95945050505050565b60805160a051615d7d620013935f395f818161066b015261155201525f613cbd0152615d7d5ff3fe608060405260043610610486575f3560e01c8063715018a611610251578063a6cbe5c111610148578063d505accf116100c9578063f2fde38b11610083578063f4db96981161006b578063f4db969814610dca578063f59c370814610de7578063fe575a8714610e0657005b8063f2fde38b14610d6f578063f3dc4f4814610d8e57005b8063d89135cd116100b1578063d89135cd14610d03578063dd62ed3e14610d17578063e2745ef214610d5b57005b8063d505accf14610cd0578063d8454a8214610cef57005b8063c78fe0d41161011a578063cc1776d311610102578063cc1776d314610c27578063d1ace71014610c3b578063d232c22014610c5a57005b8063c78fe0d414610bf4578063c997eb8d14610c0857005b8063a6cbe5c114610b6e578063a9059cbb14610ba2578063be5e49b214610bc1578063c77e006d14610be057005b80638d8350ca116101d257806396ce0795116101a4578063a457c2d71161018c578063a457c2d714610b11578063a4d8971a14610b30578063a5596b4f14610b4f57005b806396ce079514610ade5780639caf0c2514610af257005b80638d8350ca14610a705780638da5cb5b14610a8f57806395101f9014610aab57806395d89b4114610aca57005b80637b1ab0d2116102235780637ecebe001161020b5780637ecebe0014610a145780638324c3b914610a485780638bf1acff14610a5c57005b80637b1ab0d2146109d65780637b1ad1d7146109f557005b8063715018a61461096d57806375de14961461098157806379b3d411146109a357806379cc6790146109b757005b80633644e5151161037d5780634f7041a5116102fe5780635f641758116102b85780636d5c1490116102a05780636d5c1490146108f95780636f05be971461091857806370a082311461093957005b80635f641758146108bb5780636bdb5ad1146108da57005b806354fd4d50116102e657806354fd4d501461085b5780635bbb7a51146108885780635f189361146108a757005b80634f7041a51461082a5780635117cdee1461083e57005b8063395093511161034f5780633ed8a169116103375780633ed8a169146107cd578063404e5129146107ec57806342966c681461080b57005b806339509351146107775780633af32abf1461079657005b80633644e5151461070a578063370158ea1461071e578063379ba1d91461074457806339137f8b1461076357005b8063186488a811610407578063313ce567116103d957806333d48a7d116103c157806333d48a7d146106b4578063351a964d146106d457806335ed71a8146106eb57005b8063313ce56714610658578063326339671461069557005b8063186488a8146105dc57806323b872dd146105fb5780632984207a1461061a5780632add44041461063957005b806307e9652c11610458578063095ea7b311610440578063095ea7b3146105825780630ac769dc146105a157806318160ddd146105be57005b806307e9652c14610534578063095233081461055157005b806301b38af51461048f5780630588b1a5146104ae578063064a59d0146104e357806306fdde031461051357005b3661048d57005b005b34801561049a575f80fd5b5061048d6104a93660046155f4565b610e3d565b3480156104b9575f80fd5b50600854600160d01b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b3480156104ee575f80fd5b50600954640100000000900463ffffffff1615155b60405190151581526020016104da565b34801561051e575f80fd5b50610527610ed4565b6040516104da91906156b6565b34801561053f575f80fd5b5060085462010000900460ff16610503565b34801561055c575f80fd5b506016546001600160a01b03165b6040516001600160a01b0390911681526020016104da565b34801561058d575f80fd5b5061050361059c3660046156dc565b610f64565b3480156105ac575f80fd5b50601a546001600160a01b031661056a565b3480156105c9575f80fd5b50600a545b6040519081526020016104da565b3480156105e7575f80fd5b5061048d6105f63660046157ab565b610f7a565b348015610606575f80fd5b50610503610615366004615801565b610feb565b348015610625575f80fd5b5061048d610634366004615852565b61100c565b348015610644575f80fd5b5061048d61065336600461586b565b61108c565b348015610663575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016104da565b3480156106a0575f80fd5b5061048d6106af3660046158bb565b611388565b3480156106bf575f80fd5b50600854600160e81b900462ffffff166104ca565b3480156106df575f80fd5b5060085460ff16610503565b3480156106f6575f80fd5b5061048d6107053660046158d4565b61146e565b348015610715575f80fd5b50601d546105ce565b348015610729575f80fd5b50610732611544565b6040516104da969594939291906158ef565b34801561074f575f80fd5b5061048d61075e3660046158d4565b6116cd565b34801561076e575f80fd5b5061048d611763565b348015610782575f80fd5b506105036107913660046156dc565b6117e4565b3480156107a1575f80fd5b506105036107b0366004615952565b6001600160a01b03165f9081526004602052604090205460ff1690565b3480156107d8575f80fd5b5061048d6107e73660046158bb565b611818565b3480156107f7575f80fd5b5061048d61080636600461596d565b6118cf565b348015610816575f80fd5b5061048d6108253660046159a4565b611925565b348015610835575f80fd5b506104ca61192f565b348015610849575f80fd5b506017546001600160a01b031661056a565b348015610866575f80fd5b506040805180820190915260058152640312e302e360dc1b6020820152610527565b348015610893575f80fd5b5061048d6108a2366004615952565b61193e565b3480156108b2575f80fd5b5061048d6119c8565b3480156108c6575f80fd5b506104ca6108d5366004615952565b611a47565b3480156108e5575f80fd5b5061048d6108f43660046158bb565b611b2a565b348015610904575f80fd5b5061048d6109133660046159bb565b611c27565b348015610923575f80fd5b5061092c611c94565b6040516104da9190615a22565b348015610944575f80fd5b506105ce610953366004615952565b6001600160a01b03165f9081526001602052604090205490565b348015610978575f80fd5b5061048d611e25565b34801561098c575f80fd5b5060085465010000000000900462ffffff166104ca565b3480156109ae575f80fd5b5061048d611e78565b3480156109c2575f80fd5b5061048d6109d13660046156dc565b611efb565b3480156109e1575f80fd5b5061056a6109f0366004615aa1565b611f10565b348015610a00575f80fd5b5061048d610a0f366004615952565b611f82565b348015610a1f575f80fd5b506105ce610a2e366004615952565b6001600160a01b03165f908152601e602052604090205490565b348015610a53575f80fd5b5061048d611feb565b348015610a67575f80fd5b506104ca612072565b348015610a7b575f80fd5b506104ca610a8a366004615952565b612078565b348015610a9a575f80fd5b505f546001600160a01b031661056a565b348015610ab6575f80fd5b506104ca610ac5366004615952565b612141565b348015610ad5575f80fd5b5061052761220d565b348015610ae9575f80fd5b506103e86104ca565b348015610afd575f80fd5b5061048d610b0c366004615acd565b61221c565b348015610b1c575f80fd5b50610503610b2b3660046156dc565b6123e4565b348015610b3b575f80fd5b5061048d610b4a3660046158d4565b612464565b348015610b5a575f80fd5b5061048d610b693660046158d4565b6124ed565b348015610b79575f80fd5b50610b8d610b88366004615952565b612568565b60405163ffffffff90911681526020016104da565b348015610bad575f80fd5b50610503610bbc3660046156dc565b612616565b348015610bcc575f80fd5b5061048d610bdb366004615952565b612622565b348015610beb575f80fd5b5061048d6126a2565b348015610bff575f80fd5b5061048d612727565b348015610c13575f80fd5b5061048d610c223660046155f4565b6127b0565b348015610c32575f80fd5b506104ca61283b565b348015610c46575f80fd5b5061048d610c553660046158d4565b612845565b348015610c65575f80fd5b506015546040805160ff80841615158252610100840481161515602083015262010000840481161515928201929092526301000000830482161515606082015264010000000083048216151560808201526501000000000090920416151560a082015260c0016104da565b348015610cdb575f80fd5b5061048d610cea366004615b01565b6128c0565b348015610cfa575f80fd5b50600d546105ce565b348015610d0e575f80fd5b50600b546105ce565b348015610d22575f80fd5b506105ce610d31366004615aa1565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610d66575f80fd5b5061048d612adb565b348015610d7a575f80fd5b5061048d610d89366004615952565b612b8d565b348015610d99575f80fd5b50610503610da8366004615952565b6001600160a01b03165f90815260056020526040902054610100900460ff1690565b348015610dd5575f80fd5b506019546001600160a01b031661056a565b348015610df2575f80fd5b5061048d610e0136600461596d565b612bf0565b348015610e11575f80fd5b50610503610e20366004615952565b6001600160a01b03165f9081526003602052604090205460ff1690565b5f546001600160a01b03163314610e8a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610ecd57610ec5858583818110610eaa57610eaa615b6a565b9050602002016020810190610ebf9190615952565b84612c3e565b600101610e8d565b5050505050565b6060601b8054610ee390615b7e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f90615b7e565b8015610f5a5780601f10610f3157610100808354040283529160200191610f5a565b820191905f5260205f20905b815481529060010190602001808311610f3d57829003601f168201915b5050505050905090565b5f610f70338484612dd6565b5060015b92915050565b5f546001600160a01b03163314610fc25760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff1615610fd9575f80fd5b610fe584848484612e37565b50505050565b5f610ff7843384613358565b6110028484846133da565b5060019392505050565b5f546001600160a01b031633146110545760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff161561106b575f80fd5b62093a808163ffffffff161115611080575f80fd5b61108981613c06565b50565b5f546001600160a01b031633146110d45760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015611118573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113c9190615bb0565b90505f6001600160a01b038616301461117257601a546001600160a01b0387811691161461116a575f61117a565b60145461117a565b601254600f54015b90508215801561119b575083828210156111945781611196565b825b830310155b806111ae57508280156111ae5750838210155b6111ec5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b82801561121857506001600160a01b0386163014806112185750601a546001600160a01b038781169116145b80156112345750838282101561122e5781611230565b825b8303105b15611316576008546301000000900460ff1615801561125b5750600854610100900460ff16155b611263575f80fd5b306001600160a01b038716036112de575f600f548510156112885784600f540361128c565b600f545b600f805482900390559182900391905084838310156112ab57826112ad565b835b840310156112d8576012548510156112c95784601254036112cd565b6012545b601280549190910390555b50611316565b601a546001600160a01b038088169116036113165760145484101561130757836014540361130b565b6014545b601480549190910390555b505060405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044016020604051808303815f875af1158015611364573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ecd9190615bc7565b5f546001600160a01b031633146113d05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff16156113e7575f80fd5b60018162ffffff161015801561140457506103e88162ffffff1611155b61143f5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610e81565b6008805462ffffff60d01b1916600160d01b62ffffff93909316928302179055600a54620186a0910204600e55565b5f546001600160a01b031633146114b65760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff16156114ce575f80fd5b8015806114e557506016546001600160a01b031615155b6115315760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610e81565b6008805460ff1916911515919091179055565b6060805f805f6060601b601c7f00000000000000000000000000000000000000000000000000000000000000005f8054906101000a90046001600160a01b0316600a54604051806040016040528060058152602001640312e302e360dc1b8152508580546115b190615b7e565b80601f01602080910402602001604051908101604052809291908181526020018280546115dd90615b7e565b80156116285780601f106115ff57610100808354040283529160200191611628565b820191905f5260205f20905b81548152906001019060200180831161160b57829003601f168201915b5050505050955084805461163b90615b7e565b80601f016020809104026020016040519081016040528092919081815260200182805461166790615b7e565b80156116b25780601f10611689576101008083540402835291602001916116b2565b820191905f5260205f20905b81548152906001019060200180831161169557829003601f168201915b50505050509450955095509550955095509550909192939495565b5f546001600160a01b031633146117155760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff161561172d575f80fd5b80611738575f611740565b4263ffffffff165b600960046101000a81548163ffffffff021916908363ffffffff16021790555050565b5f546001600160a01b031633146117ab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805461ff0019166101001790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610f7091859085905b01612dd6565b5f546001600160a01b031633146118605760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015546301000000900460ff1615611876575f80fd5b620186a062ffffff8216111561188a575f80fd5b61189381613c72565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b5f546001600160a01b031633146119175760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6119218282613d15565b5050565b6110893382613ea5565b5f61193933612141565b905090565b5f546001600160a01b031633146119865760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155462010000900460ff161561199b575f80fd5b6001600160a01b03165f90815260056020526040902080546dffffffffffffffffffffffff000019169055565b5f546001600160a01b03163314611a105760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805460ff191660011790556040517f3d35f028b9917dcf52b6fdf73b387c4fde5ce548ad8d75bce334c2db07427bfe905f90a1565b5f6001600160a01b038216301480611a7657506001600160a01b0382165f9081526004602052604090205460ff165b80611a8e57506017546001600160a01b038381169116145b80611aa657506016546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff1680611af7575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b611b0f57600854600160701b900462ffffff16610f74565b600854600160b81b900462ffffff16610f74565b5f92915050565b5f546001600160a01b03163314611b725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611b8a575f80fd5b60018162ffffff1610158015611ba757506103e88162ffffff1611155b611be25760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610e81565b600880547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b62ffffff93909316928302179055600a54620186a0910204601155565b5f546001600160a01b03163314611c6f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155462010000900460ff1615611c84575f80fd5b611c8f838383613f44565b505050565b60408051600580825260c08201909252606091816020015b611cb46154e6565b815260200190600190039081611cac5790505090505f5b60058160ff161015611e21576040805160808101825260ff83165f81815260066020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611d28579050505050918352505060ff83165f9081526006602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611d9c5750505092845250505060ff83165f8181526006602090815260409091206003015492019190915283518491908110611e0e57611e0e615b6a565b6020908102919091010152600101611ccb565b5090565b5f546001600160a01b03163314611e6d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b611e765f614042565b565b5f546001600160a01b03163314611ec05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805462ff00001916620100001790556040517ffd61f9d9e981b264f65f693615b347d7c5addcab978b82e81ae866b25155e426905f90a1565b611f06823383613358565b6119218282613ea5565b5f80546001600160a01b03163314611f595760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611f71575f80fd5b611f7b838361409e565b9392505050565b5f546001600160a01b03163314611fca5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611fe2575f80fd5b611089816143b2565b5f546001600160a01b031633146120335760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805464ff0000000019166401000000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f611939335b5f6001600160a01b0382163014806120a757506001600160a01b0382165f9081526004602052604090205460ff165b806120bf57506017546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff1680612110575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b61212d5760085468010000000000000000900462ffffff16610f74565b600854600160881b900462ffffff16610f74565b5f6001600160a01b03821630148061217057506001600160a01b0382165f9081526004602052604090205460ff165b8061218857506017546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff16806121d9575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b6121f9576008546b010000000000000000000000900462ffffff16610f74565b600854600160a01b900462ffffff16610f74565b6060601c8054610ee390615b7e565b5f546001600160a01b031633146122645760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601854601a5447915f916001600160a01b03908116911614612286575f61228a565b6013545b9050821580156122ab575083828210156122a457816122a6565b825b830310155b806122be57508280156122be5750838210155b6122fc5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b8280156123195750601854601a546001600160a01b039081169116145b80156123355750838282101561232f5781612331565b825b8303105b15612387576008546301000000900460ff1615801561235c5750600854610100900460ff16155b612364575f80fd5b60135484101561237857836013540361237c565b6013545b601380549190910390555b50505f836001600160a01b0316836040515f6040518083038185875af1925050503d805f81146123d2576040519150601f19603f3d011682016040523d82523d5f602084013e6123d7565b606091505b5050905080610fe5575f80fd5b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156124575760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610e81565b6110023385858403612dd6565b5f546001600160a01b031633146124ac5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60085460ff1680156124c65750600854610100900460ff16155b80156124dc57506008546301000000900460ff16155b6124e4575f80fd5b6110898161456d565b5f546001600160a01b031633146125355760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff161561254c575f80fd5b60088054911515620100000262ff000019909216919091179055565b6009545f90600160a01b900463ffffffff16158061259e57506001600160a01b0382165f9081526005602052604090205460ff16155b806125d657506001600160a01b0382165f9081526005602052604090205463ffffffff4281166a010000000000000000000090920416105b156125e257505f919050565b506001600160a01b03165f9081526005602052604090205463ffffffff4281166a0100000000000000000000909204160390565b5f610f703384846133da565b5f546001600160a01b0316331461266a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff1615612681575f80fd5b6001600160a01b03165f908152600560205260409020805461ff0019169055565b5f546001600160a01b031633146126ea5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805463ff000000191663010000001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b5f546001600160a01b0316331461276f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805465ff00000000001916650100000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f546001600160a01b031633146127f85760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b815f5b81811015610ecd5761283385858381811061281857612818615b6a565b905060200201602081019061282d9190615952565b84613d15565b6001016127fb565b5f61193933611a47565b5f546001600160a01b0316331461288d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b600854610100900460ff161580156128af57506008546301000000900460ff16155b6128b7575f80fd5b61108981614e3e565b428410156129105760405162461bcd60e51b815260206004820152601160248201527f45787069726564207369676e61747572650000000000000000000000000000006044820152606401610e81565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015612a43573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590612a795750886001600160a01b0316816001600160a01b0316145b612ac55760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610e81565b5050612ad2878787612dd6565b50505050505050565b5f546001600160a01b03163314612b235760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60085460ff168015612b3d5750600854610100900460ff16155b612b45575f80fd5b601254600f54305f908152600160205260409020549101908110612b67575f80fd5b305f908152600160205260408120546012805493909103909201909155611e769061456d565b5f546001600160a01b03163314612bd55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6001600160a01b038116612be7575f80fd5b61108981614042565b5f546001600160a01b03163314612c385760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b61192182825b601554610100900460ff1615612c52575f80fd5b6001600160a01b03821615801590612c7557506001600160a01b03821661dead14155b612c7d575f80fd5b6016546001600160a01b03838116911614801590612ca957506017546001600160a01b03838116911614155b612d1b5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c656760448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610e81565b8015612d77576001600160a01b0382165f9081526003602052604090205460ff1615612d775760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610e81565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f2644091015b60405180910390a25050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1610612e46575f80fd5b6001600160a01b0383163014801590612e6757506001600160a01b03831615155b612e6f575f80fd5b60ff84165f9081526006602052604090206001600160a01b03841661dead148015612e9b5750805460ff165b8015612eaa57505f8160030154115b15612ef75760405162461bcd60e51b815260206004820152600f60248201527f556e636c61696d656420746178657300000000000000000000000000000000006044820152606401610e81565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03861602178155612f3b60018201846003615521565b50612f4b60028201836003615521565b50805460ff16612f5b575f612f66565b600181015462ffffff165b8351600880546affffff000000000000000019811693909203680100000000000000009283900462ffffff9081169190910116909102919091179055805460ff16612fb1575f612fc3565b60018101546301000000900462ffffff165b6020840151600880546dffffff0000000000000000000000198116939092036b0100000000000000000000009283900462ffffff9081169190910116909102919091179055805460ff16613017575f61302c565b60018101546601000000000000900462ffffff165b6040840151600880547fffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff811693909203600160701b9283900462ffffff9081169190910116909102919091179055805460ff16613089575f613094565b600281015462ffffff165b8251600880547fffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff811693909203600160881b9283900462ffffff9081169190910116909102919091179055805460ff166130ee575f613100565b60028101546301000000900462ffffff165b6020830151600880547fffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff811693909203600160a01b9283900462ffffff9081169190910116909102919091179055805460ff1661315d575f613172565b60028101546601000000000000900462ffffff165b6040830151600880547fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff811693909203600160b81b9283900462ffffff90811691909101811690920292909217918290556161a86801000000000000000090920416118015906131fb57506008546161a86b01000000000000000000000090910462ffffff1611155b801561321857506008546161a8600160701b90910462ffffff1611155b6132645760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610e81565b60085461c350600160881b90910462ffffff1611801590613296575060085461c350600160a01b90910462ffffff1611155b80156132b3575060085461c350600160b81b90910462ffffff1611155b6132ff5760405162461bcd60e51b815260206004820152600c60248201527f486967682050656e616c747900000000000000000000000000000000000000006044820152606401610e81565b805460ff1661331457805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a858585856040516133499493929190615be2565b60405180910390a15050505050565b6001600160a01b038381165f90815260026020908152604080832093861683529290522054818110156133cd5760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610e81565b610fe58484848403612dd6565b6001600160a01b0383165f9081526003602052604090205460ff1615801561341a57506001600160a01b0382165f9081526003602052604090205460ff16155b6134545760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610e81565b61deac196001600160a01b0383160161346b575f80fd5b6008546301000000900460ff1615801561348d5750600854610100900460ff16155b80156134c057506017546001600160a01b038481169116148015906134c057506016546001600160a01b03848116911614155b156134d7576134ce5f61456d565b6134d75f614e3e565b5f811180156134fe57506001600160a01b0383165f9081526004602052604090205460ff16155b801561352257506001600160a01b0382165f9081526004602052604090205460ff16155b801561353757506001600160a01b0383163014155b801561354c57506001600160a01b0382163014155b801561356657506016546001600160a01b03838116911614155b15613bfb576017546001600160a01b0384811691161480159061359757506017546001600160a01b03838116911614155b806135e157506017546001600160a01b03848116911614806135c657506017546001600160a01b038381169116145b80156135e15750600954640100000000900463ffffffff1615155b61362d5760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610e81565b600954600160a01b900463ffffffff161580159061365957506017546001600160a01b03848116911614155b156137e85761366783612568565b63ffffffff16156136ba5760405162461bcd60e51b815260206004820152600860248201527f436f6f6c646f776e0000000000000000000000000000000000000000000000006044820152606401610e81565b4263ffffffff166009546001600160a01b0385165f9081526005602052604090205463ffffffff92831670010000000000000000000000000000000090920483166601000000000000909104831601909116101561378d576001600160a01b0383165f908152600560205260409020805465ffffffff000019166201000017905561374863ffffffff421690565b6001600160a01b0384165f908152600560205260409020805463ffffffff9290921666010000000000000269ffffffff000000000000199092169190911790556137e8565b6008546001600160a01b0384165f908152600560205260409020805465ffffffff0000198116620100009182900463ffffffff908116600101169182021790915564010000000090910460ff16116137e8576137e883615088565b600c5415806137ff57506001600160a01b03821630145b8061382e57506017546001600160a01b038381169116148061382e57506016546001600160a01b038381169116145b806138545750600c546001600160a01b0383165f90815260016020526040902054820111155b6138a05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610e81565b60085462010000900460ff161580156138c357506008546301000000900460ff16155b80156138d75750600854610100900460ff16155b15613bfb576017545f9081906001600160a01b038681169116148061390957506017546001600160a01b038581169116145b15613930576017546001600160a01b0386811691161461392a57600261392d565b60015b90505b5f8160ff166001146139425785613944565b845b60095490915063ffffffff428116600160601b83048216640100000000909304821692909201161080159061399657506001600160a01b0381165f90815260056020526040902054610100900460ff16155b156139c0576001600160a01b0381165f908152600560205260409020805461ff0019166101001790555b5f5b60058160ff161015613be2575f808460ff1611613a4d576001600160a01b0383165f90815260056020526040902054610100900460ff16613a335760ff82165f908152600660205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613b15565b60ff82165f90815260066020526040812060020190613a13565b8360ff16600114613ab3576001600160a01b0383165f90815260056020526040902054610100900460ff16613a975760ff82165f9081526006602052604090206001016002613a13565b60ff82165f908152600660205260409020600290810190613a13565b6001600160a01b0383165f90815260056020526040902054610100900460ff16613af35760ff82165f908152600660205260409020600190810190613a13565b60ff82165f908152600660205260409020600201546301000000900462ffffff165b62ffffff169050805f03613b295750613bda565b620186a086820204613b3c8930836150f3565b60175460ff84165f908152600660205260409020546001600160a01b0391821661010090910490911603613b77576012805482019055613bd3565b60ff83165f9081526006602052604090205461deac196101009091046001600160a01b031601613bb057613bab3082613ea5565b613bd3565b60ff83165f908152600660205260409020600301805482019055600f8054820190555b9490940193505b6001016139c2565b508215613bf757600d80548401905592829003925b5050505b611c8f8383836150f3565b600980547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16600160601b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020016118c4565b6008805467ffffff000000000019166501000000000062ffffff841690810291909117909155613ca2575f613cb8565b613cb8600a548262ffffff16620186a091020490565b600c557f00000000000000000000000000000000000000000000000000000000000000006110895760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020016118c4565b60155460ff1615613d24575f80fd5b5f546001600160a01b03838116911614801590613d4957506001600160a01b03821615155b8015613d6057506001600160a01b03821661dead14155b613d68575f80fd5b6016546001600160a01b03838116911614801590613d9457506017546001600160a01b03838116911614155b613de05760405162461bcd60e51b815260206004820152601260248201527f44455820726f75746572206f72207061697200000000000000000000000000006044820152606401610e81565b8015613e4e576001600160a01b0382165f9081526004602052604090205460ff1615613e4e5760405162461bcd60e51b815260206004820152600b60248201527f57686974656c69737465640000000000000000000000000000000000000000006044820152606401610e81565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fcf3473b85df1594d47b6958f29a32bea0abff9dd68296f7bf33443646793cfd89101612dca565b613eaf8282615230565b600854613ec99065010000000000900462ffffff16613c72565b6008805462ffffff60d01b198116600160d01b9182900462ffffff1691820217909155600a54620186a0910204600e55600880547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600160e81b9182900462ffffff1691820217909155600a54620186a0910204601155611921565b60018360ff16118015613f5d575060058263ffffffff16115b613f65575f80fd5b6008805464ff00000000191664010000000060ff861690810291909117909155600980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000063ffffffff8681169182027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b92861692830217909255604080519384526020840192909252908201527f24b1343f86058af6b8e48d5f9ca6b4e206b72690500086e848cc587b2f4097149060600160405180910390a1505050565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600160a01b0383166140b1575f80fd5b6016546001600160a01b0384811691161461431a575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614107573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061412b9190615c33565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561416a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061418e9190615c33565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156141de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142029190615c33565b90506001600160a01b03811661429d576040517fc9c653960000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015614276573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061429a9190615c33565b90505b604080516080810182526001600160a01b03808a1680835293811660208301819052948116928201839052881660609091018190526016805473ffffffffffffffffffffffffffffffffffffffff199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b03838116911614614358576019805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806143d057506001600160a01b03811630145b806143e857506018546001600160a01b038281169116145b806144f25750601654604080517fc45a015500000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801561444e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144729190615c33565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156144c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144e69190615c33565b6001600160a01b031614155b61453e5760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610e81565b601a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008805461ff001981166101001790915560ff1615614e3057808061460c57506011546002601254816145a2576145a2615c1f565b601854601a5492909104916001600160a01b039081169116146145c5575f6145c9565b600f545b011015801561460c5750601254601854601a546001600160a01b039081169116146145f4575f6145f8565b600f545b305f90815260016020526040902054910111155b15614a01575f60026012548161462457614624615c1f565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f8151811061466057614660615b6a565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061469157614691615b6a565b6001600160a01b039283166020918202929092010152601654601854601a546146d3933093811692889282169116146146ca575f611812565b600f5401612dd6565b601654601854601a546001600160a01b039283169263791ac94792879282169116146146ff575f614703565b600f545b015f8430426001016040518663ffffffff1660e01b815260040161472b959493929190615c4e565b5f604051808303815f87803b158015614742575f80fd5b505af1925050508015614753575060015b6147745760165461476f9030906001600160a01b03165f612dd6565b6149fd565b600980546bffffffff000000000000000019166801000000000000000063ffffffff421602179055601254156147c057600260125f828254816147b9576147b9615c1f565b0490915550505b601854601a5447849003917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e149186916001600160a01b03918216911614614807575f61480b565b600f545b60408051929091018252602082018490520160405180910390a180156149fb57601854601a5482916001600160a01b039081169116036148bc5761489f82600f5487101561487657600f548701620186a088028161486b5761486b615c1f565b04620186a091020490565b600f5487810190620186a0028161488f5761488f615c1f565b04620186a003620186a091020490565b600f80546010805490910190555f90556013805482850301905590505b5f851180156148ca57505f81115b156149f9576016546148e79030906001600160a01b031687612dd6565b6016546019546040517ff305d719000000000000000000000000000000000000000000000000000000008152306004820152602481018890525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af19350505050801561498f575060408051601f3d908101601f1916820190925261498c91810190615cbf565b60015b6149b0576016546149ab9030906001600160a01b03165f612dd6565b6149f9565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f601255505b505b505b5050505b8080614a605750601a546001600160a01b03163014801590614a345750601854601a546001600160a01b03908116911614155b8015614a445750601154600f5410155b8015614a605750600f54305f9081526001602052604090205410155b15614e3057601a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015614aab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614acf9190615bb0565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110614b0857614b08615b6a565b6001600160a01b039283166020918202929092010152601854825191169082906001908110614b3957614b39615b6a565b6001600160a01b039283166020918202929092010152601a54825191169082906002908110614b6a57614b6a615b6a565b6001600160a01b039283166020918202929092010152601a54601654600f5460405163095ea7b360e01b81529184166004830152602482015291169063095ea7b3906044016020604051808303815f875af1158015614bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614bef9190615bc7565b50601654600f546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691635c11d79591614c45915f90869030904260010190600401615c4e565b5f604051808303815f87803b158015614c5c575f80fd5b505af1925050508015614c6d575060015b614cec57601a5460165460405163095ea7b360e01b81526001600160a01b0391821660048201525f602482015291169063095ea7b3906044016020604051808303815f875af1158015614cc2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ce69190615bc7565b50614e2d565b601a54600f546040516370a0823160e01b81523060048201527f95725684d8aa29bbc5031270724c91e6e8bee7732f11ee91ed9b3d93929e99e5926001600160a01b0316919082906370a0823190602401602060405180830381865afa158015614d58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d7c9190615bb0565b604080516001600160a01b039094168452602084019290925285039082015260600160405180910390a1600f80546010805490910190555f9055601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614dfc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e209190615bb0565b6014805491840390910190555b50505b506008805461ff0019169055565b6008805463ff0000001916630100000017905580614f7b57601a546001600160a01b031630148015614e975750600f541580614e895750600f54305f90815260016020526040902054105b80614e975750600e54600f54105b61507857601854601a546001600160a01b039081169116148015614ec657506013541580614ec6575047601354105b61507857601a546001600160a01b03163014801590614ef65750601854601a546001600160a01b03908116911614155b8015614f7657506014541580614f765750601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614f4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f719190615bb0565b601454105b615078575b5f805b60058160ff16101561502d5760ff81165f90815260066020526040902080546003909101546101009091046001600160a01b031690801580614fca57506001600160a01b03821661dead145b80614fe257506017546001600160a01b038381169116145b15614fee575050615025565b5f614ff983836152fb565b9050801561501d5760ff84165f908152600660205260409020600301805482900390555b939093019250505b600101614f7e565b506009805463ffffffff191663ffffffff42161790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506008805463ff00000019169055565b600954600160a01b900463ffffffff166150a563ffffffff421690565b6001600160a01b03929092165f90815260056020526040902080546dffffffff0000000000000000000019166a01000000000000000000009290930163ffffffff1691909102919091179055565b6001600160a01b0383161580159061511357506001600160a01b03821615155b61515f5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610e81565b6001600160a01b0383165f908152600160205260409020548111156151b85760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b80156151eb576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e2a91815260200190565b6001600160a01b0382165f908152600160205260409020548111156152895760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b6001600160a01b0382165f818152600160205260409081902080548490039055600a80548490039055600b8054840190555161dead91907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906152ef9085815260200190565b60405180910390a35050565b601a545f90306001600160a01b03909116036153385761531c3084846150f3565b81600f5f82825461532d9190615cfe565b909155506154e09050565b6010545f90615349846103e8615d11565b615354906064615d11565b61535e9190615d28565b601854601a549192505f916001600160a01b0391821691160361541d5750601354620186a08282020490811115615399575f92505050610f74565b5f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f81146153e7576040519150601f19603f3d011682016040523d82523d5f602084013e6153ec565b606091505b5050905080615400575f9350505050610f74565b8160135f8282546154119190615cfe565b909155506154c7915050565b50601454620186a0828202049084111561543b575f92505050610f74565b601a5460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af115801561548b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906154af9190615bc7565b508060145f8282546154c19190615cfe565b90915550505b8360105f8282546154d89190615cfe565b909155505050505b50919050565b60405180608001604052805f6001600160a01b031681526020016155086155b5565b81526020016155156155b5565b81526020015f81525090565b6001830191839082156155a9579160200282015f5b8382111561557857835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302615536565b80156155a75782816101000a81549062ffffff0219169055600301602081600201049283019260010302615578565b505b50611e219291506155d3565b60405180606001604052806003906020820280368337509192915050565b5b80821115611e21575f81556001016155d4565b8015158114611089575f80fd5b5f805f60408486031215615606575f80fd5b833567ffffffffffffffff8082111561561d575f80fd5b818601915086601f830112615630575f80fd5b81358181111561563e575f80fd5b8760208260051b8501011115615652575f80fd5b60209283019550935050840135615668816155e7565b809150509250925092565b5f81518084525f5b818110156156975760208185018101518683018201520161567b565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f611f7b6020830184615673565b6001600160a01b0381168114611089575f80fd5b5f80604083850312156156ed575f80fd5b82356156f8816156c8565b946020939093013593505050565b803560ff81168114615716575f80fd5b919050565b803562ffffff81168114615716575f80fd5b5f82601f83011261573c575f80fd5b6040516060810181811067ffffffffffffffff8211171561576b57634e487b7160e01b5f52604160045260245ffd5b60405280606084018581111561577f575f80fd5b845b818110156157a0576157928161571b565b835260209283019201615781565b509195945050505050565b5f805f8061010085870312156157bf575f80fd5b6157c885615706565b935060208501356157d8816156c8565b92506157e7866040870161572d565b91506157f68660a0870161572d565b905092959194509250565b5f805f60608486031215615813575f80fd5b833561581e816156c8565b9250602084013561582e816156c8565b929592945050506040919091013590565b803563ffffffff81168114615716575f80fd5b5f60208284031215615862575f80fd5b611f7b8261583f565b5f805f806080858703121561587e575f80fd5b8435615889816156c8565b93506020850135615899816156c8565b92506040850135915060608501356158b0816155e7565b939692955090935050565b5f602082840312156158cb575f80fd5b611f7b8261571b565b5f602082840312156158e4575f80fd5b8135611f7b816155e7565b60c081525f61590160c0830189615673565b82810360208401526159138189615673565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a08401526159458185615673565b9998505050505050505050565b5f60208284031215615962575f80fd5b8135611f7b816156c8565b5f806040838503121561597e575f80fd5b8235615989816156c8565b91506020830135615999816155e7565b809150509250929050565b5f602082840312156159b4575f80fd5b5035919050565b5f805f606084860312156159cd575f80fd5b6159d684615706565b92506159e46020850161583f565b91506159f26040850161583f565b90509250925092565b805f5b6003811015610fe557815162ffffff168452602093840193909101906001016159fe565b602080825282518282018190525f919060409081850190868401855b82811015615a945781516001600160a01b03815116855286810151615a65888701826159fb565b5085810151615a7760808701826159fb565b506060015160e08501526101009093019290850190600101615a3e565b5091979650505050505050565b5f8060408385031215615ab2575f80fd5b8235615abd816156c8565b91506020830135615999816156c8565b5f805f60608486031215615adf575f80fd5b8335615aea816156c8565b9250602084013591506040840135615668816155e7565b5f805f805f805f60e0888a031215615b17575f80fd5b8735615b22816156c8565b96506020880135615b32816156c8565b95506040880135945060608801359350615b4e60808901615706565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680615b9257607f821691505b6020821081036154e057634e487b7160e01b5f52602260045260245ffd5b5f60208284031215615bc0575f80fd5b5051919050565b5f60208284031215615bd7575f80fd5b8151611f7b816155e7565b60ff851681526001600160a01b03841660208201526101008101615c0960408301856159fb565b615c1660a08301846159fb565b95945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215615c43575f80fd5b8151611f7b816156c8565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015615c9e5784516001600160a01b031683529383019391830191600101615c79565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215615cd1575f80fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610f7457610f74615cea565b8082028115828204841417610f7457610f74615cea565b5f82615d4257634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220c8c510338c1de931de9cbc766dd1d513e8dd67cbb8551f9f3e2dced660d1cc4164736f6c63430008170033

Deployed Bytecode

0x608060405260043610610486575f3560e01c8063715018a611610251578063a6cbe5c111610148578063d505accf116100c9578063f2fde38b11610083578063f4db96981161006b578063f4db969814610dca578063f59c370814610de7578063fe575a8714610e0657005b8063f2fde38b14610d6f578063f3dc4f4814610d8e57005b8063d89135cd116100b1578063d89135cd14610d03578063dd62ed3e14610d17578063e2745ef214610d5b57005b8063d505accf14610cd0578063d8454a8214610cef57005b8063c78fe0d41161011a578063cc1776d311610102578063cc1776d314610c27578063d1ace71014610c3b578063d232c22014610c5a57005b8063c78fe0d414610bf4578063c997eb8d14610c0857005b8063a6cbe5c114610b6e578063a9059cbb14610ba2578063be5e49b214610bc1578063c77e006d14610be057005b80638d8350ca116101d257806396ce0795116101a4578063a457c2d71161018c578063a457c2d714610b11578063a4d8971a14610b30578063a5596b4f14610b4f57005b806396ce079514610ade5780639caf0c2514610af257005b80638d8350ca14610a705780638da5cb5b14610a8f57806395101f9014610aab57806395d89b4114610aca57005b80637b1ab0d2116102235780637ecebe001161020b5780637ecebe0014610a145780638324c3b914610a485780638bf1acff14610a5c57005b80637b1ab0d2146109d65780637b1ad1d7146109f557005b8063715018a61461096d57806375de14961461098157806379b3d411146109a357806379cc6790146109b757005b80633644e5151161037d5780634f7041a5116102fe5780635f641758116102b85780636d5c1490116102a05780636d5c1490146108f95780636f05be971461091857806370a082311461093957005b80635f641758146108bb5780636bdb5ad1146108da57005b806354fd4d50116102e657806354fd4d501461085b5780635bbb7a51146108885780635f189361146108a757005b80634f7041a51461082a5780635117cdee1461083e57005b8063395093511161034f5780633ed8a169116103375780633ed8a169146107cd578063404e5129146107ec57806342966c681461080b57005b806339509351146107775780633af32abf1461079657005b80633644e5151461070a578063370158ea1461071e578063379ba1d91461074457806339137f8b1461076357005b8063186488a811610407578063313ce567116103d957806333d48a7d116103c157806333d48a7d146106b4578063351a964d146106d457806335ed71a8146106eb57005b8063313ce56714610658578063326339671461069557005b8063186488a8146105dc57806323b872dd146105fb5780632984207a1461061a5780632add44041461063957005b806307e9652c11610458578063095ea7b311610440578063095ea7b3146105825780630ac769dc146105a157806318160ddd146105be57005b806307e9652c14610534578063095233081461055157005b806301b38af51461048f5780630588b1a5146104ae578063064a59d0146104e357806306fdde031461051357005b3661048d57005b005b34801561049a575f80fd5b5061048d6104a93660046155f4565b610e3d565b3480156104b9575f80fd5b50600854600160d01b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b3480156104ee575f80fd5b50600954640100000000900463ffffffff1615155b60405190151581526020016104da565b34801561051e575f80fd5b50610527610ed4565b6040516104da91906156b6565b34801561053f575f80fd5b5060085462010000900460ff16610503565b34801561055c575f80fd5b506016546001600160a01b03165b6040516001600160a01b0390911681526020016104da565b34801561058d575f80fd5b5061050361059c3660046156dc565b610f64565b3480156105ac575f80fd5b50601a546001600160a01b031661056a565b3480156105c9575f80fd5b50600a545b6040519081526020016104da565b3480156105e7575f80fd5b5061048d6105f63660046157ab565b610f7a565b348015610606575f80fd5b50610503610615366004615801565b610feb565b348015610625575f80fd5b5061048d610634366004615852565b61100c565b348015610644575f80fd5b5061048d61065336600461586b565b61108c565b348015610663575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016104da565b3480156106a0575f80fd5b5061048d6106af3660046158bb565b611388565b3480156106bf575f80fd5b50600854600160e81b900462ffffff166104ca565b3480156106df575f80fd5b5060085460ff16610503565b3480156106f6575f80fd5b5061048d6107053660046158d4565b61146e565b348015610715575f80fd5b50601d546105ce565b348015610729575f80fd5b50610732611544565b6040516104da969594939291906158ef565b34801561074f575f80fd5b5061048d61075e3660046158d4565b6116cd565b34801561076e575f80fd5b5061048d611763565b348015610782575f80fd5b506105036107913660046156dc565b6117e4565b3480156107a1575f80fd5b506105036107b0366004615952565b6001600160a01b03165f9081526004602052604090205460ff1690565b3480156107d8575f80fd5b5061048d6107e73660046158bb565b611818565b3480156107f7575f80fd5b5061048d61080636600461596d565b6118cf565b348015610816575f80fd5b5061048d6108253660046159a4565b611925565b348015610835575f80fd5b506104ca61192f565b348015610849575f80fd5b506017546001600160a01b031661056a565b348015610866575f80fd5b506040805180820190915260058152640312e302e360dc1b6020820152610527565b348015610893575f80fd5b5061048d6108a2366004615952565b61193e565b3480156108b2575f80fd5b5061048d6119c8565b3480156108c6575f80fd5b506104ca6108d5366004615952565b611a47565b3480156108e5575f80fd5b5061048d6108f43660046158bb565b611b2a565b348015610904575f80fd5b5061048d6109133660046159bb565b611c27565b348015610923575f80fd5b5061092c611c94565b6040516104da9190615a22565b348015610944575f80fd5b506105ce610953366004615952565b6001600160a01b03165f9081526001602052604090205490565b348015610978575f80fd5b5061048d611e25565b34801561098c575f80fd5b5060085465010000000000900462ffffff166104ca565b3480156109ae575f80fd5b5061048d611e78565b3480156109c2575f80fd5b5061048d6109d13660046156dc565b611efb565b3480156109e1575f80fd5b5061056a6109f0366004615aa1565b611f10565b348015610a00575f80fd5b5061048d610a0f366004615952565b611f82565b348015610a1f575f80fd5b506105ce610a2e366004615952565b6001600160a01b03165f908152601e602052604090205490565b348015610a53575f80fd5b5061048d611feb565b348015610a67575f80fd5b506104ca612072565b348015610a7b575f80fd5b506104ca610a8a366004615952565b612078565b348015610a9a575f80fd5b505f546001600160a01b031661056a565b348015610ab6575f80fd5b506104ca610ac5366004615952565b612141565b348015610ad5575f80fd5b5061052761220d565b348015610ae9575f80fd5b506103e86104ca565b348015610afd575f80fd5b5061048d610b0c366004615acd565b61221c565b348015610b1c575f80fd5b50610503610b2b3660046156dc565b6123e4565b348015610b3b575f80fd5b5061048d610b4a3660046158d4565b612464565b348015610b5a575f80fd5b5061048d610b693660046158d4565b6124ed565b348015610b79575f80fd5b50610b8d610b88366004615952565b612568565b60405163ffffffff90911681526020016104da565b348015610bad575f80fd5b50610503610bbc3660046156dc565b612616565b348015610bcc575f80fd5b5061048d610bdb366004615952565b612622565b348015610beb575f80fd5b5061048d6126a2565b348015610bff575f80fd5b5061048d612727565b348015610c13575f80fd5b5061048d610c223660046155f4565b6127b0565b348015610c32575f80fd5b506104ca61283b565b348015610c46575f80fd5b5061048d610c553660046158d4565b612845565b348015610c65575f80fd5b506015546040805160ff80841615158252610100840481161515602083015262010000840481161515928201929092526301000000830482161515606082015264010000000083048216151560808201526501000000000090920416151560a082015260c0016104da565b348015610cdb575f80fd5b5061048d610cea366004615b01565b6128c0565b348015610cfa575f80fd5b50600d546105ce565b348015610d0e575f80fd5b50600b546105ce565b348015610d22575f80fd5b506105ce610d31366004615aa1565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610d66575f80fd5b5061048d612adb565b348015610d7a575f80fd5b5061048d610d89366004615952565b612b8d565b348015610d99575f80fd5b50610503610da8366004615952565b6001600160a01b03165f90815260056020526040902054610100900460ff1690565b348015610dd5575f80fd5b506019546001600160a01b031661056a565b348015610df2575f80fd5b5061048d610e0136600461596d565b612bf0565b348015610e11575f80fd5b50610503610e20366004615952565b6001600160a01b03165f9081526003602052604090205460ff1690565b5f546001600160a01b03163314610e8a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610ecd57610ec5858583818110610eaa57610eaa615b6a565b9050602002016020810190610ebf9190615952565b84612c3e565b600101610e8d565b5050505050565b6060601b8054610ee390615b7e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f90615b7e565b8015610f5a5780601f10610f3157610100808354040283529160200191610f5a565b820191905f5260205f20905b815481529060010190602001808311610f3d57829003601f168201915b5050505050905090565b5f610f70338484612dd6565b5060015b92915050565b5f546001600160a01b03163314610fc25760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff1615610fd9575f80fd5b610fe584848484612e37565b50505050565b5f610ff7843384613358565b6110028484846133da565b5060019392505050565b5f546001600160a01b031633146110545760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff161561106b575f80fd5b62093a808163ffffffff161115611080575f80fd5b61108981613c06565b50565b5f546001600160a01b031633146110d45760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015611118573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113c9190615bb0565b90505f6001600160a01b038616301461117257601a546001600160a01b0387811691161461116a575f61117a565b60145461117a565b601254600f54015b90508215801561119b575083828210156111945781611196565b825b830310155b806111ae57508280156111ae5750838210155b6111ec5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b82801561121857506001600160a01b0386163014806112185750601a546001600160a01b038781169116145b80156112345750838282101561122e5781611230565b825b8303105b15611316576008546301000000900460ff1615801561125b5750600854610100900460ff16155b611263575f80fd5b306001600160a01b038716036112de575f600f548510156112885784600f540361128c565b600f545b600f805482900390559182900391905084838310156112ab57826112ad565b835b840310156112d8576012548510156112c95784601254036112cd565b6012545b601280549190910390555b50611316565b601a546001600160a01b038088169116036113165760145484101561130757836014540361130b565b6014545b601480549190910390555b505060405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044016020604051808303815f875af1158015611364573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ecd9190615bc7565b5f546001600160a01b031633146113d05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff16156113e7575f80fd5b60018162ffffff161015801561140457506103e88162ffffff1611155b61143f5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610e81565b6008805462ffffff60d01b1916600160d01b62ffffff93909316928302179055600a54620186a0910204600e55565b5f546001600160a01b031633146114b65760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff16156114ce575f80fd5b8015806114e557506016546001600160a01b031615155b6115315760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610e81565b6008805460ff1916911515919091179055565b6060805f805f6060601b601c7f00000000000000000000000000000000000000000000000000000000000000125f8054906101000a90046001600160a01b0316600a54604051806040016040528060058152602001640312e302e360dc1b8152508580546115b190615b7e565b80601f01602080910402602001604051908101604052809291908181526020018280546115dd90615b7e565b80156116285780601f106115ff57610100808354040283529160200191611628565b820191905f5260205f20905b81548152906001019060200180831161160b57829003601f168201915b5050505050955084805461163b90615b7e565b80601f016020809104026020016040519081016040528092919081815260200182805461166790615b7e565b80156116b25780601f10611689576101008083540402835291602001916116b2565b820191905f5260205f20905b81548152906001019060200180831161169557829003601f168201915b50505050509450955095509550955095509550909192939495565b5f546001600160a01b031633146117155760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff161561172d575f80fd5b80611738575f611740565b4263ffffffff165b600960046101000a81548163ffffffff021916908363ffffffff16021790555050565b5f546001600160a01b031633146117ab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805461ff0019166101001790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610f7091859085905b01612dd6565b5f546001600160a01b031633146118605760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015546301000000900460ff1615611876575f80fd5b620186a062ffffff8216111561188a575f80fd5b61189381613c72565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b5f546001600160a01b031633146119175760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6119218282613d15565b5050565b6110893382613ea5565b5f61193933612141565b905090565b5f546001600160a01b031633146119865760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155462010000900460ff161561199b575f80fd5b6001600160a01b03165f90815260056020526040902080546dffffffffffffffffffffffff000019169055565b5f546001600160a01b03163314611a105760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805460ff191660011790556040517f3d35f028b9917dcf52b6fdf73b387c4fde5ce548ad8d75bce334c2db07427bfe905f90a1565b5f6001600160a01b038216301480611a7657506001600160a01b0382165f9081526004602052604090205460ff165b80611a8e57506017546001600160a01b038381169116145b80611aa657506016546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff1680611af7575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b611b0f57600854600160701b900462ffffff16610f74565b600854600160b81b900462ffffff16610f74565b5f92915050565b5f546001600160a01b03163314611b725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611b8a575f80fd5b60018162ffffff1610158015611ba757506103e88162ffffff1611155b611be25760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610e81565b600880547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b62ffffff93909316928302179055600a54620186a0910204601155565b5f546001600160a01b03163314611c6f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155462010000900460ff1615611c84575f80fd5b611c8f838383613f44565b505050565b60408051600580825260c08201909252606091816020015b611cb46154e6565b815260200190600190039081611cac5790505090505f5b60058160ff161015611e21576040805160808101825260ff83165f81815260066020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611d28579050505050918352505060ff83165f9081526006602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611d9c5750505092845250505060ff83165f8181526006602090815260409091206003015492019190915283518491908110611e0e57611e0e615b6a565b6020908102919091010152600101611ccb565b5090565b5f546001600160a01b03163314611e6d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b611e765f614042565b565b5f546001600160a01b03163314611ec05760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805462ff00001916620100001790556040517ffd61f9d9e981b264f65f693615b347d7c5addcab978b82e81ae866b25155e426905f90a1565b611f06823383613358565b6119218282613ea5565b5f80546001600160a01b03163314611f595760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611f71575f80fd5b611f7b838361409e565b9392505050565b5f546001600160a01b03163314611fca5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60155465010000000000900460ff1615611fe2575f80fd5b611089816143b2565b5f546001600160a01b031633146120335760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805464ff0000000019166401000000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f611939335b5f6001600160a01b0382163014806120a757506001600160a01b0382165f9081526004602052604090205460ff165b806120bf57506017546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff1680612110575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b61212d5760085468010000000000000000900462ffffff16610f74565b600854600160881b900462ffffff16610f74565b5f6001600160a01b03821630148061217057506001600160a01b0382165f9081526004602052604090205460ff165b8061218857506017546001600160a01b038381169116145b611b23576001600160a01b0382165f90815260056020526040902054610100900460ff16806121d9575060095463ffffffff428116600160601b830482166401000000009093048216929092011610155b6121f9576008546b010000000000000000000000900462ffffff16610f74565b600854600160a01b900462ffffff16610f74565b6060601c8054610ee390615b7e565b5f546001600160a01b031633146122645760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601854601a5447915f916001600160a01b03908116911614612286575f61228a565b6013545b9050821580156122ab575083828210156122a457816122a6565b825b830310155b806122be57508280156122be5750838210155b6122fc5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b8280156123195750601854601a546001600160a01b039081169116145b80156123355750838282101561232f5781612331565b825b8303105b15612387576008546301000000900460ff1615801561235c5750600854610100900460ff16155b612364575f80fd5b60135484101561237857836013540361237c565b6013545b601380549190910390555b50505f836001600160a01b0316836040515f6040518083038185875af1925050503d805f81146123d2576040519150601f19603f3d011682016040523d82523d5f602084013e6123d7565b606091505b5050905080610fe5575f80fd5b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156124575760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610e81565b6110023385858403612dd6565b5f546001600160a01b031633146124ac5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60085460ff1680156124c65750600854610100900460ff16155b80156124dc57506008546301000000900460ff16155b6124e4575f80fd5b6110898161456d565b5f546001600160a01b031633146125355760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff161561254c575f80fd5b60088054911515620100000262ff000019909216919091179055565b6009545f90600160a01b900463ffffffff16158061259e57506001600160a01b0382165f9081526005602052604090205460ff16155b806125d657506001600160a01b0382165f9081526005602052604090205463ffffffff4281166a010000000000000000000090920416105b156125e257505f919050565b506001600160a01b03165f9081526005602052604090205463ffffffff4281166a0100000000000000000000909204160390565b5f610f703384846133da565b5f546001600160a01b0316331461266a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b601554640100000000900460ff1615612681575f80fd5b6001600160a01b03165f908152600560205260409020805461ff0019169055565b5f546001600160a01b031633146126ea5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805463ff000000191663010000001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b5f546001600160a01b0316331461276f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6015805465ff00000000001916650100000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f546001600160a01b031633146127f85760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b815f5b81811015610ecd5761283385858381811061281857612818615b6a565b905060200201602081019061282d9190615952565b84613d15565b6001016127fb565b5f61193933611a47565b5f546001600160a01b0316331461288d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b600854610100900460ff161580156128af57506008546301000000900460ff16155b6128b7575f80fd5b61108981614e3e565b428410156129105760405162461bcd60e51b815260206004820152601160248201527f45787069726564207369676e61747572650000000000000000000000000000006044820152606401610e81565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015612a43573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590612a795750886001600160a01b0316816001600160a01b0316145b612ac55760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610e81565b5050612ad2878787612dd6565b50505050505050565b5f546001600160a01b03163314612b235760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b60085460ff168015612b3d5750600854610100900460ff16155b612b45575f80fd5b601254600f54305f908152600160205260409020549101908110612b67575f80fd5b305f908152600160205260408120546012805493909103909201909155611e769061456d565b5f546001600160a01b03163314612bd55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b6001600160a01b038116612be7575f80fd5b61108981614042565b5f546001600160a01b03163314612c385760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610e81565b61192182825b601554610100900460ff1615612c52575f80fd5b6001600160a01b03821615801590612c7557506001600160a01b03821661dead14155b612c7d575f80fd5b6016546001600160a01b03838116911614801590612ca957506017546001600160a01b03838116911614155b612d1b5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c656760448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610e81565b8015612d77576001600160a01b0382165f9081526003602052604090205460ff1615612d775760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610e81565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f2644091015b60405180910390a25050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1610612e46575f80fd5b6001600160a01b0383163014801590612e6757506001600160a01b03831615155b612e6f575f80fd5b60ff84165f9081526006602052604090206001600160a01b03841661dead148015612e9b5750805460ff165b8015612eaa57505f8160030154115b15612ef75760405162461bcd60e51b815260206004820152600f60248201527f556e636c61696d656420746178657300000000000000000000000000000000006044820152606401610e81565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03861602178155612f3b60018201846003615521565b50612f4b60028201836003615521565b50805460ff16612f5b575f612f66565b600181015462ffffff165b8351600880546affffff000000000000000019811693909203680100000000000000009283900462ffffff9081169190910116909102919091179055805460ff16612fb1575f612fc3565b60018101546301000000900462ffffff165b6020840151600880546dffffff0000000000000000000000198116939092036b0100000000000000000000009283900462ffffff9081169190910116909102919091179055805460ff16613017575f61302c565b60018101546601000000000000900462ffffff165b6040840151600880547fffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff811693909203600160701b9283900462ffffff9081169190910116909102919091179055805460ff16613089575f613094565b600281015462ffffff165b8251600880547fffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff811693909203600160881b9283900462ffffff9081169190910116909102919091179055805460ff166130ee575f613100565b60028101546301000000900462ffffff165b6020830151600880547fffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff811693909203600160a01b9283900462ffffff9081169190910116909102919091179055805460ff1661315d575f613172565b60028101546601000000000000900462ffffff165b6040830151600880547fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff811693909203600160b81b9283900462ffffff90811691909101811690920292909217918290556161a86801000000000000000090920416118015906131fb57506008546161a86b01000000000000000000000090910462ffffff1611155b801561321857506008546161a8600160701b90910462ffffff1611155b6132645760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610e81565b60085461c350600160881b90910462ffffff1611801590613296575060085461c350600160a01b90910462ffffff1611155b80156132b3575060085461c350600160b81b90910462ffffff1611155b6132ff5760405162461bcd60e51b815260206004820152600c60248201527f486967682050656e616c747900000000000000000000000000000000000000006044820152606401610e81565b805460ff1661331457805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a858585856040516133499493929190615be2565b60405180910390a15050505050565b6001600160a01b038381165f90815260026020908152604080832093861683529290522054818110156133cd5760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610e81565b610fe58484848403612dd6565b6001600160a01b0383165f9081526003602052604090205460ff1615801561341a57506001600160a01b0382165f9081526003602052604090205460ff16155b6134545760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610e81565b61deac196001600160a01b0383160161346b575f80fd5b6008546301000000900460ff1615801561348d5750600854610100900460ff16155b80156134c057506017546001600160a01b038481169116148015906134c057506016546001600160a01b03848116911614155b156134d7576134ce5f61456d565b6134d75f614e3e565b5f811180156134fe57506001600160a01b0383165f9081526004602052604090205460ff16155b801561352257506001600160a01b0382165f9081526004602052604090205460ff16155b801561353757506001600160a01b0383163014155b801561354c57506001600160a01b0382163014155b801561356657506016546001600160a01b03838116911614155b15613bfb576017546001600160a01b0384811691161480159061359757506017546001600160a01b03838116911614155b806135e157506017546001600160a01b03848116911614806135c657506017546001600160a01b038381169116145b80156135e15750600954640100000000900463ffffffff1615155b61362d5760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610e81565b600954600160a01b900463ffffffff161580159061365957506017546001600160a01b03848116911614155b156137e85761366783612568565b63ffffffff16156136ba5760405162461bcd60e51b815260206004820152600860248201527f436f6f6c646f776e0000000000000000000000000000000000000000000000006044820152606401610e81565b4263ffffffff166009546001600160a01b0385165f9081526005602052604090205463ffffffff92831670010000000000000000000000000000000090920483166601000000000000909104831601909116101561378d576001600160a01b0383165f908152600560205260409020805465ffffffff000019166201000017905561374863ffffffff421690565b6001600160a01b0384165f908152600560205260409020805463ffffffff9290921666010000000000000269ffffffff000000000000199092169190911790556137e8565b6008546001600160a01b0384165f908152600560205260409020805465ffffffff0000198116620100009182900463ffffffff908116600101169182021790915564010000000090910460ff16116137e8576137e883615088565b600c5415806137ff57506001600160a01b03821630145b8061382e57506017546001600160a01b038381169116148061382e57506016546001600160a01b038381169116145b806138545750600c546001600160a01b0383165f90815260016020526040902054820111155b6138a05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610e81565b60085462010000900460ff161580156138c357506008546301000000900460ff16155b80156138d75750600854610100900460ff16155b15613bfb576017545f9081906001600160a01b038681169116148061390957506017546001600160a01b038581169116145b15613930576017546001600160a01b0386811691161461392a57600261392d565b60015b90505b5f8160ff166001146139425785613944565b845b60095490915063ffffffff428116600160601b83048216640100000000909304821692909201161080159061399657506001600160a01b0381165f90815260056020526040902054610100900460ff16155b156139c0576001600160a01b0381165f908152600560205260409020805461ff0019166101001790555b5f5b60058160ff161015613be2575f808460ff1611613a4d576001600160a01b0383165f90815260056020526040902054610100900460ff16613a335760ff82165f908152600660205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613b15565b60ff82165f90815260066020526040812060020190613a13565b8360ff16600114613ab3576001600160a01b0383165f90815260056020526040902054610100900460ff16613a975760ff82165f9081526006602052604090206001016002613a13565b60ff82165f908152600660205260409020600290810190613a13565b6001600160a01b0383165f90815260056020526040902054610100900460ff16613af35760ff82165f908152600660205260409020600190810190613a13565b60ff82165f908152600660205260409020600201546301000000900462ffffff165b62ffffff169050805f03613b295750613bda565b620186a086820204613b3c8930836150f3565b60175460ff84165f908152600660205260409020546001600160a01b0391821661010090910490911603613b77576012805482019055613bd3565b60ff83165f9081526006602052604090205461deac196101009091046001600160a01b031601613bb057613bab3082613ea5565b613bd3565b60ff83165f908152600660205260409020600301805482019055600f8054820190555b9490940193505b6001016139c2565b508215613bf757600d80548401905592829003925b5050505b611c8f8383836150f3565b600980547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16600160601b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020016118c4565b6008805467ffffff000000000019166501000000000062ffffff841690810291909117909155613ca2575f613cb8565b613cb8600a548262ffffff16620186a091020490565b600c557f00000000000000000000000000000000000000000000000000000000000000016110895760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020016118c4565b60155460ff1615613d24575f80fd5b5f546001600160a01b03838116911614801590613d4957506001600160a01b03821615155b8015613d6057506001600160a01b03821661dead14155b613d68575f80fd5b6016546001600160a01b03838116911614801590613d9457506017546001600160a01b03838116911614155b613de05760405162461bcd60e51b815260206004820152601260248201527f44455820726f75746572206f72207061697200000000000000000000000000006044820152606401610e81565b8015613e4e576001600160a01b0382165f9081526004602052604090205460ff1615613e4e5760405162461bcd60e51b815260206004820152600b60248201527f57686974656c69737465640000000000000000000000000000000000000000006044820152606401610e81565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fcf3473b85df1594d47b6958f29a32bea0abff9dd68296f7bf33443646793cfd89101612dca565b613eaf8282615230565b600854613ec99065010000000000900462ffffff16613c72565b6008805462ffffff60d01b198116600160d01b9182900462ffffff1691820217909155600a54620186a0910204600e55600880547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600160e81b9182900462ffffff1691820217909155600a54620186a0910204601155611921565b60018360ff16118015613f5d575060058263ffffffff16115b613f65575f80fd5b6008805464ff00000000191664010000000060ff861690810291909117909155600980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000063ffffffff8681169182027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1692909217600160a01b92861692830217909255604080519384526020840192909252908201527f24b1343f86058af6b8e48d5f9ca6b4e206b72690500086e848cc587b2f4097149060600160405180910390a1505050565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600160a01b0383166140b1575f80fd5b6016546001600160a01b0384811691161461431a575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614107573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061412b9190615c33565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561416a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061418e9190615c33565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156141de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142029190615c33565b90506001600160a01b03811661429d576040517fc9c653960000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015614276573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061429a9190615c33565b90505b604080516080810182526001600160a01b03808a1680835293811660208301819052948116928201839052881660609091018190526016805473ffffffffffffffffffffffffffffffffffffffff199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b03838116911614614358576019805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806143d057506001600160a01b03811630145b806143e857506018546001600160a01b038281169116145b806144f25750601654604080517fc45a015500000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801561444e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144729190615c33565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156144c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144e69190615c33565b6001600160a01b031614155b61453e5760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610e81565b601a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008805461ff001981166101001790915560ff1615614e3057808061460c57506011546002601254816145a2576145a2615c1f565b601854601a5492909104916001600160a01b039081169116146145c5575f6145c9565b600f545b011015801561460c5750601254601854601a546001600160a01b039081169116146145f4575f6145f8565b600f545b305f90815260016020526040902054910111155b15614a01575f60026012548161462457614624615c1f565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f8151811061466057614660615b6a565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061469157614691615b6a565b6001600160a01b039283166020918202929092010152601654601854601a546146d3933093811692889282169116146146ca575f611812565b600f5401612dd6565b601654601854601a546001600160a01b039283169263791ac94792879282169116146146ff575f614703565b600f545b015f8430426001016040518663ffffffff1660e01b815260040161472b959493929190615c4e565b5f604051808303815f87803b158015614742575f80fd5b505af1925050508015614753575060015b6147745760165461476f9030906001600160a01b03165f612dd6565b6149fd565b600980546bffffffff000000000000000019166801000000000000000063ffffffff421602179055601254156147c057600260125f828254816147b9576147b9615c1f565b0490915550505b601854601a5447849003917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e149186916001600160a01b03918216911614614807575f61480b565b600f545b60408051929091018252602082018490520160405180910390a180156149fb57601854601a5482916001600160a01b039081169116036148bc5761489f82600f5487101561487657600f548701620186a088028161486b5761486b615c1f565b04620186a091020490565b600f5487810190620186a0028161488f5761488f615c1f565b04620186a003620186a091020490565b600f80546010805490910190555f90556013805482850301905590505b5f851180156148ca57505f81115b156149f9576016546148e79030906001600160a01b031687612dd6565b6016546019546040517ff305d719000000000000000000000000000000000000000000000000000000008152306004820152602481018890525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af19350505050801561498f575060408051601f3d908101601f1916820190925261498c91810190615cbf565b60015b6149b0576016546149ab9030906001600160a01b03165f612dd6565b6149f9565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f601255505b505b505b5050505b8080614a605750601a546001600160a01b03163014801590614a345750601854601a546001600160a01b03908116911614155b8015614a445750601154600f5410155b8015614a605750600f54305f9081526001602052604090205410155b15614e3057601a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015614aab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614acf9190615bb0565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110614b0857614b08615b6a565b6001600160a01b039283166020918202929092010152601854825191169082906001908110614b3957614b39615b6a565b6001600160a01b039283166020918202929092010152601a54825191169082906002908110614b6a57614b6a615b6a565b6001600160a01b039283166020918202929092010152601a54601654600f5460405163095ea7b360e01b81529184166004830152602482015291169063095ea7b3906044016020604051808303815f875af1158015614bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614bef9190615bc7565b50601654600f546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691635c11d79591614c45915f90869030904260010190600401615c4e565b5f604051808303815f87803b158015614c5c575f80fd5b505af1925050508015614c6d575060015b614cec57601a5460165460405163095ea7b360e01b81526001600160a01b0391821660048201525f602482015291169063095ea7b3906044016020604051808303815f875af1158015614cc2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ce69190615bc7565b50614e2d565b601a54600f546040516370a0823160e01b81523060048201527f95725684d8aa29bbc5031270724c91e6e8bee7732f11ee91ed9b3d93929e99e5926001600160a01b0316919082906370a0823190602401602060405180830381865afa158015614d58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d7c9190615bb0565b604080516001600160a01b039094168452602084019290925285039082015260600160405180910390a1600f80546010805490910190555f9055601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614dfc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e209190615bb0565b6014805491840390910190555b50505b506008805461ff0019169055565b6008805463ff0000001916630100000017905580614f7b57601a546001600160a01b031630148015614e975750600f541580614e895750600f54305f90815260016020526040902054105b80614e975750600e54600f54105b61507857601854601a546001600160a01b039081169116148015614ec657506013541580614ec6575047601354105b61507857601a546001600160a01b03163014801590614ef65750601854601a546001600160a01b03908116911614155b8015614f7657506014541580614f765750601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614f4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f719190615bb0565b601454105b615078575b5f805b60058160ff16101561502d5760ff81165f90815260066020526040902080546003909101546101009091046001600160a01b031690801580614fca57506001600160a01b03821661dead145b80614fe257506017546001600160a01b038381169116145b15614fee575050615025565b5f614ff983836152fb565b9050801561501d5760ff84165f908152600660205260409020600301805482900390555b939093019250505b600101614f7e565b506009805463ffffffff191663ffffffff42161790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506008805463ff00000019169055565b600954600160a01b900463ffffffff166150a563ffffffff421690565b6001600160a01b03929092165f90815260056020526040902080546dffffffff0000000000000000000019166a01000000000000000000009290930163ffffffff1691909102919091179055565b6001600160a01b0383161580159061511357506001600160a01b03821615155b61515f5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610e81565b6001600160a01b0383165f908152600160205260409020548111156151b85760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b80156151eb576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e2a91815260200190565b6001600160a01b0382165f908152600160205260409020548111156152895760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610e81565b6001600160a01b0382165f818152600160205260409081902080548490039055600a80548490039055600b8054840190555161dead91907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906152ef9085815260200190565b60405180910390a35050565b601a545f90306001600160a01b03909116036153385761531c3084846150f3565b81600f5f82825461532d9190615cfe565b909155506154e09050565b6010545f90615349846103e8615d11565b615354906064615d11565b61535e9190615d28565b601854601a549192505f916001600160a01b0391821691160361541d5750601354620186a08282020490811115615399575f92505050610f74565b5f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f81146153e7576040519150601f19603f3d011682016040523d82523d5f602084013e6153ec565b606091505b5050905080615400575f9350505050610f74565b8160135f8282546154119190615cfe565b909155506154c7915050565b50601454620186a0828202049084111561543b575f92505050610f74565b601a5460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af115801561548b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906154af9190615bc7565b508060145f8282546154c19190615cfe565b90915550505b8360105f8282546154d89190615cfe565b909155505050505b50919050565b60405180608001604052805f6001600160a01b031681526020016155086155b5565b81526020016155156155b5565b81526020015f81525090565b6001830191839082156155a9579160200282015f5b8382111561557857835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302615536565b80156155a75782816101000a81549062ffffff0219169055600301602081600201049283019260010302615578565b505b50611e219291506155d3565b60405180606001604052806003906020820280368337509192915050565b5b80821115611e21575f81556001016155d4565b8015158114611089575f80fd5b5f805f60408486031215615606575f80fd5b833567ffffffffffffffff8082111561561d575f80fd5b818601915086601f830112615630575f80fd5b81358181111561563e575f80fd5b8760208260051b8501011115615652575f80fd5b60209283019550935050840135615668816155e7565b809150509250925092565b5f81518084525f5b818110156156975760208185018101518683018201520161567b565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f611f7b6020830184615673565b6001600160a01b0381168114611089575f80fd5b5f80604083850312156156ed575f80fd5b82356156f8816156c8565b946020939093013593505050565b803560ff81168114615716575f80fd5b919050565b803562ffffff81168114615716575f80fd5b5f82601f83011261573c575f80fd5b6040516060810181811067ffffffffffffffff8211171561576b57634e487b7160e01b5f52604160045260245ffd5b60405280606084018581111561577f575f80fd5b845b818110156157a0576157928161571b565b835260209283019201615781565b509195945050505050565b5f805f8061010085870312156157bf575f80fd5b6157c885615706565b935060208501356157d8816156c8565b92506157e7866040870161572d565b91506157f68660a0870161572d565b905092959194509250565b5f805f60608486031215615813575f80fd5b833561581e816156c8565b9250602084013561582e816156c8565b929592945050506040919091013590565b803563ffffffff81168114615716575f80fd5b5f60208284031215615862575f80fd5b611f7b8261583f565b5f805f806080858703121561587e575f80fd5b8435615889816156c8565b93506020850135615899816156c8565b92506040850135915060608501356158b0816155e7565b939692955090935050565b5f602082840312156158cb575f80fd5b611f7b8261571b565b5f602082840312156158e4575f80fd5b8135611f7b816155e7565b60c081525f61590160c0830189615673565b82810360208401526159138189615673565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a08401526159458185615673565b9998505050505050505050565b5f60208284031215615962575f80fd5b8135611f7b816156c8565b5f806040838503121561597e575f80fd5b8235615989816156c8565b91506020830135615999816155e7565b809150509250929050565b5f602082840312156159b4575f80fd5b5035919050565b5f805f606084860312156159cd575f80fd5b6159d684615706565b92506159e46020850161583f565b91506159f26040850161583f565b90509250925092565b805f5b6003811015610fe557815162ffffff168452602093840193909101906001016159fe565b602080825282518282018190525f919060409081850190868401855b82811015615a945781516001600160a01b03815116855286810151615a65888701826159fb565b5085810151615a7760808701826159fb565b506060015160e08501526101009093019290850190600101615a3e565b5091979650505050505050565b5f8060408385031215615ab2575f80fd5b8235615abd816156c8565b91506020830135615999816156c8565b5f805f60608486031215615adf575f80fd5b8335615aea816156c8565b9250602084013591506040840135615668816155e7565b5f805f805f805f60e0888a031215615b17575f80fd5b8735615b22816156c8565b96506020880135615b32816156c8565b95506040880135945060608801359350615b4e60808901615706565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680615b9257607f821691505b6020821081036154e057634e487b7160e01b5f52602260045260245ffd5b5f60208284031215615bc0575f80fd5b5051919050565b5f60208284031215615bd7575f80fd5b8151611f7b816155e7565b60ff851681526001600160a01b03841660208201526101008101615c0960408301856159fb565b615c1660a08301846159fb565b95945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215615c43575f80fd5b8151611f7b816156c8565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015615c9e5784516001600160a01b031683529383019391830191600101615c79565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215615cd1575f80fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610f7457610f74615cea565b8082028115828204841417610f7457610f74615cea565b5f82615d4257634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220c8c510338c1de931de9cbc766dd1d513e8dd67cbb8551f9f3e2dced660d1cc4164736f6c63430008170033

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.