ETH Price: $3,321.55 (+6.69%)
 

Overview

Max Total Supply

100,000,000 EAI

Holders

12,236 (0.00%)

Transfers

-
1,028 ( -0.58%)

Market

Price

$0.0476 @ 0.000014 ETH (+9.98%)

Onchain Market Cap

$4,762,939.00

Circulating Supply Market Cap

$4,323,092.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

EagleAI provides access to a data feed used by the London Stock Exchange Group in the form of telegram bots using AI to identify possible profitable trades in the current crypto-sphere and allow regular non institutional users to make those trades direct from the bot.

Market

Volume (24H):$181,621.00
Market Capitalization:$4,323,092.00
Circulating Supply:90,759,952.00 EAI
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
EAGLEAI

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2024-05-17
*/

/*


       ███████╗ █████╗  ██████╗ ██╗     ███████╗     █████╗ ██╗
       ██╔════╝██╔══██╗██╔════╝ ██║     ██╔════╝    ██╔══██╗██║
       █████╗  ███████║██║  ███╗██║     █████╗      ███████║██║
       ██╔══╝  ██╔══██║██║   ██║██║     ██╔══╝      ██╔══██║██║
       ███████╗██║  ██║╚██████╔╝███████╗███████╗    ██║  ██║██║
       ╚══════╝╚═╝  ╚═╝ ╚═════╝ ╚══════╝╚══════╝    ╚═╝  ╚═╝╚═╝
                                                        

                                                                           

============================================================================
                                PROJECT DETAILS
============================================================================

Website: https://eagleai.io

Social media:

Whitepaper: https://eagle-ai.gitbook.io/whitepaper
Telegram: https://t.me/EAGLEAI_OFFICIAL
Twitter: https://twitter.com/Eagleaibot
TikTok: https://www.tiktok.com/@eagle.ai.bot
Instagram: https://www.instagram.com/eagleaibot"

SPDX-License-Identifier: MIT
*/
pragma solidity 0.8.24;

interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

/**
 * @title Context
 * @dev The base contract that provides information about the message sender
 * and the calldata in the current transaction.
 */

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

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;
    address private _previousOwner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event Locked(address owner, address newOwner,uint256 lockTime);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor ()  {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

     /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @title IUniswapV2Factory
 * @dev Interface for the Uniswap V2 Factory contract.
 */

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

/**
 * @title IUniswapV2Router01
 * @dev Interface for the Uniswap V2 Router version 01 contract.
*/

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    //WETH function that return const value,  rather than performing some state-changing operation. 
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin, 
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract EAGLEAI is Context, IERC20, Ownable {
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 10 * 10**7 * 10**18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
   
    string  private constant NAME = "Eagle AI";
    string  private  constant SYMBOL = "EAI";
    uint8  private constant DECIMALS = 18;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool public tradeEnabled;
    
    uint256 private numTokensSellToAddToLiquidity = 1 * 10**2 * 10**18;

    //taxShare 
    uint256 refAmt;
    uint256 coinOperation;
    uint256 liquidty;
    uint256 burn;

    //Buy tax percentage
    uint256 public buyReflectionTax=1;
    uint256 public buyCoinWalletTaxPer=1;
    uint256 public buyLiquidityTaxPer=1;
    uint256 public buyBurnTaxPer= 0;
    //sell tax percentage
    uint256 public sellReflectionTax=2;
    uint256 public sellCoinWalletTaxPer=1;
    uint256 public sellLiquidityTaxPer=2;
    uint256 public sellBurnTaxPer= 1;
    //coin operation wallet
    address public fundWallet;
    
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event FundWalletChange(address wallet);
    event ThresholdUpdated(uint256 amount);
    event AddedLiquidity(uint256 totalLiquidity);
    event ReflectedFee(uint256 totalReflectFee);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event TradeEnabled(bool enabled);
    event BuyTaxUpdated(uint256 buyReflectionTax,uint256 buyCoinWalletTaxPer,uint256 buyLiquidityTaxPer,uint256 buyBurnTaxPer);
    event SellTaxUpdated(uint256 sellReflectionTax,uint256 sellCoinWalletTaxPer,uint256 sellLiquidityTaxPer,uint256 sellBurnTaxPer);
    event IncludedInFee(address account);
    event ExcludedFromFee(address account);
    event IncludedInReward(address account);
    event ExcludedFromReward(address account);
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    /**
    * @notice Contract constructor to initialize the token.
    * @dev This constructor sets initial values and configures the contract.
    * @param wallet The address where funds will be sent.
    */
    
       constructor (address wallet)  {
        require(wallet != address(0),"Fund wallet can not be zero");
        _rOwned[_msgSender()] = _rTotal;
        fundWallet = wallet;
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24); //Uniswap V2 on Base network
        // IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x1689E7B1F10000AE47eBfE339a4f69dECd19F602); // Base sepolia testnet dex


         // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;
        
        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    /**
    * @notice Retrieves the name of the token.
    * @dev This function returns the name of the token, which is often used for identification.
    * It is commonly displayed in user interfaces and provides a human-readable name for the token.
    * @return The name of the token.
    */
    function name() external pure returns (string memory) {
        return NAME;
    }

    /**
    * @notice Retrieves the symbol or ticker of the token.
    * @dev This function returns the symbol or ticker that represents the token.
    * It is commonly used for identifying the token in user interfaces and exchanges.
    * @return The symbol or ticker of the token.
    */
    function symbol() external pure returns (string memory) {
        return SYMBOL;
    }

    /**
    * @notice Retrieves the number of decimal places used in the token representation.
    * @dev This function returns the number of decimal places used to represent the token balances.
    * It is commonly used to interpret the token amounts correctly in user interfaces.
    * @return The number of decimal places used in the token representation.
    */
    function decimals() external pure returns (uint8) {
        return DECIMALS;
    }

    /**
    * @notice Retrieves the total supply of tokens.
    * @dev This function returns the total supply of tokens in circulation.
    * @return The total supply of tokens.
    */
    function totalSupply() external view override returns (uint256) {
        return _tTotal;
    }

    /**
    * @notice Retrieves the token balance of a specified account.
    * @dev This function returns the token balance of the specified account.
    * If the account is excluded, it directly returns the token balance.
    * If the account is not excluded, it converts the reflection balance to token balance using the current rate.
    * @param account The address of the account whose token balance is being queried.
    * @return The token balance of the specified account.
    */
    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];//exculded
        return tokenFromReflection(_rOwned[account]);//not excluded
    }

    /**
    * @notice Transfers a specified amount of tokens to a recipient.
    * @dev This function transfers tokens from the sender's account to the specified recipient.
    * If successful, it returns true.
    * @param recipient The address of the recipient to whom tokens are being transferred.
    * @param amount The amount of tokens to be transferred.
    * @return A boolean indicating the success of the transfer operation.
     */
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
    * @notice Retrieves the remaining allowance for a spender to spend tokens on behalf of an owner.
    * @dev This function returns the current allowance set for the specified spender to spend tokens
    * from the specified owner's account.
    * @param owner The address of the owner whose allowance is being queried.
    * @param spender The address of the spender for whom the allowance is queried.
    * @return The remaining allowance for the specified spender to spend tokens on behalf of the owner.
    */
    function allowance(address owner, address spender) external view override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
    * @notice Approves a spender to spend a specified amount of tokens on behalf of the owner.
    * @dev This function sets or updates the allowance for a spender to spend tokens
    * from the owner's account. If successful, it returns true.
    * @param spender The address of the spender to be approved.
    * @param amount The amount of tokens to approve for spending.
    * @return A boolean indicating the success of the approval operation.
    */
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
    * @notice Transfers tokens from one address to another on behalf of a third-party.
    * @dev This function allows a designated spender to transfer tokens from the sender's account
    * to the recipient's account. It also ensures that the allowance is updated correctly.
    * If successful, it returns true.
    * @param sender The address from which tokens are being transferred.
    * @param recipient The address to which tokens are being transferred.
    * @param amount The amount of tokens to be transferred.
    * @return A boolean indicating the success of the transfer operation.
    */
    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()]-amount);
        return true;
    }

    /**
    * @notice Increases the allowance granted to a spender by a specified amount.
    * @dev This function increases the allowance for the specified spender by the given value.
    * It ensures that the updated allowance is correctly set. If successful, it returns true.
    * @param spender The address of the spender whose allowance is being increased.
    * @param addedValue The amount by which to increase the allowance.
    * @return A boolean indicating the success of the operation.
    */
    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender]+addedValue);
        return true;
    }

    /**
    * @notice Reduces the allowance granted to a spender by a specified amount.
    * @dev This function decreases the allowance for the specified spender by the given value.
    * It ensures that the allowance does not go below zero. If successful, it returns true.
    * @param spender The address of the spender whose allowance is being reduced.
    * @param subtractedValue The amount by which to reduce the allowance.
    * @return A boolean indicating the success of the operation.
    */
    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender]-subtractedValue);
        return true;
    }

    /**
    * @notice Checks if the specified address is excluded from earning reflections.
    * @dev Excluded addresses do not receive reflections in certain tokenomics designs.
    * This function returns true if the address is excluded, and false otherwise.
    * @param account The address to check for exclusion from reflections.
    * @return A boolean indicating whether the address is excluded from earning reflections.
    */
    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcluded[account];
    }

    /**
    * @notice Retrieves the total amount of fees collected in tokens.
    * @dev This function returns the cumulative sum of fees collected during transactions.
    * The fees are often used for various purposes like liquidity provision, rewards, or burns.
    * @return The total amount of fees collected in tokens.
    */
    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

    /**
    * @notice Distributes the specified amount of tokens as reflections to the reward pool.
    * @dev This function is typically used to convert a portion of tokens into reflections
    * and add them to a reward pool. Excluded addresses cannot call this function.
    * @param tAmount The amount of tokens to be converted and added to reflections.
    */
    function deliver(uint256 tAmount) external {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,) = _getValue(tAmount);
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _rTotal = _rTotal-rAmount;
        _tFeeTotal = _tFeeTotal+tAmount;
    }

    /**
    * @notice Converts the given token amount to its equivalent reflection amount.
    * @dev Reflections are often used in tokenomics to calculate rewards or balances.
    * This function converts a token amount to its corresponding reflection amount
    * based on the current rate. Optionally, it deducts the transfer fee from the calculation.
    * @param tAmount The token amount to be converted to reflections.
    * @param deductTransferFee A boolean indicating whether to deduct the transfer fee from the calculation.
    * @return The equivalent reflection amount corresponding to the given token amount.
    */

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,) = _getValue(tAmount);
             return rAmount;
        } else {
            (,uint256 rTransferAmount) = _getValue(tAmount);
             return rTransferAmount;
        }
    }

    /**
    * @notice Converts the given reflection amount to its equivalent token amount.
    * @dev Reflections are often used in tokenomics to calculate rewards or balances.
    * This function converts a reflection amount to its corresponding token amount
    * based on the current rate.
    * @param rAmount The reflection amount to be converted to tokens.
    * @return The equivalent token amount corresponding to the given reflection amount.
    */

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount / currentRate;
    }

    /**
    * @notice Grants the owner the ability to exclude an address from earning reflections.
    * @dev Reflections are often used in tokenomics to distribute rewards to holders.
    * This function excludes the specified address from receiving reflections.
    * @param account The address to be excluded from earning reflections.
    */
    function excludeFromReward(address account) external onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
        emit ExcludedFromReward(account);
    }

    /**
    * @dev External function for including an account in the reward distribution.
    * @param account The address to be included in the reward distribution.
    * 
    * The function can only be called by the owner of the contract.
    * Requires that the specified account is currently excluded.
    * Iterates through the list of excluded accounts, finds the specified account, and removes it from the exclusion list.
    * Resets the token balance of the specified account to 0 and updates the exclusion status.
    * 
    * @notice Only the owner of the contract can call this function.
    * @notice Requires that the specified account is currently excluded.
    */
    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already Included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
        emit IncludedInReward(account);
    }

    /**
    * @dev Internal function for transferring tokens between two excluded addresses.
    * @param sender The address from which the tokens are being sent.
    * @param recipient The address to which the tokens are being sent.
    * @param tAmount The amount of tokens to be transferred.
    * 
    * Retrieves token values, including transfer amount, fees, and liquidity, and updates both token balances.
    * Takes liquidity and reflects fees based on specified values.
    * Emits a `Transfer` event with details about the transfer.
    * 
    * @param sender The sender's address.
    * @param recipient The recipient's address.
    * @param tAmount The amount of tokens to be transferred.
    * 
    * @notice This function is intended for internal use and should not be called directly.
    */
     function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tBurn) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation, tBurn);
        _tOwned[sender] = _tOwned[sender]-tAmount;
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;        
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee, tBurn);
        _takeCoinFund(tCoinOperation,sender);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
    * @notice Grants the owner the ability to exclude an address from transaction fees.
    * @dev Transaction fees are often applied in decentralized finance (DeFi) projects
    * to support various mechanisms like liquidity provision, rewards, or token burns.
    * @param account The address to exclude from transaction fees.
    */
     function excludeFromFee(address account) external onlyOwner {
        require(!_isExcludedFromFee[account],"Alreay excluded from fee");
        _isExcludedFromFee[account] = true;
        emit ExcludedFromFee(account);
    }

     /**
    * @notice Grants the owner the ability to include an address in transaction fees.
    * @dev Transaction fees are often applied in decentralized finance (DeFi) projects
    * to support various mechanisms like liquidity provision, rewards, or token burns.
    * @param account The address to include in transaction fees.
    */
    
    function includeInFee(address account) external onlyOwner {
        require(_isExcludedFromFee[account],"Alreay included in fee");
        _isExcludedFromFee[account] = false;
        emit IncludedInFee(account);
    }

    /**
    * @dev Sets the address of the fund wallet.
    * @param wallet The new address to be set as the fund wallet.
    *
    * Requirements:
    * - Only the contract owner can call this function.
    *
    * Emits a {FundWalletChange} event with the updated fund wallet address on successful execution.
    */
    
    function setFundWallet(address wallet) external onlyOwner{
     require(wallet != address(0),"Fund wallet can not be zero");
     fundWallet = wallet;
     emit FundWalletChange(wallet);
    }                                                                                                                  

    /**
    * @notice Allows the owner to enable or disable the swap and liquify feature.
    * @dev The swap and liquify feature is a mechanism often used in decentralized finance (DeFi)
    * projects to automatically swap a portion of tokens for liquidity and add them to a liquidity pool.
    * @param enabled A boolean indicating whether to enable (true) or disable (false) the feature.
    */
    function setSwapAndLiquifyEnabled(bool enabled) external onlyOwner {
        swapAndLiquifyEnabled = enabled;
        emit SwapAndLiquifyEnabledUpdated(enabled);
    }

    /**
    * @dev External function for updating the threshold amount required for triggering liquidity addition.
    * @param amount The new threshold amount.
    * 
    * The function can only be called by the owner of the contract.
    * Requires that the provided threshold amount (amount) is greater than 0.
    * Updates the numTokensSellToAddToLiquidity with the new threshold amount.
    * @notice Only the owner of the contract can call this function.
    * @notice Requires a positive amount for successful execution.
    */
    //set numTokensSellToAddToLiquidity value
    function updateThreshold(uint256 amount) external onlyOwner {
        require(amount > 0 && amount <= 5 * 10**5 * 10**18,"Amount should be more than zero and less than 500k tokens");
        numTokensSellToAddToLiquidity = amount;
        emit ThresholdUpdated(amount);
    }
    
     //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    /**
    * @dev Private function for reflecting fees in the total supply and fee tracking variables.
    * @param rFee The reflection equivalent of the fee amount.
    * @param tFee The actual fee amount in tokens.
    * @param tBurn The amount of tokens designated for burning.
    * 
    * Calls the internal `_getRate` function to get the current conversion rate.
    * Calculates the reflection equivalent of the burn amount using the current rate.
    * Updates the total reflection supply by subtracting the reflection fees and burn reflection.
    * Updates the total fee tracking variable by adding the actual fee amount.
    * Updates the total token supply by subtracting the burn amount.
    * 
    * @notice Internal use only.
    */
    function _reflectFee(uint256 rFee, uint256 tFee, uint256 tBurn) private {
         uint256 currentRate = _getRate();
         uint256 rBurn = tBurn * currentRate;
     
        _rTotal = _rTotal - rFee - rBurn;
        _tFeeTotal = _tFeeTotal + tFee;

        _tTotal = _tTotal - tBurn;
        emit ReflectedFee(tFee);
        
    }


    /**
    * @dev Private function for transferring tokens designated for coin operations to a specified wallet.
    * @param tCoinOperation The amount of tokens designated for coin operations.
    * 
    * Calls the internal `_getRate` function to get the current conversion rate.
    * Calculates the reflection equivalent of the token amount for coin operations using the current rate.
    * Transfers the reflection equivalent to the specified wallet for coin operations.
    * 
    * @param tCoinOperation The amount of tokens designated for coin operations.
    * 
    * @notice Internal use only.
    */
       function _takeCoinFund(uint256 tCoinOperation,address sender) private {
           uint256 currentRate =  _getRate();
        uint256 rCoinOperation = tCoinOperation * currentRate;
        _rOwned[fundWallet] = _rOwned[fundWallet] + rCoinOperation;
        if(_isExcluded[fundWallet])
            _tOwned[fundWallet] = _tOwned[fundWallet] + tCoinOperation;
        emit Transfer(sender, fundWallet, tCoinOperation);
    }

    /**
    * @dev Private function for calculating various token values based on a specified total token amount.
    * @param tAmount The total amount of tokens in the transaction.
    * @return tTransferAmount The token amount after deducting fees.
    * @return tFee The amount of tokens designated for fees.
    * @return tLiquidity The amount of tokens designated for liquidity.
    * @return tCoinOperation The amount of tokens designated for coin operations.
    * @return tBurn The amount of tokens designated for burning.
    * 
    * Calls the internal `_getTValues` function to calculate token values for fees, liquidity, coin operation, and burning.
    * 
    * @notice Internal use only.
    */

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tBurn) = _getTValues(tAmount); 
        return ( tTransferAmount, tFee, tLiquidity, tCoinOperation, tBurn);
    }

    /**
    * @dev Private function for calculating both reflection and transfer amounts based on a specified total token amount.
    * @param tAmount The total amount of tokens in the transaction.
    * @return rAmount Reflection equivalent of the total token amount.
    * @return rTransferAmount Reflection equivalent of the transfer amount (after deducting fees).
    * 
    * Calls the internal functions to calculate token values for fees, liquidity, coin operation, and burning.
    * Utilizes the calculated values to get both reflection and transfer amounts.
    * 
    * @notice Internal use only.
    */
    function _getValue(uint256 tAmount) private view returns(uint256, uint256){
        (, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tBurn) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount,) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation, tBurn);
         return (rAmount, rTransferAmount);

    }

    /**
    * @dev Private function for calculating token values based on a specified total token amount.
    * @param tAmount The total amount of tokens in the transaction.
    * @return tTransferAmount The token amount after deducting fees.
    * @return tFee The amount of tokens designated for fees.
    * @return tLiquidity The amount of tokens designated for liquidity.
    * @return tCoinOperation The amount of tokens designated for coin operations.
    * @return tBurn The amount of tokens designated for burning.
    * 
    * Calls the internal functions to calculate fees for tax, liquidity, coin operation, and burning.
    * Calculates the total fee amount and deducts it from the total token amount to get the transfer amount.
    * 
    * @notice Internal use only.
    */
    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tCoinOperation = calculateCoinOperartionTax(tAmount);
        uint256 tBurn = calculateBurnTax(tAmount);
        uint256 allTax = tFee + tLiquidity + tCoinOperation + tBurn;
        uint256 tTransferAmount = tAmount - allTax;
        return (tTransferAmount, tFee, tLiquidity, tCoinOperation, tBurn);
    }

    /**
    * @dev Private function for calculating reflection values based on specified token amounts.
    * @param tAmount The total amount of tokens in the transaction.
    * @param tFee The amount of tokens designated for fees.
    * @param tLiquidity The amount of tokens designated for liquidity.
    * @param tCoinOperation The amount of tokens designated for coin operations.
    * @param tBurn The amount of tokens designated for burning.
    * @return rAmount Reflection equivalent of the total token amount.
    * @return rTransferAmount Reflection equivalent of the transfer amount (after deducting fees).
    * @return rFee Reflection equivalent of the fee amount.
    * 
    * Calls the internal `_getRate` function to get the current conversion rate.
    * Calculates reflection values for the total amount, transfer amount, and fees by multiplying token amounts with the rate.
    * 
    * @notice Internal use only.
    */
    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tBurn) private view returns (uint256, uint256, uint256) {
        uint256 currentRate = _getRate();
        uint256 rAmount = tAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        uint256 rCoinOperation = tCoinOperation * currentRate;
        uint256 rBurn = tBurn * currentRate;
        uint256 rLiquidity = tLiquidity * currentRate;
        uint256 allTax = rFee + rCoinOperation + rBurn + rLiquidity;
        uint256 rTransferAmount = rAmount - allTax;
        return (rAmount, rTransferAmount, rFee);
    }

    /**
    * @dev Private function for retrieving the current conversion rate between reflection and token balances.
    * @return rate Current conversion rate.
    * 
    * @notice Internal use only.
    */
    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    /**
    * @dev Private function for retrieving the current supply of both reflection and token balances.
    * @return rSupply Current reflection supply.
    * @return tSupply Current token supply.
    * 
    * @notice Internal use only.
    */
    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply - _rOwned[_excluded[i]];
            tSupply = tSupply - _tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    /**
    * @dev Private function for handling the transfer of liquidity to the contract.
    * @param tLiquidity The amount of liquidity tokens to be taken.
    * 
    * @notice Internal use only.
    */
    function _takeLiquidity(uint256 tLiquidity) private {
           uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)] + tLiquidity;
        emit AddedLiquidity(tLiquidity);
    }

    /**
    * @dev Calculates the tax fee for reflection based on a specified amount.
    * @param amount Amount for tax fee calculation.
    * @return Calculated tax fee amount.
    * 
    * @notice Internal use only.
    */
    
    function calculateTaxFee(uint256 amount) private view returns (uint256) {
        return amount * refAmt / 10**2;
    }

    /**
    * @dev Calculates the liquidity fee based on a specified amount.
    * @param amount Amount for liquidity fee calculation.
    * @return Calculated liquidity fee amount.
    * 
    * @notice Internal use only.
    */
    function calculateLiquidityFee(uint256 amount) private view returns (uint256) {
        return amount * liquidty / 10**2;
    }

    /**
    * @dev Calculates the coin operation tax based on a specified amount.
    * @param amount Amount for coin operation tax calculation.
    * @return Calculated coin operation tax amount.
    * 
    * @notice Internal use only.
    */

        function calculateCoinOperartionTax(uint256 amount) private view returns (uint256) {
        return amount * coinOperation / 10**2;
    }

    /*
    * @dev Calculates the burn tax based on a specified amount.
    * @param amount Amount for burn tax calculation.
    * @return Calculated burn tax amount.
    * 
    * Multiplies the amount by the burn percentage and divides by 100.
    * 
    * @notice Internal use only.
    */
    function calculateBurnTax(uint256 amount) private view returns (uint256) {
        return amount * burn / 10**2;
    }
    
    /**
    * @dev Private function for removing all fee values.
    * 
    * Sets all fee values (refAmt, coinOperation, liquidity, burn) to zero.
    * This function is typically used to temporarily disable fees during specific operations.
    * 
    * @notice This function is intended for internal use and should not be called directly.
    */

    function removeAllFee() private {
         refAmt =   0;
            coinOperation = 0;
            liquidty = 0;
            burn = 0;  
    }
    
  
    function isExcludedFromFee(address account) external view returns(bool) {
        return _isExcludedFromFee[account];
    }

    /**
    * @dev Private function for approving a spender to spend a certain amount on behalf of the owner.
    * @param owner The address that owns the tokens.
    * @param spender The address that is approved to spend the tokens.
    * @param amount The amount of tokens to be approved for spending.
    * 
    * Requires that both the owner and spender addresses are not the zero address.
    * Sets the allowance for the spender on behalf of the owner to the specified amount.
    * Emits an `Approval` event with details about the approval.
    * 
    * @notice This function is intended for internal use and should not be called directly.
    */

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

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

    /**
     * @notice Enables trading functionality.
     * @dev Only callable by the owner of the contract.
    */
    function startTrading() external onlyOwner(){
        require(!tradeEnabled,"Trading already started");
        tradeEnabled = true;
        emit TradeEnabled(tradeEnabled);
    } 

     /**
      * @notice Updates the buy taxes percentages.
      * @dev This function can only be called by the contract owner.
      * @param reflectionPercent Percentage of reflection tax on buy transactions.
      * @param coinOperartionPer Percentage of tax allocated to coin operation on buy transactions.
      * @param liquidityTaxPer Percentage of tax allocated to liquidity on buy transactions.
      * @param burnTaxPer Percentage of tax allocated to burning on buy transactions.
      * @dev The individual of all tax percentages cannot exceed 6%.
      * Note: Only whole numbers are accepted for each tax percentage, not fractions.
      */
    function updateBuyTaxPer(uint256 reflectionPercent,uint256 coinOperartionPer,uint256 liquidityTaxPer,uint256 burnTaxPer) external onlyOwner {
        require(reflectionPercent <= 6,"You can not set reflection tax more then 6%");
        require(coinOperartionPer <= 6,"You can not set coin operation  tax more then 6%");
        require(liquidityTaxPer <= 6,"You can not set liquidity tax more then 6%");
        require(burnTaxPer <= 6,"You can not set burn  tax more then 6%");       
        buyReflectionTax = reflectionPercent;
        buyCoinWalletTaxPer = coinOperartionPer;
        buyLiquidityTaxPer = liquidityTaxPer;
        buyBurnTaxPer = burnTaxPer;
        emit BuyTaxUpdated(buyReflectionTax,buyCoinWalletTaxPer,buyLiquidityTaxPer,buyBurnTaxPer);
    }

     /**
      * @notice Updates the sell taxes percentages.
      * @dev This function can only be called by the contract owner.
      * @param reflectionPercent Percentage of reflection tax on sell transactions.
      * @param coinOperartionPer Percentage of tax allocated to coin operation on sell transactions.
      * @param liquidityTaxPer Percentage of tax allocated to liquidity on sell transactions.
      * @param burnTaxPer Percentage of tax allocated to burning on sell transactions.
      * @dev The individual of all tax percentages cannot exceed 6%.
      * Note: Only whole numbers are accepted for each tax percentage, not fractions.
      */
    function updateSellTaxPer(uint256 reflectionPercent,uint256 coinOperartionPer,uint256 liquidityTaxPer,uint256 burnTaxPer) external onlyOwner {
        require(reflectionPercent <= 6,"You can not set reflection tax more then 6%");
        require(coinOperartionPer <= 6,"You can not set coin operation  tax more then 6%");
        require(liquidityTaxPer <= 6,"You can not set liquidity tax more then 6%");
        require(burnTaxPer <= 6,"You can not set burn  tax more then 6%");
        sellReflectionTax = reflectionPercent;
        sellCoinWalletTaxPer = coinOperartionPer;
        sellLiquidityTaxPer = liquidityTaxPer;
        sellBurnTaxPer = burnTaxPer;
        emit SellTaxUpdated(sellReflectionTax,sellCoinWalletTaxPer,sellLiquidityTaxPer,sellBurnTaxPer);
    }

    /**
    * @dev Internal function for transferring tokens between addresses.
    * @param from The address from which the tokens are transferred.
    * @param to The address to which the tokens are transferred.
    * @param amount The amount of tokens to be transferred.
    * 
    * @param from The sender's address.
    * @param to The recipient's address.
    * @param amount The amount of tokens to be transferred.
    * 
    * Emits a `Transfer` event indicating the transfer of tokens from one address to another.
    * 
    * Manages fees, including tax, burn, and liquidity fee, based on specified conditions.
    * If the transfer triggers the conditions for liquidity provision, it swaps and adds liquidity.
    * 
    * @notice This function is intended for internal use and should not be called directly.
    */



    function _transfer( address from, address to, uint256 amount ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if (from == owner() || to == owner()){
            _tokenTransfer(from,to,amount,false);
            return;
        }

        require(tradeEnabled,"Trading not started yet");

        
        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        
        //indicates if fee should be deducted from transfer
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        //if takeFee is true then set sell or buy tax percentage
        if(takeFee)
        _sellBuyTax(from,to); 
      _tokenTransfer(from,to,amount,takeFee);
    }

    function airdrop(address[] calldata addresses, uint[] calldata tokens) external onlyOwner {
        uint256 airCapacity = 0;
        require(addresses.length == tokens.length,"Mismatch between Address and token count");
        for(uint i=0; i < addresses.length; i++){
            uint amount = tokens[i];
            airCapacity = airCapacity + amount;
        }
        require(balanceOf(msg.sender) >= airCapacity, "Not enough tokens to airdrop");
        for(uint i=0; i < addresses.length; i++){
            uint amount = tokens[i];
            _tokenTransfer(msg.sender,addresses[i],amount,false);
        }
    }

    /**
    * @dev Internal function for setting buy or sell tax shares based on transaction details.
    * @param from The address from which the tokens are being sent.
    * @param to The address to which the tokens are being sent.
    * 
    * Sets tax shares for buy and sell transactions, including referral amount, coin operation fee,
    * liquidity fee, and burn fee, based on specified percentages.
    * 
    * @notice This function is intended for internal use and should not be called directly.
    * Auditor Note:- Due to Less time and in order to reduce contract size we have opted to change the tax percentages for buy, sell and normal transfer dynamically instead of hardcoding it.
    **/
      function _sellBuyTax(address from, address to) private {
           //sell and buy logic
        bool isBuy = from == uniswapV2Pair;
        bool isSell = to == uniswapV2Pair;

            if (isBuy) {    
            refAmt =   buyReflectionTax; //1 %
            coinOperation = buyCoinWalletTaxPer; //2 %
            liquidty = buyLiquidityTaxPer; //2 %
            burn = buyBurnTaxPer; //0%
 
            } 
            else if (isSell) {
            refAmt = sellReflectionTax; //1%
            coinOperation = sellCoinWalletTaxPer; //2%
            liquidty = sellLiquidityTaxPer; //2%
            burn = sellBurnTaxPer;   //0%
               
            }
            else {
          removeAllFee();
            }
    } 

    
    /**
    * @dev Private function for performing token swap and liquidity addition on the Uniswap V2 router.
    * @param contractTokenBalance The balance of tokens in the contract to be used for the swap and liquidity.
    * 
    * Splits the contract token balance into halves, swaps one half for ETH, captures the ETH balance,
    * and adds liquidity with the other half. Emits a `SwapAndLiquify` event with details about the swap and liquidity addition.
    * 
    * @notice This function is intended for internal use and should not be called directly.
    */
    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance / 2;
        uint256 otherHalf = contractTokenBalance - half;

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance - initialBalance;

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    /**
    * @dev Private function for swapping tokens for ETH on the Uniswap V2 router.
    * @param tokenAmount The amount of tokens to be swapped for ETH.
    * 
    * Generates the Uniswap pair path of token -> WETH and approves token transfer to the Uniswap V2 router.
    * Makes the token-to-ETH swap using the Uniswap V2 router's `swapExactTokensForETHSupportingFeeOnTransferTokens` function.
    * 
    * @notice This function is intended for internal use and should not be called directly.
    */
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    /**
    * @dev Private function for adding liquidity to the Uniswap V2 router.
    * @param tokenAmount The amount of tokens to be added to the liquidity pool.
    * @param ethAmount The amount of ETH to be added to the liquidity pool.
    * 
    * Approves token transfer to the Uniswap V2 router and adds liquidity with specified amounts.
    * Uses the Uniswap V2 router's `addLiquidityETH` function, specifying the token address, token amount,
    * slippage tolerance, and other parameters.
    *  
    * @notice This function is intended for internal use and should not be called directly.
    */

 
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    /**
    * @dev Internal function for transferring tokens between addresses, applying fees if specified.
    * @param sender The address from which the tokens are being sent.
    * @param recipient The address to which the tokens are being received.
    * @param amount The amount of tokens to be transferred.
    * @param takeFee A boolean indicating whether fees should be applied.
    * 
    * If `takeFee` is false, all fees are removed for the current transfer.
    * Determines the transfer scenario (standard, to/from excluded), and calls the appropriate transfer function accordingly.
    *  
    * @notice This function is intended for internal use and should not be called directly.
    */
    
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
          if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
      
    }

    /**
    * @dev Internal function for transferring tokens between two non-excluded addresses.
    * @param sender The address from which the tokens are being sent.
    * @param recipient The address to which the tokens are being sent.
    * @param tAmount The amount of tokens to be transferred.
    * 
    * Retrieves token values, including transfer amount, fees, and liquidity, and updates reflection balances.
    * Takes liquidity and reflects fees based on specified values.
    * Emits a `Transfer` event with details about the transfer.
    *  
    * @notice This function is intended for internal use and should not be called directly.
    */

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tBurn) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation, tBurn);
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee, tBurn);
        _takeCoinFund(tCoinOperation,sender);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
    * @dev Internal function for transferring tokens from a non-excluded address to an excluded address.
    * @param sender The address from which the tokens are being sent.
    * @param recipient The address to which the tokens are being sent.
    * @param tAmount The amount of tokens to be transferred.
    * 
    * Retrieves token values, including transfer amount, fees, and liquidity, and updates both token and reflection balances.
    * Takes liquidity and reflects fees based on specified values.
    * Emits a `Transfer` event with details about the transfer.
    *  
    * @notice This function is intended for internal use and should not be called directly.
    */
    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tBurn) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation, tBurn);
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;           
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee, tBurn);
        _takeCoinFund(tCoinOperation,sender);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
    * @dev Internal function for transferring tokens from an excluded address to a non-excluded address.
    * @param sender The address from which the tokens are being sent.
    * @param recipient The address to which the tokens are being sent.
    * @param tAmount The amount of tokens to be transferred.
    * 
    * Retrieves token values, including transfer amount, fees, and liquidity, and updates both token and reflection balances.
    * Takes liquidity and reflects fees based on specified values.
    * Emits a `Transfer` event with details about the transfer.
    * 
    * @notice This function is intended for internal use and should not be called directly.
    */

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tBurn) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation, tBurn);
        _tOwned[sender] = _tOwned[sender]-tAmount;
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;   
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee, tBurn);
        _takeCoinFund(tCoinOperation,sender);
        emit Transfer(sender, recipient, tTransferAmount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalLiquidity","type":"uint256"}],"name":"AddedLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buyReflectionTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyCoinWalletTaxPer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityTaxPer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyBurnTaxPer","type":"uint256"}],"name":"BuyTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludedFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludedFromReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"FundWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludedInFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludedInReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockTime","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalReflectFee","type":"uint256"}],"name":"ReflectedFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellReflectionTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellCoinWalletTaxPer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityTaxPer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellBurnTaxPer","type":"uint256"}],"name":"SellTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TradeEnabled","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"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnTaxPer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyCoinWalletTaxPer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityTaxPer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyReflectionTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnTaxPer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellCoinWalletTaxPer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityTaxPer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellReflectionTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setFundWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":"tradeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionPercent","type":"uint256"},{"internalType":"uint256","name":"coinOperartionPer","type":"uint256"},{"internalType":"uint256","name":"liquidityTaxPer","type":"uint256"},{"internalType":"uint256","name":"burnTaxPer","type":"uint256"}],"name":"updateBuyTaxPer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionPercent","type":"uint256"},{"internalType":"uint256","name":"coinOperartionPer","type":"uint256"},{"internalType":"uint256","name":"liquidityTaxPer","type":"uint256"},{"internalType":"uint256","name":"burnTaxPer","type":"uint256"}],"name":"updateSellTaxPer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526a52b7d2dcc80cd2e4000000600881905562000022905f196200038f565b6200002f905f19620003af565b600955600b805461ff00191661010017905568056bc75e2d63100000600c5560016011819055601281905560138190555f60145560026015819055601682905560175560185534801562000081575f80fd5b506040516200337e3803806200337e833981016040819052620000a491620003d5565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b0381166200013f5760405162461bcd60e51b815260206004820152601b60248201527f46756e642077616c6c65742063616e206e6f74206265207a65726f0000000000604482015260640160405180910390fd5b600954335f9081526002602090815260409182902092909255601980546001600160a01b0319166001600160a01b038516179055805163c45a015560e01b81529051734752ba5dbc23f44d87826276bf6fd6b1c372ad2492839263c45a015592600480830193928290030181865afa158015620001be573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001e49190620003d5565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000230573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002569190620003d5565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015620002a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002c79190620003d5565b6001600160a01b0390811660a0528116608052600160055f620002f15f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805494151560ff199586161790553081526005909252902080549091166001179055620003383390565b6001600160a01b03165f6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6008546040516200037f91815260200190565b60405180910390a3505062000404565b5f82620003aa57634e487b7160e01b5f52601260045260245ffd5b500690565b81810381811115620003cf57634e487b7160e01b5f52601160045260245ffd5b92915050565b5f60208284031215620003e6575f80fd5b81516001600160a01b0381168114620003fd575f80fd5b9392505050565b60805160a051612f27620004575f395f81816104b501528181611b660152611e9501525f818161030d015281816124bc01528181612573015281816125af0152818161261b01526126420152612f275ff3fe608060405260043610610262575f3560e01c806355ce3b9a1161013f578063bdf024ec116100b3578063e1662ed311610078578063e1662ed314610781578063e1eaf3bb14610796578063ea204636146107ab578063ea2f0b37146107c0578063ea7db9e5146107df578063f2fde38b146107fe575f80fd5b8063bdf024ec146106cb578063c49b9a80146106e0578063d621e813146106ff578063d7d7442f1461071e578063dd62ed3e1461073d575f80fd5b806388f820201161010457806388f82020146105f05780638da5cb5b1461062757806395d89b4114610643578063a457c2d71461066e578063a9059cbb1461068d578063b618a70d146106ac575f80fd5b806355ce3b9a14610560578063664a1ad61461057f578063672434821461059e57806370a08231146105bd578063715018a6146105dc575f80fd5b80633685d419116101d6578063463db7dd1161019b578063463db7dd1461048f57806349bd5a5e146104a45780634a74bb02146104d757806352390c02146104f55780635252a228146105145780635342acb414610529575f80fd5b80633685d419146103f457806339509351146104135780633bd5d17314610432578063437823ec146104515780634549b03914610470575f80fd5b806323b872dd1161022757806323b872dd1461035b578063281d9a7a1461037a578063293230b81461038f5780632d5624ed146103a55780632d838119146103ba578063313ce567146103d9575f80fd5b806306fdde031461026d578063095ea7b3146102af57806313114a9d146102de5780631694505e146102fc57806318160ddd14610347575f80fd5b3661026957005b5f80fd5b348015610278575f80fd5b506040805180820190915260088152674561676c6520414960c01b60208201525b6040516102a691906129d9565b60405180910390f35b3480156102ba575f80fd5b506102ce6102c9366004612a3c565b61081d565b60405190151581526020016102a6565b3480156102e9575f80fd5b50600a545b6040519081526020016102a6565b348015610307575f80fd5b5061032f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102a6565b348015610352575f80fd5b506008546102ee565b348015610366575f80fd5b506102ce610375366004612a66565b610833565b348015610385575f80fd5b506102ee60145481565b34801561039a575f80fd5b506103a3610883565b005b3480156103b0575f80fd5b506102ee60185481565b3480156103c5575f80fd5b506102ee6103d4366004612aa4565b610965565b3480156103e4575f80fd5b50604051601281526020016102a6565b3480156103ff575f80fd5b506103a361040e366004612abb565b6109e7565b34801561041e575f80fd5b506102ce61042d366004612a3c565b610bc9565b34801561043d575f80fd5b506103a361044c366004612aa4565b610bff565b34801561045c575f80fd5b506103a361046b366004612abb565b610ce3565b34801561047b575f80fd5b506102ee61048a366004612aea565b610dc7565b34801561049a575f80fd5b506102ee60165481565b3480156104af575f80fd5b5061032f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e2575f80fd5b50600b546102ce90610100900460ff1681565b348015610500575f80fd5b506103a361050f366004612abb565b610e47565b34801561051f575f80fd5b506102ee60115481565b348015610534575f80fd5b506102ce610543366004612abb565b6001600160a01b03165f9081526005602052604090205460ff1690565b34801561056b575f80fd5b506103a361057a366004612abb565b610fc4565b34801561058a575f80fd5b5060195461032f906001600160a01b031681565b3480156105a9575f80fd5b506103a36105b8366004612b5c565b611091565b3480156105c8575f80fd5b506102ee6105d7366004612abb565b61121a565b3480156105e7575f80fd5b506103a3611276565b3480156105fb575f80fd5b506102ce61060a366004612abb565b6001600160a01b03165f9081526006602052604090205460ff1690565b348015610632575f80fd5b505f546001600160a01b031661032f565b34801561064e575f80fd5b5060408051808201909152600381526245414960e81b6020820152610299565b348015610679575f80fd5b506102ce610688366004612a3c565b6112e7565b348015610698575f80fd5b506102ce6106a7366004612a3c565b61131d565b3480156106b7575f80fd5b506103a36106c6366004612bc3565b611329565b3480156106d6575f80fd5b506102ee60175481565b3480156106eb575f80fd5b506103a36106fa366004612bf2565b611439565b34801561070a575f80fd5b50600b546102ce9062010000900460ff1681565b348015610729575f80fd5b506103a3610738366004612aa4565b6114ab565b348015610748575f80fd5b506102ee610757366004612c0b565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b34801561078c575f80fd5b506102ee60155481565b3480156107a1575f80fd5b506102ee60125481565b3480156107b6575f80fd5b506102ee60135481565b3480156107cb575f80fd5b506103a36107da366004612abb565b611594565b3480156107ea575f80fd5b506103a36107f9366004612bc3565b61166d565b348015610809575f80fd5b506103a3610818366004612abb565b611773565b5f61082933848461185a565b5060015b92915050565b5f61083f84848461197d565b6001600160a01b0384165f90815260046020908152604080832033808552925290912054610879918691610874908690612c56565b61185a565b5060019392505050565b5f546001600160a01b031633146108b55760405162461bcd60e51b81526004016108ac90612c69565b60405180910390fd5b600b5462010000900460ff161561090e5760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c7265616479207374617274656400000000000000000060448201526064016108ac565b600b805462ff0000191662010000908117918290556040517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7359261095b92900460ff161515815260200190565b60405180910390a1565b5f6009548211156109cb5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108ac565b5f6109d4611c25565b90506109e08184612c9e565b9392505050565b5f546001600160a01b03163314610a105760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381165f9081526006602052604090205460ff16610a775760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920496e636c75646564000000000060448201526064016108ac565b5f5b600754811015610b8857816001600160a01b031660078281548110610aa057610aa0612cbd565b5f918252602090912001546001600160a01b031603610b805760078054610ac990600190612c56565b81548110610ad957610ad9612cbd565b5f91825260209091200154600780546001600160a01b039092169183908110610b0457610b04612cbd565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600382526040808220829055600690925220805460ff191690556007805480610b5b57610b5b612cd1565b5f8281526020902081015f1990810180546001600160a01b0319169055019055610b88565b600101610a79565b506040516001600160a01b03821681527f47ab6b2d1f416edec684889dc42cd04ed7cc6c6244edaa04c4215e1077548614906020015b60405180910390a150565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610829918590610874908690612ce5565b335f8181526006602052604090205460ff1615610c735760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016108ac565b5f610c7d83611c46565b506001600160a01b0383165f90815260026020526040902054909150610ca4908290612c56565b6001600160a01b0383165f90815260026020526040902055600954610cca908290612c56565b600955600a54610cdb908490612ce5565b600a55505050565b5f546001600160a01b03163314610d0c5760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381165f9081526005602052604090205460ff1615610d745760405162461bcd60e51b815260206004820152601860248201527f416c72656179206578636c756465642066726f6d20666565000000000000000060448201526064016108ac565b6001600160a01b0381165f81815260056020908152604091829020805460ff1916600117905590519182527ff1d6512ec7550bf605a5a38910e48fb6a57938ed74a5afa01753fa023001005c9101610bbe565b5f600854831115610e1a5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108ac565b81610e33575f610e2984611c46565b50915061082d9050565b5f610e3d84611c46565b925061082d915050565b5f546001600160a01b03163314610e705760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381165f9081526006602052604090205460ff1615610ed85760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108ac565b6001600160a01b0381165f9081526002602052604090205415610f2f576001600160a01b0381165f90815260026020526040902054610f1690610965565b6001600160a01b0382165f908152600360205260409020555b6001600160a01b0381165f818152600660209081526040808320805460ff191660019081179091556007805491820181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890920180546001600160a01b0319168417905590519182527f110b1fbed46dec7bc9019c3fba97541a3d64821a824872bb7b2ad678490855bf9101610bbe565b5f546001600160a01b03163314610fed5760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381166110435760405162461bcd60e51b815260206004820152601b60248201527f46756e642077616c6c65742063616e206e6f74206265207a65726f000000000060448201526064016108ac565b601980546001600160a01b0319166001600160a01b0383169081179091556040519081527f4cb53cdee53f2d4e4e60769add356f6cbd911505806fd6c1eee38f5a6b8a257490602001610bbe565b5f546001600160a01b031633146110ba5760405162461bcd60e51b81526004016108ac90612c69565b5f83821461111b5760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206265747765656e204164647265737320616e6420746f6b604482015267195b8818dbdd5b9d60c21b60648201526084016108ac565b5f5b84811015611158575f84848381811061113857611138612cbd565b905060200201359050808361114d9190612ce5565b92505060010161111d565b50806111633361121a565b10156111b15760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e7320746f2061697264726f700000000060448201526064016108ac565b5f5b84811015611212575f8484838181106111ce576111ce612cbd565b905060200201359050611209338888858181106111ed576111ed612cbd565b90506020020160208101906112029190612abb565b835f611c7e565b506001016111b3565b505050505050565b6001600160a01b0381165f9081526006602052604081205460ff161561125557506001600160a01b03165f9081526003602052604090205490565b6001600160a01b0382165f9081526002602052604090205461082d90610965565b5f546001600160a01b0316331461129f5760405162461bcd60e51b81526004016108ac90612c69565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610829918590610874908690612c56565b5f61082933848461197d565b5f546001600160a01b031633146113525760405162461bcd60e51b81526004016108ac90612c69565b60068411156113735760405162461bcd60e51b81526004016108ac90612cf8565b60068311156113945760405162461bcd60e51b81526004016108ac90612d43565b60068211156113b55760405162461bcd60e51b81526004016108ac90612d93565b60068111156113d65760405162461bcd60e51b81526004016108ac90612ddd565b60158490556016839055601782905560188190556040805185815260208101859052908101839052606081018290527fa987db89f31df6351bb1ad3d58f4e5ef54e52c1e3389622f2b38adcf43a086ae906080015b60405180910390a150505050565b5f546001600160a01b031633146114625760405162461bcd60e51b81526004016108ac90612c69565b600b80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610bbe90831515815260200190565b5f546001600160a01b031633146114d45760405162461bcd60e51b81526004016108ac90612c69565b5f811180156114ed57506969e10de76676d08000008111155b61155f5760405162461bcd60e51b815260206004820152603960248201527f416d6f756e742073686f756c64206265206d6f7265207468616e207a65726f2060448201527f616e64206c657373207468616e203530306b20746f6b656e730000000000000060648201526084016108ac565b600c8190556040518181527fadfa8ecb21b6962ebcd0adbd9ab985b7b4c5b5eb3b0dead683171565c7bfe17190602001610bbe565b5f546001600160a01b031633146115bd5760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381165f9081526005602052604090205460ff1661161d5760405162461bcd60e51b8152602060048201526016602482015275416c7265617920696e636c7564656420696e2066656560501b60448201526064016108ac565b6001600160a01b0381165f81815260056020908152604091829020805460ff1916905590519182527f78ce087db51d01d3e32355f2d83455d5a39f99194c8d3d1c2614893695cee4429101610bbe565b5f546001600160a01b031633146116965760405162461bcd60e51b81526004016108ac90612c69565b60068411156116b75760405162461bcd60e51b81526004016108ac90612cf8565b60068311156116d85760405162461bcd60e51b81526004016108ac90612d43565b60068211156116f95760405162461bcd60e51b81526004016108ac90612d93565b600681111561171a5760405162461bcd60e51b81526004016108ac90612ddd565b60118490556012839055601382905560148190556040805185815260208101859052908101839052606081018290527f39dd28ec6ca271c82451a8ef3e1422d281febc1d63701dd827a8573ed55bd4859060800161142b565b5f546001600160a01b0316331461179c5760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381166118015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ac565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166118bc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ac565b6001600160a01b03821661191d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ac565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166119e15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108ac565b6001600160a01b038216611a435760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108ac565b5f8111611aa45760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108ac565b5f546001600160a01b0384811691161480611acb57505f546001600160a01b038381169116145b15611ae157611adc8383835f611c7e565b505050565b600b5462010000900460ff16611b395760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420737461727465642079657400000000000000000060448201526064016108ac565b5f611b433061121a565b600c5490915081108015908190611b5d5750600b5460ff16155b8015611b9b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611bae5750600b54610100900460ff165b15611bc157600c549150611bc182611ded565b6001600160a01b0385165f9081526005602052604090205460019060ff1680611c0157506001600160a01b0385165f9081526005602052604090205460ff165b15611c0957505f5b8015611c1957611c198686611e88565b61121286868684611c7e565b5f805f611c30611f1b565b9092509050611c3f8183612c9e565b9250505090565b5f805f805f80611c558761208b565b9450945094509450505f80611c6d8987878787612102565b50909a909950975050505050505050565b80611c9b57611c9b5f600d819055600e819055600f819055601055565b6001600160a01b0384165f9081526006602052604090205460ff168015611cda57506001600160a01b0383165f9081526006602052604090205460ff16155b15611cef57611cea848484612199565b611de7565b6001600160a01b0384165f9081526006602052604090205460ff16158015611d2e57506001600160a01b0383165f9081526006602052604090205460ff165b15611d3e57611cea8484846122da565b6001600160a01b0384165f9081526006602052604090205460ff16158015611d7e57506001600160a01b0383165f9081526006602052604090205460ff16155b15611d8e57611cea848484612392565b6001600160a01b0384165f9081526006602052604090205460ff168015611dcc57506001600160a01b0383165f9081526006602052604090205460ff165b15611ddc57611cea8484846123e5565b611de7848484612392565b50505050565b600b805460ff191660011790555f611e06600283612c9e565b90505f611e138284612c56565b905047611e1f83612467565b5f611e2a8247612c56565b9050611e368382612615565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600b805460ff19169055505050565b6001600160a01b038281167f00000000000000000000000000000000000000000000000000000000000000008216908114918316148115611ee057601154600d55601254600e55601354600f55601454601055611de7565b8015611f0357601554600d55601654600e55601754600f55601854601055611de7565b611de75f600d819055600e819055600f819055601055565b6009546008545f918291825b60075481101561205a578260025f60078481548110611f4857611f48612cbd565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541180611fb057508160035f60078481548110611f8a57611f8a612cbd565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b15611fc657600954600854945094505050509091565b60025f60078381548110611fdc57611fdc612cbd565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205461200a9084612c56565b925060035f6007838154811061202257612022612cbd565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546120509083612c56565b9150600101611f27565b5060085460095461206b9190612c9e565b821015612082576009546008549350935050509091565b90939092509050565b5f805f805f8061209a87612717565b90505f6120a688612732565b90505f6120b289612743565b90505f6120be8a612754565b90505f81836120cd8688612ce5565b6120d79190612ce5565b6120e19190612ce5565b90505f6120ee828d612c56565b9c959b509399509197509550919350505050565b5f805f8061210e611c25565b90505f61211b828b612e23565b90505f612128838b612e23565b90505f612135848a612e23565b90505f612142858a612e23565b90505f61214f868d612e23565b90505f818361215e8688612ce5565b6121689190612ce5565b6121729190612ce5565b90505f61217f8288612c56565b969a50959850939650505050505050955095509592505050565b5f805f805f6121a786612765565b945094509450945094505f805f6121c18988888888612102565b6001600160a01b038e165f9081526003602052604090205492955090935091506121ec908a90612c56565b6001600160a01b038c165f9081526003602090815260408083209390935560029052205461221b908490612c56565b6001600160a01b03808d165f9081526002602052604080822093909355908c168152205461224a908390612ce5565b6001600160a01b038b165f9081526002602052604090205561226b8661278f565b612276818886612847565b612280858c6128d7565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040516122c591815260200190565b60405180910390a35050505050505050505050565b5f805f805f6122e886612765565b945094509450945094505f805f6123028988888888612102565b6001600160a01b038e165f90815260026020526040902054929550909350915061232d908490612c56565b6001600160a01b03808d165f90815260026020908152604080832094909455918d16815260039091522054612363908990612ce5565b6001600160a01b038b165f9081526003602090815260408083209390935560029052205461224a908390612ce5565b5f805f805f6123a086612765565b945094509450945094505f805f6123ba8988888888612102565b6001600160a01b038e165f90815260026020526040902054929550909350915061221b908490612c56565b5f805f805f6123f386612765565b945094509450945094505f805f61240d8988888888612102565b6001600160a01b038e165f908152600360205260409020549295509093509150612438908a90612c56565b6001600160a01b038c165f9081526003602090815260408083209390935560029052205461232d908490612c56565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061249a5761249a612cbd565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612516573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253a9190612e3a565b8160018151811061254d5761254d612cbd565b60200260200101906001600160a01b031690816001600160a01b031681525050612598307f00000000000000000000000000000000000000000000000000000000000000008461185a565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906125ec9085905f90869030904290600401612e55565b5f604051808303815f87803b158015612603575f80fd5b505af1158015611212573d5f803e3d5ffd5b612640307f00000000000000000000000000000000000000000000000000000000000000008461185a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230855f806126855f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156126eb573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906127109190612ec6565b5050505050565b5f6064600d54836127289190612e23565b61082d9190612c9e565b5f6064600f54836127289190612e23565b5f6064600e54836127289190612e23565b5f6064601054836127289190612e23565b5f805f805f805f805f806127788b61208b565b939f929e50909c509a509098509650505050505050565b5f612798611c25565b90505f6127a58284612e23565b305f908152600260205260409020549091506127c2908290612ce5565b305f9081526002602090815260408083209390935560069052205460ff161561280f57305f908152600360205260409020546127ff908490612ce5565b305f908152600360205260409020555b6040518381527f3a8ab79f6d1537e459a1a8379f48a77e1ffd07dda4b16ea97074fdab5dd8bf349060200160405180910390a1505050565b5f612850611c25565b90505f61285d8284612e23565b9050808560095461286e9190612c56565b6128789190612c56565b600955600a54612889908590612ce5565b600a5560085461289a908490612c56565b6008556040518481527f56b5df500587465b57d8ce799cc562a294f136b75a13718c574d9d36bd8280589060200160405180910390a15050505050565b5f6128e0611c25565b90505f6128ed8285612e23565b6019546001600160a01b03165f90815260026020526040902054909150612915908290612ce5565b601980546001600160a01b039081165f90815260026020908152604080832095909555925490911681526006909152205460ff161561298e576019546001600160a01b03165f90815260036020526040902054612973908590612ce5565b6019546001600160a01b03165f908152600360205260409020555b6019546040518581526001600160a01b03918216918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b5f602080835283518060208501525f5b81811015612a05578581018301518582016040015282016129e9565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612a39575f80fd5b50565b5f8060408385031215612a4d575f80fd5b8235612a5881612a25565b946020939093013593505050565b5f805f60608486031215612a78575f80fd5b8335612a8381612a25565b92506020840135612a9381612a25565b929592945050506040919091013590565b5f60208284031215612ab4575f80fd5b5035919050565b5f60208284031215612acb575f80fd5b81356109e081612a25565b80358015158114612ae5575f80fd5b919050565b5f8060408385031215612afb575f80fd5b82359150612b0b60208401612ad6565b90509250929050565b5f8083601f840112612b24575f80fd5b50813567ffffffffffffffff811115612b3b575f80fd5b6020830191508360208260051b8501011115612b55575f80fd5b9250929050565b5f805f8060408587031215612b6f575f80fd5b843567ffffffffffffffff80821115612b86575f80fd5b612b9288838901612b14565b90965094506020870135915080821115612baa575f80fd5b50612bb787828801612b14565b95989497509550505050565b5f805f8060808587031215612bd6575f80fd5b5050823594602084013594506040840135936060013592509050565b5f60208284031215612c02575f80fd5b6109e082612ad6565b5f8060408385031215612c1c575f80fd5b8235612c2781612a25565b91506020830135612c3781612a25565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561082d5761082d612c42565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f82612cb857634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b8082018082111561082d5761082d612c42565b6020808252602b908201527f596f752063616e206e6f7420736574207265666c656374696f6e20746178206d60408201526a6f7265207468656e20362560a81b606082015260800190565b60208082526030908201527f596f752063616e206e6f742073657420636f696e206f7065726174696f6e202060408201526f746178206d6f7265207468656e20362560801b606082015260800190565b6020808252602a908201527f596f752063616e206e6f7420736574206c697175696469747920746178206d6f6040820152697265207468656e20362560b01b606082015260800190565b60208082526026908201527f596f752063616e206e6f7420736574206275726e2020746178206d6f7265207460408201526568656e20362560d01b606082015260800190565b808202811582820484141761082d5761082d612c42565b5f60208284031215612e4a575f80fd5b81516109e081612a25565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015612ea55784516001600160a01b031683529383019391830191600101612e80565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612ed8575f80fd5b835192506020840151915060408401519050925092509256fea264697066735822122099b6630c7eda074eeb7d086400c9941deefaffd6548fc7e6d9219706a648981764736f6c6343000818003300000000000000000000000086ff8c600c3bab0d6751bc8173db501770f8d70f

Deployed Bytecode

0x608060405260043610610262575f3560e01c806355ce3b9a1161013f578063bdf024ec116100b3578063e1662ed311610078578063e1662ed314610781578063e1eaf3bb14610796578063ea204636146107ab578063ea2f0b37146107c0578063ea7db9e5146107df578063f2fde38b146107fe575f80fd5b8063bdf024ec146106cb578063c49b9a80146106e0578063d621e813146106ff578063d7d7442f1461071e578063dd62ed3e1461073d575f80fd5b806388f820201161010457806388f82020146105f05780638da5cb5b1461062757806395d89b4114610643578063a457c2d71461066e578063a9059cbb1461068d578063b618a70d146106ac575f80fd5b806355ce3b9a14610560578063664a1ad61461057f578063672434821461059e57806370a08231146105bd578063715018a6146105dc575f80fd5b80633685d419116101d6578063463db7dd1161019b578063463db7dd1461048f57806349bd5a5e146104a45780634a74bb02146104d757806352390c02146104f55780635252a228146105145780635342acb414610529575f80fd5b80633685d419146103f457806339509351146104135780633bd5d17314610432578063437823ec146104515780634549b03914610470575f80fd5b806323b872dd1161022757806323b872dd1461035b578063281d9a7a1461037a578063293230b81461038f5780632d5624ed146103a55780632d838119146103ba578063313ce567146103d9575f80fd5b806306fdde031461026d578063095ea7b3146102af57806313114a9d146102de5780631694505e146102fc57806318160ddd14610347575f80fd5b3661026957005b5f80fd5b348015610278575f80fd5b506040805180820190915260088152674561676c6520414960c01b60208201525b6040516102a691906129d9565b60405180910390f35b3480156102ba575f80fd5b506102ce6102c9366004612a3c565b61081d565b60405190151581526020016102a6565b3480156102e9575f80fd5b50600a545b6040519081526020016102a6565b348015610307575f80fd5b5061032f7f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b6040516001600160a01b0390911681526020016102a6565b348015610352575f80fd5b506008546102ee565b348015610366575f80fd5b506102ce610375366004612a66565b610833565b348015610385575f80fd5b506102ee60145481565b34801561039a575f80fd5b506103a3610883565b005b3480156103b0575f80fd5b506102ee60185481565b3480156103c5575f80fd5b506102ee6103d4366004612aa4565b610965565b3480156103e4575f80fd5b50604051601281526020016102a6565b3480156103ff575f80fd5b506103a361040e366004612abb565b6109e7565b34801561041e575f80fd5b506102ce61042d366004612a3c565b610bc9565b34801561043d575f80fd5b506103a361044c366004612aa4565b610bff565b34801561045c575f80fd5b506103a361046b366004612abb565b610ce3565b34801561047b575f80fd5b506102ee61048a366004612aea565b610dc7565b34801561049a575f80fd5b506102ee60165481565b3480156104af575f80fd5b5061032f7f000000000000000000000000bfb7bd3637a57ba278b831a01b35210ecafa592c81565b3480156104e2575f80fd5b50600b546102ce90610100900460ff1681565b348015610500575f80fd5b506103a361050f366004612abb565b610e47565b34801561051f575f80fd5b506102ee60115481565b348015610534575f80fd5b506102ce610543366004612abb565b6001600160a01b03165f9081526005602052604090205460ff1690565b34801561056b575f80fd5b506103a361057a366004612abb565b610fc4565b34801561058a575f80fd5b5060195461032f906001600160a01b031681565b3480156105a9575f80fd5b506103a36105b8366004612b5c565b611091565b3480156105c8575f80fd5b506102ee6105d7366004612abb565b61121a565b3480156105e7575f80fd5b506103a3611276565b3480156105fb575f80fd5b506102ce61060a366004612abb565b6001600160a01b03165f9081526006602052604090205460ff1690565b348015610632575f80fd5b505f546001600160a01b031661032f565b34801561064e575f80fd5b5060408051808201909152600381526245414960e81b6020820152610299565b348015610679575f80fd5b506102ce610688366004612a3c565b6112e7565b348015610698575f80fd5b506102ce6106a7366004612a3c565b61131d565b3480156106b7575f80fd5b506103a36106c6366004612bc3565b611329565b3480156106d6575f80fd5b506102ee60175481565b3480156106eb575f80fd5b506103a36106fa366004612bf2565b611439565b34801561070a575f80fd5b50600b546102ce9062010000900460ff1681565b348015610729575f80fd5b506103a3610738366004612aa4565b6114ab565b348015610748575f80fd5b506102ee610757366004612c0b565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b34801561078c575f80fd5b506102ee60155481565b3480156107a1575f80fd5b506102ee60125481565b3480156107b6575f80fd5b506102ee60135481565b3480156107cb575f80fd5b506103a36107da366004612abb565b611594565b3480156107ea575f80fd5b506103a36107f9366004612bc3565b61166d565b348015610809575f80fd5b506103a3610818366004612abb565b611773565b5f61082933848461185a565b5060015b92915050565b5f61083f84848461197d565b6001600160a01b0384165f90815260046020908152604080832033808552925290912054610879918691610874908690612c56565b61185a565b5060019392505050565b5f546001600160a01b031633146108b55760405162461bcd60e51b81526004016108ac90612c69565b60405180910390fd5b600b5462010000900460ff161561090e5760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c7265616479207374617274656400000000000000000060448201526064016108ac565b600b805462ff0000191662010000908117918290556040517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7359261095b92900460ff161515815260200190565b60405180910390a1565b5f6009548211156109cb5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108ac565b5f6109d4611c25565b90506109e08184612c9e565b9392505050565b5f546001600160a01b03163314610a105760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381165f9081526006602052604090205460ff16610a775760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920496e636c75646564000000000060448201526064016108ac565b5f5b600754811015610b8857816001600160a01b031660078281548110610aa057610aa0612cbd565b5f918252602090912001546001600160a01b031603610b805760078054610ac990600190612c56565b81548110610ad957610ad9612cbd565b5f91825260209091200154600780546001600160a01b039092169183908110610b0457610b04612cbd565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600382526040808220829055600690925220805460ff191690556007805480610b5b57610b5b612cd1565b5f8281526020902081015f1990810180546001600160a01b0319169055019055610b88565b600101610a79565b506040516001600160a01b03821681527f47ab6b2d1f416edec684889dc42cd04ed7cc6c6244edaa04c4215e1077548614906020015b60405180910390a150565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610829918590610874908690612ce5565b335f8181526006602052604090205460ff1615610c735760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016108ac565b5f610c7d83611c46565b506001600160a01b0383165f90815260026020526040902054909150610ca4908290612c56565b6001600160a01b0383165f90815260026020526040902055600954610cca908290612c56565b600955600a54610cdb908490612ce5565b600a55505050565b5f546001600160a01b03163314610d0c5760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381165f9081526005602052604090205460ff1615610d745760405162461bcd60e51b815260206004820152601860248201527f416c72656179206578636c756465642066726f6d20666565000000000000000060448201526064016108ac565b6001600160a01b0381165f81815260056020908152604091829020805460ff1916600117905590519182527ff1d6512ec7550bf605a5a38910e48fb6a57938ed74a5afa01753fa023001005c9101610bbe565b5f600854831115610e1a5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108ac565b81610e33575f610e2984611c46565b50915061082d9050565b5f610e3d84611c46565b925061082d915050565b5f546001600160a01b03163314610e705760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381165f9081526006602052604090205460ff1615610ed85760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108ac565b6001600160a01b0381165f9081526002602052604090205415610f2f576001600160a01b0381165f90815260026020526040902054610f1690610965565b6001600160a01b0382165f908152600360205260409020555b6001600160a01b0381165f818152600660209081526040808320805460ff191660019081179091556007805491820181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890920180546001600160a01b0319168417905590519182527f110b1fbed46dec7bc9019c3fba97541a3d64821a824872bb7b2ad678490855bf9101610bbe565b5f546001600160a01b03163314610fed5760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381166110435760405162461bcd60e51b815260206004820152601b60248201527f46756e642077616c6c65742063616e206e6f74206265207a65726f000000000060448201526064016108ac565b601980546001600160a01b0319166001600160a01b0383169081179091556040519081527f4cb53cdee53f2d4e4e60769add356f6cbd911505806fd6c1eee38f5a6b8a257490602001610bbe565b5f546001600160a01b031633146110ba5760405162461bcd60e51b81526004016108ac90612c69565b5f83821461111b5760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206265747765656e204164647265737320616e6420746f6b604482015267195b8818dbdd5b9d60c21b60648201526084016108ac565b5f5b84811015611158575f84848381811061113857611138612cbd565b905060200201359050808361114d9190612ce5565b92505060010161111d565b50806111633361121a565b10156111b15760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e7320746f2061697264726f700000000060448201526064016108ac565b5f5b84811015611212575f8484838181106111ce576111ce612cbd565b905060200201359050611209338888858181106111ed576111ed612cbd565b90506020020160208101906112029190612abb565b835f611c7e565b506001016111b3565b505050505050565b6001600160a01b0381165f9081526006602052604081205460ff161561125557506001600160a01b03165f9081526003602052604090205490565b6001600160a01b0382165f9081526002602052604090205461082d90610965565b5f546001600160a01b0316331461129f5760405162461bcd60e51b81526004016108ac90612c69565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610829918590610874908690612c56565b5f61082933848461197d565b5f546001600160a01b031633146113525760405162461bcd60e51b81526004016108ac90612c69565b60068411156113735760405162461bcd60e51b81526004016108ac90612cf8565b60068311156113945760405162461bcd60e51b81526004016108ac90612d43565b60068211156113b55760405162461bcd60e51b81526004016108ac90612d93565b60068111156113d65760405162461bcd60e51b81526004016108ac90612ddd565b60158490556016839055601782905560188190556040805185815260208101859052908101839052606081018290527fa987db89f31df6351bb1ad3d58f4e5ef54e52c1e3389622f2b38adcf43a086ae906080015b60405180910390a150505050565b5f546001600160a01b031633146114625760405162461bcd60e51b81526004016108ac90612c69565b600b80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610bbe90831515815260200190565b5f546001600160a01b031633146114d45760405162461bcd60e51b81526004016108ac90612c69565b5f811180156114ed57506969e10de76676d08000008111155b61155f5760405162461bcd60e51b815260206004820152603960248201527f416d6f756e742073686f756c64206265206d6f7265207468616e207a65726f2060448201527f616e64206c657373207468616e203530306b20746f6b656e730000000000000060648201526084016108ac565b600c8190556040518181527fadfa8ecb21b6962ebcd0adbd9ab985b7b4c5b5eb3b0dead683171565c7bfe17190602001610bbe565b5f546001600160a01b031633146115bd5760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381165f9081526005602052604090205460ff1661161d5760405162461bcd60e51b8152602060048201526016602482015275416c7265617920696e636c7564656420696e2066656560501b60448201526064016108ac565b6001600160a01b0381165f81815260056020908152604091829020805460ff1916905590519182527f78ce087db51d01d3e32355f2d83455d5a39f99194c8d3d1c2614893695cee4429101610bbe565b5f546001600160a01b031633146116965760405162461bcd60e51b81526004016108ac90612c69565b60068411156116b75760405162461bcd60e51b81526004016108ac90612cf8565b60068311156116d85760405162461bcd60e51b81526004016108ac90612d43565b60068211156116f95760405162461bcd60e51b81526004016108ac90612d93565b600681111561171a5760405162461bcd60e51b81526004016108ac90612ddd565b60118490556012839055601382905560148190556040805185815260208101859052908101839052606081018290527f39dd28ec6ca271c82451a8ef3e1422d281febc1d63701dd827a8573ed55bd4859060800161142b565b5f546001600160a01b0316331461179c5760405162461bcd60e51b81526004016108ac90612c69565b6001600160a01b0381166118015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ac565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166118bc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ac565b6001600160a01b03821661191d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ac565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166119e15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108ac565b6001600160a01b038216611a435760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108ac565b5f8111611aa45760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108ac565b5f546001600160a01b0384811691161480611acb57505f546001600160a01b038381169116145b15611ae157611adc8383835f611c7e565b505050565b600b5462010000900460ff16611b395760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420737461727465642079657400000000000000000060448201526064016108ac565b5f611b433061121a565b600c5490915081108015908190611b5d5750600b5460ff16155b8015611b9b57507f000000000000000000000000bfb7bd3637a57ba278b831a01b35210ecafa592c6001600160a01b0316856001600160a01b031614155b8015611bae5750600b54610100900460ff165b15611bc157600c549150611bc182611ded565b6001600160a01b0385165f9081526005602052604090205460019060ff1680611c0157506001600160a01b0385165f9081526005602052604090205460ff165b15611c0957505f5b8015611c1957611c198686611e88565b61121286868684611c7e565b5f805f611c30611f1b565b9092509050611c3f8183612c9e565b9250505090565b5f805f805f80611c558761208b565b9450945094509450505f80611c6d8987878787612102565b50909a909950975050505050505050565b80611c9b57611c9b5f600d819055600e819055600f819055601055565b6001600160a01b0384165f9081526006602052604090205460ff168015611cda57506001600160a01b0383165f9081526006602052604090205460ff16155b15611cef57611cea848484612199565b611de7565b6001600160a01b0384165f9081526006602052604090205460ff16158015611d2e57506001600160a01b0383165f9081526006602052604090205460ff165b15611d3e57611cea8484846122da565b6001600160a01b0384165f9081526006602052604090205460ff16158015611d7e57506001600160a01b0383165f9081526006602052604090205460ff16155b15611d8e57611cea848484612392565b6001600160a01b0384165f9081526006602052604090205460ff168015611dcc57506001600160a01b0383165f9081526006602052604090205460ff165b15611ddc57611cea8484846123e5565b611de7848484612392565b50505050565b600b805460ff191660011790555f611e06600283612c9e565b90505f611e138284612c56565b905047611e1f83612467565b5f611e2a8247612c56565b9050611e368382612615565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600b805460ff19169055505050565b6001600160a01b038281167f000000000000000000000000bfb7bd3637a57ba278b831a01b35210ecafa592c8216908114918316148115611ee057601154600d55601254600e55601354600f55601454601055611de7565b8015611f0357601554600d55601654600e55601754600f55601854601055611de7565b611de75f600d819055600e819055600f819055601055565b6009546008545f918291825b60075481101561205a578260025f60078481548110611f4857611f48612cbd565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541180611fb057508160035f60078481548110611f8a57611f8a612cbd565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b15611fc657600954600854945094505050509091565b60025f60078381548110611fdc57611fdc612cbd565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205461200a9084612c56565b925060035f6007838154811061202257612022612cbd565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546120509083612c56565b9150600101611f27565b5060085460095461206b9190612c9e565b821015612082576009546008549350935050509091565b90939092509050565b5f805f805f8061209a87612717565b90505f6120a688612732565b90505f6120b289612743565b90505f6120be8a612754565b90505f81836120cd8688612ce5565b6120d79190612ce5565b6120e19190612ce5565b90505f6120ee828d612c56565b9c959b509399509197509550919350505050565b5f805f8061210e611c25565b90505f61211b828b612e23565b90505f612128838b612e23565b90505f612135848a612e23565b90505f612142858a612e23565b90505f61214f868d612e23565b90505f818361215e8688612ce5565b6121689190612ce5565b6121729190612ce5565b90505f61217f8288612c56565b969a50959850939650505050505050955095509592505050565b5f805f805f6121a786612765565b945094509450945094505f805f6121c18988888888612102565b6001600160a01b038e165f9081526003602052604090205492955090935091506121ec908a90612c56565b6001600160a01b038c165f9081526003602090815260408083209390935560029052205461221b908490612c56565b6001600160a01b03808d165f9081526002602052604080822093909355908c168152205461224a908390612ce5565b6001600160a01b038b165f9081526002602052604090205561226b8661278f565b612276818886612847565b612280858c6128d7565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040516122c591815260200190565b60405180910390a35050505050505050505050565b5f805f805f6122e886612765565b945094509450945094505f805f6123028988888888612102565b6001600160a01b038e165f90815260026020526040902054929550909350915061232d908490612c56565b6001600160a01b03808d165f90815260026020908152604080832094909455918d16815260039091522054612363908990612ce5565b6001600160a01b038b165f9081526003602090815260408083209390935560029052205461224a908390612ce5565b5f805f805f6123a086612765565b945094509450945094505f805f6123ba8988888888612102565b6001600160a01b038e165f90815260026020526040902054929550909350915061221b908490612c56565b5f805f805f6123f386612765565b945094509450945094505f805f61240d8988888888612102565b6001600160a01b038e165f908152600360205260409020549295509093509150612438908a90612c56565b6001600160a01b038c165f9081526003602090815260408083209390935560029052205461232d908490612c56565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061249a5761249a612cbd565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612516573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253a9190612e3a565b8160018151811061254d5761254d612cbd565b60200260200101906001600160a01b031690816001600160a01b031681525050612598307f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad248461185a565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24169063791ac947906125ec9085905f90869030904290600401612e55565b5f604051808303815f87803b158015612603575f80fd5b505af1158015611212573d5f803e3d5ffd5b612640307f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad248461185a565b7f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663f305d7198230855f806126855f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156126eb573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906127109190612ec6565b5050505050565b5f6064600d54836127289190612e23565b61082d9190612c9e565b5f6064600f54836127289190612e23565b5f6064600e54836127289190612e23565b5f6064601054836127289190612e23565b5f805f805f805f805f806127788b61208b565b939f929e50909c509a509098509650505050505050565b5f612798611c25565b90505f6127a58284612e23565b305f908152600260205260409020549091506127c2908290612ce5565b305f9081526002602090815260408083209390935560069052205460ff161561280f57305f908152600360205260409020546127ff908490612ce5565b305f908152600360205260409020555b6040518381527f3a8ab79f6d1537e459a1a8379f48a77e1ffd07dda4b16ea97074fdab5dd8bf349060200160405180910390a1505050565b5f612850611c25565b90505f61285d8284612e23565b9050808560095461286e9190612c56565b6128789190612c56565b600955600a54612889908590612ce5565b600a5560085461289a908490612c56565b6008556040518481527f56b5df500587465b57d8ce799cc562a294f136b75a13718c574d9d36bd8280589060200160405180910390a15050505050565b5f6128e0611c25565b90505f6128ed8285612e23565b6019546001600160a01b03165f90815260026020526040902054909150612915908290612ce5565b601980546001600160a01b039081165f90815260026020908152604080832095909555925490911681526006909152205460ff161561298e576019546001600160a01b03165f90815260036020526040902054612973908590612ce5565b6019546001600160a01b03165f908152600360205260409020555b6019546040518581526001600160a01b03918216918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b5f602080835283518060208501525f5b81811015612a05578581018301518582016040015282016129e9565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612a39575f80fd5b50565b5f8060408385031215612a4d575f80fd5b8235612a5881612a25565b946020939093013593505050565b5f805f60608486031215612a78575f80fd5b8335612a8381612a25565b92506020840135612a9381612a25565b929592945050506040919091013590565b5f60208284031215612ab4575f80fd5b5035919050565b5f60208284031215612acb575f80fd5b81356109e081612a25565b80358015158114612ae5575f80fd5b919050565b5f8060408385031215612afb575f80fd5b82359150612b0b60208401612ad6565b90509250929050565b5f8083601f840112612b24575f80fd5b50813567ffffffffffffffff811115612b3b575f80fd5b6020830191508360208260051b8501011115612b55575f80fd5b9250929050565b5f805f8060408587031215612b6f575f80fd5b843567ffffffffffffffff80821115612b86575f80fd5b612b9288838901612b14565b90965094506020870135915080821115612baa575f80fd5b50612bb787828801612b14565b95989497509550505050565b5f805f8060808587031215612bd6575f80fd5b5050823594602084013594506040840135936060013592509050565b5f60208284031215612c02575f80fd5b6109e082612ad6565b5f8060408385031215612c1c575f80fd5b8235612c2781612a25565b91506020830135612c3781612a25565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561082d5761082d612c42565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f82612cb857634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b8082018082111561082d5761082d612c42565b6020808252602b908201527f596f752063616e206e6f7420736574207265666c656374696f6e20746178206d60408201526a6f7265207468656e20362560a81b606082015260800190565b60208082526030908201527f596f752063616e206e6f742073657420636f696e206f7065726174696f6e202060408201526f746178206d6f7265207468656e20362560801b606082015260800190565b6020808252602a908201527f596f752063616e206e6f7420736574206c697175696469747920746178206d6f6040820152697265207468656e20362560b01b606082015260800190565b60208082526026908201527f596f752063616e206e6f7420736574206275726e2020746178206d6f7265207460408201526568656e20362560d01b606082015260800190565b808202811582820484141761082d5761082d612c42565b5f60208284031215612e4a575f80fd5b81516109e081612a25565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015612ea55784516001600160a01b031683529383019391830191600101612e80565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612ed8575f80fd5b835192506020840151915060408401519050925092509256fea264697066735822122099b6630c7eda074eeb7d086400c9941deefaffd6548fc7e6d9219706a648981764736f6c63430008180033

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

00000000000000000000000086ff8c600c3bab0d6751bc8173db501770f8d70f

-----Decoded View---------------
Arg [0] : wallet (address): 0x86Ff8c600c3bAB0D6751Bc8173Db501770F8D70f

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000086ff8c600c3bab0d6751bc8173db501770f8d70f


Deployed Bytecode Sourcemap

12855:50366:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16932:84;;;;;;;;;;-1:-1:-1;17004:4:0;;;;;;;;;;;;-1:-1:-1;;;17004:4:0;;;;16932:84;;;;;;;:::i;:::-;;;;;;;;20686:161;;;;;;;;;;-1:-1:-1;20686:161:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;20686:161:0;1023:187:1;24141:89:0;;;;;;;;;;-1:-1:-1;24212:10:0;;24141:89;;;1361:25:1;;;1349:2;1334:18;24141:89:0;1215:177:1;13574:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1587:32:1;;;1569:51;;1557:2;1542:18;13574:51:0;1397:229:1;18070:97:0;;;;;;;;;;-1:-1:-1;18152:7:0;;18070:97;;21475:266;;;;;;;;;;-1:-1:-1;21475:266:0;;;;;:::i;:::-;;:::i;14131:31::-;;;;;;;;;;;;;;;;46112:183;;;;;;;;;;;;;:::i;:::-;;14324:32;;;;;;;;;;;;;;;;26522:250;;;;;;;;;;-1:-1:-1;26522:250:0;;;;;:::i;:::-;;:::i;17788:84::-;;;;;;;;;;-1:-1:-1;17788:84:0;;13563:2;2419:36:1;;2407:2;2392:18;17788:84:0;2277:184:1;28209:520:0;;;;;;;;;;-1:-1:-1;28209:520:0;;;;;:::i;:::-;;:::i;22263:215::-;;;;;;;;;;-1:-1:-1;22263:215:0;;;;;:::i;:::-;;:::i;24609:359::-;;;;;;;;;;-1:-1:-1;24609:359:0;;;;;:::i;:::-;;:::i;30711:228::-;;;;;;;;;;-1:-1:-1;30711:228:0;;;;;:::i;:::-;;:::i;25616:430::-;;;;;;;;;;-1:-1:-1;25616:430:0;;;;;:::i;:::-;;:::i;14237:37::-;;;;;;;;;;;;;;;;13632:38;;;;;;;;;;;;;;;13711:40;;;;;;;;;;-1:-1:-1;13711:40:0;;;;;;;;;;;27131:378;;;;;;;;;;-1:-1:-1;27131:378:0;;;;;:::i;:::-;;:::i;14006:33::-;;;;;;;;;;;;;;;;44845:125;;;;;;;;;;-1:-1:-1;44845:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;44935:27:0;44911:4;44935:27;;;:18;:27;;;;;;;;;44845:125;31863:196;;;;;;;;;;-1:-1:-1;31863:196:0;;;;;:::i;:::-;;:::i;14392:25::-;;;;;;;;;;-1:-1:-1;14392:25:0;;;;-1:-1:-1;;;;;14392:25:0;;;51557:632;;;;;;;;;;-1:-1:-1;51557:632:0;;;;;:::i;:::-;;:::i;18672:222::-;;;;;;;;;;-1:-1:-1;18672:222:0;;;;;:::i;:::-;;:::i;6479:148::-;;;;;;;;;;;;;:::i;23673:122::-;;;;;;;;;;-1:-1:-1;23673:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;23767:20:0;23743:4;23767:20;;;:11;:20;;;;;;;;;23673:122;5836:79;;;;;;;;;;-1:-1:-1;5874:7:0;5901:6;-1:-1:-1;;;;;5901:6:0;5836:79;;17320:88;;;;;;;;;;-1:-1:-1;17394:6:0;;;;;;;;;;;;-1:-1:-1;;;17394:6:0;;;;17320:88;;22997:225;;;;;;;;;;-1:-1:-1;22997:225:0;;;;;:::i;:::-;;:::i;19353:169::-;;;;;;;;;;-1:-1:-1;19353:169:0;;;;;:::i;:::-;;:::i;48425:781::-;;;;;;;;;;-1:-1:-1;48425:781:0;;;;;:::i;:::-;;:::i;14281:36::-;;;;;;;;;;;;;;;;32586:170;;;;;;;;;;-1:-1:-1;32586:170:0;;;;;:::i;:::-;;:::i;13758:24::-;;;;;;;;;;-1:-1:-1;13758:24:0;;;;;;;;;;;33357:279;;;;;;;;;;-1:-1:-1;33357:279:0;;;;;:::i;:::-;;:::i;20062:145::-;;;;;;;;;;-1:-1:-1;20062:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;20172:18:0;;;20145:7;20172:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20062:145;14196:34;;;;;;;;;;;;;;;;14046:36;;;;;;;;;;;;;;;;14089:35;;;;;;;;;;;;;;;;31300:222;;;;;;;;;;-1:-1:-1;31300:222:0;;;;;:::i;:::-;;:::i;46969:778::-;;;;;;;;;;-1:-1:-1;46969:778:0;;;;;:::i;:::-;;:::i;6782:244::-;;;;;;;;;;-1:-1:-1;6782:244:0;;;;;:::i;:::-;;:::i;20686:161::-;20761:4;20778:39;4463:10;20801:7;20810:6;20778:8;:39::i;:::-;-1:-1:-1;20835:4:0;20686:161;;;;;:::o;21475:266::-;21575:4;21592:36;21602:6;21610:9;21621:6;21592:9;:36::i;:::-;-1:-1:-1;;;;;21670:19:0;;;;;;:11;:19;;;;;;;;4463:10;21670:33;;;;;;;;;21639:72;;21648:6;;21670:40;;21704:6;;21670:40;:::i;:::-;21639:8;:72::i;:::-;-1:-1:-1;21729:4:0;21475:266;;;;;:::o;46112:183::-;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;;;;;;;;;46176:12:::1;::::0;;;::::1;;;46175:13;46167:48;;;::::0;-1:-1:-1;;;46167:48:0;;6290:2:1;46167:48:0::1;::::0;::::1;6272:21:1::0;6329:2;6309:18;;;6302:30;6368:25;6348:18;;;6341:53;6411:18;;46167:48:0::1;6088:347:1::0;46167:48:0::1;46226:12;:19:::0;;-1:-1:-1;;46226:19:0::1;::::0;;;::::1;::::0;;;;46261:26:::1;::::0;::::1;::::0;::::1;::::0;46274:12;::::1;46226:19;46274:12;1188:14:1::0;1181:22;1163:41;;1151:2;1136:18;;1023:187;46261:26:0::1;;;;;;;;46112:183::o:0;26522:250::-;26588:7;26627;;26616;:18;;26608:73;;;;-1:-1:-1;;;26608:73:0;;6642:2:1;26608:73:0;;;6624:21:1;6681:2;6661:18;;;6654:30;6720:34;6700:18;;;6693:62;-1:-1:-1;;;6771:18:1;;;6764:40;6821:19;;26608:73:0;6440:406:1;26608:73:0;26692:19;26715:10;:8;:10::i;:::-;26692:33;-1:-1:-1;26743:21:0;26692:33;26743:7;:21;:::i;:::-;26736:28;26522:250;-1:-1:-1;;;26522:250:0:o;28209:520::-;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28291:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;28283:60;;;::::0;-1:-1:-1;;;28283:60:0;;7275:2:1;28283:60:0::1;::::0;::::1;7257:21:1::0;7314:2;7294:18;;;7287:30;7353:29;7333:18;;;7326:57;7400:18;;28283:60:0::1;7073:351:1::0;28283:60:0::1;28359:9;28354:327;28378:9;:16:::0;28374:20;::::1;28354:327;;;28436:7;-1:-1:-1::0;;;;;28420:23:0::1;:9;28430:1;28420:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;28420:12:0::1;:23:::0;28416:254:::1;;28479:9;28489:16:::0;;:20:::1;::::0;28508:1:::1;::::0;28489:20:::1;:::i;:::-;28479:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;28464:9:::1;:12:::0;;-1:-1:-1;;;;;28479:31:0;;::::1;::::0;28474:1;;28464:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;28464:46:0::1;-1:-1:-1::0;;;;;28464:46:0;;::::1;;::::0;;28529:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;28568:11:::1;:20:::0;;;;:28;;-1:-1:-1;;28568:28:0::1;::::0;;28615:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;28615:15:0;;;;;-1:-1:-1;;;;;;28615:15:0::1;::::0;;;;;28649:5:::1;;28416:254;28396:3;;28354:327;;;-1:-1:-1::0;28696:25:0::1;::::0;-1:-1:-1;;;;;1587:32:1;;1569:51;;28696:25:0::1;::::0;1557:2:1;1542:18;28696:25:0::1;;;;;;;;28209:520:::0;:::o;22263:215::-;4463:10;22353:4;22402:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22402:34:0;;;;;;;;;;22353:4;;22370:78;;22393:7;;22402:45;;22437:10;;22402:45;:::i;24609:359::-;4463:10;24663:14;24712:19;;;:11;:19;;;;;;;;24711:20;24703:77;;;;-1:-1:-1;;;24703:77:0;;8025:2:1;24703:77:0;;;8007:21:1;8064:2;8044:18;;;8037:30;8103:34;8083:18;;;8076:62;-1:-1:-1;;;8154:18:1;;;8147:42;8206:19;;24703:77:0;7823:408:1;24703:77:0;24792:15;24812:18;24822:7;24812:9;:18::i;:::-;-1:-1:-1;;;;;;24859:15:0;;;;;;:7;:15;;;;;;24791:39;;-1:-1:-1;24859:23:0;;24791:39;;24859:23;:::i;:::-;-1:-1:-1;;;;;24841:15:0;;;;;;:7;:15;;;;;:41;24903:7;;:15;;24911:7;;24903:15;:::i;:::-;24893:7;:25;24942:10;;:18;;24953:7;;24942:18;:::i;:::-;24929:10;:31;-1:-1:-1;;;24609:359:0:o;30711:228::-;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30791:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;30790:28;30782:64;;;::::0;-1:-1:-1;;;30782:64:0;;8438:2:1;30782:64:0::1;::::0;::::1;8420:21:1::0;8477:2;8457:18;;;8450:30;8516:26;8496:18;;;8489:54;8560:18;;30782:64:0::1;8236:348:1::0;30782:64:0::1;-1:-1:-1::0;;;;;30857:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;30857:34:0::1;30887:4;30857:34;::::0;;30907:24;;1569:51:1;;;30907:24:0::1;::::0;1542:18:1;30907:24:0::1;1397:229:1::0;25616:430:0;25708:7;25747;;25736;:18;;25728:62;;;;-1:-1:-1;;;25728:62:0;;8791:2:1;25728:62:0;;;8773:21:1;8830:2;8810:18;;;8803:30;8869:33;8849:18;;;8842:61;8920:18;;25728:62:0;8589:355:1;25728:62:0;25806:17;25801:238;;25841:15;25861:18;25871:7;25861:9;:18::i;:::-;-1:-1:-1;25840:39:0;-1:-1:-1;25895:14:0;;-1:-1:-1;25895:14:0;25801:238;25944:23;25971:18;25981:7;25971:9;:18::i;:::-;25942:47;-1:-1:-1;26005:22:0;;-1:-1:-1;;26005:22:0;27131:378;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27216:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;27215:21;27207:61;;;::::0;-1:-1:-1;;;27207:61:0;;9151:2:1;27207:61:0::1;::::0;::::1;9133:21:1::0;9190:2;9170:18;;;9163:30;9229:29;9209:18;;;9202:57;9276:18;;27207:61:0::1;8949:351:1::0;27207:61:0::1;-1:-1:-1::0;;;;;27282:16:0;::::1;27301:1;27282:16:::0;;;:7:::1;:16;::::0;;;;;:20;27279:108:::1;;-1:-1:-1::0;;;;;27358:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;27338:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;27319:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;27279:108:::1;-1:-1:-1::0;;;;;27397:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;;;:27;;-1:-1:-1;;27397:27:0::1;27420:4;27397:27:::0;;::::1;::::0;;;27435:9:::1;:23:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;27435:23:0::1;::::0;::::1;::::0;;27474:27;;1569:51:1;;;27474:27:0::1;::::0;1542:18:1;27474:27:0::1;1397:229:1::0;31863:196:0;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31936:20:0;::::1;31928:59;;;::::0;-1:-1:-1;;;31928:59:0;;9507:2:1;31928:59:0::1;::::0;::::1;9489:21:1::0;9546:2;9526:18;;;9519:30;9585:29;9565:18;;;9558:57;9632:18;;31928:59:0::1;9305:351:1::0;31928:59:0::1;31995:10;:19:::0;;-1:-1:-1;;;;;;31995:19:0::1;-1:-1:-1::0;;;;;31995:19:0;::::1;::::0;;::::1;::::0;;;32027:24:::1;::::0;1569:51:1;;;32027:24:0::1;::::0;1557:2:1;1542:18;32027:24:0::1;1397:229:1::0;51557:632:0;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;51658:19:::1;51700:33:::0;;::::1;51692:85;;;::::0;-1:-1:-1;;;51692:85:0;;9863:2:1;51692:85:0::1;::::0;::::1;9845:21:1::0;9902:2;9882:18;;;9875:30;9941:34;9921:18;;;9914:62;-1:-1:-1;;;9992:18:1;;;9985:38;10040:19;;51692:85:0::1;9661:404:1::0;51692:85:0::1;51792:6;51788:139;51802:20:::0;;::::1;51788:139;;;51843:11;51857:6;;51864:1;51857:9;;;;;;;:::i;:::-;;;;;;;51843:23;;51909:6;51895:11;:20;;;;:::i;:::-;51881:34:::0;-1:-1:-1;;51824:3:0::1;;51788:139;;;;51970:11;51945:21;51955:10;51945:9;:21::i;:::-;:36;;51937:77;;;::::0;-1:-1:-1;;;51937:77:0;;10272:2:1;51937:77:0::1;::::0;::::1;10254:21:1::0;10311:2;10291:18;;;10284:30;10350;10330:18;;;10323:58;10398:18;;51937:77:0::1;10070:352:1::0;51937:77:0::1;52029:6;52025:157;52039:20:::0;;::::1;52025:157;;;52080:11;52094:6;;52101:1;52094:9;;;;;;;:::i;:::-;;;;;;;52080:23;;52118:52;52133:10;52144:9;;52154:1;52144:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52157:6;52164:5;52118:14;:52::i;:::-;-1:-1:-1::0;52061:3:0::1;;52025:157;;;;51647:542;51557:632:::0;;;;:::o;18672:222::-;-1:-1:-1;;;;;18762:20:0;;18738:7;18762:20;;;:11;:20;;;;;;;;18758:49;;;-1:-1:-1;;;;;;18791:16:0;;;;;:7;:16;;;;;;;18672:222::o;18758:49::-;-1:-1:-1;;;;;18855:16:0;;;;;;:7;:16;;;;;;18835:37;;:19;:37::i;6479:148::-;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;6586:1:::1;6570:6:::0;;6549:40:::1;::::0;-1:-1:-1;;;;;6570:6:0;;::::1;::::0;6549:40:::1;::::0;6586:1;;6549:40:::1;6617:1;6600:19:::0;;-1:-1:-1;;;;;;6600:19:0::1;::::0;;6479:148::o;22997:225::-;4463:10;23092:4;23141:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;23141:34:0;;;;;;;;;;23092:4;;23109:83;;23132:7;;23141:50;;23176:15;;23141:50;:::i;19353:169::-;19433:4;19450:42;4463:10;19474:9;19485:6;19450:9;:42::i;48425:781::-;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;48606:1:::1;48585:17;:22;;48577:77;;;;-1:-1:-1::0;;;48577:77:0::1;;;;;;;:::i;:::-;48694:1;48673:17;:22;;48665:82;;;;-1:-1:-1::0;;;48665:82:0::1;;;;;;;:::i;:::-;48785:1;48766:15;:20;;48758:74;;;;-1:-1:-1::0;;;48758:74:0::1;;;;;;;:::i;:::-;48865:1;48851:10;:15;;48843:65;;;;-1:-1:-1::0;;;48843:65:0::1;;;;;;;:::i;:::-;48919:17;:37:::0;;;48967:20:::1;:40:::0;;;49018:19:::1;:37:::0;;;49066:14:::1;:27:::0;;;49109:89:::1;::::0;;12305:25:1;;;12361:2;12346:18;;12339:34;;;12389:18;;;12382:34;;;12447:2;12432:18;;12425:34;;;49109:89:0::1;::::0;12292:3:1;12277:19;49109:89:0::1;;;;;;;;48425:781:::0;;;;:::o;32586:170::-;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;32664:21:::1;:31:::0;;;::::1;;;;-1:-1:-1::0;;32664:31:0;;::::1;;::::0;;32711:37:::1;::::0;::::1;::::0;::::1;::::0;32688:7;1188:14:1;1181:22;1163:41;;1151:2;1136:18;;1023:187;33357:279:0;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;33445:1:::1;33436:6;:10;:42;;;;;33460:18;33450:6;:28;;33436:42;33428:111;;;::::0;-1:-1:-1;;;33428:111:0;;12672:2:1;33428:111:0::1;::::0;::::1;12654:21:1::0;12711:2;12691:18;;;12684:30;12750:34;12730:18;;;12723:62;12821:27;12801:18;;;12794:55;12866:19;;33428:111:0::1;12470:421:1::0;33428:111:0::1;33550:29;:38:::0;;;33604:24:::1;::::0;1361:25:1;;;33604:24:0::1;::::0;1349:2:1;1334:18;33604:24:0::1;1215:177:1::0;31300:222:0;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31377:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;31369:61;;;::::0;-1:-1:-1;;;31369:61:0;;13098:2:1;31369:61:0::1;::::0;::::1;13080:21:1::0;13137:2;13117:18;;;13110:30;-1:-1:-1;;;13156:18:1;;;13149:52;13218:18;;31369:61:0::1;12896:346:1::0;31369:61:0::1;-1:-1:-1::0;;;;;31441:27:0;::::1;31471:5;31441:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;31441:35:0::1;::::0;;31492:22;;1569:51:1;;;31492:22:0::1;::::0;1542:18:1;31492:22:0::1;1397:229:1::0;46969:778:0;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;47149:1:::1;47128:17;:22;;47120:77;;;;-1:-1:-1::0;;;47120:77:0::1;;;;;;;:::i;:::-;47237:1;47216:17;:22;;47208:82;;;;-1:-1:-1::0;;;47208:82:0::1;;;;;;;:::i;:::-;47328:1;47309:15;:20;;47301:74;;;;-1:-1:-1::0;;;47301:74:0::1;;;;;;;:::i;:::-;47408:1;47394:10;:15;;47386:65;;;;-1:-1:-1::0;;;47386:65:0::1;;;;;;;:::i;:::-;47469:16;:36:::0;;;47516:19:::1;:39:::0;;;47566:18:::1;:36:::0;;;47613:13:::1;:26:::0;;;47655:84:::1;::::0;;12305:25:1;;;12361:2;12346:18;;12339:34;;;12389:18;;;12382:34;;;12447:2;12432:18;;12425:34;;;47655:84:0::1;::::0;12292:3:1;12277:19;47655:84:0::1;12074:391:1::0;6782:244:0;6048:6;;-1:-1:-1;;;;;6048:6:0;4463:10;6048:22;6040:67;;;;-1:-1:-1;;;6040:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6871:22:0;::::1;6863:73;;;::::0;-1:-1:-1;;;6863:73:0;;13449:2:1;6863:73:0::1;::::0;::::1;13431:21:1::0;13488:2;13468:18;;;13461:30;13527:34;13507:18;;;13500:62;-1:-1:-1;;;13578:18:1;;;13571:36;13624:19;;6863:73:0::1;13247:402:1::0;6863:73:0::1;6973:6;::::0;;6952:38:::1;::::0;-1:-1:-1;;;;;6952:38:0;;::::1;::::0;6973:6;::::1;::::0;6952:38:::1;::::0;::::1;7001:6;:17:::0;;-1:-1:-1;;;;;;7001:17:0::1;-1:-1:-1::0;;;;;7001:17:0;;;::::1;::::0;;;::::1;::::0;;6782:244::o;45646:337::-;-1:-1:-1;;;;;45739:19:0;;45731:68;;;;-1:-1:-1;;;45731:68:0;;13856:2:1;45731:68:0;;;13838:21:1;13895:2;13875:18;;;13868:30;13934:34;13914:18;;;13907:62;-1:-1:-1;;;13985:18:1;;;13978:34;14029:19;;45731:68:0;13654:400:1;45731:68:0;-1:-1:-1;;;;;45818:21:0;;45810:68;;;;-1:-1:-1;;;45810:68:0;;14261:2:1;45810:68:0;;;14243:21:1;14300:2;14280:18;;;14273:30;14339:34;14319:18;;;14312:62;-1:-1:-1;;;14390:18:1;;;14383:32;14432:19;;45810:68:0;14059:398:1;45810:68:0;-1:-1:-1;;;;;45891:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;45943:32;;1361:25:1;;;45943:32:0;;1334:18:1;45943:32:0;;;;;;;45646:337;;;:::o;50064:1485::-;-1:-1:-1;;;;;50154:18:0;;50146:68;;;;-1:-1:-1;;;50146:68:0;;14664:2:1;50146:68:0;;;14646:21:1;14703:2;14683:18;;;14676:30;14742:34;14722:18;;;14715:62;-1:-1:-1;;;14793:18:1;;;14786:35;14838:19;;50146:68:0;14462:401:1;50146:68:0;-1:-1:-1;;;;;50233:16:0;;50225:64;;;;-1:-1:-1;;;50225:64:0;;15070:2:1;50225:64:0;;;15052:21:1;15109:2;15089:18;;;15082:30;15148:34;15128:18;;;15121:62;-1:-1:-1;;;15199:18:1;;;15192:33;15242:19;;50225:64:0;14868:399:1;50225:64:0;50317:1;50308:6;:10;50300:64;;;;-1:-1:-1;;;50300:64:0;;15474:2:1;50300:64:0;;;15456:21:1;15513:2;15493:18;;;15486:30;15552:34;15532:18;;;15525:62;-1:-1:-1;;;15603:18:1;;;15596:39;15652:19;;50300:64:0;15272:405:1;50300:64:0;5874:7;5901:6;-1:-1:-1;;;;;50381:15:0;;;5901:6;;50381:15;;:32;;-1:-1:-1;5874:7:0;5901:6;-1:-1:-1;;;;;50400:13:0;;;5901:6;;50400:13;50381:32;50377:121;;;50429:36;50444:4;50449:2;50452:6;50459:5;50429:14;:36::i;:::-;50064:1485;;;:::o;50377:121::-;50518:12;;;;;;;50510:47;;;;-1:-1:-1;;;50510:47:0;;15884:2:1;50510:47:0;;;15866:21:1;15923:2;15903:18;;;15896:30;15962:25;15942:18;;;15935:53;16005:18;;50510:47:0;15682:347:1;50510:47:0;50580:28;50611:24;50629:4;50611:9;:24::i;:::-;50707:29;;50580:55;;-1:-1:-1;50683:53:0;;;;;;;50765;;-1:-1:-1;50802:16:0;;;;50801:17;50765:53;:91;;;;;50843:13;-1:-1:-1;;;;;50835:21:0;:4;-1:-1:-1;;;;;50835:21:0;;;50765:91;:129;;;;-1:-1:-1;50873:21:0;;;;;;;50765:129;50747:318;;;50944:29;;50921:52;;51017:36;51032:20;51017:14;:36::i;:::-;-1:-1:-1;;;;;51273:24:0;;51146:12;51273:24;;;:18;:24;;;;;;51161:4;;51273:24;;;:50;;-1:-1:-1;;;;;;51301:22:0;;;;;;:18;:22;;;;;;;;51273:50;51270:96;;;-1:-1:-1;51349:5:0;51270:96;51455:7;51452:41;;;51473:20;51485:4;51490:2;51473:11;:20::i;:::-;51503:38;51518:4;51523:2;51526:6;51533:7;51503:14;:38::i;41146:160::-;41187:7;41208:15;41225;41244:19;:17;:19::i;:::-;41207:56;;-1:-1:-1;41207:56:0;-1:-1:-1;41281:17:0;41207:56;;41281:17;:::i;:::-;41274:24;;;;41146:160;:::o;37602:356::-;37659:7;37668;37690:12;37704:18;37724:22;37748:13;37765:20;37777:7;37765:11;:20::i;:::-;37687:98;;;;;;;;;37797:15;37814:23;37842:61;37854:7;37863:4;37869:10;37881:14;37897:5;37842:11;:61::i;:::-;-1:-1:-1;37796:107:0;;;;-1:-1:-1;37602:356:0;-1:-1:-1;;;;;;;;37602:356:0:o;58218:792::-;58329:7;58325:40;;58351:14;44736:1;44725:6;:12;;;44752:13;:17;;;44784:8;:12;;;44811:4;:8;44681:148;58351:14;-1:-1:-1;;;;;58392:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;58416:22:0;;;;;;:11;:22;;;;;;;;58415:23;58392:46;58388:597;;;58455:48;58477:6;58485:9;58496:6;58455:21;:48::i;:::-;58388:597;;;-1:-1:-1;;;;;58526:19:0;;;;;;:11;:19;;;;;;;;58525:20;:46;;;;-1:-1:-1;;;;;;58549:22:0;;;;;;:11;:22;;;;;;;;58525:46;58521:464;;;58588:46;58608:6;58616:9;58627:6;58588:19;:46::i;58521:464::-;-1:-1:-1;;;;;58657:19:0;;;;;;:11;:19;;;;;;;;58656:20;:47;;;;-1:-1:-1;;;;;;58681:22:0;;;;;;:11;:22;;;;;;;;58680:23;58656:47;58652:333;;;58720:44;58738:6;58746:9;58757:6;58720:17;:44::i;58652:333::-;-1:-1:-1;;;;;58786:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;58809:22:0;;;;;;:11;:22;;;;;;;;58786:45;58782:203;;;58848:48;58870:6;58878:9;58889:6;58848:21;:48::i;58782:203::-;58929:44;58947:6;58955:9;58966:6;58929:17;:44::i;:::-;58218:792;;;;:::o;54260:971::-;15331:16;:23;;-1:-1:-1;;15331:23:0;15350:4;15331:23;;;:16;54411:24:::1;54434:1;54411:20:::0;:24:::1;:::i;:::-;54396:39:::0;-1:-1:-1;54446:17:0::1;54466:27;54396:39:::0;54466:20;:27:::1;:::i;:::-;54446:47:::0;-1:-1:-1;54796:21:0::1;54862:22;54879:4:::0;54862:16:::1;:22::i;:::-;55010:18;55031:38;55055:14:::0;55031:21:::1;:38;:::i;:::-;55010:59;;55119:35;55132:9;55143:10;55119:12;:35::i;:::-;55180:43;::::0;;16236:25:1;;;16292:2;16277:18;;16270:34;;;16320:18;;;16313:34;;;55180:43:0::1;::::0;16224:2:1;16209:18;55180:43:0::1;;;;;;;-1:-1:-1::0;;15377:16:0;:24;;-1:-1:-1;;15377:24:0;;;-1:-1:-1;;;54260:971:0:o;52918:751::-;-1:-1:-1;;;;;53030:21:0;;;53038:13;53030:21;;;;;;53076:19;;;53112:550;;;;53153:16;;53142:6;:27;53206:19;;53190:13;:35;53257:18;;53246:8;:29;53303:13;;53296:4;:20;53112:550;;;53364:6;53360:302;;;53396:17;;53387:6;:26;53449:20;;53433:13;:36;53500:19;;53489:8;:30;53546:14;;53539:4;:21;53360:302;;;53632:14;44736:1;44725:6;:12;;;44752:13;:17;;;44784:8;:12;;;44811:4;:8;44681:148;41570:552;41667:7;;41703;;41620;;;;;41727:283;41751:9;:16;41747:20;;41727:283;;;41817:7;41793;:21;41801:9;41811:1;41801:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41801:12:0;41793:21;;;;;;;;;;;;;:31;;:66;;;41852:7;41828;:21;41836:9;41846:1;41836:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41836:12:0;41828:21;;;;;;;;;;;;;:31;41793:66;41789:97;;;41869:7;;41878;;41861:25;;;;;;;41570:552;;:::o;41789:97::-;41921:7;:21;41929:9;41939:1;41929:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41929:12:0;41921:21;;;;;;;;;;;;;41911:31;;:7;:31;:::i;:::-;41901:41;;41977:7;:21;41985:9;41995:1;41985:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41985:12:0;41977:21;;;;;;;;;;;;;41967:31;;:7;:31;:::i;:::-;41957:41;-1:-1:-1;41769:3:0;;41727:283;;;;42044:7;;42034;;:17;;;;:::i;:::-;42024:7;:27;42020:58;;;42061:7;;42070;;42053:25;;;;;;41570:552;;:::o;42020:58::-;42097:7;;42106;;-1:-1:-1;41570:552:0;-1:-1:-1;41570:552:0:o;38768:547::-;38828:7;38837;38846;38855;38864;38884:12;38899:24;38915:7;38899:15;:24::i;:::-;38884:39;;38934:18;38955:30;38977:7;38955:21;:30::i;:::-;38934:51;;38996:22;39021:35;39048:7;39021:26;:35::i;:::-;38996:60;;39067:13;39083:25;39100:7;39083:16;:25::i;:::-;39067:41;-1:-1:-1;39119:14:0;39067:41;39156:14;39136:17;39143:10;39136:4;:17;:::i;:::-;:34;;;;:::i;:::-;:42;;;;:::i;:::-;39119:59;-1:-1:-1;39189:23:0;39215:16;39119:59;39215:7;:16;:::i;:::-;39189:42;39267:4;;-1:-1:-1;39273:10:0;;-1:-1:-1;39285:14:0;;-1:-1:-1;39285:14:0;-1:-1:-1;38768:547:0;;-1:-1:-1;;;;38768:547:0:o;40279:644::-;40412:7;40421;40430;40450:19;40472:10;:8;:10::i;:::-;40450:32;-1:-1:-1;40493:15:0;40511:21;40450:32;40511:7;:21;:::i;:::-;40493:39;-1:-1:-1;40543:12:0;40558:18;40565:11;40558:4;:18;:::i;:::-;40543:33;-1:-1:-1;40587:22:0;40612:28;40629:11;40612:14;:28;:::i;:::-;40587:53;-1:-1:-1;40651:13:0;40667:19;40675:11;40667:5;:19;:::i;:::-;40651:35;-1:-1:-1;40697:18:0;40718:24;40731:11;40718:10;:24;:::i;:::-;40697:45;-1:-1:-1;40753:14:0;40697:45;40794:5;40770:21;40777:14;40770:4;:21;:::i;:::-;:29;;;;:::i;:::-;:42;;;;:::i;:::-;40753:59;-1:-1:-1;40823:23:0;40849:16;40753:59;40849:7;:16;:::i;:::-;40884:7;;-1:-1:-1;40823:42:0;;-1:-1:-1;40910:4:0;;-1:-1:-1;;;;;;;40279:644:0;;;;;;;;;:::o;62499:719::-;62602:23;62627:12;62641:18;62661:22;62685:13;62702:19;62713:7;62702:10;:19::i;:::-;62601:120;;;;;;;;;;62733:15;62750:23;62775:12;62791:61;62803:7;62812:4;62818:10;62830:14;62846:5;62791:11;:61::i;:::-;-1:-1:-1;;;;;62881:15:0;;;;;;:7;:15;;;;;;62732:120;;-1:-1:-1;62732:120:0;;-1:-1:-1;62732:120:0;-1:-1:-1;62881:23:0;;62897:7;;62881:23;:::i;:::-;-1:-1:-1;;;;;62863:15:0;;;;;;:7;:15;;;;;;;;:41;;;;62933:7;:15;;;;:23;;62949:7;;62933:23;:::i;:::-;-1:-1:-1;;;;;62915:15:0;;;;;;;:7;:15;;;;;;:41;;;;62988:18;;;;;;;:34;;63007:15;;62988:34;:::i;:::-;-1:-1:-1;;;;;62967:18:0;;;;;;:7;:18;;;;;:55;63036:26;63051:10;63036:14;:26::i;:::-;63073:30;63085:4;63091;63097:5;63073:11;:30::i;:::-;63114:36;63128:14;63143:6;63114:13;:36::i;:::-;63183:9;-1:-1:-1;;;;;63166:44:0;63175:6;-1:-1:-1;;;;;63166:44:0;;63194:15;63166:44;;;;1361:25:1;;1349:2;1334:18;;1215:177;63166:44:0;;;;;;;;62590:628;;;;;;;;62499:719;;;:::o;61053:739::-;61154:23;61179:12;61193:18;61213:22;61237:13;61254:19;61265:7;61254:10;:19::i;:::-;61153:120;;;;;;;;;;61285:15;61302:23;61327:12;61343:61;61355:7;61364:4;61370:10;61382:14;61398:5;61343:11;:61::i;:::-;-1:-1:-1;;;;;61433:15:0;;;;;;:7;:15;;;;;;61284:120;;-1:-1:-1;61284:120:0;;-1:-1:-1;61284:120:0;-1:-1:-1;61433:23:0;;61284:120;;61433:23;:::i;:::-;-1:-1:-1;;;;;61415:15:0;;;;;;;:7;:15;;;;;;;;:41;;;;61488:18;;;;;:7;:18;;;;;:34;;61507:15;;61488:34;:::i;:::-;-1:-1:-1;;;;;61467:18:0;;;;;;:7;:18;;;;;;;;:55;;;;61554:7;:18;;;;:34;;61573:15;;61554:34;:::i;59687:660::-;59786:23;59811:12;59825:18;59845:22;59869:13;59886:19;59897:7;59886:10;:19::i;:::-;59785:120;;;;;;;;;;59917:15;59934:23;59959:12;59975:61;59987:7;59996:4;60002:10;60014:14;60030:5;59975:11;:61::i;:::-;-1:-1:-1;;;;;60065:15:0;;;;;;:7;:15;;;;;;59916:120;;-1:-1:-1;59916:120:0;;-1:-1:-1;59916:120:0;-1:-1:-1;60065:23:0;;59916:120;;60065:23;:::i;29562:790::-;29665:23;29690:12;29704:18;29724:22;29748:13;29765:19;29776:7;29765:10;:19::i;:::-;29664:120;;;;;;;;;;29796:15;29813:23;29838:12;29854:61;29866:7;29875:4;29881:10;29893:14;29909:5;29854:11;:61::i;:::-;-1:-1:-1;;;;;29944:15:0;;;;;;:7;:15;;;;;;29795:120;;-1:-1:-1;29795:120:0;;-1:-1:-1;29795:120:0;-1:-1:-1;29944:23:0;;29960:7;;29944:23;:::i;:::-;-1:-1:-1;;;;;29926:15:0;;;;;;:7;:15;;;;;;;;:41;;;;29996:7;:15;;;;:23;;30012:7;;29996:23;:::i;55756:589::-;55906:16;;;55920:1;55906:16;;;;;;;;55882:21;;55906:16;;;;;;;;;;-1:-1:-1;55906:16:0;55882:40;;55951:4;55933;55938:1;55933:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;55933:23:0;;;-1:-1:-1;;;;;55933:23:0;;;;;55977:15;-1:-1:-1;;;;;55977:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55967:4;55972:1;55967:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;55967:32:0;;;-1:-1:-1;;;;;55967:32:0;;;;;56012:62;56029:4;56044:15;56062:11;56012:8;:62::i;:::-;56113:224;;-1:-1:-1;;;56113:224:0;;-1:-1:-1;;;;;56113:15:0;:66;;;;:224;;56194:11;;56220:1;;56264:4;;56291;;56311:15;;56113:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56976:513;57124:62;57141:4;57156:15;57174:11;57124:8;:62::i;:::-;57229:15;-1:-1:-1;;;;;57229:31:0;;57268:9;57301:4;57321:11;57347:1;57390;57433:7;5874;5901:6;-1:-1:-1;;;;;5901:6:0;;5836:79;57433:7;57229:252;;;;;;-1:-1:-1;;;;;;57229:252:0;;;-1:-1:-1;;;;;18263:15:1;;;57229:252:0;;;18245:34:1;18295:18;;;18288:34;;;;18338:18;;;18331:34;;;;18381:18;;;18374:34;18445:15;;;18424:19;;;18417:44;57455:15:0;18477:19:1;;;18470:35;18179:19;;57229:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;56976:513;;:::o;42985:121::-;43048:7;43093:5;43084:6;;43075;:15;;;;:::i;:::-;:23;;;;:::i;43350:129::-;43419:7;43466:5;43455:8;;43446:6;:17;;;;:::i;43744:139::-;43818:7;43870:5;43854:13;;43845:6;:22;;;;:::i;44191:120::-;44255:7;44298:5;44291:4;;44282:6;:13;;;;:::i;36646:322::-;36705:7;36714;36723;36732;36741;36762:23;36787:12;36801:18;36821:22;36845:13;36862:20;36874:7;36862:11;:20::i;:::-;36761:121;;;;-1:-1:-1;36761:121:0;;-1:-1:-1;36761:121:0;-1:-1:-1;36761:121:0;;-1:-1:-1;36646:322:0;-1:-1:-1;;;;;;;36646:322:0:o;42347:391::-;42413:19;42436:10;:8;:10::i;:::-;42413:33;-1:-1:-1;42457:18:0;42478:24;42413:33;42478:10;:24;:::i;:::-;42554:4;42538:22;;;;:7;:22;;;;;;42457:45;;-1:-1:-1;42538:35:0;;42457:45;;42538:35;:::i;:::-;42529:4;42513:22;;;;:7;:22;;;;;;;;:60;;;;42587:11;:26;;;;;;42584:104;;;42669:4;42653:22;;;;:7;:22;;;;;;:35;;42678:10;;42653:35;:::i;:::-;42644:4;42628:22;;;;:7;:22;;;;;:60;42584:104;42704:26;;1361:25:1;;;42704:26:0;;1349:2:1;1334:18;42704:26:0;;;;;;;42399:339;;42347:391;:::o;34505:344::-;34589:19;34611:10;:8;:10::i;:::-;34589:32;-1:-1:-1;34633:13:0;34649:19;34589:32;34649:5;:19;:::i;:::-;34633:35;;34713:5;34706:4;34696:7;;:14;;;;:::i;:::-;:22;;;;:::i;:::-;34686:7;:32;34742:10;;:17;;34755:4;;34742:17;:::i;:::-;34729:10;:30;34782:7;;:15;;34792:5;;34782:15;:::i;:::-;34772:7;:25;34813:18;;1361:25:1;;;34813:18:0;;1349:2:1;1334:18;34813::0;;;;;;;34577:272;;34505:344;;;:::o;35486:428::-;35570:19;35593:10;:8;:10::i;:::-;35570:33;-1:-1:-1;35614:22:0;35639:28;35570:33;35639:14;:28;:::i;:::-;35708:10;;-1:-1:-1;;;;;35708:10:0;35700:19;;;;:7;:19;;;;;;35614:53;;-1:-1:-1;35700:36:0;;35614:53;;35700:36;:::i;:::-;35686:10;;;-1:-1:-1;;;;;35686:10:0;;;35678:19;;;;:7;:19;;;;;;;;:58;;;;35762:10;;;;;35750:23;;:11;:23;;;;;;;35747:99;;;35818:10;;-1:-1:-1;;;;;35818:10:0;35810:19;;;;:7;:19;;;;;;:36;;35832:14;;35810:36;:::i;:::-;35796:10;;-1:-1:-1;;;;;35796:10:0;35788:19;;;;:7;:19;;;;;:58;35747:99;35879:10;;35862:44;;1361:25:1;;;-1:-1:-1;;;;;35879:10:0;;;;35862:44;;;;;1349:2:1;1334:18;35862:44:0;;;;;;;35556:358;;35486:428;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;622:70;567:131;:::o;703:315::-;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1631:456::-;1708:6;1716;1724;1777:2;1765:9;1756:7;1752:23;1748:32;1745:52;;;1793:1;1790;1783:12;1745:52;1832:9;1819:23;1851:31;1876:5;1851:31;:::i;:::-;1901:5;-1:-1:-1;1958:2:1;1943:18;;1930:32;1971:33;1930:32;1971:33;:::i;:::-;1631:456;;2023:7;;-1:-1:-1;;;2077:2:1;2062:18;;;;2049:32;;1631:456::o;2092:180::-;2151:6;2204:2;2192:9;2183:7;2179:23;2175:32;2172:52;;;2220:1;2217;2210:12;2172:52;-1:-1:-1;2243:23:1;;2092:180;-1:-1:-1;2092:180:1:o;2466:247::-;2525:6;2578:2;2566:9;2557:7;2553:23;2549:32;2546:52;;;2594:1;2591;2584:12;2546:52;2633:9;2620:23;2652:31;2677:5;2652:31;:::i;2718:160::-;2783:20;;2839:13;;2832:21;2822:32;;2812:60;;2868:1;2865;2858:12;2812:60;2718:160;;;:::o;2883:248::-;2948:6;2956;3009:2;2997:9;2988:7;2984:23;2980:32;2977:52;;;3025:1;3022;3015:12;2977:52;3061:9;3048:23;3038:33;;3090:35;3121:2;3110:9;3106:18;3090:35;:::i;:::-;3080:45;;2883:248;;;;;:::o;3344:367::-;3407:8;3417:6;3471:3;3464:4;3456:6;3452:17;3448:27;3438:55;;3489:1;3486;3479:12;3438:55;-1:-1:-1;3512:20:1;;3555:18;3544:30;;3541:50;;;3587:1;3584;3577:12;3541:50;3624:4;3616:6;3612:17;3600:29;;3684:3;3677:4;3667:6;3664:1;3660:14;3652:6;3648:27;3644:38;3641:47;3638:67;;;3701:1;3698;3691:12;3638:67;3344:367;;;;;:::o;3716:773::-;3838:6;3846;3854;3862;3915:2;3903:9;3894:7;3890:23;3886:32;3883:52;;;3931:1;3928;3921:12;3883:52;3971:9;3958:23;4000:18;4041:2;4033:6;4030:14;4027:34;;;4057:1;4054;4047:12;4027:34;4096:70;4158:7;4149:6;4138:9;4134:22;4096:70;:::i;:::-;4185:8;;-1:-1:-1;4070:96:1;-1:-1:-1;4273:2:1;4258:18;;4245:32;;-1:-1:-1;4289:16:1;;;4286:36;;;4318:1;4315;4308:12;4286:36;;4357:72;4421:7;4410:8;4399:9;4395:24;4357:72;:::i;:::-;3716:773;;;;-1:-1:-1;4448:8:1;-1:-1:-1;;;;3716:773:1:o;4494:385::-;4580:6;4588;4596;4604;4657:3;4645:9;4636:7;4632:23;4628:33;4625:53;;;4674:1;4671;4664:12;4625:53;-1:-1:-1;;4697:23:1;;;4767:2;4752:18;;4739:32;;-1:-1:-1;4818:2:1;4803:18;;4790:32;;4869:2;4854:18;4841:32;;-1:-1:-1;4494:385:1;-1:-1:-1;4494:385:1:o;4884:180::-;4940:6;4993:2;4981:9;4972:7;4968:23;4964:32;4961:52;;;5009:1;5006;4999:12;4961:52;5032:26;5048:9;5032:26;:::i;5069:388::-;5137:6;5145;5198:2;5186:9;5177:7;5173:23;5169:32;5166:52;;;5214:1;5211;5204:12;5166:52;5253:9;5240:23;5272:31;5297:5;5272:31;:::i;:::-;5322:5;-1:-1:-1;5379:2:1;5364:18;;5351:32;5392:33;5351:32;5392:33;:::i;:::-;5444:7;5434:17;;;5069:388;;;;;:::o;5462:127::-;5523:10;5518:3;5514:20;5511:1;5504:31;5554:4;5551:1;5544:15;5578:4;5575:1;5568:15;5594:128;5661:9;;;5682:11;;;5679:37;;;5696:18;;:::i;5727:356::-;5929:2;5911:21;;;5948:18;;;5941:30;6007:34;6002:2;5987:18;;5980:62;6074:2;6059:18;;5727:356::o;6851:217::-;6891:1;6917;6907:132;;6961:10;6956:3;6952:20;6949:1;6942:31;6996:4;6993:1;6986:15;7024:4;7021:1;7014:15;6907:132;-1:-1:-1;7053:9:1;;6851:217::o;7429:127::-;7490:10;7485:3;7481:20;7478:1;7471:31;7521:4;7518:1;7511:15;7545:4;7542:1;7535:15;7561:127;7622:10;7617:3;7613:20;7610:1;7603:31;7653:4;7650:1;7643:15;7677:4;7674:1;7667:15;7693:125;7758:9;;;7779:10;;;7776:36;;;7792:18;;:::i;10427:407::-;10629:2;10611:21;;;10668:2;10648:18;;;10641:30;10707:34;10702:2;10687:18;;10680:62;-1:-1:-1;;;10773:2:1;10758:18;;10751:41;10824:3;10809:19;;10427:407::o;10839:412::-;11041:2;11023:21;;;11080:2;11060:18;;;11053:30;11119:34;11114:2;11099:18;;11092:62;-1:-1:-1;;;11185:2:1;11170:18;;11163:46;11241:3;11226:19;;10839:412::o;11256:406::-;11458:2;11440:21;;;11497:2;11477:18;;;11470:30;11536:34;11531:2;11516:18;;11509:62;-1:-1:-1;;;11602:2:1;11587:18;;11580:40;11652:3;11637:19;;11256:406::o;11667:402::-;11869:2;11851:21;;;11908:2;11888:18;;;11881:30;11947:34;11942:2;11927:18;;11920:62;-1:-1:-1;;;12013:2:1;11998:18;;11991:36;12059:3;12044:19;;11667:402::o;16358:168::-;16431:9;;;16462;;16479:15;;;16473:22;;16459:37;16449:71;;16500:18;;:::i;16663:251::-;16733:6;16786:2;16774:9;16765:7;16761:23;16757:32;16754:52;;;16802:1;16799;16792:12;16754:52;16834:9;16828:16;16853:31;16878:5;16853:31;:::i;16919:980::-;17181:4;17229:3;17218:9;17214:19;17260:6;17249:9;17242:25;17286:2;17324:6;17319:2;17308:9;17304:18;17297:34;17367:3;17362:2;17351:9;17347:18;17340:31;17391:6;17426;17420:13;17457:6;17449;17442:22;17495:3;17484:9;17480:19;17473:26;;17534:2;17526:6;17522:15;17508:29;;17555:1;17565:195;17579:6;17576:1;17573:13;17565:195;;;17644:13;;-1:-1:-1;;;;;17640:39:1;17628:52;;17735:15;;;;17700:12;;;;17676:1;17594:9;17565:195;;;-1:-1:-1;;;;;;;17816:32:1;;;;17811:2;17796:18;;17789:60;-1:-1:-1;;;17880:3:1;17865:19;17858:35;17777:3;16919:980;-1:-1:-1;;;16919:980:1:o;18516:306::-;18604:6;18612;18620;18673:2;18661:9;18652:7;18648:23;18644:32;18641:52;;;18689:1;18686;18679:12;18641:52;18718:9;18712:16;18702:26;;18768:2;18757:9;18753:18;18747:25;18737:35;;18812:2;18801:9;18797:18;18791:25;18781:35;;18516:306;;;;;:::o

Swarm Source

ipfs://99b6630c7eda074eeb7d086400c9941deefaffd6548fc7e6d9219706a6489817
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.