ETH Price: $2,862.78 (-2.93%)
 

Overview

Max Total Supply

105,000,000 SPORT

Holders

2,680 (0.00%)

Market

Price

$0.0275 @ 0.000010 ETH (+8.12%)

Onchain Market Cap

$2,886,727.20

Circulating Supply Market Cap

$2,399,605.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
70.266505537300669549 SPORT

Value
$1.93 ( ~0.000674168850023905 ETH) [0.0001%]
0x922164bbbd36acf9e854acbbf32facc949fcaeef
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Staicy Sport provides access to hyper-accurate sports predictions through AI-driven analysis, leveraging real-time data and neural networks to identify profitable betting opportunities, and enabling users to access these insights directly.

Market

Volume (24H):$156,842.00
Market Capitalization:$2,399,605.00
Circulating Supply:88,003,160.00 SPORT
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
SportToken

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2025-02-26
*/

/*
                  ███████╗██████╗  ██████╗ ██████╗ ████████╗
                  ██╔════╝██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝
                  ███████╗██████╔╝██║   ██║██████╔╝   ██║   
                  ╚════██║██╔═══╝ ██║   ██║██╔══██╗   ██║   
                  ███████║██║     ╚██████╔╝██║  ██║   ██║   
*/

//SPDX-License-Identifier: MIT

pragma solidity 0.8.26;

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 SportToken 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 = 105 * 10**6 * 10**18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
   
    string  private constant NAME = "SPORT";
    string  private constant SYMBOL = "SPORT";
    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 = 10 * 10**4 * 10**18;

    //taxShare 
    uint256 refAmt;
    uint256 coinOperation;
    uint256 prizeFund;
    uint256 liquidty;
    uint256 burn;
    
    //Buy tax percentage
    uint256 public buyReflectionTax = 5;
    uint256 public buyOperationWalletTax = 5;
    uint256 public buyPrizeFundWalletTax = 5;
    uint256 public buyLiquidityTax = 5;
    uint256 public buyBurnTax = 4;
 
    // Sell tax percentage
    uint256 public sellReflectionTax = 5;
    uint256 public sellOperationWalletTax = 5;
    uint256 public sellPrizeFundWalletTax = 5;
    uint256 public sellLiquidityTax = 5;
    uint256 public sellBurnTax = 4;
 
    //Fund wallet
    address public operationFundWallet;
    address public prizeFundWallet;
    
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event OperationFundWalletUpdated(address wallet);
    event PrizeFundWalletUpdated(address prizeFundWallet);
    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 buyCoinWalletTax,uint256 buyPrizeFundWalletTax,uint256 buyLiquidityTax,uint256 buyBurnTax);
    event SellTaxUpdated(uint256 sellReflectionTax,uint256 sellCoinWalletTaxPer,uint256 sellPrizeFundWalletTax,uint256 sellLiquidityTax,uint256 sellBurnTax);    
    event IncludedInFee(address account);
    event ExcludedFromFee(address account);
    event IncludedInReward(address account);
    event ExcludedFromReward(address account);
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor(address _operationwallet,address _prizeFundWallet)  {
        require(_operationwallet != address(0),"operation wallet can not be zero");
        require(_prizeFundWallet != address(0),"prizeFund wallet can not be zero");

        _rOwned[_msgSender()] = _rTotal;
        operationFundWallet = _operationwallet;
        prizeFundWallet = _prizeFundWallet;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24); //Uniswap V2 on Base network
    
        // 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;
        //exclude pair and this contract from reward
        excludeFromReward(address(this));
        excludeFromReward(uniswapV2Pair);
        
        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) public 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);
    }

    /**
    * @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 {OperationFundWalletUpdated} event with the updated fund wallet address on successful execution.
    */
    function setOperationFundWallet(address wallet) external onlyOwner{
        require(wallet != address(0),"Fund wallet can not be zero");
        operationFundWallet = wallet;
        emit OperationFundWalletUpdated(wallet);
    }    

    /**
    * @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 {PrizeFundWalletUpdated} event with the updated fund wallet address on successful execution.
    */  
    function setPrizeFundWallet(address wallet) external onlyOwner{
        require(wallet != address(0),"Fund wallet can not be zero");
        prizeFundWallet = wallet;
        emit PrizeFundWalletUpdated(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.
    */
    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 Transfers the specified fund amount to the given fund wallet.
    * This function calculates the reflection-adjusted fund amount and updates 
    * the balance of the fund wallet accordingly.
    * 
    * @param tFund The amount of tokens to allocate as a fund.
    * @param fundWallet The address of the fund wallet receiving the allocation.
    */
    function _takeFund(uint256 tFund, address fundWallet) private {
        uint256 currentRate = _getRate();
        uint256 rFund = tFund * currentRate;
    
        _rOwned[fundWallet] = _rOwned[fundWallet] + rFund;
        
        if (_isExcluded[fundWallet]) {
            _tOwned[fundWallet] = _tOwned[fundWallet] + tFund;
        }
    }
   
    /**
    * @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 tPrizeFund The amount of tokens designated for prizeFund wallet.
    * @return tBurn The amount of tokens designated for burning.
    * 
    * Calls the internal `_getTValues` function to calculate token values for fees, liquidity, coin operation,prizeFund  and burning.
    * 
    * @notice Internal use only.
    */
    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256,uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tPrizeFund,uint256 tBurn) = _getTValues(tAmount); 
        return (tTransferAmount, tFee, tLiquidity, tCoinOperation,tPrizeFund, 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,prizeFund 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 tPrizeFund, uint256 tBurn) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount,) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation,tPrizeFund,tBurn);
         return (rAmount, rTransferAmount);
    }
    
    /**
    * @dev Calculates tax deductions and returns the adjusted transfer amount.
    * @param tAmount Total transaction amount.
    * @return (tTransferAmount, tFee, tLiquidity, tCoinOperation, tPrizeFund, tBurn)
    */
    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256,uint256,uint256) {
        uint256 tFee = calculateTax(tAmount,refAmt);
        uint256 tLiquidity = calculateTax(tAmount,coinOperation);
        uint256 tCoinOperation = calculateTax(tAmount,prizeFund);
        uint256 tPrizeFund = calculateTax(tAmount,liquidty);
        uint256 tBurn = calculateTax(tAmount,burn);
        uint256 allTax = tFee + tLiquidity + tCoinOperation + tPrizeFund + tBurn;
        uint256 tTransferAmount = tAmount - allTax;
        return (tTransferAmount, tFee, tLiquidity, tCoinOperation, tPrizeFund, 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 tPrizeFund The amount of tokens designated for PrizeFund wallet.
    * @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 tPrizeFund, uint256 tBurn) private view returns (uint256, uint256, uint256) {
        uint256 currentRate = _getRate();
        uint256 rAmount = tAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        uint256 rCoinOperation = tCoinOperation * currentRate;
        uint256 rPrizeFund = tPrizeFund * currentRate;
        uint256 rBurn = tBurn * currentRate;
        uint256 rLiquidity = tLiquidity * currentRate;
        uint256 allTax = rFee + rCoinOperation + rPrizeFund + 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 amount based on the given rate.
    * @param amount The total amount to apply the tax on.
    * @param taxRate The tax rate as a percentage (e.g., 5 for 5%).
    * @return The calculated tax amount.
    */
    function calculateTax(uint256 amount, uint256 taxRate) private pure returns (uint256) {
        return amount * taxRate / 10**2;
    } 

    /**
    * @dev Removes all tax fees by setting them to zero.
    */
    function removeAllFee() private {
        refAmt = 0;
        coinOperation = 0;
        prizeFund = 0; 
        liquidty = 0;
        burn = 0;  
    }
    
    /**
    * @dev Checks if an account is excluded from fees.
    * @param account The address to check.
    * @return True if the account is excluded from fees, otherwise false.
    */
    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);
    } 

    /**
    * @dev Updates the tax percentages for buy  transactions. 
    * Ensures that no tax exceeds 6%.
    * @param reflectionPer Tax percentage for reflections.
    * @param coinOperartionPer Tax percentage for coin operations.
    * @param prizeFundPer Tax percentage for the prize fund.
    * @param liquidityPer Tax percentage for liquidity.
    * @param burnPer Tax percentage for burning tokens.
    */    
    function updateBuyTax(uint256 reflectionPer,uint256 coinOperartionPer,uint256 prizeFundPer,uint256 liquidityPer,uint256 burnPer) external onlyOwner {
        require(reflectionPer <= 6,"You can not set reflection tax more then 6%");
        require(coinOperartionPer <= 6,"You can not set coin operation  tax more then 6%");
        require(prizeFundPer <= 6,"You can not set prizeFund tax more then 6%");
        require(liquidityPer <= 6,"You can not set liquidity tax more then 6%");
        require(burnPer <= 6,"You can not set burn  tax more then 6%");       
        buyReflectionTax= reflectionPer;
        buyOperationWalletTax = coinOperartionPer;
        buyPrizeFundWalletTax = prizeFundPer;
        buyLiquidityTax = liquidityPer;
        buyBurnTax = burnPer;
        emit BuyTaxUpdated(buyReflectionTax,buyOperationWalletTax,buyPrizeFundWalletTax,buyLiquidityTax,buyBurnTax);
    }

    /**
    * @dev Updates the tax percentages for sell  transactions. 
    * Ensures that no tax exceeds 6%.
    * @param reflectionPer Tax percentage for reflections.
    * @param coinOperartionPer Tax percentage for coin operations.
    * @param prizeFundPer Tax percentage for the prize fund.
    * @param liquidityPer Tax percentage for liquidity.
    * @param burnPer Tax percentage for burning tokens.
    */    
    function updateSellTax(uint256 reflectionPer,uint256 coinOperartionPer,uint256 prizeFundPer,uint256 liquidityPer,uint256 burnPer) external onlyOwner {
        require(reflectionPer <= 6,"You can not set reflection tax more then 6%");
        require(coinOperartionPer <= 6,"You can not set coin operation  tax more then 6%");
        require(prizeFundPer <= 6,"You can not set prizeFund tax more then 6%");
        require(liquidityPer <= 6,"You can not set liquidity tax more then 6%");
        require(burnPer <= 6,"You can not set burn  tax more then 6%");       
        sellReflectionTax= reflectionPer;
        sellOperationWalletTax = coinOperartionPer;
        sellPrizeFundWalletTax = prizeFundPer;
        sellLiquidityTax = liquidityPer;
        sellBurnTax = burnPer;
        emit BuyTaxUpdated(sellReflectionTax,sellOperationWalletTax,sellPrizeFundWalletTax,sellLiquidityTax,sellBurnTax);
    }
    
    /**
    * @dev Transfers tokens while enforcing trading rules, fees, and auto-liquidity.
    * Excludes owner from restrictions and handles automatic liquidity swaps.
    * @param from Sender address.
    * @param to Receiver address.
    * @param amount Transfer amount.
    */
    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);
    }

    /**
    * @dev Distributes tokens to multiple addresses in an airdrop.
    * Ensures the sender has enough balance and checks input validity.
    * @param addresses List of recipient addresses.
    * @param tokens Corresponding amounts to be sent.
    */
    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 ;
               coinOperation =  buyOperationWalletTax; 
               prizeFund = buyPrizeFundWalletTax;
               liquidty = buyLiquidityTax; 
               burn = buyBurnTax; 
            } else if(isSell){
               refAmt= sellReflectionTax;
               coinOperation = sellOperationWalletTax;
               prizeFund = sellPrizeFundWalletTax;
               liquidty = sellLiquidityTax;
               burn = sellBurnTax;
            }
            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 Transfers tokens between two excluded addresses, applying fees and reflections.
    * Handles liquidity, operations, and prize fund allocations.
    * @param sender The sender's address.
    * @param recipient The recipient's address.
    * @param tAmount The amount to transfer.
    */
    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation,uint256 tPrizeFund, uint256 tBurn) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation, tPrizeFund, 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);
        _takeFund(tCoinOperation, operationFundWallet);
        _takeFund(tPrizeFund,prizeFundWallet);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
    * @dev Transfers tokens between standard (non-excluded) addresses, applying fees and reflections.
    * Handles liquidity, operations, and prize fund allocations.
    * @param sender The sender's address.
    * @param recipient The recipient's address.
    * @param tAmount The amount to transfer.
    */
    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tPrizeFund, uint256 tBurn) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation,tPrizeFund, tBurn);
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee, tBurn);
        _takeFund(tCoinOperation, operationFundWallet);
        _takeFund(tPrizeFund, prizeFundWallet);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
    * @dev Transfers tokens to an excluded recipient (from reflections), applying fees and reflections.
    * Handles liquidity, operations, and prize fund allocations.
    * @param sender The sender's address.
    * @param recipient The excluded recipient's address.
    * @param tAmount The amount to transfer.
    */
    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation, uint256 tPrizeFund, uint256 tBurn) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation,tPrizeFund, tBurn);
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;           
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee, tBurn);
        _takeFund(tCoinOperation, operationFundWallet);
        _takeFund(tPrizeFund,  prizeFundWallet);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
    * @dev Transfers tokens from an excluded sender (from reflections), applying fees and reflections.
    * Handles liquidity, operations, and prize fund allocations.
    * @param sender The excluded sender's address.
    * @param recipient The recipient's address.
    * @param tAmount The amount to transfer.
    */
    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tCoinOperation,uint256 tPrizeFund, uint256 tBurn) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tCoinOperation,tPrizeFund, tBurn);
        _tOwned[sender] = _tOwned[sender]-tAmount;
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;   
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee, tBurn);
        _takeFund(tCoinOperation, operationFundWallet);
        _takeFund(tPrizeFund, prizeFundWallet);
        emit Transfer(sender, recipient, tTransferAmount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_operationwallet","type":"address"},{"internalType":"address","name":"_prizeFundWallet","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":"buyCoinWalletTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyPrizeFundWalletTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyBurnTax","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":"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":false,"internalType":"address","name":"wallet","type":"address"}],"name":"OperationFundWalletUpdated","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":"address","name":"prizeFundWallet","type":"address"}],"name":"PrizeFundWalletUpdated","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":"sellPrizeFundWalletTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellBurnTax","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":"buyBurnTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyOperationWalletTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyPrizeFundWalletTax","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":[{"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":"operationFundWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeFundWallet","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":"sellBurnTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellOperationWalletTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellPrizeFundWalletTax","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":"setOperationFundWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setPrizeFundWallet","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":"reflectionPer","type":"uint256"},{"internalType":"uint256","name":"coinOperartionPer","type":"uint256"},{"internalType":"uint256","name":"prizeFundPer","type":"uint256"},{"internalType":"uint256","name":"liquidityPer","type":"uint256"},{"internalType":"uint256","name":"burnPer","type":"uint256"}],"name":"updateBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionPer","type":"uint256"},{"internalType":"uint256","name":"coinOperartionPer","type":"uint256"},{"internalType":"uint256","name":"prizeFundPer","type":"uint256"},{"internalType":"uint256","name":"liquidityPer","type":"uint256"},{"internalType":"uint256","name":"burnPer","type":"uint256"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526a56da9d67d20d77090000006008819055610020905f196107c9565b61002b905f196107dc565b600955600b805461ff00191661010017905569152d02c7e14af6800000600c556005601281905560138190556014819055601581905560046016819055601782905560188290556019829055601a91909155601b5534801561008b575f80fd5b506040516139e23803806139e28339810160408190526100aa9161081c565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b0382166101455760405162461bcd60e51b815260206004820181905260248201527f6f7065726174696f6e2077616c6c65742063616e206e6f74206265207a65726f60448201526064015b60405180910390fd5b6001600160a01b03811661019b5760405162461bcd60e51b815260206004820181905260248201527f7072697a6546756e642077616c6c65742063616e206e6f74206265207a65726f604482015260640161013c565b600954335f9081526002602090815260409182902092909255601c80546001600160a01b038681166001600160a01b031992831617909255601d805492861692909116919091179055805163c45a015560e01b81529051734752ba5dbc23f44d87826276bf6fd6b1c372ad2492839263c45a015592600480830193928290030181865afa15801561022e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610252919061084d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561029d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102c1919061084d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561030b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061032f919061084d565b6001600160a01b0390811660a0528116608052600160055f6103585f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805494151560ff199586161790553080825260059093522080549092166001179091556103a1906103ef565b60a0516103ad906103ef565b60085460405190815233905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505061088d565b5f546001600160a01b031633146104485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161013c565b6001600160a01b0381165f9081526006602052604090205460ff16156104b05760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015260640161013c565b6001600160a01b0381165f9081526002602052604090205415610507576001600160a01b0381165f908152600260205260409020546104ee906105a2565b6001600160a01b0382165f908152600360205260409020555b6001600160a01b0381165f818152600660209081526040808320805460ff191660019081179091556007805491820181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890920180546001600160a01b0319168417905590519182527f110b1fbed46dec7bc9019c3fba97541a3d64821a824872bb7b2ad678490855bf910160405180910390a150565b5f6009548211156106085760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840161013c565b5f610611610624565b905061061d8184610866565b9392505050565b5f808061062f610645565b909250905061063e8183610866565b9250505090565b6009546008545f918291825b600754811015610784578260025f6007848154811061067257610672610879565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411806106da57508160035f600784815481106106b4576106b4610879565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b156106f057600954600854945094505050509091565b60025f6007838154811061070657610706610879565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205461073490846107dc565b925060035f6007838154811061074c5761074c610879565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205461077a90836107dc565b9150600101610651565b506008546009546107959190610866565b8210156107ac576009546008549350935050509091565b90939092509050565b634e487b7160e01b5f52601260045260245ffd5b5f826107d7576107d76107b5565b500690565b818103818111156107fb57634e487b7160e01b5f52601160045260245ffd5b92915050565b80516001600160a01b0381168114610817575f80fd5b919050565b5f806040838503121561082d575f80fd5b61083683610801565b915061084460208401610801565b90509250929050565b5f6020828403121561085d575f80fd5b61061d82610801565b5f82610874576108746107b5565b500490565b634e487b7160e01b5f52603260045260245ffd5b60805160a0516131036108df5f395f818161054201528181611cf1015261202a01525f81816103aa015281816126db01528181612792015281816127ce0152818161283a015261286101526131035ff3fe60806040526004361061028e575f3560e01c80635342acb41161015557806395d89b41116100be578063d7d7442f11610078578063d7d7442f146107b5578063dd62ed3e146107d4578063e1662ed314610818578063ea2f0b371461082d578063ea78a0d71461084c578063f2fde38b14610861575f80fd5b806395d89b41146102ba578063a2cbba2814610724578063a457c2d714610739578063a9059cbb14610758578063c49b9a8014610777578063d621e81314610796575f80fd5b8063715018a61161010f578063715018a61461067457806378e4382b1461068857806386e328061461069d57806388f82020146106b25780638da5cb5b146106e95780638df90b3114610705575f80fd5b80635342acb4146105b65780635f1de9db146105ed57806364ac91e51461060257806367243482146106215780636ab912061461064057806370a0823114610655575f80fd5b80633020a89c116101f7578063437823ec116101b1578063437823ec146104f35780634549b0391461051257806349bd5a5e146105315780634a74bb021461056457806352390c02146105825780635252a228146105a1575f80fd5b80633020a89c14610447578063313ce5671461045c57806332df0a88146104775780633685d4191461049657806339509351146104b55780633bd5d173146104d4575f80fd5b80631694505e116102485780631694505e1461039957806318160ddd146103cc5780631f3ecf65146103e057806323b872dd146103f5578063293230b8146104145780632d83811914610428575f80fd5b806303dd6a771461029957806306fdde03146102ba578063095ea7b3146102f657806311743c111461032557806313114a9d1461035c57806313c7af2a1461037a575f80fd5b3661029557005b5f80fd5b3480156102a4575f80fd5b506102b86102b3366004612b8d565b610880565b005b3480156102c5575f80fd5b50604080518082018252600581526414d413d49560da1b602082015290516102ed9190612ba8565b60405180910390f35b348015610301575f80fd5b50610315610310366004612bdd565b61095d565b60405190151581526020016102ed565b348015610330575f80fd5b50601c54610344906001600160a01b031681565b6040516001600160a01b0390911681526020016102ed565b348015610367575f80fd5b50600a545b6040519081526020016102ed565b348015610385575f80fd5b506102b8610394366004612c07565b610973565b3480156103a4575f80fd5b506103447f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d7575f80fd5b5060085461036c565b3480156103eb575f80fd5b5061036c601b5481565b348015610400575f80fd5b5061031561040f366004612c3e565b610ab1565b34801561041f575f80fd5b506102b8610b01565b348015610433575f80fd5b5061036c610442366004612c7c565b610bda565b348015610452575f80fd5b5061036c60165481565b348015610467575f80fd5b50604051601281526020016102ed565b348015610482575f80fd5b50601d54610344906001600160a01b031681565b3480156104a1575f80fd5b506102b86104b0366004612b8d565b610c5c565b3480156104c0575f80fd5b506103156104cf366004612bdd565b610e37565b3480156104df575f80fd5b506102b86104ee366004612c7c565b610e6d565b3480156104fe575f80fd5b506102b861050d366004612b8d565b610f51565b34801561051d575f80fd5b5061036c61052c366004612ca7565b611035565b34801561053c575f80fd5b506103447f000000000000000000000000000000000000000000000000000000000000000081565b34801561056f575f80fd5b50600b5461031590610100900460ff1681565b34801561058d575f80fd5b506102b861059c366004612b8d565b6110b5565b3480156105ac575f80fd5b5061036c60125481565b3480156105c1575f80fd5b506103156105d0366004612b8d565b6001600160a01b03165f9081526005602052604090205460ff1690565b3480156105f8575f80fd5b5061036c60135481565b34801561060d575f80fd5b506102b861061c366004612b8d565b611232565b34801561062c575f80fd5b506102b861063b366004612d19565b6112ff565b34801561064b575f80fd5b5061036c601a5481565b348015610660575f80fd5b5061036c61066f366004612b8d565b611488565b34801561067f575f80fd5b506102b86114e4565b348015610693575f80fd5b5061036c60145481565b3480156106a8575f80fd5b5061036c60195481565b3480156106bd575f80fd5b506103156106cc366004612b8d565b6001600160a01b03165f9081526006602052604090205460ff1690565b3480156106f4575f80fd5b505f546001600160a01b0316610344565b348015610710575f80fd5b506102b861071f366004612c07565b611555565b34801561072f575f80fd5b5061036c60155481565b348015610744575f80fd5b50610315610753366004612bdd565b611688565b348015610763575f80fd5b50610315610772366004612bdd565b6116be565b348015610782575f80fd5b506102b8610791366004612d85565b6116ca565b3480156107a1575f80fd5b50600b546103159062010000900460ff1681565b3480156107c0575f80fd5b506102b86107cf366004612c7c565b61173c565b3480156107df575f80fd5b5061036c6107ee366004612d9e565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b348015610823575f80fd5b5061036c60175481565b348015610838575f80fd5b506102b8610847366004612b8d565b611825565b348015610857575f80fd5b5061036c60185481565b34801561086c575f80fd5b506102b861087b366004612b8d565b6118fe565b5f546001600160a01b031633146108b25760405162461bcd60e51b81526004016108a990612dd5565b60405180910390fd5b6001600160a01b0381166109085760405162461bcd60e51b815260206004820152601b60248201527f46756e642077616c6c65742063616e206e6f74206265207a65726f000000000060448201526064016108a9565b601d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f03e28f0673e11ab80c28857d6222b2e5d5aac2c10cfc32826ba6c3ef8c064a17906020015b60405180910390a150565b5f6109693384846119e5565b5060015b92915050565b5f546001600160a01b0316331461099c5760405162461bcd60e51b81526004016108a990612dd5565b60068511156109bd5760405162461bcd60e51b81526004016108a990612e0a565b60068411156109de5760405162461bcd60e51b81526004016108a990612e55565b60068311156109ff5760405162461bcd60e51b81526004016108a990612ea5565b6006821115610a205760405162461bcd60e51b81526004016108a990612eef565b6006811115610a415760405162461bcd60e51b81526004016108a990612f39565b60128590556013849055601483905560158290556016819055604080518681526020810186905290810184905260608101839052608081018290527f01e39f38385f3416e0e6e6cb23a1ed2df1a25a62ac7d5e6d2ee91f934ea2573f9060a0015b60405180910390a15050505050565b5f610abd848484611b08565b6001600160a01b0384165f90815260046020908152604080832033808552925290912054610af7918691610af2908690612f93565b6119e5565b5060019392505050565b5f546001600160a01b03163314610b2a5760405162461bcd60e51b81526004016108a990612dd5565b600b5462010000900460ff1615610b835760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c7265616479207374617274656400000000000000000060448201526064016108a9565b600b805462ff0000191662010000908117918290556040517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e73592610bd092900460ff161515815260200190565b60405180910390a1565b5f600954821115610c405760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108a9565b5f610c49611db0565b9050610c558184612fa6565b9392505050565b5f546001600160a01b03163314610c855760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381165f9081526006602052604090205460ff16610cec5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920496e636c75646564000000000060448201526064016108a9565b5f5b600754811015610dfd57816001600160a01b031660078281548110610d1557610d15612fc5565b5f918252602090912001546001600160a01b031603610df55760078054610d3e90600190612f93565b81548110610d4e57610d4e612fc5565b5f91825260209091200154600780546001600160a01b039092169183908110610d7957610d79612fc5565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600382526040808220829055600690925220805460ff191690556007805480610dd057610dd0612fd9565b5f8281526020902081015f1990810180546001600160a01b0319169055019055610dfd565b600101610cee565b506040516001600160a01b03821681527f47ab6b2d1f416edec684889dc42cd04ed7cc6c6244edaa04c4215e107754861490602001610952565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610969918590610af2908690612fed565b335f8181526006602052604090205460ff1615610ee15760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016108a9565b5f610eeb83611dd1565b506001600160a01b0383165f90815260026020526040902054909150610f12908290612f93565b6001600160a01b0383165f90815260026020526040902055600954610f38908290612f93565b600955600a54610f49908490612fed565b600a55505050565b5f546001600160a01b03163314610f7a5760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381165f9081526005602052604090205460ff1615610fe25760405162461bcd60e51b815260206004820152601860248201527f416c72656179206578636c756465642066726f6d20666565000000000000000060448201526064016108a9565b6001600160a01b0381165f81815260056020908152604091829020805460ff1916600117905590519182527ff1d6512ec7550bf605a5a38910e48fb6a57938ed74a5afa01753fa023001005c9101610952565b5f6008548311156110885760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108a9565b816110a1575f61109784611dd1565b50915061096d9050565b5f6110ab84611dd1565b925061096d915050565b5f546001600160a01b031633146110de5760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381165f9081526006602052604090205460ff16156111465760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108a9565b6001600160a01b0381165f908152600260205260409020541561119d576001600160a01b0381165f9081526002602052604090205461118490610bda565b6001600160a01b0382165f908152600360205260409020555b6001600160a01b0381165f818152600660209081526040808320805460ff191660019081179091556007805491820181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890920180546001600160a01b0319168417905590519182527f110b1fbed46dec7bc9019c3fba97541a3d64821a824872bb7b2ad678490855bf9101610952565b5f546001600160a01b0316331461125b5760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381166112b15760405162461bcd60e51b815260206004820152601b60248201527f46756e642077616c6c65742063616e206e6f74206265207a65726f000000000060448201526064016108a9565b601c80546001600160a01b0319166001600160a01b0383169081179091556040519081527ff30d970a33cd2d0fcf9d1f5ba08d5011082326305e248b54cf10e52af607f23d90602001610952565b5f546001600160a01b031633146113285760405162461bcd60e51b81526004016108a990612dd5565b5f8382146113895760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206265747765656e204164647265737320616e6420746f6b604482015267195b8818dbdd5b9d60c21b60648201526084016108a9565b5f5b848110156113c6575f8484838181106113a6576113a6612fc5565b90506020020135905080836113bb9190612fed565b92505060010161138b565b50806113d133611488565b101561141f5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e7320746f2061697264726f700000000060448201526064016108a9565b5f5b84811015611480575f84848381811061143c5761143c612fc5565b9050602002013590506114773388888581811061145b5761145b612fc5565b90506020020160208101906114709190612b8d565b835f611e0e565b50600101611421565b505050505050565b6001600160a01b0381165f9081526006602052604081205460ff16156114c357506001600160a01b03165f9081526003602052604090205490565b6001600160a01b0382165f9081526002602052604090205461096d90610bda565b5f546001600160a01b0316331461150d5760405162461bcd60e51b81526004016108a990612dd5565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b0316331461157e5760405162461bcd60e51b81526004016108a990612dd5565b600685111561159f5760405162461bcd60e51b81526004016108a990612e0a565b60068411156115c05760405162461bcd60e51b81526004016108a990612e55565b60068311156115e15760405162461bcd60e51b81526004016108a990612ea5565b60068211156116025760405162461bcd60e51b81526004016108a990612eef565b60068111156116235760405162461bcd60e51b81526004016108a990612f39565b601785905560188490556019839055601a829055601b819055604080518681526020810186905290810184905260608101839052608081018290527f01e39f38385f3416e0e6e6cb23a1ed2df1a25a62ac7d5e6d2ee91f934ea2573f9060a001610aa2565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610969918590610af2908690612f93565b5f610969338484611b08565b5f546001600160a01b031633146116f35760405162461bcd60e51b81526004016108a990612dd5565b600b80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061095290831515815260200190565b5f546001600160a01b031633146117655760405162461bcd60e51b81526004016108a990612dd5565b5f8111801561177e57506969e10de76676d08000008111155b6117f05760405162461bcd60e51b815260206004820152603960248201527f416d6f756e742073686f756c64206265206d6f7265207468616e207a65726f2060448201527f616e64206c657373207468616e203530306b20746f6b656e730000000000000060648201526084016108a9565b600c8190556040518181527fadfa8ecb21b6962ebcd0adbd9ab985b7b4c5b5eb3b0dead683171565c7bfe17190602001610952565b5f546001600160a01b0316331461184e5760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381165f9081526005602052604090205460ff166118ae5760405162461bcd60e51b8152602060048201526016602482015275416c7265617920696e636c7564656420696e2066656560501b60448201526064016108a9565b6001600160a01b0381165f81815260056020908152604091829020805460ff1916905590519182527f78ce087db51d01d3e32355f2d83455d5a39f99194c8d3d1c2614893695cee4429101610952565b5f546001600160a01b031633146119275760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b03811661198c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a9565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611a475760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108a9565b6001600160a01b038216611aa85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108a9565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b6c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108a9565b6001600160a01b038216611bce5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108a9565b5f8111611c2f5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108a9565b5f546001600160a01b0384811691161480611c5657505f546001600160a01b038381169116145b15611c6c57611c678383835f611e0e565b505050565b600b5462010000900460ff16611cc45760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420737461727465642079657400000000000000000060448201526064016108a9565b5f611cce30611488565b600c5490915081108015908190611ce85750600b5460ff16155b8015611d2657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611d395750600b54610100900460ff165b15611d4c57600c549150611d4c82611f82565b6001600160a01b0385165f9081526005602052604090205460019060ff1680611d8c57506001600160a01b0385165f9081526005602052604090205460ff165b15611d9457505f5b8015611da457611da4868661201d565b61148086868684611e0e565b5f805f611dbb6120c1565b9092509050611dca8183612fa6565b9250505090565b5f805f805f805f611de188612231565b95509550955095509550505f80611dfc8a88888888886122d2565b50909b909a5098505050505050505050565b80611e3057611e305f600d819055600e819055600f8190556010819055601155565b6001600160a01b0384165f9081526006602052604090205460ff168015611e6f57506001600160a01b0383165f9081526006602052604090205460ff16155b15611e8457611e7f848484612383565b611f7c565b6001600160a01b0384165f9081526006602052604090205460ff16158015611ec357506001600160a01b0383165f9081526006602052604090205460ff165b15611ed357611e7f8484846124ed565b6001600160a01b0384165f9081526006602052604090205460ff16158015611f1357506001600160a01b0383165f9081526006602052604090205460ff16155b15611f2357611e7f8484846125a9565b6001600160a01b0384165f9081526006602052604090205460ff168015611f6157506001600160a01b0383165f9081526006602052604090205460ff165b15611f7157611e7f848484612600565b611f7c8484846125a9565b50505050565b600b805460ff191660011790555f611f9b600283612fa6565b90505f611fa88284612f93565b905047611fb483612686565b5f611fbf8247612f93565b9050611fcb8382612834565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600b805460ff19169055505050565b6001600160a01b038281167f0000000000000000000000000000000000000000000000000000000000000000821690811491831614811561207b57601254600d55601354600e55601454600f55601554601055601654601155611f7c565b80156120a457601754600d55601854600e55601954600f55601a54601055601b54601155611f7c565b611f7c5f600d819055600e819055600f8190556010819055601155565b6009546008545f918291825b600754811015612200578260025f600784815481106120ee576120ee612fc5565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054118061215657508160035f6007848154811061213057612130612fc5565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b1561216c57600954600854945094505050509091565b60025f6007838154811061218257612182612fc5565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546121b09084612f93565b925060035f600783815481106121c8576121c8612fc5565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546121f69083612f93565b91506001016120cd565b506008546009546122119190612fa6565b821015612228576009546008549350935050509091565b90939092509050565b5f805f805f805f61224488600d54612936565b90505f61225389600e54612936565b90505f6122628a600f54612936565b90505f6122718b601054612936565b90505f6122808c601154612936565b90505f818385612290888a612fed565b61229a9190612fed565b6122a49190612fed565b6122ae9190612fed565b90505f6122bb828f612f93565b9e969d50949b509299509097509550919350505050565b5f805f806122de611db0565b90505f6122eb828c613000565b90505f6122f8838c613000565b90505f612305848b613000565b90505f612312858b613000565b90505f61231f868b613000565b90505f61232c878f613000565b90505f81838561233c888a612fed565b6123469190612fed565b6123509190612fed565b61235a9190612fed565b90505f6123678289612f93565b979b509699509497505050505050505096509650969350505050565b5f805f805f806123928761294d565b9550955095509550955095505f805f6123af8a89898989896122d2565b6001600160a01b038f165f9081526003602052604090205492955090935091506123da908b90612f93565b6001600160a01b038d165f90815260036020908152604080832093909355600290522054612409908490612f93565b6001600160a01b03808e165f9081526002602052604080822093909355908d1681522054612438908390612fed565b6001600160a01b038c165f908152600260205260409020556124598761298f565b612464818986612a47565b601c5461247b9087906001600160a01b0316612acd565b601d546124929086906001600160a01b0316612acd565b8a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8b6040516124d791815260200190565b60405180910390a3505050505050505050505050565b5f805f805f806124fc8761294d565b9550955095509550955095505f805f6125198a89898989896122d2565b6001600160a01b038f165f908152600260205260409020549295509093509150612544908490612f93565b6001600160a01b03808e165f90815260026020908152604080832094909455918e1681526003909152205461257a908a90612fed565b6001600160a01b038c165f90815260036020908152604080832093909355600290522054612438908390612fed565b5f805f805f806125b88761294d565b9550955095509550955095505f805f6125d58a89898989896122d2565b6001600160a01b038f165f908152600260205260409020549295509093509150612409908490612f93565b5f805f805f8061260f8761294d565b9550955095509550955095505f805f61262c8a89898989896122d2565b6001600160a01b038f165f908152600360205260409020549295509093509150612657908b90612f93565b6001600160a01b038d165f90815260036020908152604080832093909355600290522054612544908490612f93565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106126b9576126b9612fc5565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612735573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127599190613017565b8160018151811061276c5761276c612fc5565b60200260200101906001600160a01b031690816001600160a01b0316815250506127b7307f0000000000000000000000000000000000000000000000000000000000000000846119e5565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061280b9085905f90869030904290600401613032565b5f604051808303815f87803b158015612822575f80fd5b505af1158015611480573d5f803e3d5ffd5b61285f307f0000000000000000000000000000000000000000000000000000000000000000846119e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230855f806128a45f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561290a573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061292f91906130a2565b5050505050565b5f60646129438385613000565b610c559190612fa6565b5f805f805f805f805f805f806129628d612231565b9550955095509550955095508585858585859b509b509b509b509b509b5050505050505091939550919395565b5f612998611db0565b90505f6129a58284613000565b305f908152600260205260409020549091506129c2908290612fed565b305f9081526002602090815260408083209390935560069052205460ff1615612a0f57305f908152600360205260409020546129ff908490612fed565b305f908152600360205260409020555b6040518381527f3a8ab79f6d1537e459a1a8379f48a77e1ffd07dda4b16ea97074fdab5dd8bf349060200160405180910390a1505050565b5f612a50611db0565b90505f612a5d8284613000565b90508085600954612a6e9190612f93565b612a789190612f93565b600955600a54612a89908590612fed565b600a55600854612a9a908490612f93565b6008556040518481527f56b5df500587465b57d8ce799cc562a294f136b75a13718c574d9d36bd82805890602001610aa2565b5f612ad6611db0565b90505f612ae38285613000565b6001600160a01b0384165f90815260026020526040902054909150612b09908290612fed565b6001600160a01b0384165f9081526002602090815260408083209390935560069052205460ff1615611f7c576001600160a01b0383165f90815260036020526040902054612b58908590612fed565b6001600160a01b0384165f9081526003602052604090205550505050565b6001600160a01b0381168114612b8a575f80fd5b50565b5f60208284031215612b9d575f80fd5b8135610c5581612b76565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8060408385031215612bee575f80fd5b8235612bf981612b76565b946020939093013593505050565b5f805f805f60a08688031215612c1b575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f805f60608486031215612c50575f80fd5b8335612c5b81612b76565b92506020840135612c6b81612b76565b929592945050506040919091013590565b5f60208284031215612c8c575f80fd5b5035919050565b80358015158114612ca2575f80fd5b919050565b5f8060408385031215612cb8575f80fd5b82359150612cc860208401612c93565b90509250929050565b5f8083601f840112612ce1575f80fd5b50813567ffffffffffffffff811115612cf8575f80fd5b6020830191508360208260051b8501011115612d12575f80fd5b9250929050565b5f805f8060408587031215612d2c575f80fd5b843567ffffffffffffffff811115612d42575f80fd5b612d4e87828801612cd1565b909550935050602085013567ffffffffffffffff811115612d6d575f80fd5b612d7987828801612cd1565b95989497509550505050565b5f60208284031215612d95575f80fd5b610c5582612c93565b5f8060408385031215612daf575f80fd5b8235612dba81612b76565b91506020830135612dca81612b76565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f596f752063616e206e6f7420736574207265666c656374696f6e20746178206d60408201526a6f7265207468656e20362560a81b606082015260800190565b60208082526030908201527f596f752063616e206e6f742073657420636f696e206f7065726174696f6e202060408201526f746178206d6f7265207468656e20362560801b606082015260800190565b6020808252602a908201527f596f752063616e206e6f7420736574207072697a6546756e6420746178206d6f6040820152697265207468656e20362560b01b606082015260800190565b6020808252602a908201527f596f752063616e206e6f7420736574206c697175696469747920746178206d6f6040820152697265207468656e20362560b01b606082015260800190565b60208082526026908201527f596f752063616e206e6f7420736574206275726e2020746178206d6f7265207460408201526568656e20362560d01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561096d5761096d612f7f565b5f82612fc057634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b8082018082111561096d5761096d612f7f565b808202811582820484141761096d5761096d612f7f565b5f60208284031215613027575f80fd5b8151610c5581612b76565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156130825783516001600160a01b031683526020938401939092019160010161305b565b50506001600160a01b039590951660608401525050608001529392505050565b5f805f606084860312156130b4575f80fd5b505081516020830151604090930151909492935091905056fea26469706673582212202bbaec77207fcdd48642862e8e81d66649e451dcbb8233da77c17b4471efc90964736f6c634300081a0033000000000000000000000000e5f50476f9e14f850068a9349a569592a0751c6d000000000000000000000000e5f50476f9e14f850068a9349a569592a0751c6d

Deployed Bytecode

0x60806040526004361061028e575f3560e01c80635342acb41161015557806395d89b41116100be578063d7d7442f11610078578063d7d7442f146107b5578063dd62ed3e146107d4578063e1662ed314610818578063ea2f0b371461082d578063ea78a0d71461084c578063f2fde38b14610861575f80fd5b806395d89b41146102ba578063a2cbba2814610724578063a457c2d714610739578063a9059cbb14610758578063c49b9a8014610777578063d621e81314610796575f80fd5b8063715018a61161010f578063715018a61461067457806378e4382b1461068857806386e328061461069d57806388f82020146106b25780638da5cb5b146106e95780638df90b3114610705575f80fd5b80635342acb4146105b65780635f1de9db146105ed57806364ac91e51461060257806367243482146106215780636ab912061461064057806370a0823114610655575f80fd5b80633020a89c116101f7578063437823ec116101b1578063437823ec146104f35780634549b0391461051257806349bd5a5e146105315780634a74bb021461056457806352390c02146105825780635252a228146105a1575f80fd5b80633020a89c14610447578063313ce5671461045c57806332df0a88146104775780633685d4191461049657806339509351146104b55780633bd5d173146104d4575f80fd5b80631694505e116102485780631694505e1461039957806318160ddd146103cc5780631f3ecf65146103e057806323b872dd146103f5578063293230b8146104145780632d83811914610428575f80fd5b806303dd6a771461029957806306fdde03146102ba578063095ea7b3146102f657806311743c111461032557806313114a9d1461035c57806313c7af2a1461037a575f80fd5b3661029557005b5f80fd5b3480156102a4575f80fd5b506102b86102b3366004612b8d565b610880565b005b3480156102c5575f80fd5b50604080518082018252600581526414d413d49560da1b602082015290516102ed9190612ba8565b60405180910390f35b348015610301575f80fd5b50610315610310366004612bdd565b61095d565b60405190151581526020016102ed565b348015610330575f80fd5b50601c54610344906001600160a01b031681565b6040516001600160a01b0390911681526020016102ed565b348015610367575f80fd5b50600a545b6040519081526020016102ed565b348015610385575f80fd5b506102b8610394366004612c07565b610973565b3480156103a4575f80fd5b506103447f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b3480156103d7575f80fd5b5060085461036c565b3480156103eb575f80fd5b5061036c601b5481565b348015610400575f80fd5b5061031561040f366004612c3e565b610ab1565b34801561041f575f80fd5b506102b8610b01565b348015610433575f80fd5b5061036c610442366004612c7c565b610bda565b348015610452575f80fd5b5061036c60165481565b348015610467575f80fd5b50604051601281526020016102ed565b348015610482575f80fd5b50601d54610344906001600160a01b031681565b3480156104a1575f80fd5b506102b86104b0366004612b8d565b610c5c565b3480156104c0575f80fd5b506103156104cf366004612bdd565b610e37565b3480156104df575f80fd5b506102b86104ee366004612c7c565b610e6d565b3480156104fe575f80fd5b506102b861050d366004612b8d565b610f51565b34801561051d575f80fd5b5061036c61052c366004612ca7565b611035565b34801561053c575f80fd5b506103447f000000000000000000000000b18d8c3960d6ddfd3b979542dc9171a3d067a3c381565b34801561056f575f80fd5b50600b5461031590610100900460ff1681565b34801561058d575f80fd5b506102b861059c366004612b8d565b6110b5565b3480156105ac575f80fd5b5061036c60125481565b3480156105c1575f80fd5b506103156105d0366004612b8d565b6001600160a01b03165f9081526005602052604090205460ff1690565b3480156105f8575f80fd5b5061036c60135481565b34801561060d575f80fd5b506102b861061c366004612b8d565b611232565b34801561062c575f80fd5b506102b861063b366004612d19565b6112ff565b34801561064b575f80fd5b5061036c601a5481565b348015610660575f80fd5b5061036c61066f366004612b8d565b611488565b34801561067f575f80fd5b506102b86114e4565b348015610693575f80fd5b5061036c60145481565b3480156106a8575f80fd5b5061036c60195481565b3480156106bd575f80fd5b506103156106cc366004612b8d565b6001600160a01b03165f9081526006602052604090205460ff1690565b3480156106f4575f80fd5b505f546001600160a01b0316610344565b348015610710575f80fd5b506102b861071f366004612c07565b611555565b34801561072f575f80fd5b5061036c60155481565b348015610744575f80fd5b50610315610753366004612bdd565b611688565b348015610763575f80fd5b50610315610772366004612bdd565b6116be565b348015610782575f80fd5b506102b8610791366004612d85565b6116ca565b3480156107a1575f80fd5b50600b546103159062010000900460ff1681565b3480156107c0575f80fd5b506102b86107cf366004612c7c565b61173c565b3480156107df575f80fd5b5061036c6107ee366004612d9e565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b348015610823575f80fd5b5061036c60175481565b348015610838575f80fd5b506102b8610847366004612b8d565b611825565b348015610857575f80fd5b5061036c60185481565b34801561086c575f80fd5b506102b861087b366004612b8d565b6118fe565b5f546001600160a01b031633146108b25760405162461bcd60e51b81526004016108a990612dd5565b60405180910390fd5b6001600160a01b0381166109085760405162461bcd60e51b815260206004820152601b60248201527f46756e642077616c6c65742063616e206e6f74206265207a65726f000000000060448201526064016108a9565b601d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f03e28f0673e11ab80c28857d6222b2e5d5aac2c10cfc32826ba6c3ef8c064a17906020015b60405180910390a150565b5f6109693384846119e5565b5060015b92915050565b5f546001600160a01b0316331461099c5760405162461bcd60e51b81526004016108a990612dd5565b60068511156109bd5760405162461bcd60e51b81526004016108a990612e0a565b60068411156109de5760405162461bcd60e51b81526004016108a990612e55565b60068311156109ff5760405162461bcd60e51b81526004016108a990612ea5565b6006821115610a205760405162461bcd60e51b81526004016108a990612eef565b6006811115610a415760405162461bcd60e51b81526004016108a990612f39565b60128590556013849055601483905560158290556016819055604080518681526020810186905290810184905260608101839052608081018290527f01e39f38385f3416e0e6e6cb23a1ed2df1a25a62ac7d5e6d2ee91f934ea2573f9060a0015b60405180910390a15050505050565b5f610abd848484611b08565b6001600160a01b0384165f90815260046020908152604080832033808552925290912054610af7918691610af2908690612f93565b6119e5565b5060019392505050565b5f546001600160a01b03163314610b2a5760405162461bcd60e51b81526004016108a990612dd5565b600b5462010000900460ff1615610b835760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c7265616479207374617274656400000000000000000060448201526064016108a9565b600b805462ff0000191662010000908117918290556040517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e73592610bd092900460ff161515815260200190565b60405180910390a1565b5f600954821115610c405760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108a9565b5f610c49611db0565b9050610c558184612fa6565b9392505050565b5f546001600160a01b03163314610c855760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381165f9081526006602052604090205460ff16610cec5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920496e636c75646564000000000060448201526064016108a9565b5f5b600754811015610dfd57816001600160a01b031660078281548110610d1557610d15612fc5565b5f918252602090912001546001600160a01b031603610df55760078054610d3e90600190612f93565b81548110610d4e57610d4e612fc5565b5f91825260209091200154600780546001600160a01b039092169183908110610d7957610d79612fc5565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600382526040808220829055600690925220805460ff191690556007805480610dd057610dd0612fd9565b5f8281526020902081015f1990810180546001600160a01b0319169055019055610dfd565b600101610cee565b506040516001600160a01b03821681527f47ab6b2d1f416edec684889dc42cd04ed7cc6c6244edaa04c4215e107754861490602001610952565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610969918590610af2908690612fed565b335f8181526006602052604090205460ff1615610ee15760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016108a9565b5f610eeb83611dd1565b506001600160a01b0383165f90815260026020526040902054909150610f12908290612f93565b6001600160a01b0383165f90815260026020526040902055600954610f38908290612f93565b600955600a54610f49908490612fed565b600a55505050565b5f546001600160a01b03163314610f7a5760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381165f9081526005602052604090205460ff1615610fe25760405162461bcd60e51b815260206004820152601860248201527f416c72656179206578636c756465642066726f6d20666565000000000000000060448201526064016108a9565b6001600160a01b0381165f81815260056020908152604091829020805460ff1916600117905590519182527ff1d6512ec7550bf605a5a38910e48fb6a57938ed74a5afa01753fa023001005c9101610952565b5f6008548311156110885760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108a9565b816110a1575f61109784611dd1565b50915061096d9050565b5f6110ab84611dd1565b925061096d915050565b5f546001600160a01b031633146110de5760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381165f9081526006602052604090205460ff16156111465760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108a9565b6001600160a01b0381165f908152600260205260409020541561119d576001600160a01b0381165f9081526002602052604090205461118490610bda565b6001600160a01b0382165f908152600360205260409020555b6001600160a01b0381165f818152600660209081526040808320805460ff191660019081179091556007805491820181559093527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890920180546001600160a01b0319168417905590519182527f110b1fbed46dec7bc9019c3fba97541a3d64821a824872bb7b2ad678490855bf9101610952565b5f546001600160a01b0316331461125b5760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381166112b15760405162461bcd60e51b815260206004820152601b60248201527f46756e642077616c6c65742063616e206e6f74206265207a65726f000000000060448201526064016108a9565b601c80546001600160a01b0319166001600160a01b0383169081179091556040519081527ff30d970a33cd2d0fcf9d1f5ba08d5011082326305e248b54cf10e52af607f23d90602001610952565b5f546001600160a01b031633146113285760405162461bcd60e51b81526004016108a990612dd5565b5f8382146113895760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206265747765656e204164647265737320616e6420746f6b604482015267195b8818dbdd5b9d60c21b60648201526084016108a9565b5f5b848110156113c6575f8484838181106113a6576113a6612fc5565b90506020020135905080836113bb9190612fed565b92505060010161138b565b50806113d133611488565b101561141f5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e7320746f2061697264726f700000000060448201526064016108a9565b5f5b84811015611480575f84848381811061143c5761143c612fc5565b9050602002013590506114773388888581811061145b5761145b612fc5565b90506020020160208101906114709190612b8d565b835f611e0e565b50600101611421565b505050505050565b6001600160a01b0381165f9081526006602052604081205460ff16156114c357506001600160a01b03165f9081526003602052604090205490565b6001600160a01b0382165f9081526002602052604090205461096d90610bda565b5f546001600160a01b0316331461150d5760405162461bcd60e51b81526004016108a990612dd5565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b0316331461157e5760405162461bcd60e51b81526004016108a990612dd5565b600685111561159f5760405162461bcd60e51b81526004016108a990612e0a565b60068411156115c05760405162461bcd60e51b81526004016108a990612e55565b60068311156115e15760405162461bcd60e51b81526004016108a990612ea5565b60068211156116025760405162461bcd60e51b81526004016108a990612eef565b60068111156116235760405162461bcd60e51b81526004016108a990612f39565b601785905560188490556019839055601a829055601b819055604080518681526020810186905290810184905260608101839052608081018290527f01e39f38385f3416e0e6e6cb23a1ed2df1a25a62ac7d5e6d2ee91f934ea2573f9060a001610aa2565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610969918590610af2908690612f93565b5f610969338484611b08565b5f546001600160a01b031633146116f35760405162461bcd60e51b81526004016108a990612dd5565b600b80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061095290831515815260200190565b5f546001600160a01b031633146117655760405162461bcd60e51b81526004016108a990612dd5565b5f8111801561177e57506969e10de76676d08000008111155b6117f05760405162461bcd60e51b815260206004820152603960248201527f416d6f756e742073686f756c64206265206d6f7265207468616e207a65726f2060448201527f616e64206c657373207468616e203530306b20746f6b656e730000000000000060648201526084016108a9565b600c8190556040518181527fadfa8ecb21b6962ebcd0adbd9ab985b7b4c5b5eb3b0dead683171565c7bfe17190602001610952565b5f546001600160a01b0316331461184e5760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b0381165f9081526005602052604090205460ff166118ae5760405162461bcd60e51b8152602060048201526016602482015275416c7265617920696e636c7564656420696e2066656560501b60448201526064016108a9565b6001600160a01b0381165f81815260056020908152604091829020805460ff1916905590519182527f78ce087db51d01d3e32355f2d83455d5a39f99194c8d3d1c2614893695cee4429101610952565b5f546001600160a01b031633146119275760405162461bcd60e51b81526004016108a990612dd5565b6001600160a01b03811661198c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a9565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611a475760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108a9565b6001600160a01b038216611aa85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108a9565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b6c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108a9565b6001600160a01b038216611bce5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108a9565b5f8111611c2f5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108a9565b5f546001600160a01b0384811691161480611c5657505f546001600160a01b038381169116145b15611c6c57611c678383835f611e0e565b505050565b600b5462010000900460ff16611cc45760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420737461727465642079657400000000000000000060448201526064016108a9565b5f611cce30611488565b600c5490915081108015908190611ce85750600b5460ff16155b8015611d2657507f000000000000000000000000b18d8c3960d6ddfd3b979542dc9171a3d067a3c36001600160a01b0316856001600160a01b031614155b8015611d395750600b54610100900460ff165b15611d4c57600c549150611d4c82611f82565b6001600160a01b0385165f9081526005602052604090205460019060ff1680611d8c57506001600160a01b0385165f9081526005602052604090205460ff165b15611d9457505f5b8015611da457611da4868661201d565b61148086868684611e0e565b5f805f611dbb6120c1565b9092509050611dca8183612fa6565b9250505090565b5f805f805f805f611de188612231565b95509550955095509550505f80611dfc8a88888888886122d2565b50909b909a5098505050505050505050565b80611e3057611e305f600d819055600e819055600f8190556010819055601155565b6001600160a01b0384165f9081526006602052604090205460ff168015611e6f57506001600160a01b0383165f9081526006602052604090205460ff16155b15611e8457611e7f848484612383565b611f7c565b6001600160a01b0384165f9081526006602052604090205460ff16158015611ec357506001600160a01b0383165f9081526006602052604090205460ff165b15611ed357611e7f8484846124ed565b6001600160a01b0384165f9081526006602052604090205460ff16158015611f1357506001600160a01b0383165f9081526006602052604090205460ff16155b15611f2357611e7f8484846125a9565b6001600160a01b0384165f9081526006602052604090205460ff168015611f6157506001600160a01b0383165f9081526006602052604090205460ff165b15611f7157611e7f848484612600565b611f7c8484846125a9565b50505050565b600b805460ff191660011790555f611f9b600283612fa6565b90505f611fa88284612f93565b905047611fb483612686565b5f611fbf8247612f93565b9050611fcb8382612834565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600b805460ff19169055505050565b6001600160a01b038281167f000000000000000000000000b18d8c3960d6ddfd3b979542dc9171a3d067a3c3821690811491831614811561207b57601254600d55601354600e55601454600f55601554601055601654601155611f7c565b80156120a457601754600d55601854600e55601954600f55601a54601055601b54601155611f7c565b611f7c5f600d819055600e819055600f8190556010819055601155565b6009546008545f918291825b600754811015612200578260025f600784815481106120ee576120ee612fc5565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054118061215657508160035f6007848154811061213057612130612fc5565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b1561216c57600954600854945094505050509091565b60025f6007838154811061218257612182612fc5565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546121b09084612f93565b925060035f600783815481106121c8576121c8612fc5565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546121f69083612f93565b91506001016120cd565b506008546009546122119190612fa6565b821015612228576009546008549350935050509091565b90939092509050565b5f805f805f805f61224488600d54612936565b90505f61225389600e54612936565b90505f6122628a600f54612936565b90505f6122718b601054612936565b90505f6122808c601154612936565b90505f818385612290888a612fed565b61229a9190612fed565b6122a49190612fed565b6122ae9190612fed565b90505f6122bb828f612f93565b9e969d50949b509299509097509550919350505050565b5f805f806122de611db0565b90505f6122eb828c613000565b90505f6122f8838c613000565b90505f612305848b613000565b90505f612312858b613000565b90505f61231f868b613000565b90505f61232c878f613000565b90505f81838561233c888a612fed565b6123469190612fed565b6123509190612fed565b61235a9190612fed565b90505f6123678289612f93565b979b509699509497505050505050505096509650969350505050565b5f805f805f806123928761294d565b9550955095509550955095505f805f6123af8a89898989896122d2565b6001600160a01b038f165f9081526003602052604090205492955090935091506123da908b90612f93565b6001600160a01b038d165f90815260036020908152604080832093909355600290522054612409908490612f93565b6001600160a01b03808e165f9081526002602052604080822093909355908d1681522054612438908390612fed565b6001600160a01b038c165f908152600260205260409020556124598761298f565b612464818986612a47565b601c5461247b9087906001600160a01b0316612acd565b601d546124929086906001600160a01b0316612acd565b8a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8b6040516124d791815260200190565b60405180910390a3505050505050505050505050565b5f805f805f806124fc8761294d565b9550955095509550955095505f805f6125198a89898989896122d2565b6001600160a01b038f165f908152600260205260409020549295509093509150612544908490612f93565b6001600160a01b03808e165f90815260026020908152604080832094909455918e1681526003909152205461257a908a90612fed565b6001600160a01b038c165f90815260036020908152604080832093909355600290522054612438908390612fed565b5f805f805f806125b88761294d565b9550955095509550955095505f805f6125d58a89898989896122d2565b6001600160a01b038f165f908152600260205260409020549295509093509150612409908490612f93565b5f805f805f8061260f8761294d565b9550955095509550955095505f805f61262c8a89898989896122d2565b6001600160a01b038f165f908152600360205260409020549295509093509150612657908b90612f93565b6001600160a01b038d165f90815260036020908152604080832093909355600290522054612544908490612f93565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106126b9576126b9612fc5565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612735573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127599190613017565b8160018151811061276c5761276c612fc5565b60200260200101906001600160a01b031690816001600160a01b0316815250506127b7307f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24846119e5565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24169063791ac9479061280b9085905f90869030904290600401613032565b5f604051808303815f87803b158015612822575f80fd5b505af1158015611480573d5f803e3d5ffd5b61285f307f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24846119e5565b7f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663f305d7198230855f806128a45f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561290a573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061292f91906130a2565b5050505050565b5f60646129438385613000565b610c559190612fa6565b5f805f805f805f805f805f806129628d612231565b9550955095509550955095508585858585859b509b509b509b509b509b5050505050505091939550919395565b5f612998611db0565b90505f6129a58284613000565b305f908152600260205260409020549091506129c2908290612fed565b305f9081526002602090815260408083209390935560069052205460ff1615612a0f57305f908152600360205260409020546129ff908490612fed565b305f908152600360205260409020555b6040518381527f3a8ab79f6d1537e459a1a8379f48a77e1ffd07dda4b16ea97074fdab5dd8bf349060200160405180910390a1505050565b5f612a50611db0565b90505f612a5d8284613000565b90508085600954612a6e9190612f93565b612a789190612f93565b600955600a54612a89908590612fed565b600a55600854612a9a908490612f93565b6008556040518481527f56b5df500587465b57d8ce799cc562a294f136b75a13718c574d9d36bd82805890602001610aa2565b5f612ad6611db0565b90505f612ae38285613000565b6001600160a01b0384165f90815260026020526040902054909150612b09908290612fed565b6001600160a01b0384165f9081526002602090815260408083209390935560069052205460ff1615611f7c576001600160a01b0383165f90815260036020526040902054612b58908590612fed565b6001600160a01b0384165f9081526003602052604090205550505050565b6001600160a01b0381168114612b8a575f80fd5b50565b5f60208284031215612b9d575f80fd5b8135610c5581612b76565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8060408385031215612bee575f80fd5b8235612bf981612b76565b946020939093013593505050565b5f805f805f60a08688031215612c1b575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f805f60608486031215612c50575f80fd5b8335612c5b81612b76565b92506020840135612c6b81612b76565b929592945050506040919091013590565b5f60208284031215612c8c575f80fd5b5035919050565b80358015158114612ca2575f80fd5b919050565b5f8060408385031215612cb8575f80fd5b82359150612cc860208401612c93565b90509250929050565b5f8083601f840112612ce1575f80fd5b50813567ffffffffffffffff811115612cf8575f80fd5b6020830191508360208260051b8501011115612d12575f80fd5b9250929050565b5f805f8060408587031215612d2c575f80fd5b843567ffffffffffffffff811115612d42575f80fd5b612d4e87828801612cd1565b909550935050602085013567ffffffffffffffff811115612d6d575f80fd5b612d7987828801612cd1565b95989497509550505050565b5f60208284031215612d95575f80fd5b610c5582612c93565b5f8060408385031215612daf575f80fd5b8235612dba81612b76565b91506020830135612dca81612b76565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f596f752063616e206e6f7420736574207265666c656374696f6e20746178206d60408201526a6f7265207468656e20362560a81b606082015260800190565b60208082526030908201527f596f752063616e206e6f742073657420636f696e206f7065726174696f6e202060408201526f746178206d6f7265207468656e20362560801b606082015260800190565b6020808252602a908201527f596f752063616e206e6f7420736574207072697a6546756e6420746178206d6f6040820152697265207468656e20362560b01b606082015260800190565b6020808252602a908201527f596f752063616e206e6f7420736574206c697175696469747920746178206d6f6040820152697265207468656e20362560b01b606082015260800190565b60208082526026908201527f596f752063616e206e6f7420736574206275726e2020746178206d6f7265207460408201526568656e20362560d01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561096d5761096d612f7f565b5f82612fc057634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b8082018082111561096d5761096d612f7f565b808202811582820484141761096d5761096d612f7f565b5f60208284031215613027575f80fd5b8151610c5581612b76565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156130825783516001600160a01b031683526020938401939092019160010161305b565b50506001600160a01b039590951660608401525050608001529392505050565b5f805f606084860312156130b4575f80fd5b505081516020830151604090930151909492935091905056fea26469706673582212202bbaec77207fcdd48642862e8e81d66649e451dcbb8233da77c17b4471efc90964736f6c634300081a0033

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

000000000000000000000000e5f50476f9e14f850068a9349a569592a0751c6d000000000000000000000000e5f50476f9e14f850068a9349a569592a0751c6d

-----Decoded View---------------
Arg [0] : _operationwallet (address): 0xe5F50476f9E14f850068a9349A569592A0751c6D
Arg [1] : _prizeFundWallet (address): 0xe5F50476f9E14f850068a9349A569592A0751c6D

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e5f50476f9e14f850068a9349a569592a0751c6d
Arg [1] : 000000000000000000000000e5f50476f9e14f850068a9349a569592a0751c6d


Deployed Bytecode Sourcemap

11962:47833:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30195:221;;;;;;;;;;-1:-1:-1;30195:221:0;;;;;:::i;:::-;;:::i;:::-;;16314:84;;;;;;;;;;-1:-1:-1;16386:4:0;;;;;;;;;;;-1:-1:-1;;;16386:4:0;;;;16314:84;;;;16386:4;16314:84;:::i;:::-;;;;;;;;20068:161;;;;;;;;;;-1:-1:-1;20068:161:0;;;;;:::i;:::-;;:::i;:::-;;;1362:14:1;;1355:22;1337:41;;1325:2;1310:18;20068:161:0;1197:187:1;13630:34:0;;;;;;;;;;-1:-1:-1;13630:34:0;;;;-1:-1:-1;;;;;13630:34:0;;;;;;-1:-1:-1;;;;;1553:32:1;;;1535:51;;1523:2;1508:18;13630:34:0;1389:203:1;23523:89:0;;;;;;;;;;-1:-1:-1;23594:10:0;;23523:89;;;1743:25:1;;;1731:2;1716:18;23523:89:0;1597:177:1;43412:908:0;;;;;;;;;;-1:-1:-1;43412:908:0;;;;;:::i;:::-;;:::i;12685:51::-;;;;;;;;;;;;;;;17452:97;;;;;;;;;;-1:-1:-1;17534:7:0;;17452:97;;13571:30;;;;;;;;;;;;;;;;20857:266;;;;;;;;;;-1:-1:-1;20857:266:0;;;;;:::i;:::-;;:::i;42792:183::-;;;;;;;;;;;;;:::i;25902:250::-;;;;;;;;;;-1:-1:-1;25902:250:0;;;;;:::i;:::-;;:::i;13323:29::-;;;;;;;;;;;;;;;;17170:84;;;;;;;;;;-1:-1:-1;17170:84:0;;12674:2;3612:36:1;;3600:2;3585:18;17170:84:0;3470:184:1;13671:30:0;;;;;;;;;;-1:-1:-1;13671:30:0;;;;-1:-1:-1;;;;;13671:30:0;;;27587:520;;;;;;;;;;-1:-1:-1;27587:520:0;;;;;:::i;:::-;;:::i;21645:215::-;;;;;;;;;;-1:-1:-1;21645:215:0;;;;;:::i;:::-;;:::i;23991:361::-;;;;;;;;;;-1:-1:-1;23991:361:0;;;;;:::i;:::-;;:::i;28465:228::-;;;;;;;;;;-1:-1:-1;28465:228:0;;;;;:::i;:::-;;:::i;24998:430::-;;;;;;;;;;-1:-1:-1;24998:430:0;;;;;:::i;:::-;;:::i;12743:38::-;;;;;;;;;;;;;;;12822:40;;;;;;;;;;-1:-1:-1;12822:40:0;;;;;;;;;;;26511:376;;;;;;;;;;-1:-1:-1;26511:376:0;;;;;:::i;:::-;;:::i;13146:35::-;;;;;;;;;;;;;;;;41527:125;;;;;;;;;;-1:-1:-1;41527:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;41617:27:0;41593:4;41617:27;;;:18;:27;;;;;;;;;41527:125;13188:40;;;;;;;;;;;;;;;;29615:233;;;;;;;;;;-1:-1:-1;29615:233:0;;;;;:::i;:::-;;:::i;47728:632::-;;;;;;;;;;-1:-1:-1;47728:632:0;;;;;:::i;:::-;;:::i;13529:35::-;;;;;;;;;;;;;;;;18054:222;;;;;;;;;;-1:-1:-1;18054:222:0;;;;;:::i;:::-;;:::i;5592:148::-;;;;;;;;;;;;;:::i;13235:40::-;;;;;;;;;;;;;;;;13481:41;;;;;;;;;;;;;;;;23055:122;;;;;;;;;;-1:-1:-1;23055:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;23149:20:0;23125:4;23149:20;;;:11;:20;;;;;;;;;23055:122;4956:79;;;;;;;;;;-1:-1:-1;4994:7:0;5021:6;-1:-1:-1;;;;;5021:6:0;4956:79;;44757:919;;;;;;;;;;-1:-1:-1;44757:919:0;;;;;:::i;:::-;;:::i;13282:34::-;;;;;;;;;;;;;;;;22379:225;;;;;;;;;;-1:-1:-1;22379:225:0;;;;;:::i;:::-;;:::i;18735:169::-;;;;;;;;;;-1:-1:-1;18735:169:0;;;;;:::i;:::-;;:::i;31053:170::-;;;;;;;;;;-1:-1:-1;31053:170:0;;;;;:::i;:::-;;:::i;12869:24::-;;;;;;;;;;-1:-1:-1;12869:24:0;;;;;;;;;;;31777:279;;;;;;;;;;-1:-1:-1;31777:279:0;;;;;:::i;:::-;;:::i;19444:145::-;;;;;;;;;;-1:-1:-1;19444:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;19554:18:0;;;19527:7;19554:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19444:145;13390:36;;;;;;;;;;;;;;;;29048:222;;;;;;;;;;-1:-1:-1;29048:222:0;;;;;:::i;:::-;;:::i;13433:41::-;;;;;;;;;;;;;;;;5895:244;;;;;;;;;;-1:-1:-1;5895:244:0;;;;;:::i;:::-;;:::i;30195:221::-;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;30276:20:0;::::1;30268:59;;;::::0;-1:-1:-1;;;30268:59:0;;6409:2:1;30268:59:0::1;::::0;::::1;6391:21:1::0;6448:2;6428:18;;;6421:30;6487:29;6467:18;;;6460:57;6534:18;;30268:59:0::1;6207:351:1::0;30268:59:0::1;30338:15;:24:::0;;-1:-1:-1;;;;;;30338:24:0::1;-1:-1:-1::0;;;;;30338:24:0;::::1;::::0;;::::1;::::0;;;30378:30:::1;::::0;1535:51:1;;;30378:30:0::1;::::0;1523:2:1;1508:18;30378:30:0::1;;;;;;;;30195:221:::0;:::o;20068:161::-;20143:4;20160:39;3583:10;20183:7;20192:6;20160:8;:39::i;:::-;-1:-1:-1;20217:4:0;20068:161;;;;;:::o;43412:908::-;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;43596:1:::1;43579:13;:18;;43571:73;;;;-1:-1:-1::0;;;43571:73:0::1;;;;;;;:::i;:::-;43684:1;43663:17;:22;;43655:82;;;;-1:-1:-1::0;;;43655:82:0::1;;;;;;;:::i;:::-;43772:1;43756:12;:17;;43748:71;;;;-1:-1:-1::0;;;43748:71:0::1;;;;;;;:::i;:::-;43854:1;43838:12;:17;;43830:71;;;;-1:-1:-1::0;;;43830:71:0::1;;;;;;;:::i;:::-;43931:1;43920:7;:12;;43912:62;;;;-1:-1:-1::0;;;43912:62:0::1;;;;;;;:::i;:::-;43992:16;:31:::0;;;44034:21:::1;:41:::0;;;44086:21:::1;:36:::0;;;44133:15:::1;:30:::0;;;44174:10:::1;:20:::0;;;44210:102:::1;::::0;;8880:25:1;;;8936:2;8921:18;;8914:34;;;8964:18;;;8957:34;;;9022:2;9007:18;;9000:34;;;9065:3;9050:19;;9043:35;;;44210:102:0::1;::::0;8867:3:1;8852:19;44210:102:0::1;;;;;;;;43412:908:::0;;;;;:::o;20857:266::-;20957:4;20974:36;20984:6;20992:9;21003:6;20974:9;:36::i;:::-;-1:-1:-1;;;;;21052:19:0;;;;;;:11;:19;;;;;;;;3583:10;21052:33;;;;;;;;;21021:72;;21030:6;;21052:40;;21086:6;;21052:40;:::i;:::-;21021:8;:72::i;:::-;-1:-1:-1;21111:4:0;20857:266;;;;;:::o;42792:183::-;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;42856:12:::1;::::0;;;::::1;;;42855:13;42847:48;;;::::0;-1:-1:-1;;;42847:48:0;;9556:2:1;42847:48:0::1;::::0;::::1;9538:21:1::0;9595:2;9575:18;;;9568:30;9634:25;9614:18;;;9607:53;9677:18;;42847:48:0::1;9354:347:1::0;42847:48:0::1;42906:12;:19:::0;;-1:-1:-1;;42906:19:0::1;::::0;;;::::1;::::0;;;;42941:26:::1;::::0;::::1;::::0;::::1;::::0;42954:12;::::1;42906:19;42954:12;1362:14:1::0;1355:22;1337:41;;1325:2;1310:18;;1197:187;42941:26:0::1;;;;;;;;42792:183::o:0;25902:250::-;25968:7;26007;;25996;:18;;25988:73;;;;-1:-1:-1;;;25988:73:0;;9908:2:1;25988:73:0;;;9890:21:1;9947:2;9927:18;;;9920:30;9986:34;9966:18;;;9959:62;-1:-1:-1;;;10037:18:1;;;10030:40;10087:19;;25988:73:0;9706:406:1;25988:73:0;26072:19;26095:10;:8;:10::i;:::-;26072:33;-1:-1:-1;26123:21:0;26072:33;26123:7;:21;:::i;:::-;26116:28;25902:250;-1:-1:-1;;;25902:250:0:o;27587:520::-;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27669:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;27661:60;;;::::0;-1:-1:-1;;;27661:60:0;;10541:2:1;27661:60:0::1;::::0;::::1;10523:21:1::0;10580:2;10560:18;;;10553:30;10619:29;10599:18;;;10592:57;10666:18;;27661:60:0::1;10339:351:1::0;27661:60:0::1;27737:9;27732:327;27756:9;:16:::0;27752:20;::::1;27732:327;;;27814:7;-1:-1:-1::0;;;;;27798:23:0::1;:9;27808:1;27798:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27798:12:0::1;:23:::0;27794:254:::1;;27857:9;27867:16:::0;;:20:::1;::::0;27886:1:::1;::::0;27867:20:::1;:::i;:::-;27857:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;27842:9:::1;:12:::0;;-1:-1:-1;;;;;27857:31:0;;::::1;::::0;27852:1;;27842:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;27842:46:0::1;-1:-1:-1::0;;;;;27842:46:0;;::::1;;::::0;;27907:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;27946:11:::1;:20:::0;;;;:28;;-1:-1:-1;;27946:28:0::1;::::0;;27993:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;27993:15:0;;;;;-1:-1:-1;;;;;;27993:15:0::1;::::0;;;;;28027:5:::1;;27794:254;27774:3;;27732:327;;;-1:-1:-1::0;28074:25:0::1;::::0;-1:-1:-1;;;;;1553:32:1;;1535:51;;28074:25:0::1;::::0;1523:2:1;1508:18;28074:25:0::1;1389:203:1::0;21645:215:0;3583:10;21735:4;21784:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21784:34:0;;;;;;;;;;21735:4;;21752:78;;21775:7;;21784:45;;21819:10;;21784:45;:::i;23991:361::-;3583:10;24045:14;24094:19;;;:11;:19;;;;;;;;24093:20;24085:77;;;;-1:-1:-1;;;24085:77:0;;11291:2:1;24085:77:0;;;11273:21:1;11330:2;11310:18;;;11303:30;11369:34;11349:18;;;11342:62;-1:-1:-1;;;11420:18:1;;;11413:42;11472:19;;24085:77:0;11089:408:1;24085:77:0;24174:15;24194:18;24204:7;24194:9;:18::i;:::-;-1:-1:-1;;;;;;24241:15:0;;;;;;:7;:15;;;;;;24173:39;;-1:-1:-1;24241:23:0;;24173:39;;24241:23;:::i;:::-;-1:-1:-1;;;;;24223:15:0;;;;;;:7;:15;;;;;:41;24285:7;;:15;;24293:7;;24285:15;:::i;:::-;24275:7;:25;24324:10;;:20;;24337:7;;24324:20;:::i;:::-;24311:10;:33;-1:-1:-1;;;23991:361:0:o;28465:228::-;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28545:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;28544:28;28536:64;;;::::0;-1:-1:-1;;;28536:64:0;;11704:2:1;28536:64:0::1;::::0;::::1;11686:21:1::0;11743:2;11723:18;;;11716:30;11782:26;11762:18;;;11755:54;11826:18;;28536:64:0::1;11502:348:1::0;28536:64:0::1;-1:-1:-1::0;;;;;28611:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;28611:34:0::1;28641:4;28611:34;::::0;;28661:24;;1535:51:1;;;28661:24:0::1;::::0;1508:18:1;28661:24:0::1;1389:203:1::0;24998:430:0;25090:7;25129;;25118;:18;;25110:62;;;;-1:-1:-1;;;25110:62:0;;12057:2:1;25110:62:0;;;12039:21:1;12096:2;12076:18;;;12069:30;12135:33;12115:18;;;12108:61;12186:18;;25110:62:0;11855:355:1;25110:62:0;25188:17;25183:238;;25223:15;25243:18;25253:7;25243:9;:18::i;:::-;-1:-1:-1;25222:39:0;-1:-1:-1;25277:14:0;;-1:-1:-1;25277:14:0;25183:238;25326:23;25353:18;25363:7;25353:9;:18::i;:::-;25324:47;-1:-1:-1;25387:22:0;;-1:-1:-1;;25387:22:0;26511:376;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26594:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;26593:21;26585:61;;;::::0;-1:-1:-1;;;26585:61:0;;12417:2:1;26585:61:0::1;::::0;::::1;12399:21:1::0;12456:2;12436:18;;;12429:30;12495:29;12475:18;;;12468:57;12542:18;;26585:61:0::1;12215:351:1::0;26585:61:0::1;-1:-1:-1::0;;;;;26660:16:0;::::1;26679:1;26660:16:::0;;;:7:::1;:16;::::0;;;;;:20;26657:108:::1;;-1:-1:-1::0;;;;;26736:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;26716:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;26697:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;26657:108:::1;-1:-1:-1::0;;;;;26775:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;;;:27;;-1:-1:-1;;26775:27:0::1;26798:4;26775:27:::0;;::::1;::::0;;;26813:9:::1;:23:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;26813:23:0::1;::::0;::::1;::::0;;26852:27;;1535:51:1;;;26852:27:0::1;::::0;1508:18:1;26852:27:0::1;1389:203:1::0;29615:233:0;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29700:20:0;::::1;29692:59;;;::::0;-1:-1:-1;;;29692:59:0;;6409:2:1;29692:59:0::1;::::0;::::1;6391:21:1::0;6448:2;6428:18;;;6421:30;6487:29;6467:18;;;6460:57;6534:18;;29692:59:0::1;6207:351:1::0;29692:59:0::1;29762:19;:28:::0;;-1:-1:-1;;;;;;29762:28:0::1;-1:-1:-1::0;;;;;29762:28:0;::::1;::::0;;::::1;::::0;;;29806:34:::1;::::0;1535:51:1;;;29806:34:0::1;::::0;1523:2:1;1508:18;29806:34:0::1;1389:203:1::0;47728:632:0;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;47829:19:::1;47871:33:::0;;::::1;47863:85;;;::::0;-1:-1:-1;;;47863:85:0;;12773:2:1;47863:85:0::1;::::0;::::1;12755:21:1::0;12812:2;12792:18;;;12785:30;12851:34;12831:18;;;12824:62;-1:-1:-1;;;12902:18:1;;;12895:38;12950:19;;47863:85:0::1;12571:404:1::0;47863:85:0::1;47963:6;47959:139;47973:20:::0;;::::1;47959:139;;;48014:11;48028:6;;48035:1;48028:9;;;;;;;:::i;:::-;;;;;;;48014:23;;48080:6;48066:11;:20;;;;:::i;:::-;48052:34:::0;-1:-1:-1;;47995:3:0::1;;47959:139;;;;48141:11;48116:21;48126:10;48116:9;:21::i;:::-;:36;;48108:77;;;::::0;-1:-1:-1;;;48108:77:0;;13182:2:1;48108:77:0::1;::::0;::::1;13164:21:1::0;13221:2;13201:18;;;13194:30;13260;13240:18;;;13233:58;13308:18;;48108:77:0::1;12980:352:1::0;48108:77:0::1;48200:6;48196:157;48210:20:::0;;::::1;48196:157;;;48251:11;48265:6;;48272:1;48265:9;;;;;;;:::i;:::-;;;;;;;48251:23;;48289:52;48304:10;48315:9;;48325:1;48315:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48328:6;48335:5;48289:14;:52::i;:::-;-1:-1:-1::0;48232:3:0::1;;48196:157;;;;47818:542;47728:632:::0;;;;:::o;18054:222::-;-1:-1:-1;;;;;18144:20:0;;18120:7;18144:20;;;:11;:20;;;;;;;;18140:49;;;-1:-1:-1;;;;;;18173:16:0;;;;;:7;:16;;;;;;;18054:222::o;18140:49::-;-1:-1:-1;;;;;18237:16:0;;;;;;:7;:16;;;;;;18217:37;;:19;:37::i;5592:148::-;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;5699:1:::1;5683:6:::0;;5662:40:::1;::::0;-1:-1:-1;;;;;5683:6:0;;::::1;::::0;5662:40:::1;::::0;5699:1;;5662:40:::1;5730:1;5713:19:::0;;-1:-1:-1;;;;;;5713:19:0::1;::::0;;5592:148::o;44757:919::-;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;44942:1:::1;44925:13;:18;;44917:73;;;;-1:-1:-1::0;;;44917:73:0::1;;;;;;;:::i;:::-;45030:1;45009:17;:22;;45001:82;;;;-1:-1:-1::0;;;45001:82:0::1;;;;;;;:::i;:::-;45118:1;45102:12;:17;;45094:71;;;;-1:-1:-1::0;;;45094:71:0::1;;;;;;;:::i;:::-;45200:1;45184:12;:17;;45176:71;;;;-1:-1:-1::0;;;45176:71:0::1;;;;;;;:::i;:::-;45277:1;45266:7;:12;;45258:62;;;;-1:-1:-1::0;;;45258:62:0::1;;;;;;;:::i;:::-;45338:17;:32:::0;;;45381:22:::1;:42:::0;;;45434:22:::1;:37:::0;;;45482:16:::1;:31:::0;;;45524:11:::1;:21:::0;;;45561:107:::1;::::0;;8880:25:1;;;8936:2;8921:18;;8914:34;;;8964:18;;;8957:34;;;9022:2;9007:18;;9000:34;;;9065:3;9050:19;;9043:35;;;45561:107:0::1;::::0;8867:3:1;8852:19;45561:107:0::1;8621:463:1::0;22379:225:0;3583:10;22474:4;22523:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22523:34:0;;;;;;;;;;22474:4;;22491:83;;22514:7;;22523:50;;22558:15;;22523:50;:::i;18735:169::-;18815:4;18832:42;3583:10;18856:9;18867:6;18832:9;:42::i;31053:170::-;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;31131:21:::1;:31:::0;;;::::1;;;;-1:-1:-1::0;;31131:31:0;;::::1;;::::0;;31178:37:::1;::::0;::::1;::::0;::::1;::::0;31155:7;1362:14:1;1355:22;1337:41;;1325:2;1310:18;;1197:187;31777:279:0;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;31865:1:::1;31856:6;:10;:42;;;;;31880:18;31870:6;:28;;31856:42;31848:111;;;::::0;-1:-1:-1;;;31848:111:0;;13539:2:1;31848:111:0::1;::::0;::::1;13521:21:1::0;13578:2;13558:18;;;13551:30;13617:34;13597:18;;;13590:62;13688:27;13668:18;;;13661:55;13733:19;;31848:111:0::1;13337:421:1::0;31848:111:0::1;31970:29;:38:::0;;;32024:24:::1;::::0;1743:25:1;;;32024:24:0::1;::::0;1731:2:1;1716:18;32024:24:0::1;1597:177:1::0;29048:222:0;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29125:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;29117:61;;;::::0;-1:-1:-1;;;29117:61:0;;13965:2:1;29117:61:0::1;::::0;::::1;13947:21:1::0;14004:2;13984:18;;;13977:30;-1:-1:-1;;;14023:18:1;;;14016:52;14085:18;;29117:61:0::1;13763:346:1::0;29117:61:0::1;-1:-1:-1::0;;;;;29189:27:0;::::1;29219:5;29189:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;29189:35:0::1;::::0;;29240:22;;1535:51:1;;;29240:22:0::1;::::0;1508:18:1;29240:22:0::1;1389:203:1::0;5895:244:0;5168:6;;-1:-1:-1;;;;;5168:6:0;3583:10;5168:22;5160:67;;;;-1:-1:-1;;;5160:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5984:22:0;::::1;5976:73;;;::::0;-1:-1:-1;;;5976:73:0;;14316:2:1;5976:73:0::1;::::0;::::1;14298:21:1::0;14355:2;14335:18;;;14328:30;14394:34;14374:18;;;14367:62;-1:-1:-1;;;14445:18:1;;;14438:36;14491:19;;5976:73:0::1;14114:402:1::0;5976:73:0::1;6086:6;::::0;;6065:38:::1;::::0;-1:-1:-1;;;;;6065:38:0;;::::1;::::0;6086:6;::::1;::::0;6065:38:::1;::::0;::::1;6114:6;:17:::0;;-1:-1:-1;;;;;;6114:17:0::1;-1:-1:-1::0;;;;;6114:17:0;;;::::1;::::0;;;::::1;::::0;;5895:244::o;42326:337::-;-1:-1:-1;;;;;42419:19:0;;42411:68;;;;-1:-1:-1;;;42411:68:0;;14723:2:1;42411:68:0;;;14705:21:1;14762:2;14742:18;;;14735:30;14801:34;14781:18;;;14774:62;-1:-1:-1;;;14852:18:1;;;14845:34;14896:19;;42411:68:0;14521:400:1;42411:68:0;-1:-1:-1;;;;;42498:21:0;;42490:68;;;;-1:-1:-1;;;42490:68:0;;15128:2:1;42490:68:0;;;15110:21:1;15167:2;15147:18;;;15140:30;15206:34;15186:18;;;15179:62;-1:-1:-1;;;15257:18:1;;;15250:32;15299:19;;42490:68:0;14926:398:1;42490:68:0;-1:-1:-1;;;;;42571:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;42623:32;;1743:25:1;;;42623:32:0;;1716:18:1;42623:32:0;;;;;;;42326:337;;;:::o;45978:1477::-;-1:-1:-1;;;;;46068:18:0;;46060:68;;;;-1:-1:-1;;;46060:68:0;;15531:2:1;46060:68:0;;;15513:21:1;15570:2;15550:18;;;15543:30;15609:34;15589:18;;;15582:62;-1:-1:-1;;;15660:18:1;;;15653:35;15705:19;;46060:68:0;15329:401:1;46060:68:0;-1:-1:-1;;;;;46147:16:0;;46139:64;;;;-1:-1:-1;;;46139:64:0;;15937:2:1;46139:64:0;;;15919:21:1;15976:2;15956:18;;;15949:30;16015:34;15995:18;;;15988:62;-1:-1:-1;;;16066:18:1;;;16059:33;16109:19;;46139:64:0;15735:399:1;46139:64:0;46231:1;46222:6;:10;46214:64;;;;-1:-1:-1;;;46214:64:0;;16341:2:1;46214:64:0;;;16323:21:1;16380:2;16360:18;;;16353:30;16419:34;16399:18;;;16392:62;-1:-1:-1;;;16470:18:1;;;16463:39;16519:19;;46214:64:0;16139:405:1;46214:64:0;4994:7;5021:6;-1:-1:-1;;;;;46295:15:0;;;5021:6;;46295:15;;:32;;-1:-1:-1;4994:7:0;5021:6;-1:-1:-1;;;;;46314:13:0;;;5021:6;;46314:13;46295:32;46291:121;;;46343:36;46358:4;46363:2;46366:6;46373:5;46343:14;:36::i;:::-;45978:1477;;;:::o;46291:121::-;46432:12;;;;;;;46424:47;;;;-1:-1:-1;;;46424:47:0;;16751:2:1;46424:47:0;;;16733:21:1;16790:2;16770:18;;;16763:30;16829:25;16809:18;;;16802:53;16872:18;;46424:47:0;16549:347:1;46424:47:0;46484:28;46515:24;46533:4;46515:9;:24::i;:::-;46611:29;;46484:55;;-1:-1:-1;46587:53:0;;;;;;;46669;;-1:-1:-1;46706:16:0;;;;46705:17;46669:53;:91;;;;;46747:13;-1:-1:-1;;;;;46739:21:0;:4;-1:-1:-1;;;;;46739:21:0;;;46669:91;:129;;;;-1:-1:-1;46777:21:0;;;;;;;46669:129;46651:318;;;46848:29;;46825:52;;46921:36;46936:20;46921:14;:36::i;:::-;-1:-1:-1;;;;;47177:24:0;;47050:12;47177:24;;;:18;:24;;;;;;47065:4;;47177:24;;;:50;;-1:-1:-1;;;;;;47205:22:0;;;;;;:18;:22;;;;;;;;47177:50;47174:96;;;-1:-1:-1;47253:5:0;47174:96;47359:7;47356:41;;;47377:20;47389:4;47394:2;47377:11;:20::i;:::-;47409:38;47424:4;47429:2;47432:6;47439:7;47409:14;:38::i;39094:160::-;39135:7;39156:15;39173;39192:19;:17;:19::i;:::-;39155:56;;-1:-1:-1;39155:56:0;-1:-1:-1;39229:17:0;39155:56;;39229:17;:::i;:::-;39222:24;;;;39094:160;:::o;35822:383::-;35879:7;35888;35910:12;35924:18;35944:22;35967:18;35987:13;36004:20;36016:7;36004:11;:20::i;:::-;35907:117;;;;;;;;;;;36036:15;36053:23;36081:71;36093:7;36102:4;36108:10;36120:14;36135:10;36146:5;36081:11;:71::i;:::-;-1:-1:-1;36035:117:0;;;;-1:-1:-1;35822:383:0;-1:-1:-1;;;;;;;;;35822:383:0:o;54412:775::-;54523:7;54519:40;;54545:14;41217:1;41208:6;:10;;;41229:13;:17;;;41257:9;:13;;;41282:8;:12;;;41305:4;:8;41165:158;54545:14;-1:-1:-1;;;;;54586:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;54610:22:0;;;;;;:11;:22;;;;;;;;54609:23;54586:46;54582:597;;;54649:48;54671:6;54679:9;54690:6;54649:21;:48::i;:::-;54582:597;;;-1:-1:-1;;;;;54720:19:0;;;;;;:11;:19;;;;;;;;54719:20;:46;;;;-1:-1:-1;;;;;;54743:22:0;;;;;;:11;:22;;;;;;;;54719:46;54715:464;;;54782:46;54802:6;54810:9;54821:6;54782:19;:46::i;54715:464::-;-1:-1:-1;;;;;54851:19:0;;;;;;:11;:19;;;;;;;;54850:20;:47;;;;-1:-1:-1;;;;;;54875:22:0;;;;;;:11;:22;;;;;;;;54874:23;54850:47;54846:333;;;54914:44;54932:6;54940:9;54951:6;54914:17;:44::i;54846:333::-;-1:-1:-1;;;;;54980:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;55003:22:0;;;;;;:11;:22;;;;;;;;54980:45;54976:203;;;55042:48;55064:6;55072:9;55083:6;55042:21;:48::i;54976:203::-;55123:44;55141:6;55149:9;55160:6;55123:17;:44::i;:::-;54412:775;;;;:::o;50464:971::-;14735:16;:23;;-1:-1:-1;;14735:23:0;14754:4;14735:23;;;:16;50615:24:::1;50638:1;50615:20:::0;:24:::1;:::i;:::-;50600:39:::0;-1:-1:-1;50650:17:0::1;50670:27;50600:39:::0;50670:20;:27:::1;:::i;:::-;50650:47:::0;-1:-1:-1;51000:21:0::1;51066:22;51083:4:::0;51066:16:::1;:22::i;:::-;51214:18;51235:38;51259:14:::0;51235:21:::1;:38;:::i;:::-;51214:59;;51323:35;51336:9;51347:10;51323:12;:35::i;:::-;51384:43;::::0;;17103:25:1;;;17159:2;17144:18;;17137:34;;;17187:18;;;17180:34;;;51384:43:0::1;::::0;17091:2:1;17076:18;51384:43:0::1;;;;;;;-1:-1:-1::0;;14781:16:0;:24;;-1:-1:-1;;14781:24:0;;;-1:-1:-1;;;50464:971:0:o;49087:788::-;-1:-1:-1;;;;;49196:21:0;;;49204:13;49196:21;;;;;;49242:19;;;49278:590;;;;49316:16;;49307:6;:25;49368:21;;49351:13;:38;49420:21;;49408:9;:33;49470:15;;49459:8;:26;49511:10;;49504:4;:17;49278:590;;;49547:6;49544:324;;;49580:17;;49572:6;:25;49631:22;;49615:13;:38;49683:22;;49671:9;:34;49734:16;;49723:8;:27;49775:11;;49768:4;:18;49544:324;;;49838:14;41217:1;41208:6;:10;;;41229:13;:17;;;41257:9;:13;;;41282:8;:12;;;41305:4;:8;41165:158;39518:552;39615:7;;39651;;39568;;;;;39675:283;39699:9;:16;39695:20;;39675:283;;;39765:7;39741;:21;39749:9;39759:1;39749:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39749:12:0;39741:21;;;;;;;;;;;;;:31;;:66;;;39800:7;39776;:21;39784:9;39794:1;39784:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39784:12:0;39776:21;;;;;;;;;;;;;:31;39741:66;39737:97;;;39817:7;;39826;;39809:25;;;;;;;39518:552;;:::o;39737:97::-;39869:7;:21;39877:9;39887:1;39877:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39877:12:0;39869:21;;;;;;;;;;;;;39859:31;;:7;:31;:::i;:::-;39849:41;;39925:7;:21;39933:9;39943:1;39933:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39933:12:0;39925:21;;;;;;;;;;;;;39915:31;;:7;:31;:::i;:::-;39905:41;-1:-1:-1;39717:3:0;;39675:283;;;;39992:7;;39982;;:17;;;;:::i;:::-;39972:7;:27;39968:58;;;40009:7;;40018;;40001:25;;;;;;39518:552;;:::o;39968:58::-;40045:7;;40054;;-1:-1:-1;39518:552:0;-1:-1:-1;39518:552:0:o;36448:647::-;36508:7;36517;36526;36535;36543;36551;36571:12;36586:28;36599:7;36607:6;;36586:12;:28::i;:::-;36571:43;;36625:18;36646:35;36659:7;36667:13;;36646:12;:35::i;:::-;36625:56;;36692:22;36717:31;36730:7;36738:9;;36717:12;:31::i;:::-;36692:56;;36759:18;36780:30;36793:7;36801:8;;36780:12;:30::i;:::-;36759:51;;36821:13;36837:26;36850:7;36858:4;;36837:12;:26::i;:::-;36821:42;-1:-1:-1;36874:14:0;36821:42;36928:10;36911:14;36891:17;36898:10;36891:4;:17;:::i;:::-;:34;;;;:::i;:::-;:47;;;;:::i;:::-;:55;;;;:::i;:::-;36874:72;-1:-1:-1;36957:23:0;36983:16;36874:72;36983:7;:16;:::i;:::-;36957:42;37035:4;;-1:-1:-1;37041:10:0;;-1:-1:-1;37053:14:0;;-1:-1:-1;37069:10:0;;-1:-1:-1;37053:14:0;-1:-1:-1;36448:647:0;;-1:-1:-1;;;;36448:647:0:o;38138:733::-;38291:7;38300;38309;38329:19;38351:10;:8;:10::i;:::-;38329:32;-1:-1:-1;38372:15:0;38390:21;38329:32;38390:7;:21;:::i;:::-;38372:39;-1:-1:-1;38422:12:0;38437:18;38444:11;38437:4;:18;:::i;:::-;38422:33;-1:-1:-1;38466:22:0;38491:28;38508:11;38491:14;:28;:::i;:::-;38466:53;-1:-1:-1;38530:18:0;38551:24;38564:11;38551:10;:24;:::i;:::-;38530:45;-1:-1:-1;38586:13:0;38602:19;38610:11;38602:5;:19;:::i;:::-;38586:35;-1:-1:-1;38632:18:0;38653:24;38666:11;38653:10;:24;:::i;:::-;38632:45;-1:-1:-1;38688:14:0;38632:45;38742:5;38729:10;38705:21;38712:14;38705:4;:21;:::i;:::-;:34;;;;:::i;:::-;:42;;;;:::i;:::-;:55;;;;:::i;:::-;38688:72;-1:-1:-1;38771:23:0;38797:16;38688:72;38797:7;:16;:::i;:::-;38832:7;;-1:-1:-1;38771:42:0;;-1:-1:-1;38858:4:0;;-1:-1:-1;;;;;;;;38138:733:0;;;;;;;;;;:::o;58984:808::-;59087:23;59112:12;59126:18;59146:22;59169:18;59189:13;59206:19;59217:7;59206:10;:19::i;:::-;59086:139;;;;;;;;;;;;59237:15;59254:23;59279:12;59295:72;59307:7;59316:4;59322:10;59334:14;59349:10;59361:5;59295:11;:72::i;:::-;-1:-1:-1;;;;;59396:15:0;;;;;;:7;:15;;;;;;59236:131;;-1:-1:-1;59236:131:0;;-1:-1:-1;59236:131:0;-1:-1:-1;59396:23:0;;59412:7;;59396:23;:::i;:::-;-1:-1:-1;;;;;59378:15:0;;;;;;:7;:15;;;;;;;;:41;;;;59448:7;:15;;;;:23;;59464:7;;59448:23;:::i;:::-;-1:-1:-1;;;;;59430:15:0;;;;;;;:7;:15;;;;;;:41;;;;59503:18;;;;;;;:34;;59522:15;;59503:34;:::i;:::-;-1:-1:-1;;;;;59482:18:0;;;;;;:7;:18;;;;;:55;59551:26;59566:10;59551:14;:26::i;:::-;59588:30;59600:4;59606;59612:5;59588:11;:30::i;:::-;59655:19;;59629:46;;59639:14;;-1:-1:-1;;;;;59655:19:0;59629:9;:46::i;:::-;59708:15;;59686:38;;59696:10;;-1:-1:-1;;;;;59708:15:0;59686:9;:38::i;:::-;59757:9;-1:-1:-1;;;;;59740:44:0;59749:6;-1:-1:-1;;;;;59740:44:0;;59768:15;59740:44;;;;1743:25:1;;1731:2;1716:18;;1597:177;59740:44:0;;;;;;;;59075:717;;;;;;;;;58984:808;;;:::o;57812:830::-;57913:23;57938:12;57952:18;57972:22;57996:18;58016:13;58033:19;58044:7;58033:10;:19::i;:::-;57912:140;;;;;;;;;;;;58064:15;58081:23;58106:12;58122:72;58134:7;58143:4;58149:10;58161:14;58176:10;58188:5;58122:11;:72::i;:::-;-1:-1:-1;;;;;58223:15:0;;;;;;:7;:15;;;;;;58063:131;;-1:-1:-1;58063:131:0;;-1:-1:-1;58063:131:0;-1:-1:-1;58223:23:0;;58063:131;;58223:23;:::i;:::-;-1:-1:-1;;;;;58205:15:0;;;;;;;:7;:15;;;;;;;;:41;;;;58278:18;;;;;:7;:18;;;;;:34;;58297:15;;58278:34;:::i;:::-;-1:-1:-1;;;;;58257:18:0;;;;;;:7;:18;;;;;;;;:55;;;;58344:7;:18;;;;:34;;58363:15;;58344:34;:::i;56719:750::-;56818:23;56843:12;56857:18;56877:22;56901:18;56921:13;56938:19;56949:7;56938:10;:19::i;:::-;56817:140;;;;;;;;;;;;56969:15;56986:23;57011:12;57027:72;57039:7;57048:4;57054:10;57066:14;57081:10;57093:5;57027:11;:72::i;:::-;-1:-1:-1;;;;;57128:15:0;;;;;;:7;:15;;;;;;56968:131;;-1:-1:-1;56968:131:0;;-1:-1:-1;56968:131:0;-1:-1:-1;57128:23:0;;56968:131;;57128:23;:::i;55508:879::-;55611:23;55636:12;55650:18;55670:22;55693:18;55713:13;55730:19;55741:7;55730:10;:19::i;:::-;55610:139;;;;;;;;;;;;55761:15;55778:23;55803:12;55819:73;55831:7;55840:4;55846:10;55858:14;55874:10;55886:5;55819:11;:73::i;:::-;-1:-1:-1;;;;;55921:15:0;;;;;;:7;:15;;;;;;55760:132;;-1:-1:-1;55760:132:0;;-1:-1:-1;55760:132:0;-1:-1:-1;55921:23:0;;55937:7;;55921:23;:::i;:::-;-1:-1:-1;;;;;55903:15:0;;;;;;:7;:15;;;;;;;;:41;;;;55973:7;:15;;;;:23;;55989:7;;55973:23;:::i;51960:589::-;52110:16;;;52124:1;52110:16;;;;;;;;52086:21;;52110:16;;;;;;;;;;-1:-1:-1;52110:16:0;52086:40;;52155:4;52137;52142:1;52137:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;52137:23:0;;;-1:-1:-1;;;;;52137:23:0;;;;;52181:15;-1:-1:-1;;;;;52181:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52171:4;52176:1;52171:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;52171:32:0;;;-1:-1:-1;;;;;52171:32:0;;;;;52216:62;52233:4;52248:15;52266:11;52216:8;:62::i;:::-;52317:224;;-1:-1:-1;;;52317:224:0;;-1:-1:-1;;;;;52317:15:0;:66;;;;:224;;52398:11;;52424:1;;52468:4;;52495;;52515:15;;52317:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53175:513;53323:62;53340:4;53355:15;53373:11;53323:8;:62::i;:::-;53428:15;-1:-1:-1;;;;;53428:31:0;;53467:9;53500:4;53520:11;53546:1;53589;53632:7;4994;5021:6;-1:-1:-1;;;;;5021:6:0;;4956:79;53632:7;53428:252;;;;;;-1:-1:-1;;;;;;53428:252:0;;;-1:-1:-1;;;;;19071:32:1;;;53428:252:0;;;19053:51:1;19120:18;;;19113:34;;;;19163:18;;;19156:34;;;;19206:18;;;19199:34;19270:32;;;19249:19;;;19242:61;53654:15:0;19319:19:1;;;19312:35;19025:19;;53428:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;53175:513;;:::o;40945:136::-;41022:7;41068:5;41049:16;41058:7;41049:6;:16;:::i;:::-;:24;;;;:::i;34820:359::-;34879:7;34888;34897;34906;34915;34923;34944:23;34969:12;34983:18;35003:22;35027:18;35046:13;35063:20;35075:7;35063:11;:20::i;:::-;34943:140;;;;;;;;;;;;35103:15;35120:4;35126:10;35138:14;35153:10;35165:5;35095:76;;;;;;;;;;;;;;;;;;34820:359;;;;;;;:::o;40295:388::-;40358:19;40381:10;:8;:10::i;:::-;40358:33;-1:-1:-1;40402:18:0;40423:24;40358:33;40423:10;:24;:::i;:::-;40499:4;40483:22;;;;:7;:22;;;;;;40402:45;;-1:-1:-1;40483:35:0;;40402:45;;40483:35;:::i;:::-;40474:4;40458:22;;;;:7;:22;;;;;;;;:60;;;;40532:11;:26;;;;;;40529:104;;;40614:4;40598:22;;;;:7;:22;;;;;;:35;;40623:10;;40598:35;:::i;:::-;40589:4;40573:22;;;;:7;:22;;;;;:60;40529:104;40649:26;;1743:25:1;;;40649:26:0;;1731:2:1;1716:18;40649:26:0;;;;;;;40347:336;;40295:388;:::o;32924:338::-;33008:19;33030:10;:8;:10::i;:::-;33008:32;-1:-1:-1;33052:13:0;33068:19;33008:32;33068:5;:19;:::i;:::-;33052:35;;33132:5;33125:4;33115:7;;:14;;;;:::i;:::-;:22;;;;:::i;:::-;33105:7;:32;33161:10;;:17;;33174:4;;33161:17;:::i;:::-;33148:10;:30;33201:7;;:15;;33211:5;;33201:15;:::i;:::-;33191:7;:25;33232:18;;1743:25:1;;;33232:18:0;;1731:2:1;1716:18;33232::0;1597:177:1;33647:350:0;33720:19;33742:10;:8;:10::i;:::-;33720:32;-1:-1:-1;33763:13:0;33779:19;33720:32;33779:5;:19;:::i;:::-;-1:-1:-1;;;;;33837:19:0;;;;;;:7;:19;;;;;;33763:35;;-1:-1:-1;33837:27:0;;33763:35;;33837:27;:::i;:::-;-1:-1:-1;;;;;33815:19:0;;;;;;:7;:19;;;;;;;;:49;;;;33889:11;:23;;;;;;33885:105;;;-1:-1:-1;;;;;33951:19:0;;;;;;:7;:19;;;;;;:27;;33973:5;;33951:27;:::i;:::-;-1:-1:-1;;;;;33929:19:0;;;;;;:7;:19;;;;;:49;33709:288;;33647:350;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:247::-;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:418::-;551:2;540:9;533:21;514:4;583:6;577:13;626:6;621:2;610:9;606:18;599:34;685:6;680:2;672:6;668:15;663:2;652:9;648:18;642:50;741:1;736:2;727:6;716:9;712:22;708:31;701:42;811:2;804;800:7;795:2;787:6;783:15;779:29;768:9;764:45;760:54;752:62;;;402:418;;;;:::o;825:367::-;893:6;901;954:2;942:9;933:7;929:23;925:32;922:52;;;970:1;967;960:12;922:52;1009:9;996:23;1028:31;1053:5;1028:31;:::i;:::-;1078:5;1156:2;1141:18;;;;1128:32;;-1:-1:-1;;;825:367:1:o;1779:708::-;1874:6;1882;1890;1898;1906;1959:3;1947:9;1938:7;1934:23;1930:33;1927:53;;;1976:1;1973;1966:12;1927:53;-1:-1:-1;;2021:23:1;;;2141:2;2126:18;;2113:32;;-1:-1:-1;2244:2:1;2229:18;;2216:32;;2347:2;2332:18;;2319:32;;-1:-1:-1;2450:3:1;2435:19;2422:33;;-1:-1:-1;1779:708:1;-1:-1:-1;1779:708:1:o;2726:508::-;2803:6;2811;2819;2872:2;2860:9;2851:7;2847:23;2843:32;2840:52;;;2888:1;2885;2878:12;2840:52;2927:9;2914:23;2946:31;2971:5;2946:31;:::i;:::-;2996:5;-1:-1:-1;3053:2:1;3038:18;;3025:32;3066:33;3025:32;3066:33;:::i;:::-;2726:508;;3118:7;;-1:-1:-1;;;3198:2:1;3183:18;;;;3170:32;;2726:508::o;3239:226::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3412:23:1;;3239:226;-1:-1:-1;3239:226:1:o;3659:160::-;3724:20;;3780:13;;3773:21;3763:32;;3753:60;;3809:1;3806;3799:12;3753:60;3659:160;;;:::o;3824:294::-;3889:6;3897;3950:2;3938:9;3929:7;3925:23;3921:32;3918:52;;;3966:1;3963;3956:12;3918:52;4011:23;;;-1:-1:-1;4077:35:1;4108:2;4093:18;;4077:35;:::i;:::-;4067:45;;3824:294;;;;;:::o;4123:367::-;4186:8;4196:6;4250:3;4243:4;4235:6;4231:17;4227:27;4217:55;;4268:1;4265;4258:12;4217:55;-1:-1:-1;4291:20:1;;4334:18;4323:30;;4320:50;;;4366:1;4363;4356:12;4320:50;4403:4;4395:6;4391:17;4379:29;;4463:3;4456:4;4446:6;4443:1;4439:14;4431:6;4427:27;4423:38;4420:47;4417:67;;;4480:1;4477;4470:12;4417:67;4123:367;;;;;:::o;4495:768::-;4617:6;4625;4633;4641;4694:2;4682:9;4673:7;4669:23;4665:32;4662:52;;;4710:1;4707;4700:12;4662:52;4750:9;4737:23;4783:18;4775:6;4772:30;4769:50;;;4815:1;4812;4805:12;4769:50;4854:70;4916:7;4907:6;4896:9;4892:22;4854:70;:::i;:::-;4943:8;;-1:-1:-1;4828:96:1;-1:-1:-1;;5031:2:1;5016:18;;5003:32;5060:18;5047:32;;5044:52;;;5092:1;5089;5082:12;5044:52;5131:72;5195:7;5184:8;5173:9;5169:24;5131:72;:::i;:::-;4495:768;;;;-1:-1:-1;5222:8:1;-1:-1:-1;;;;4495:768:1:o;5268:180::-;5324:6;5377:2;5365:9;5356:7;5352:23;5348:32;5345:52;;;5393:1;5390;5383:12;5345:52;5416:26;5432:9;5416:26;:::i;5453:388::-;5521:6;5529;5582:2;5570:9;5561:7;5557:23;5553:32;5550:52;;;5598:1;5595;5588:12;5550:52;5637:9;5624:23;5656:31;5681:5;5656:31;:::i;:::-;5706:5;-1:-1:-1;5763:2:1;5748:18;;5735:32;5776:33;5735:32;5776:33;:::i;:::-;5828:7;5818:17;;;5453:388;;;;;:::o;5846:356::-;6048:2;6030:21;;;6067:18;;;6060:30;6126:34;6121:2;6106:18;;6099:62;6193:2;6178:18;;5846:356::o;6563:407::-;6765:2;6747:21;;;6804:2;6784:18;;;6777:30;6843:34;6838:2;6823:18;;6816:62;-1:-1:-1;;;6909:2:1;6894:18;;6887:41;6960:3;6945:19;;6563:407::o;6975:412::-;7177:2;7159:21;;;7216:2;7196:18;;;7189:30;7255:34;7250:2;7235:18;;7228:62;-1:-1:-1;;;7321:2:1;7306:18;;7299:46;7377:3;7362:19;;6975:412::o;7392:406::-;7594:2;7576:21;;;7633:2;7613:18;;;7606:30;7672:34;7667:2;7652:18;;7645:62;-1:-1:-1;;;7738:2:1;7723:18;;7716:40;7788:3;7773:19;;7392:406::o;7803:::-;8005:2;7987:21;;;8044:2;8024:18;;;8017:30;8083:34;8078:2;8063:18;;8056:62;-1:-1:-1;;;8149:2:1;8134:18;;8127:40;8199:3;8184:19;;7803:406::o;8214:402::-;8416:2;8398:21;;;8455:2;8435:18;;;8428:30;8494:34;8489:2;8474:18;;8467:62;-1:-1:-1;;;8560:2:1;8545:18;;8538:36;8606:3;8591:19;;8214:402::o;9089:127::-;9150:10;9145:3;9141:20;9138:1;9131:31;9181:4;9178:1;9171:15;9205:4;9202:1;9195:15;9221:128;9288:9;;;9309:11;;;9306:37;;;9323:18;;:::i;10117:217::-;10157:1;10183;10173:132;;10227:10;10222:3;10218:20;10215:1;10208:31;10262:4;10259:1;10252:15;10290:4;10287:1;10280:15;10173:132;-1:-1:-1;10319:9:1;;10117:217::o;10695:127::-;10756:10;10751:3;10747:20;10744:1;10737:31;10787:4;10784:1;10777:15;10811:4;10808:1;10801:15;10827:127;10888:10;10883:3;10879:20;10876:1;10869:31;10919:4;10916:1;10909:15;10943:4;10940:1;10933:15;10959:125;11024:9;;;11045:10;;;11042:36;;;11058:18;;:::i;17225:168::-;17298:9;;;17329;;17346:15;;;17340:22;;17326:37;17316:71;;17367:18;;:::i;17530:251::-;17600:6;17653:2;17641:9;17632:7;17628:23;17624:32;17621:52;;;17669:1;17666;17659:12;17621:52;17701:9;17695:16;17720:31;17745:5;17720:31;:::i;17786:959::-;18048:4;18096:3;18085:9;18081:19;18127:6;18116:9;18109:25;18170:6;18165:2;18154:9;18150:18;18143:34;18213:3;18208:2;18197:9;18193:18;18186:31;18237:6;18272;18266:13;18303:6;18295;18288:22;18341:3;18330:9;18326:19;18319:26;;18380:2;18372:6;18368:15;18354:29;;18401:1;18411:195;18425:6;18422:1;18419:13;18411:195;;;18490:13;;-1:-1:-1;;;;;18486:39:1;18474:52;;18555:2;18581:15;;;;18546:12;;;;18522:1;18440:9;18411:195;;;-1:-1:-1;;;;;;;18662:32:1;;;;18657:2;18642:18;;18635:60;-1:-1:-1;;18726:3:1;18711:19;18704:35;18623:3;17786:959;-1:-1:-1;;;17786:959:1:o;19358:456::-;19446:6;19454;19462;19515:2;19503:9;19494:7;19490:23;19486:32;19483:52;;;19531:1;19528;19521:12;19483:52;-1:-1:-1;;19576:16:1;;19682:2;19667:18;;19661:25;19778:2;19763:18;;;19757:25;19576:16;;19661:25;;-1:-1:-1;19757:25:1;19358:456;-1:-1:-1;19358:456:1:o

Swarm Source

ipfs://2bbaec77207fcdd48642862e8e81d66649e451dcbb8233da77c17b4471efc909
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.