ETH Price: $3,231.64 (-3.40%)
 

Overview

Max Total Supply

1,000,000,000,000 FP

Holders

153

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
3,075,838,475.806437898814734354 FP

Value
$0.00
0x7ac6874487744fc3624b1d987918e218eb015fb4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
fai

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2025-01-03
*/

/**

Welcome to The Firm Protocols ( $FP )

Your AI-Powered Agent (AIA) :
━━━━━━━━━━━━━━━━━━━━━━
🎯 What You Can FIRM AIA Do:
💡 Learn Crypto Basics
⚡️ Analyze Risks with The Firm AI
✅ Get Safety Assessments for Projects
📚 Access Step-by-Step Guides
📊 Stay Updated with Real-Time Market Insights
🎮 Play & Earn Points
🎨 Generate AI Art
🤖 Chat with The Firm AI Assistant

https://t.me/FirmAiProtocols
https://x.com/TF_Protocols
https://thefirmprotocols.com
https://t.me/TheFirmAIProtocols_bot
*/

// SPDX-License-Identifier: Unlicensed

    pragma solidity ^0.8.0;

    interface IERC20 {
        
        function totalSupply() external view returns (uint256);
        function balanceOf(address account) external view returns (uint256);
        function transfer(address recipient, uint256 amount) external returns (bool);
        function allowance(address owner, address spender) external view returns (uint256);
        function approve(address spender, uint256 amount) external returns (bool);
        function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
        
        event Transfer(address indexed from, address indexed to, uint256 value);
        event Approval(address indexed owner, address indexed spender, uint256 value);
    }

    library SafeMath {
        
        function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            unchecked {
                uint256 c = a + b;
                if (c < a) return (false, 0);
                return (true, c);
            }
        }
        
        function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            unchecked {
                if (b > a) return (false, 0);
                return (true, a - b);
            }
        }
        
        function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            unchecked {
                // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
                // benefit is lost if 'b' is also tested.
                // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
                if (a == 0) return (true, 0);
                uint256 c = a * b;
                if (c / a != b) return (false, 0);
                return (true, c);
            }
        }
        
        function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            unchecked {
                if (b == 0) return (false, 0);
                return (true, a / b);
            }
        }
        
        function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
            unchecked {
                if (b == 0) return (false, 0);
                return (true, a % b);
            }
        }

        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            return a + b;
        }


        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            return a - b;
        }


        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
            return a * b;
        }
        
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            return a / b;
        }


        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            return a % b;
        }
        
        function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            unchecked {
                require(b <= a, errorMessage);
                return a - b;
            }
        }
        
        function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            unchecked {
                require(b > 0, errorMessage);
                return a / b;
            }
        }
        
        function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            unchecked {
                require(b > 0, errorMessage);
                return a % b;
            }
        }
    }

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

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

    library Address {
        
        function isContract(address account) internal view returns (bool) {
            uint256 size;
            assembly { size := extcodesize(account) }
            return size > 0;
        }

        function sendValue(address payable recipient, uint256 amount) internal {
            require(address(this).balance >= amount, "Address: insufficient balance");
            (bool success, ) = recipient.call{ value: amount }("");
            require(success, "Address: unable to send value, recipient may have reverted");
        }
        
        function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
        }
        
        function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
            return functionCallWithValue(target, data, 0, errorMessage);
        }
        
        function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
            return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
        }
        
        function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
            require(address(this).balance >= value, "Address: insufficient balance for call");
            require(isContract(target), "Address: call to non-contract");
            (bool success, bytes memory returndata) = target.call{ value: value }(data);
            return _verifyCallResult(success, returndata, errorMessage);
        }
        
        function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
            return functionStaticCall(target, data, "Address: low-level static call failed");
        }
        
        function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
            require(isContract(target), "Address: static call to non-contract");
            (bool success, bytes memory returndata) = target.staticcall(data);
            return _verifyCallResult(success, returndata, errorMessage);
        }


        function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
            return functionDelegateCall(target, data, "Address: low-level delegate call failed");
        }
        
        function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
            require(isContract(target), "Address: delegate call to non-contract");
            (bool success, bytes memory returndata) = target.delegatecall(data);
            return _verifyCallResult(success, returndata, errorMessage);
        }

        function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
            if (success) {
                return returndata;
            } else {
                if (returndata.length > 0) {
                    assembly {
                        let returndata_size := mload(returndata)
                        revert(add(32, returndata), returndata_size)
                    }
                } else {
                    revert(errorMessage);
                }
            }
        }
    }

    abstract contract Ownable is Context {
        address internal _owner;
        address private _previousOwner;

        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
        constructor () {
            _owner = _msgSender();
            emit OwnershipTransferred(address(0), _owner);
        }
        
        function owner() public view virtual returns (address) {
            return _owner;
        }
        
        modifier onlyOwner() {
            require(owner() == _msgSender(), "Ownable: caller is not the owner");
            _;
        }
        
        function renounceOwnership() public virtual onlyOwner {
            emit OwnershipTransferred(_owner, address(0));
            _owner = address(0);
        }


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

    interface IERC20Metadata is IERC20 {
        /**
        * @dev Returns the name of the token.
        */
        function name() external view returns (string memory);

        /**
        * @dev Returns the symbol of the token.
        */
        function symbol() external view returns (string memory);

        /**
        * @dev Returns the decimals places of the token.
        */
        function decimals() external view returns (uint8);
    }
    contract ERC20 is Context,Ownable, IERC20, IERC20Metadata {
        using SafeMath for uint256;

        mapping(address => uint256) private _balances;

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

        uint256 private _totalSupply;

        string private _name;
        string private _symbol;

        /**
        * @dev Sets the values for {name} and {symbol}.
        *
        * The default value of {decimals} is 18. To select a different value for
        * {decimals} you should overload it.
        *
        * All two of these values are immutable: they can only be set once during
        * construction.
        */
        constructor(string memory name_, string memory symbol_) {
            _name = name_;
            _symbol = symbol_;
        }

        /**
        * @dev Returns the name of the token.
        */
        function name() public view virtual override returns (string memory) {
            return _name;
        }

        /**
        * @dev Returns the symbol of the token, usually a shorter version of the
        * name.
        */
        function symbol() public view virtual override returns (string memory) {
            return _symbol;
        }

        /**
        * @dev Returns the number of decimals used to get its user representation.
        * For example, if `decimals` equals `2`, a balance of `505` tokens should
        * be displayed to a user as `5,05` (`505 / 10 ** 2`).
        *
        * Tokens usually opt for a value of 18, imitating the relationship between
        * Ether and Wei. This is the value {ERC20} uses, unless this function is
        * overridden;
        *
        * NOTE: This information is only used for _display_ purposes: it in
        * no way affects any of the arithmetic of the contract, including
        * {IERC20-balanceOf} and {IERC20-transfer}.
        */
        function decimals() public view virtual override returns (uint8) {
            return 18;
        }

        /**
        * @dev See {IERC20-totalSupply}.
        */
        function totalSupply() public view virtual override returns (uint256) {
            return _totalSupply;
        }

        /**
        * @dev See {IERC20-balanceOf}.
        */
        function balanceOf(address account) public view virtual override returns (uint256) {
            return _balances[account];
        }

        /**
        * @dev See {IERC20-transfer}.
        *
        * Requirements:
        *
        * - `recipient` cannot be the zero address.
        * - the caller must have a balance of at least `amount`.
        */
        function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
            _transfer(_msgSender(), recipient, amount);
            return true;
        }

        /**
        * @dev See {IERC20-allowance}.
        */
        function allowance(address owner, address spender) public view virtual override returns (uint256) {
            return _allowances[owner][spender];
        }

        /**
        * @dev See {IERC20-approve}.
        *
        * Requirements:
        *
        * - `spender` cannot be the zero address.
        */
        function approve(address spender, uint256 amount) public virtual override returns (bool) {
            _approve(_msgSender(), spender, amount);
            return true;
        }

        /**
        * @dev See {IERC20-transferFrom}.
        *
        * Emits an {Approval} event indicating the updated allowance. This is not
        * required by the EIP. See the note at the beginning of {ERC20}.
        *
        * Requirements:
        *
        * - `sender` and `recipient` cannot be the zero address.
        * - `sender` must have a balance of at least `amount`.
        * - the caller must have allowance for ``sender``'s tokens of at least
        * `amount`.
        */
        function transferFrom(
            address sender,
            address recipient,
            uint256 amount
        ) public virtual override returns (bool) {
            _transfer(sender, recipient, amount);
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
            return true;
        }

        /**
        * @dev Atomically increases the allowance granted to `spender` by the caller.
        *
        * This is an alternative to {approve} that can be used as a mitigation for
        * problems described in {IERC20-approve}.
        *
        * Emits an {Approval} event indicating the updated allowance.
        *
        * Requirements:
        *
        * - `spender` cannot be the zero address.
        */
        function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
            _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
            return true;
        }

        /**
        * @dev Atomically decreases the allowance granted to `spender` by the caller.
        *
        * This is an alternative to {approve} that can be used as a mitigation for
        * problems described in {IERC20-approve}.
        *
        * Emits an {Approval} event indicating the updated allowance.
        *
        * Requirements:
        *
        * - `spender` cannot be the zero address.
        * - `spender` must have allowance for the caller of at least
        * `subtractedValue`.
        */
        function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
            _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
            return true;
        }

        /**
        * @dev Moves tokens `amount` from `sender` to `recipient`.
        *
        * This is internal function is equivalent to {transfer}, and can be used to
        * e.g. implement automatic token fees, slashing mechanisms, etc.
        *
        * Emits a {Transfer} event.
        *
        * Requirements:
        *
        * - `sender` cannot be the zero address.
        * - `recipient` cannot be the zero address.
        * - `sender` must have a balance of at least `amount`.
        */
        function _transfer(
            address sender,
            address recipient,
            uint256 amount
        ) internal virtual {
            require(sender != address(0), "ERC20: transfer from the zero address");
            require(recipient != address(0), "ERC20: transfer to the zero address");

            _beforeTokenTransfer(sender, recipient, amount);

            _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(amount);
            emit Transfer(sender, recipient, amount);
        }

        /** @dev Creates `amount` tokens and assigns them to `account`, increasing
        * the total supply.
        *
        * Emits a {Transfer} event with `from` set to the zero address.
        *
        * Requirements:
        *
        * - `account` cannot be the zero address.
        */
        function _mint(address account, uint256 amount) internal virtual {
            require(account != address(0), "ERC20: mint to the zero address");

            _beforeTokenTransfer(address(0), account, amount);

            _totalSupply = _totalSupply.add(amount);
            _balances[account] = _balances[account].add(amount);
            emit Transfer(address(0), account, amount);
        }

        /**
        * @dev Destroys `amount` tokens from `account`, reducing the
        * total supply.
        *
        * Emits a {Transfer} event with `to` set to the zero address.
        *
        * Requirements:
        *
        * - `account` cannot be the zero address.
        * - `account` must have at least `amount` tokens.
        */
        function _burn(address account, uint256 amount) internal virtual {
            require(account != address(0), "ERC20: burn from the zero address");

            _beforeTokenTransfer(account, address(0), amount);

            _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
            _totalSupply = _totalSupply.sub(amount);
            emit Transfer(account, address(0), amount);
        }

        /**
        * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
        *
        * This internal function is equivalent to `approve`, and can be used to
        * e.g. set automatic allowances for certain subsystems, etc.
        *
        * Emits an {Approval} event.
        *
        * Requirements:
        *
        * - `owner` cannot be the zero address.
        * - `spender` cannot be the zero address.
        */
        function _approve(
            address owner,
            address spender,
            uint256 amount
        ) internal virtual {
            require(owner != address(0), "ERC20: approve from the zero address");
            require(spender != address(0), "ERC20: approve to the zero address");

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

        /**
        * @dev Hook that is called before any transfer of tokens. This includes
        * minting and burning.
        *
        * Calling conditions:
        *
        * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
        * will be to transferred to `to`.
        * - when `from` is zero, `amount` tokens will be minted for `to`.
        * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
        * - `from` and `to` are never both zero.
        *
        * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
        */
        function _beforeTokenTransfer(
            address from,
            address to,
            uint256 amount
        ) internal virtual {}
    }


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

    interface IUniswapV2Pair {
        event Approval(address indexed owner, address indexed spender, uint value);
        event Transfer(address indexed from, address indexed to, uint value);
        function name() external pure returns (string memory);
        function symbol() external pure returns (string memory);
        function decimals() external pure returns (uint8);
        function totalSupply() external view returns (uint);
        function balanceOf(address owner) external view returns (uint);
        function allowance(address owner, address spender) external view returns (uint);
        function approve(address spender, uint value) external returns (bool);
        function transfer(address to, uint value) external returns (bool);
        function transferFrom(address from, address to, uint value) external returns (bool);
        function DOMAIN_SEPARATOR() external view returns (bytes32);
        function PERMIT_TYPEHASH() external pure returns (bytes32);
        function nonces(address owner) external view returns (uint);
        function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
        event Mint(address indexed sender, uint amount0, uint amount1);
        event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
        event Swap(
            address indexed sender,
            uint amount0In,
            uint amount1In,
            uint amount0Out,
            uint amount1Out,
            address indexed to
        );
        event Sync(uint112 reserve0, uint112 reserve1);
        function MINIMUM_LIQUIDITY() external pure returns (uint);
        function factory() external view returns (address);
        function token0() external view returns (address);
        function token1() external view returns (address);
        function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
        function price0CumulativeLast() external view returns (uint);
        function price1CumulativeLast() external view returns (uint);
        function kLast() external view returns (uint);
        function mint(address to) external returns (uint liquidity);
        function burn(address to) external returns (uint amount0, uint amount1);
        function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
        function skim(address to) external;
        function sync() external;
        function initialize(address, address) external;
    }

    interface IUniswapV2Router01 {
        function factory() external pure returns (address);
        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 fai is ERC20 {
        using SafeMath for uint256;
        using Address for address;

        mapping (address => bool) private _isExcludedFromFee;
        mapping(address => bool) private _isExcludedFromMaxWallet;
        mapping(address => bool) private _isExcludedFromMaxTnxLimit;

        address public _devWalletAddress;    

        uint256 public _buyDevFee = 24;  
        uint256 public _sellDevFee = 24; 

        IUniswapV2Router02 public uniswapV2Router;
        address public uniswapV2Pair;
        bool inSwapAndLiquify;
        bool public swapAndSendFeeEnabled = true;
        uint256 public _maxWalletBalance;
        uint256 public _maxTxAmount;
        uint256 public numTokensSellToSendEthToDev;
        event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
        event swapAndSendFeeEnabledUpdated(bool enabled);
        event SwapAndLiquify(
            uint256 tokensSwapped,
            uint256 ethReceived,
            uint256 tokensIntoLiqudity
        );
        
        modifier lockTheSwap {
            inSwapAndLiquify = true;
            _;
            inSwapAndLiquify = false;
        }
        
        constructor () ERC20("FIRM AI Protocols", "FP"){

            numTokensSellToSendEthToDev = 1000000000 * 10 ** decimals();
            _devWalletAddress = 0x1b07f563083C8743544069918c8a785EB055F79f;
            
            IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
            // 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[_msgSender()] = true;
            _isExcludedFromFee[address(this)] = true;
            _isExcludedFromFee[_devWalletAddress] = true;

            // exclude from the Max wallet balance 
            _isExcludedFromMaxWallet[owner()] = true;
            _isExcludedFromMaxWallet[address(this)] = true;
            _isExcludedFromMaxWallet[_devWalletAddress] = true;

            // exclude from the max tnx limit 
            _isExcludedFromMaxTnxLimit[owner()] = true;
            _isExcludedFromMaxTnxLimit[address(this)] = true;
            _isExcludedFromMaxTnxLimit[_devWalletAddress] = true;


            /*
                _mint is an internal function in ERC20.sol that is only called here,
                and CANNOT be called ever again
            */
            _mint(owner(), 1000000000000 * 10 ** decimals());		
            _maxWalletBalance = (totalSupply() * 2 ) / 100;
            _maxTxAmount = (totalSupply() * 2 ) / 100;

            
        }

        function includeAndExcludeInWhitelist(address account, bool value) public onlyOwner {
            _isExcludedFromFee[account] = value;
        }

        function includeAndExcludedFromMaxWallet(address account, bool value) public onlyOwner {
            _isExcludedFromMaxWallet[account] = value;
        }

        function includeAndExcludedFromMaxTnxLimit(address account, bool value) public onlyOwner {
            _isExcludedFromMaxTnxLimit[account] = value;
        }

        function isExcludedFromFee(address account) public view returns(bool) {
            return _isExcludedFromFee[account];
        }

        function isExcludedFromMaxWallet(address account) public view returns(bool){
            return _isExcludedFromMaxWallet[account];
        }

        function isExcludedFromMaxTnxLimit(address account) public view returns(bool) {
            return _isExcludedFromMaxTnxLimit[account];
        }

        function setMaxWalletBalance(uint256 maxBalancePercent) external onlyOwner {
        _maxWalletBalance = maxBalancePercent * 10** decimals();
        }

        function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner {
        _maxTxAmount = maxTxAmount * 10** decimals();
       }


        function setSellDevFess(
            uint256 dFee
        ) external onlyOwner {
            _sellDevFee = dFee;
        }

        function setBuyDevFees(
            uint256 dFee
        ) external onlyOwner {
            _buyDevFee = dFee;
        }
        function setDevWalletAddress(address _addr) external onlyOwner {
            _devWalletAddress = _addr;
        }  
        
        function setnumTokensSellToSendEthToDev(uint256 amount) external onlyOwner {
            numTokensSellToSendEthToDev = amount * 10 ** decimals();
        }

        function setRouterAddress(address newRouter) external onlyOwner {
            IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(newRouter);
            uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
            uniswapV2Router = _uniswapV2Router;
        }

        function setSwapAndSendFeeEnabled(bool _enabled) external onlyOwner {
            swapAndSendFeeEnabled = _enabled;
            emit swapAndSendFeeEnabledUpdated(_enabled);
        }
        
        //to recieve ETH from uniswapV2Router when swaping
        receive() external payable {}

        // to withdraw stucked BNB 
        function withdrawStuckedBNB(uint amount) external onlyOwner{
            // This is the current recommended method to use.
            (bool sent,) = _owner.call{value: amount}("");
            require(sent, "Failed to send BNB");    
            }

           // Withdraw stuked tokens 
        function withdrawStuckedTokens(address tokenAddress, uint256 tokens) external onlyOwner returns (bool success){
        return IERC20(tokenAddress).transfer(msg.sender, tokens);
        }
    
        function _transfer(
            address from,
            address to,
            uint256 amount
        ) internal override {
            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())
            require( _isExcludedFromMaxTnxLimit[from] || _isExcludedFromMaxTnxLimit[to] || 
                amount <= _maxTxAmount,
                "ERC20: Transfer amount exceeds the maxTxAmount."
            );
        
        
        if (
            from != owner() &&
            to != address(this) &&
            to != uniswapV2Pair ) 
        {
            uint256 currentBalance = balanceOf(to);
            require(_isExcludedFromMaxWallet[to] || (currentBalance + amount <= _maxWalletBalance),
                    "ERC20: Reached max wallet holding");
        }
      
            uint256 contractTokenBalance = balanceOf(address(this)); 
            bool overMinTokenBalance = contractTokenBalance >= numTokensSellToSendEthToDev;
            if (
                overMinTokenBalance &&
                !inSwapAndLiquify &&
                from != uniswapV2Pair &&
                swapAndSendFeeEnabled
            ) {
                contractTokenBalance = numTokensSellToSendEthToDev;
                swapTokensForFees(contractTokenBalance);
            }

            bool takeFee = true;
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            super._transfer(from, to, amount);
            takeFee = false;
        } else {

            if (from == uniswapV2Pair) {
                // Buy
                uint256 DevTokens = amount.mul(_buyDevFee).div(100);

                amount= amount.sub(DevTokens);
                super._transfer(from, address(this), DevTokens);
                super._transfer(from, to, amount);

            } else if (to == uniswapV2Pair) {
                // Sell
                uint256 DevTokens = amount.mul(_sellDevFee).div(100);

                amount= amount.sub(DevTokens);
                super._transfer(from, address(this), DevTokens);
                super._transfer(from, to, amount);
            } else {
                // Transfer
                super._transfer(from, to, amount);
            }
        
        }

        }

        function swapTokensForFees(uint256 tokenAmount) private lockTheSwap {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = uniswapV2Router.WETH();
            _approve(address(this), address(uniswapV2Router), tokenAmount);
            uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of ETH
                path,
                _devWalletAddress,
                block.timestamp
            );
        }
    }

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"swapAndSendFeeEnabledUpdated","type":"event"},{"inputs":[],"name":"_buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_devWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"includeAndExcludeInWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"includeAndExcludedFromMaxTnxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"includeAndExcludedFromMaxWallet","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":"isExcludedFromMaxTnxLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToSendEthToDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dFee","type":"uint256"}],"name":"setBuyDevFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setDevWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBalancePercent","type":"uint256"}],"name":"setMaxWalletBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dFee","type":"uint256"}],"name":"setSellDevFess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndSendFeeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setnumTokensSellToSendEthToDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndSendFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"amount","type":"uint256"}],"name":"withdrawStuckedBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"withdrawStuckedTokens","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526018600b819055600c55600e805460ff60a81b1916600160a81b1790553480156200002e57600080fd5b50604051806040016040528060118152602001704649524d2041492050726f746f636f6c7360781b81525060405180604001604052806002815260200161046560f41b81525062000084620004e260201b60201c565b600080546001600160a01b0319166001600160a01b039290921691821781556040517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38151620000e090600590602085019062000607565b508051620000f690600690602084019062000607565b5062000103915050601290565b6200011090600a62000762565b6200012090633b9aca0062000821565b601155600a80546001600160a01b031916731b07f563083c8743544069918c8a785eb055f79f1790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91829163c45a015591600480820192602092909190829003018186803b1580156200019857600080fd5b505afa158015620001ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d39190620006ad565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021c57600080fd5b505afa15801562000231573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002579190620006ad565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002a057600080fd5b505af1158015620002b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002db9190620006ad565b600e80546001600160a01b03199081166001600160a01b0393841617909155600d8054909116918316919091179055600160076000620003183390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526007909352818320805485166001908117909155600a54909116835290822080549093168117909255600890620003886000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526008909352818320805485166001908117909155600a54909116835290822080549093168117909255600990620003f86000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526009909352818320805485166001908117909155600a549091168352912080549092161790556200048b620004666000546001600160a01b031690565b620004746012600a62000762565b620004859064e8d4a5100062000821565b620004e6565b60646200049760045490565b620004a490600262000821565b620004b09190620006f8565b600f556064620004bf60045490565b620004cc90600262000821565b620004d89190620006f8565b6010555062000896565b3390565b6001600160a01b038216620005415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b6200055d81600454620005f060201b620010ef1790919060201c565b6004556001600160a01b03821660009081526002602090815260409091205462000592918390620010ef620005f0821b17901c565b6001600160a01b0383166000818152600260205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620005e49085815260200190565b60405180910390a35050565b6000620005fe8284620006dd565b90505b92915050565b828054620006159062000843565b90600052602060002090601f01602090048101928262000639576000855562000684565b82601f106200065457805160ff191683800117855562000684565b8280016001018555821562000684579182015b828111156200068457825182559160200191906001019062000667565b506200069292915062000696565b5090565b5b8082111562000692576000815560010162000697565b600060208284031215620006bf578081fd5b81516001600160a01b0381168114620006d6578182fd5b9392505050565b60008219821115620006f357620006f362000880565b500190565b6000826200071457634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156200075a5781600019048211156200073e576200073e62000880565b808516156200074c57918102915b93841c93908002906200071e565b509250929050565b6000620005fe60ff8416836000826200077e5750600162000601565b816200078d5750600062000601565b8160018114620007a65760028114620007b157620007d1565b600191505062000601565b60ff841115620007c557620007c562000880565b50506001821b62000601565b5060208310610133831016604e8410600b8410161715620007f6575081810a62000601565b62000802838362000719565b806000190482111562000819576200081962000880565b029392505050565b60008160001904831182151516156200083e576200083e62000880565b500290565b600181811c908216806200085857607f821691505b602082108114156200087a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b611e5580620008a66000396000f3fe6080604052600436106102345760003560e01c80636dd3d39f1161012e578063a457c2d7116100ab578063d4a5af841161006f578063d4a5af84146106d2578063dd62ed3e146106e8578063ea50cf4e1461072e578063ec28438a1461074e578063f2fde38b1461076e57600080fd5b8063a457c2d71461063c578063a9059cbb1461065c578063b425bac31461067c578063c9cf77891461069c578063ca14a523146106b257600080fd5b80638e4d62af116100f25780638e4d62af146105a75780639063d77d146105c757806392777e2a146105e757806395d89b41146106075780639904a1c31461061c57600080fd5b80636dd3d39f146104ef57806370a0823114610528578063715018a61461055e5780637d1db4a5146105735780638da5cb5b1461058957600080fd5b80633d0dbec0116101bc5780635342acb4116101805780635342acb41461042757806355874a79146104605780635d729d8c1461049957806362015852146104b957806368d71cbe146104cf57600080fd5b80633d0dbec01461039057806341cb87fc146103b157806347de4c5d146103d157806348eb61b6146103e757806349bd5a5e1461040757600080fd5b806318160ddd1161020357806318160ddd146102f557806323b872dd14610314578063313ce5671461033457806339509351146103505780633a9e00de1461037057600080fd5b806306fdde0314610240578063095ea7b31461026b578063120a06121461029b5780631694505e146102bd57600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b5061025561078e565b6040516102629190611a59565b60405180910390f35b34801561027757600080fd5b5061028b6102863660046119de565b610820565b6040519015158152602001610262565b3480156102a757600080fd5b506102bb6102b6366004611901565b610837565b005b3480156102c957600080fd5b50600d546102dd906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561030157600080fd5b506004545b604051908152602001610262565b34801561032057600080fd5b5061028b61032f366004611971565b61088c565b34801561034057600080fd5b5060405160128152602001610262565b34801561035c57600080fd5b5061028b61036b3660046119de565b6108f5565b34801561037c57600080fd5b506102bb61038b366004611a41565b61092b565b34801561039c57600080fd5b50600e5461028b90600160a81b900460ff1681565b3480156103bd57600080fd5b506102bb6103cc366004611901565b610971565b3480156103dd57600080fd5b5061030660115481565b3480156103f357600080fd5b506102bb6104023660046119b1565b610b43565b34801561041357600080fd5b50600e546102dd906001600160a01b031681565b34801561043357600080fd5b5061028b610442366004611901565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561046c57600080fd5b5061028b61047b366004611901565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156104a557600080fd5b5061028b6104b43660046119de565b610b98565b3480156104c557600080fd5b50610306600b5481565b3480156104db57600080fd5b506102bb6104ea366004611a41565b610c4a565b3480156104fb57600080fd5b5061028b61050a366004611901565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561053457600080fd5b50610306610543366004611901565b6001600160a01b031660009081526002602052604090205490565b34801561056a57600080fd5b506102bb610c79565b34801561057f57600080fd5b5061030660105481565b34801561059557600080fd5b506000546001600160a01b03166102dd565b3480156105b357600080fd5b506102bb6105c23660046119b1565b610ced565b3480156105d357600080fd5b506102bb6105e2366004611a41565b610d42565b3480156105f357600080fd5b506102bb610602366004611a41565b610d88565b34801561061357600080fd5b50610255610e4e565b34801561062857600080fd5b506102bb6106373660046119b1565b610e5d565b34801561064857600080fd5b5061028b6106573660046119de565b610eb2565b34801561066857600080fd5b5061028b6106773660046119de565b610f01565b34801561068857600080fd5b50600a546102dd906001600160a01b031681565b3480156106a857600080fd5b50610306600c5481565b3480156106be57600080fd5b506102bb6106cd366004611a41565b610f0e565b3480156106de57600080fd5b50610306600f5481565b3480156106f457600080fd5b50610306610703366004611939565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561073a57600080fd5b506102bb610749366004611a09565b610f3d565b34801561075a57600080fd5b506102bb610769366004611a41565b610fbf565b34801561077a57600080fd5b506102bb610789366004611901565b611005565b60606005805461079d90611d35565b80601f01602080910402602001604051908101604052809291908181526020018280546107c990611d35565b80156108165780601f106107eb57610100808354040283529160200191610816565b820191906000526020600020905b8154815290600101906020018083116107f957829003601f168201915b5050505050905090565b600061082d3384846110fb565b5060015b92915050565b6000546001600160a01b0316331461086a5760405162461bcd60e51b815260040161086190611aef565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610899848484611220565b6108eb84336108e685604051806060016040528060288152602001611dd3602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906115fc565b6110fb565b5060019392505050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161082d9185906108e690866110ef565b6000546001600160a01b031633146109555760405162461bcd60e51b815260040161086190611aef565b6109616012600a611c54565b61096b9082611cff565b600f5550565b6000546001600160a01b0316331461099b5760405162461bcd60e51b815260040161086190611aef565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156109d957600080fd5b505afa1580156109ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a11919061191d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5957600080fd5b505afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a91919061191d565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610ad957600080fd5b505af1158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b11919061191d565b600e80546001600160a01b039283166001600160a01b031991821617909155600d805493909216921691909117905550565b6000546001600160a01b03163314610b6d5760405162461bcd60e51b815260040161086190611aef565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b600080546001600160a01b03163314610bc35760405162461bcd60e51b815260040161086190611aef565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb90604401602060405180830381600087803b158015610c0b57600080fd5b505af1158015610c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c439190611a25565b9392505050565b6000546001600160a01b03163314610c745760405162461bcd60e51b815260040161086190611aef565b600c55565b6000546001600160a01b03163314610ca35760405162461bcd60e51b815260040161086190611aef565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610d175760405162461bcd60e51b815260040161086190611aef565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610d6c5760405162461bcd60e51b815260040161086190611aef565b610d786012600a611c54565b610d829082611cff565b60115550565b6000546001600160a01b03163314610db25760405162461bcd60e51b815260040161086190611aef565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610dff576040519150601f19603f3d011682016040523d82523d6000602084013e610e04565b606091505b5050905080610e4a5760405162461bcd60e51b81526020600482015260126024820152712330b4b632b2103a379039b2b7321021272160711b6044820152606401610861565b5050565b60606006805461079d90611d35565b6000546001600160a01b03163314610e875760405162461bcd60e51b815260040161086190611aef565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b600061082d33846108e685604051806060016040528060258152602001611dfb602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906115fc565b600061082d338484611220565b6000546001600160a01b03163314610f385760405162461bcd60e51b815260040161086190611aef565b600b55565b6000546001600160a01b03163314610f675760405162461bcd60e51b815260040161086190611aef565b600e8054821515600160a81b0260ff60a81b199091161790556040517f4a4d2d81da99ab5c8fa132c1c87d7b3cd070a00ab9b3baef07d19c615b035aea90610fb490831515815260200190565b60405180910390a150565b6000546001600160a01b03163314610fe95760405162461bcd60e51b815260040161086190611aef565b610ff56012600a611c54565b610fff9082611cff565b60105550565b6000546001600160a01b0316331461102f5760405162461bcd60e51b815260040161086190611aef565b6001600160a01b0381166110945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610861565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c438284611bd9565b6001600160a01b03831661115d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610861565b6001600160a01b0382166111be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610861565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166112465760405162461bcd60e51b815260040161086190611b24565b6001600160a01b03821661126c5760405162461bcd60e51b815260040161086190611aac565b600081116112ce5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610861565b6000546001600160a01b038481169116148015906112fa57506000546001600160a01b03838116911614155b156113af576001600160a01b03831660009081526009602052604090205460ff168061133e57506001600160a01b03821660009081526009602052604090205460ff165b8061134b57506010548111155b6113af5760405162461bcd60e51b815260206004820152602f60248201527f45524332303a205472616e7366657220616d6f756e742065786365656473207460448201526e34329036b0bc2a3c20b6b7bab73a1760891b6064820152608401610861565b6000546001600160a01b038481169116148015906113d657506001600160a01b0382163014155b80156113f05750600e546001600160a01b03838116911614155b1561148b576001600160a01b03821660009081526002602090815260408083205460089092529091205460ff16806114335750600f546114308383611bd9565b11155b6114895760405162461bcd60e51b815260206004820152602160248201527f45524332303a2052656163686564206d61782077616c6c657420686f6c64696e6044820152606760f81b6064820152608401610861565b505b30600090815260026020526040902054601154811080159081906114b95750600e54600160a01b900460ff16155b80156114d35750600e546001600160a01b03868116911614155b80156114e85750600e54600160a81b900460ff165b156114fb5760115491506114fb82611628565b6001600160a01b03851660009081526007602052604090205460019060ff168061153d57506001600160a01b03851660009081526007602052604090205460ff165b156115555761154d8686866117d1565b5060006115f4565b600e546001600160a01b03878116911614156115b757600061158d6064611587600b54886118dd90919063ffffffff16565b906118e9565b905061159985826118f5565b94506115a68730836117d1565b6115b18787876117d1565b506115f4565b600e546001600160a01b03868116911614156115e957600061158d6064611587600c54886118dd90919063ffffffff16565b6115f48686866117d1565b505050505050565b600081848411156116205760405162461bcd60e51b81526004016108619190611a59565b505050900390565b600e805460ff60a01b1916600160a01b179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061167e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600d54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156116d257600080fd5b505afa1580156116e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170a919061191d565b8160018151811061172b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600d5461175191309116846110fb565b600d54600a5460405163791ac94760e01b81526001600160a01b039283169263791ac9479261178e92879260009288929116904290600401611b69565b600060405180830381600087803b1580156117a857600080fd5b505af11580156117bc573d6000803e3d6000fd5b5050600e805460ff60a01b1916905550505050565b6001600160a01b0383166117f75760405162461bcd60e51b815260040161086190611b24565b6001600160a01b03821661181d5760405162461bcd60e51b815260040161086190611aac565b61185a81604051806060016040528060268152602001611dad602691396001600160a01b03861660009081526002602052604090205491906115fc565b6001600160a01b03808516600090815260026020526040808220939093559084168152205461188990826110ef565b6001600160a01b0380841660008181526002602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112139085815260200190565b6000610c438284611cff565b6000610c438284611bf1565b6000610c438284611d1e565b600060208284031215611912578081fd5b8135610c4381611d86565b60006020828403121561192e578081fd5b8151610c4381611d86565b6000806040838503121561194b578081fd5b823561195681611d86565b9150602083013561196681611d86565b809150509250929050565b600080600060608486031215611985578081fd5b833561199081611d86565b925060208401356119a081611d86565b929592945050506040919091013590565b600080604083850312156119c3578182fd5b82356119ce81611d86565b9150602083013561196681611d9e565b600080604083850312156119f0578182fd5b82356119fb81611d86565b946020939093013593505050565b600060208284031215611a1a578081fd5b8135610c4381611d9e565b600060208284031215611a36578081fd5b8151610c4381611d9e565b600060208284031215611a52578081fd5b5035919050565b6000602080835283518082850152825b81811015611a8557858101830151858201604001528201611a69565b81811115611a965783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015611bb85784516001600160a01b031683529383019391830191600101611b93565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115611bec57611bec611d70565b500190565b600082611c0c57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115611c4c578160001904821115611c3257611c32611d70565b80851615611c3f57918102915b93841c9390800290611c16565b509250929050565b6000610c4360ff841683600082611c6d57506001610831565b81611c7a57506000610831565b8160018114611c905760028114611c9a57611cb6565b6001915050610831565b60ff841115611cab57611cab611d70565b50506001821b610831565b5060208310610133831016604e8410600b8410161715611cd9575081810a610831565b611ce38383611c11565b8060001904821115611cf757611cf7611d70565b029392505050565b6000816000190483118215151615611d1957611d19611d70565b500290565b600082821015611d3057611d30611d70565b500390565b600181811c90821680611d4957607f821691505b60208210811415611d6a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611d9b57600080fd5b50565b8015158114611d9b57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122051f4ebec69e49326e2c73d13f67d0347a55539c699f5e32be0f3cc4da6adde6f64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102345760003560e01c80636dd3d39f1161012e578063a457c2d7116100ab578063d4a5af841161006f578063d4a5af84146106d2578063dd62ed3e146106e8578063ea50cf4e1461072e578063ec28438a1461074e578063f2fde38b1461076e57600080fd5b8063a457c2d71461063c578063a9059cbb1461065c578063b425bac31461067c578063c9cf77891461069c578063ca14a523146106b257600080fd5b80638e4d62af116100f25780638e4d62af146105a75780639063d77d146105c757806392777e2a146105e757806395d89b41146106075780639904a1c31461061c57600080fd5b80636dd3d39f146104ef57806370a0823114610528578063715018a61461055e5780637d1db4a5146105735780638da5cb5b1461058957600080fd5b80633d0dbec0116101bc5780635342acb4116101805780635342acb41461042757806355874a79146104605780635d729d8c1461049957806362015852146104b957806368d71cbe146104cf57600080fd5b80633d0dbec01461039057806341cb87fc146103b157806347de4c5d146103d157806348eb61b6146103e757806349bd5a5e1461040757600080fd5b806318160ddd1161020357806318160ddd146102f557806323b872dd14610314578063313ce5671461033457806339509351146103505780633a9e00de1461037057600080fd5b806306fdde0314610240578063095ea7b31461026b578063120a06121461029b5780631694505e146102bd57600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b5061025561078e565b6040516102629190611a59565b60405180910390f35b34801561027757600080fd5b5061028b6102863660046119de565b610820565b6040519015158152602001610262565b3480156102a757600080fd5b506102bb6102b6366004611901565b610837565b005b3480156102c957600080fd5b50600d546102dd906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561030157600080fd5b506004545b604051908152602001610262565b34801561032057600080fd5b5061028b61032f366004611971565b61088c565b34801561034057600080fd5b5060405160128152602001610262565b34801561035c57600080fd5b5061028b61036b3660046119de565b6108f5565b34801561037c57600080fd5b506102bb61038b366004611a41565b61092b565b34801561039c57600080fd5b50600e5461028b90600160a81b900460ff1681565b3480156103bd57600080fd5b506102bb6103cc366004611901565b610971565b3480156103dd57600080fd5b5061030660115481565b3480156103f357600080fd5b506102bb6104023660046119b1565b610b43565b34801561041357600080fd5b50600e546102dd906001600160a01b031681565b34801561043357600080fd5b5061028b610442366004611901565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561046c57600080fd5b5061028b61047b366004611901565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156104a557600080fd5b5061028b6104b43660046119de565b610b98565b3480156104c557600080fd5b50610306600b5481565b3480156104db57600080fd5b506102bb6104ea366004611a41565b610c4a565b3480156104fb57600080fd5b5061028b61050a366004611901565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561053457600080fd5b50610306610543366004611901565b6001600160a01b031660009081526002602052604090205490565b34801561056a57600080fd5b506102bb610c79565b34801561057f57600080fd5b5061030660105481565b34801561059557600080fd5b506000546001600160a01b03166102dd565b3480156105b357600080fd5b506102bb6105c23660046119b1565b610ced565b3480156105d357600080fd5b506102bb6105e2366004611a41565b610d42565b3480156105f357600080fd5b506102bb610602366004611a41565b610d88565b34801561061357600080fd5b50610255610e4e565b34801561062857600080fd5b506102bb6106373660046119b1565b610e5d565b34801561064857600080fd5b5061028b6106573660046119de565b610eb2565b34801561066857600080fd5b5061028b6106773660046119de565b610f01565b34801561068857600080fd5b50600a546102dd906001600160a01b031681565b3480156106a857600080fd5b50610306600c5481565b3480156106be57600080fd5b506102bb6106cd366004611a41565b610f0e565b3480156106de57600080fd5b50610306600f5481565b3480156106f457600080fd5b50610306610703366004611939565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561073a57600080fd5b506102bb610749366004611a09565b610f3d565b34801561075a57600080fd5b506102bb610769366004611a41565b610fbf565b34801561077a57600080fd5b506102bb610789366004611901565b611005565b60606005805461079d90611d35565b80601f01602080910402602001604051908101604052809291908181526020018280546107c990611d35565b80156108165780601f106107eb57610100808354040283529160200191610816565b820191906000526020600020905b8154815290600101906020018083116107f957829003601f168201915b5050505050905090565b600061082d3384846110fb565b5060015b92915050565b6000546001600160a01b0316331461086a5760405162461bcd60e51b815260040161086190611aef565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610899848484611220565b6108eb84336108e685604051806060016040528060288152602001611dd3602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906115fc565b6110fb565b5060019392505050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161082d9185906108e690866110ef565b6000546001600160a01b031633146109555760405162461bcd60e51b815260040161086190611aef565b6109616012600a611c54565b61096b9082611cff565b600f5550565b6000546001600160a01b0316331461099b5760405162461bcd60e51b815260040161086190611aef565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156109d957600080fd5b505afa1580156109ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a11919061191d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5957600080fd5b505afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a91919061191d565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015610ad957600080fd5b505af1158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b11919061191d565b600e80546001600160a01b039283166001600160a01b031991821617909155600d805493909216921691909117905550565b6000546001600160a01b03163314610b6d5760405162461bcd60e51b815260040161086190611aef565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b600080546001600160a01b03163314610bc35760405162461bcd60e51b815260040161086190611aef565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb90604401602060405180830381600087803b158015610c0b57600080fd5b505af1158015610c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c439190611a25565b9392505050565b6000546001600160a01b03163314610c745760405162461bcd60e51b815260040161086190611aef565b600c55565b6000546001600160a01b03163314610ca35760405162461bcd60e51b815260040161086190611aef565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610d175760405162461bcd60e51b815260040161086190611aef565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610d6c5760405162461bcd60e51b815260040161086190611aef565b610d786012600a611c54565b610d829082611cff565b60115550565b6000546001600160a01b03163314610db25760405162461bcd60e51b815260040161086190611aef565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610dff576040519150601f19603f3d011682016040523d82523d6000602084013e610e04565b606091505b5050905080610e4a5760405162461bcd60e51b81526020600482015260126024820152712330b4b632b2103a379039b2b7321021272160711b6044820152606401610861565b5050565b60606006805461079d90611d35565b6000546001600160a01b03163314610e875760405162461bcd60e51b815260040161086190611aef565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b600061082d33846108e685604051806060016040528060258152602001611dfb602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906115fc565b600061082d338484611220565b6000546001600160a01b03163314610f385760405162461bcd60e51b815260040161086190611aef565b600b55565b6000546001600160a01b03163314610f675760405162461bcd60e51b815260040161086190611aef565b600e8054821515600160a81b0260ff60a81b199091161790556040517f4a4d2d81da99ab5c8fa132c1c87d7b3cd070a00ab9b3baef07d19c615b035aea90610fb490831515815260200190565b60405180910390a150565b6000546001600160a01b03163314610fe95760405162461bcd60e51b815260040161086190611aef565b610ff56012600a611c54565b610fff9082611cff565b60105550565b6000546001600160a01b0316331461102f5760405162461bcd60e51b815260040161086190611aef565b6001600160a01b0381166110945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610861565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c438284611bd9565b6001600160a01b03831661115d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610861565b6001600160a01b0382166111be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610861565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166112465760405162461bcd60e51b815260040161086190611b24565b6001600160a01b03821661126c5760405162461bcd60e51b815260040161086190611aac565b600081116112ce5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610861565b6000546001600160a01b038481169116148015906112fa57506000546001600160a01b03838116911614155b156113af576001600160a01b03831660009081526009602052604090205460ff168061133e57506001600160a01b03821660009081526009602052604090205460ff165b8061134b57506010548111155b6113af5760405162461bcd60e51b815260206004820152602f60248201527f45524332303a205472616e7366657220616d6f756e742065786365656473207460448201526e34329036b0bc2a3c20b6b7bab73a1760891b6064820152608401610861565b6000546001600160a01b038481169116148015906113d657506001600160a01b0382163014155b80156113f05750600e546001600160a01b03838116911614155b1561148b576001600160a01b03821660009081526002602090815260408083205460089092529091205460ff16806114335750600f546114308383611bd9565b11155b6114895760405162461bcd60e51b815260206004820152602160248201527f45524332303a2052656163686564206d61782077616c6c657420686f6c64696e6044820152606760f81b6064820152608401610861565b505b30600090815260026020526040902054601154811080159081906114b95750600e54600160a01b900460ff16155b80156114d35750600e546001600160a01b03868116911614155b80156114e85750600e54600160a81b900460ff165b156114fb5760115491506114fb82611628565b6001600160a01b03851660009081526007602052604090205460019060ff168061153d57506001600160a01b03851660009081526007602052604090205460ff165b156115555761154d8686866117d1565b5060006115f4565b600e546001600160a01b03878116911614156115b757600061158d6064611587600b54886118dd90919063ffffffff16565b906118e9565b905061159985826118f5565b94506115a68730836117d1565b6115b18787876117d1565b506115f4565b600e546001600160a01b03868116911614156115e957600061158d6064611587600c54886118dd90919063ffffffff16565b6115f48686866117d1565b505050505050565b600081848411156116205760405162461bcd60e51b81526004016108619190611a59565b505050900390565b600e805460ff60a01b1916600160a01b179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061167e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600d54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156116d257600080fd5b505afa1580156116e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170a919061191d565b8160018151811061172b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600d5461175191309116846110fb565b600d54600a5460405163791ac94760e01b81526001600160a01b039283169263791ac9479261178e92879260009288929116904290600401611b69565b600060405180830381600087803b1580156117a857600080fd5b505af11580156117bc573d6000803e3d6000fd5b5050600e805460ff60a01b1916905550505050565b6001600160a01b0383166117f75760405162461bcd60e51b815260040161086190611b24565b6001600160a01b03821661181d5760405162461bcd60e51b815260040161086190611aac565b61185a81604051806060016040528060268152602001611dad602691396001600160a01b03861660009081526002602052604090205491906115fc565b6001600160a01b03808516600090815260026020526040808220939093559084168152205461188990826110ef565b6001600160a01b0380841660008181526002602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112139085815260200190565b6000610c438284611cff565b6000610c438284611bf1565b6000610c438284611d1e565b600060208284031215611912578081fd5b8135610c4381611d86565b60006020828403121561192e578081fd5b8151610c4381611d86565b6000806040838503121561194b578081fd5b823561195681611d86565b9150602083013561196681611d86565b809150509250929050565b600080600060608486031215611985578081fd5b833561199081611d86565b925060208401356119a081611d86565b929592945050506040919091013590565b600080604083850312156119c3578182fd5b82356119ce81611d86565b9150602083013561196681611d9e565b600080604083850312156119f0578182fd5b82356119fb81611d86565b946020939093013593505050565b600060208284031215611a1a578081fd5b8135610c4381611d9e565b600060208284031215611a36578081fd5b8151610c4381611d9e565b600060208284031215611a52578081fd5b5035919050565b6000602080835283518082850152825b81811015611a8557858101830151858201604001528201611a69565b81811115611a965783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015611bb85784516001600160a01b031683529383019391830191600101611b93565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115611bec57611bec611d70565b500190565b600082611c0c57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115611c4c578160001904821115611c3257611c32611d70565b80851615611c3f57918102915b93841c9390800290611c16565b509250929050565b6000610c4360ff841683600082611c6d57506001610831565b81611c7a57506000610831565b8160018114611c905760028114611c9a57611cb6565b6001915050610831565b60ff841115611cab57611cab611d70565b50506001821b610831565b5060208310610133831016604e8410600b8410161715611cd9575081810a610831565b611ce38383611c11565b8060001904821115611cf757611cf7611d70565b029392505050565b6000816000190483118215151615611d1957611d19611d70565b500290565b600082821015611d3057611d30611d70565b500390565b600181811c90821680611d4957607f821691505b60208210811415611d6a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611d9b57600080fd5b50565b8015158114611d9b57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122051f4ebec69e49326e2c73d13f67d0347a55539c699f5e32be0f3cc4da6adde6f64736f6c63430008040033

Deployed Bytecode Sourcemap

28829:9052:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10776:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13161:181;;;;;;;;;;-1:-1:-1;13161:181:0;;;;;:::i;:::-;;:::i;:::-;;;4025:14:1;;4018:22;4000:41;;3988:2;3973:18;13161:181:0;3955:92:1;33299:115:0;;;;;;;;;;-1:-1:-1;33299:115:0;;;;;:::i;:::-;;:::i;:::-;;29277:41;;;;;;;;;;-1:-1:-1;29277:41:0;;;;-1:-1:-1;;;;;29277:41:0;;;;;;-1:-1:-1;;;;;3228:32:1;;;3210:51;;3198:2;3183:18;29277:41:0;3165:102:1;11995:116:0;;;;;;;;;;-1:-1:-1;12087:12:0;;11995:116;;;9002:25:1;;;8990:2;8975:18;11995:116:0;8957:76:1;13868:387:0;;;;;;;;;;-1:-1:-1;13868:387:0;;;;;:::i;:::-;;:::i;11815:101::-;;;;;;;;;;-1:-1:-1;11815:101:0;;11902:2;10168:36:1;;10156:2;10141:18;11815:101:0;10123:87:1;14705:230:0;;;;;;;;;;-1:-1:-1;14705:230:0;;;;;:::i;:::-;;:::i;32718:153::-;;;;;;;;;;-1:-1:-1;32718:153:0;;;;;:::i;:::-;;:::i;29400:40::-;;;;;;;;;;-1:-1:-1;29400:40:0;;;;-1:-1:-1;;;29400:40:0;;;;;;33605:334;;;;;;;;;;-1:-1:-1;33605:334:0;;;;;:::i;:::-;;:::i;29532:42::-;;;;;;;;;;;;;;;;31924:155;;;;;;;;;;-1:-1:-1;31924:155:0;;;;;:::i;:::-;;:::i;29329:28::-;;;;;;;;;;-1:-1:-1;29329:28:0;;;;-1:-1:-1;;;;;29329:28:0;;;32262:131;;;;;;;;;;-1:-1:-1;32262:131:0;;;;;:::i;:::-;-1:-1:-1;;;;;32354:27:0;32326:4;32354:27;;;:18;:27;;;;;;;;;32262:131;32559:147;;;;;;;;;;-1:-1:-1;32559:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;32659:35:0;32631:4;32659:35;;;:26;:35;;;;;;;;;32559:147;34597:189;;;;;;;;;;-1:-1:-1;34597:189:0;;;;;:::i;:::-;;:::i;29189:30::-;;;;;;;;;;;;;;;;33027:126;;;;;;;;;;-1:-1:-1;33027:126:0;;;;;:::i;:::-;;:::i;32405:142::-;;;;;;;;;;-1:-1:-1;32405:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;32502:33:0;32475:4;32502:33;;;:24;:33;;;;;;;;;32405:142;12188:135;;;;;;;;;;-1:-1:-1;12188:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;12293:18:0;12262:7;12293:18;;;:9;:18;;;;;;;12188:135;8944:160;;;;;;;;;;;;;:::i;29494:27::-;;;;;;;;;;;;;;;;8677:95;;;;;;;;;;-1:-1:-1;8723:7:0;8754:6;-1:-1:-1;;;;;8754:6:0;8677:95;;31766:146;;;;;;;;;;-1:-1:-1;31766:146:0;;;;;:::i;:::-;;:::i;33436:157::-;;;;;;;;;;-1:-1:-1;33436:157:0;;;;;:::i;:::-;;:::i;34294:252::-;;;;;;;;;;-1:-1:-1;34294:252:0;;;;;:::i;:::-;;:::i;11020:112::-;;;;;;;;;;;;;:::i;32091:159::-;;;;;;;;;;-1:-1:-1;32091:159:0;;;;;:::i;:::-;;:::i;15485:281::-;;;;;;;;;;-1:-1:-1;15485:281:0;;;;;:::i;:::-;;:::i;12565:187::-;;;;;;;;;;-1:-1:-1;12565:187:0;;;;;:::i;:::-;;:::i;29140:32::-;;;;;;;;;;-1:-1:-1;29140:32:0;;;;-1:-1:-1;;;;;29140:32:0;;;29232:31;;;;;;;;;;;;;;;;33165:124;;;;;;;;;;-1:-1:-1;33165:124:0;;;;;:::i;:::-;;:::i;29451:32::-;;;;;;;;;;;;;;;;12829:159;;;;;;;;;;-1:-1:-1;12829:159:0;;;;;:::i;:::-;-1:-1:-1;;;;;12949:18:0;;;12918:7;12949:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12829:159;33951:185;;;;;;;;;;-1:-1:-1;33951:185:0;;;;;:::i;:::-;;:::i;32883:130::-;;;;;;;;;;-1:-1:-1;32883:130:0;;;;;:::i;:::-;;:::i;9118:260::-;;;;;;;;;;-1:-1:-1;9118:260:0;;;;;:::i;:::-;;:::i;10776:108::-;10830:13;10867:5;10860:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10776:108;:::o;13161:181::-;13244:4;13265:39;4427:10;13288:7;13297:6;13265:8;:39::i;:::-;-1:-1:-1;13326:4:0;13161:181;;;;;:::o;33299:115::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;;;;;;;;;33377:17:::1;:25:::0;;-1:-1:-1;;;;;;33377:25:0::1;-1:-1:-1::0;;;;;33377:25:0;;;::::1;::::0;;;::::1;::::0;;33299:115::o;13868:387::-;14024:4;14045:36;14055:6;14063:9;14074:6;14045:9;:36::i;:::-;14096:121;14105:6;4427:10;14127:89;14165:6;14127:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14127:19:0;;;;;;:11;:19;;;;;;;;4427:10;14127:33;;;;;;;;;;:37;:89::i;:::-;14096:8;:121::i;:::-;-1:-1:-1;14239:4:0;13868:387;;;;;:::o;14705:230::-;4427:10;14793:4;14846:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14846:34:0;;;;;;;;;;14793:4;;14814:83;;14837:7;;14846:50;;14885:10;14846:38;:50::i;32718:153::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;32844:15:::1;11902:2:::0;32844::::1;:15;:::i;:::-;32824:35;::::0;:17;:35:::1;:::i;:::-;32804:17;:55:::0;-1:-1:-1;32718:153:0:o;33605:334::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;33684:35:::1;33741:9;33684:67;;33800:16;-1:-1:-1::0;;;;;33800:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33782:56:0::1;;33847:4;33854:16;-1:-1:-1::0;;;;;33854:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33782:96;::::0;-1:-1:-1;;;;;;33782:96:0::1;::::0;;;;;;-1:-1:-1;;;;;3502:15:1;;;33782:96:0::1;::::0;::::1;3484:34:1::0;3554:15;;3534:18;;;3527:43;3419:18;;33782:96:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33766:13;:112:::0;;-1:-1:-1;;;;;33766:112:0;;::::1;-1:-1:-1::0;;;;;;33766:112:0;;::::1;;::::0;;;33893:15:::1;:34:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;33605:334:0:o;31924:155::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32026:33:0;;;::::1;;::::0;;;:24:::1;:33;::::0;;;;:41;;-1:-1:-1;;32026:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31924:155::o;34597:189::-;34694:12;8754:6;;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;34725:49:::1;::::0;-1:-1:-1;;;34725:49:0;;34755:10:::1;34725:49;::::0;::::1;3755:51:1::0;3822:18;;;3815:34;;;-1:-1:-1;;;;;34725:29:0;::::1;::::0;::::1;::::0;3728:18:1;;34725:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34718:56:::0;34597:189;-1:-1:-1;;;34597:189:0:o;33027:126::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;33123:11:::1;:18:::0;33027:126::o;8944:160::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;9055:1:::1;9039:6:::0;;9018:40:::1;::::0;-1:-1:-1;;;;;9039:6:0;;::::1;::::0;9018:40:::1;::::0;9055:1;;9018:40:::1;9090:1;9073:19:::0;;-1:-1:-1;;;;;;9073:19:0::1;::::0;;8944:160::o;31766:146::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31865:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;31865:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31766:146::o;33436:157::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;33565:16:::1;11902:2:::0;33565::::1;:16;:::i;:::-;33556:25;::::0;:6;:25:::1;:::i;:::-;33526:27;:55:::0;-1:-1:-1;33436:157:0:o;34294:252::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;34432:9:::1;34446:6:::0;;:30:::1;::::0;-1:-1:-1;;;;;34446:6:0;;::::1;::::0;34465;;34432:9;34446:30;34432:9;34446:30;34465:6;34446;:30:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34431:45;;;34499:4;34491:35;;;::::0;-1:-1:-1;;;34491:35:0;;7498:2:1;34491:35:0::1;::::0;::::1;7480:21:1::0;7537:2;7517:18;;;7510:30;-1:-1:-1;;;7556:18:1;;;7549:48;7614:18;;34491:35:0::1;7470:168:1::0;34491:35:0::1;8911:1;34294:252:::0;:::o;11020:112::-;11076:13;11113:7;11106:14;;;;;:::i;32091:159::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32195:35:0;;;::::1;;::::0;;;:26:::1;:35;::::0;;;;:43;;-1:-1:-1;;32195:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32091:159::o;15485:281::-;15578:4;15599:129;4427:10;15622:7;15631:96;15670:15;15631:96;;;;;;;;;;;;;;;;;4427:10;15631:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15631:34:0;;;;;;;;;;;;:38;:96::i;12565:187::-;12651:4;12672:42;4427:10;12696:9;12707:6;12672:9;:42::i;33165:124::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;33260:10:::1;:17:::0;33165:124::o;33951:185::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;34034:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;34034:32:0::1;-1:-1:-1::0;;;;34034:32:0;;::::1;;::::0;;34086:38:::1;::::0;::::1;::::0;::::1;::::0;34058:8;4025:14:1;4018:22;4000:41;;3988:2;3973:18;;3955:92;34086:38:0::1;;;;;;;;33951:185:::0;:::o;32883:130::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;32987:15:::1;11902:2:::0;32987::::1;:15;:::i;:::-;32973:29;::::0;:11;:29:::1;:::i;:::-;32958:12;:44:::0;-1:-1:-1;32883:130:0:o;9118:260::-;8723:7;8754:6;-1:-1:-1;;;;;8754:6:0;4427:10;8836:23;8828:68;;;;-1:-1:-1;;;8828:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9211:22:0;::::1;9203:73;;;::::0;-1:-1:-1;;;9203:73:0;;5501:2:1;9203:73:0::1;::::0;::::1;5483:21:1::0;5540:2;5520:18;;;5513:30;5579:34;5559:18;;;5552:62;-1:-1:-1;;;5630:18:1;;;5623:36;5676:19;;9203:73:0::1;5473:228:1::0;9203:73:0::1;9317:6;::::0;;9296:38:::1;::::0;-1:-1:-1;;;;;9296:38:0;;::::1;::::0;9317:6;::::1;::::0;9296:38:::1;::::0;::::1;9349:6;:17:::0;;-1:-1:-1;;;;;;9349:17:0::1;-1:-1:-1::0;;;;;9349:17:0;;;::::1;::::0;;;::::1;::::0;;9118:260::o;2963:106::-;3021:7;3052:5;3056:1;3052;:5;:::i;18936:416::-;-1:-1:-1;;;;;19092:19:0;;19084:68;;;;-1:-1:-1;;;19084:68:0;;8653:2:1;19084:68:0;;;8635:21:1;8692:2;8672:18;;;8665:30;8731:34;8711:18;;;8704:62;-1:-1:-1;;;8782:18:1;;;8775:34;8826:19;;19084:68:0;8625:226:1;19084:68:0;-1:-1:-1;;;;;19175:21:0;;19167:68;;;;-1:-1:-1;;;19167:68:0;;5908:2:1;19167:68:0;;;5890:21:1;5947:2;5927:18;;;5920:30;5986:34;5966:18;;;5959:62;-1:-1:-1;;;6037:18:1;;;6030:32;6079:19;;19167:68:0;5880:224:1;19167:68:0;-1:-1:-1;;;;;19252:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19308:32;;9002:25:1;;;19308:32:0;;8975:18:1;19308:32:0;;;;;;;;18936:416;;;:::o;34802:2496::-;-1:-1:-1;;;;;34954:18:0;;34946:68;;;;-1:-1:-1;;;34946:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35037:16:0;;35029:64;;;;-1:-1:-1;;;35029:64:0;;;;;;;:::i;:::-;35125:1;35116:6;:10;35108:64;;;;-1:-1:-1;;;35108:64:0;;7088:2:1;35108:64:0;;;7070:21:1;7127:2;7107:18;;;7100:30;7166:34;7146:18;;;7139:62;-1:-1:-1;;;7217:18:1;;;7210:39;7266:19;;35108:64:0;7060:231:1;35108:64:0;8723:7;8754:6;-1:-1:-1;;;;;35197:15:0;;;8754:6;;35197:15;;;;:32;;-1:-1:-1;8723:7:0;8754:6;-1:-1:-1;;;;;35216:13:0;;;8754:6;;35216:13;;35197:32;35193:253;;;-1:-1:-1;;;;;35253:32:0;;;;;;:26;:32;;;;;;;;;:66;;-1:-1:-1;;;;;;35289:30:0;;;;;;:26;:30;;;;;;;;35253:66;:110;;;;35351:12;;35341:6;:22;;35253:110;35244:202;;;;-1:-1:-1;;;35244:202:0;;6311:2:1;35244:202:0;;;6293:21:1;6350:2;6330:18;;;6323:30;6389:34;6369:18;;;6362:62;-1:-1:-1;;;6440:18:1;;;6433:45;6495:19;;35244:202:0;6283:237:1;35244:202:0;8723:7;8754:6;-1:-1:-1;;;;;35495:15:0;;;8754:6;;35495:15;;;;:51;;-1:-1:-1;;;;;;35527:19:0;;35541:4;35527:19;;35495:51;:87;;;;-1:-1:-1;35569:13:0;;-1:-1:-1;;;;;35563:19:0;;;35569:13;;35563:19;;35495:87;35477:343;;;-1:-1:-1;;;;;12293:18:0;;35610:22;12293:18;;;:9;:18;;;;;;;;;35671:24;:28;;;;;;;;;;:78;;-1:-1:-1;35731:17:0;;35704:23;35721:6;35704:14;:23;:::i;:::-;:44;;35671:78;35663:145;;;;-1:-1:-1;;;35663:145:0;;8251:2:1;35663:145:0;;;8233:21:1;8290:2;8270:18;;;8263:30;8329:34;8309:18;;;8302:62;-1:-1:-1;;;8380:18:1;;;8373:31;8421:19;;35663:145:0;8223:223:1;35663:145:0;35477:343;;35891:4;35842:28;12293:18;;;:9;:18;;;;;;35964:27;;35940:51;;;;;;;36028:57;;-1:-1:-1;36069:16:0;;-1:-1:-1;;;36069:16:0;;;;36068:17;36028:57;:99;;;;-1:-1:-1;36114:13:0;;-1:-1:-1;;;;;36106:21:0;;;36114:13;;36106:21;;36028:99;:141;;;;-1:-1:-1;36148:21:0;;-1:-1:-1;;;36148:21:0;;;;36028:141;36006:322;;;36227:27;;36204:50;;36273:39;36291:20;36273:17;:39::i;:::-;-1:-1:-1;;;;;36378:24:0;;36344:12;36378:24;;;:18;:24;;;;;;36359:4;;36378:24;;;:50;;-1:-1:-1;;;;;;36406:22:0;;;;;;:18;:22;;;;;;;;36378:50;36374:911;;;36445:33;36461:4;36467:2;36471:6;36445:15;:33::i;:::-;-1:-1:-1;36503:5:0;36374:911;;;36555:13;;-1:-1:-1;;;;;36547:21:0;;;36555:13;;36547:21;36543:721;;;36613:17;36633:31;36660:3;36633:22;36644:10;;36633:6;:10;;:22;;;;:::i;:::-;:26;;:31::i;:::-;36613:51;-1:-1:-1;36693:21:0;:6;36613:51;36693:10;:21::i;:::-;36685:29;;36733:47;36749:4;36763;36770:9;36733:15;:47::i;:::-;36799:33;36815:4;36821:2;36825:6;36799:15;:33::i;:::-;36543:721;;;;36866:13;;-1:-1:-1;;;;;36860:19:0;;;36866:13;;36860:19;36856:408;;;36925:17;36945:32;36973:3;36945:23;36956:11;;36945:6;:10;;:23;;;;:::i;36856:408::-;37215:33;37231:4;37237:2;37241:6;37215:15;:33::i;:::-;34802:2496;;;;;;:::o;3575:226::-;3661:7;3730:12;3722:6;;;;3714:29;;;;-1:-1:-1;;;3714:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;3769:5:0;;;3575:226::o;37310:564::-;29915:16;:23;;-1:-1:-1;;;;29915:23:0;-1:-1:-1;;;29915:23:0;;;37417:16:::1;::::0;;37431:1:::1;37417:16:::0;;;;;::::1;::::0;;-1:-1:-1;;37417:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;37417:16:0::1;37393:40;;37466:4;37448;37453:1;37448:7;;;;;;-1:-1:-1::0;;;37448:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;37448:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;37496:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;37496:22:0;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;37448:7;;37496:22;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37486:4;37491:1;37486:7;;;;;;-1:-1:-1::0;;;37486:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;37486:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;37565:15:::1;::::0;37533:62:::1;::::0;37550:4:::1;::::0;37565:15:::1;37583:11:::0;37533:8:::1;:62::i;:::-;37610:15;::::0;37796:17:::1;::::0;37610:252:::1;::::0;-1:-1:-1;;;37610:252:0;;-1:-1:-1;;;;;37610:15:0;;::::1;::::0;:66:::1;::::0;:252:::1;::::0;37695:11;;37610:15:::1;::::0;37773:4;;37796:17;::::1;::::0;37832:15:::1;::::0;37610:252:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;29969:16:0;:24;;-1:-1:-1;;;;29969:24:0;;;-1:-1:-1;;;;37310:564:0:o;16303:617::-;-1:-1:-1;;;;;16463:20:0;;16455:70;;;;-1:-1:-1;;;16455:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16548:23:0;;16540:71;;;;-1:-1:-1;;;16540:71:0;;;;;;;:::i;:::-;16712;16734:6;16712:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16712:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;16692:17:0;;;;;;;:9;:17;;;;;;:91;;;;16821:20;;;;;;;:32;;16846:6;16821:24;:32::i;:::-;-1:-1:-1;;;;;16798:20:0;;;;;;;:9;:20;;;;;;;:55;;;;16873:35;;;;;;;;;;16901:6;9002:25:1;;8990:2;8975:18;;8957:76;3203:106:0;3261:7;3292:5;3296:1;3292;:5;:::i;3329:106::-;3387:7;3418:5;3422:1;3418;:5;:::i;3083:106::-;3141:7;3172:5;3176:1;3172;:5;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:398::-;610:6;618;671:2;659:9;650:7;646:23;642:32;639:2;;;692:6;684;677:22;639:2;736:9;723:23;755:31;780:5;755:31;:::i;:::-;805:5;-1:-1:-1;862:2:1;847:18;;834:32;875:33;834:32;875:33;:::i;:::-;927:7;917:17;;;629:311;;;;;:::o;945:466::-;1022:6;1030;1038;1091:2;1079:9;1070:7;1066:23;1062:32;1059:2;;;1112:6;1104;1097:22;1059:2;1156:9;1143:23;1175:31;1200:5;1175:31;:::i;:::-;1225:5;-1:-1:-1;1282:2:1;1267:18;;1254:32;1295:33;1254:32;1295:33;:::i;:::-;1049:362;;1347:7;;-1:-1:-1;;;1401:2:1;1386:18;;;;1373:32;;1049:362::o;1416:392::-;1481:6;1489;1542:2;1530:9;1521:7;1517:23;1513:32;1510:2;;;1563:6;1555;1548:22;1510:2;1607:9;1594:23;1626:31;1651:5;1626:31;:::i;:::-;1676:5;-1:-1:-1;1733:2:1;1718:18;;1705:32;1746:30;1705:32;1746:30;:::i;1813:325::-;1881:6;1889;1942:2;1930:9;1921:7;1917:23;1913:32;1910:2;;;1963:6;1955;1948:22;1910:2;2007:9;1994:23;2026:31;2051:5;2026:31;:::i;:::-;2076:5;2128:2;2113:18;;;;2100:32;;-1:-1:-1;;;1900:238:1:o;2143:251::-;2199:6;2252:2;2240:9;2231:7;2227:23;2223:32;2220:2;;;2273:6;2265;2258:22;2220:2;2317:9;2304:23;2336:28;2358:5;2336:28;:::i;2399:255::-;2466:6;2519:2;2507:9;2498:7;2494:23;2490:32;2487:2;;;2540:6;2532;2525:22;2487:2;2577:9;2571:16;2596:28;2618:5;2596:28;:::i;2659:190::-;2718:6;2771:2;2759:9;2750:7;2746:23;2742:32;2739:2;;;2792:6;2784;2777:22;2739:2;-1:-1:-1;2820:23:1;;2729:120;-1:-1:-1;2729:120:1:o;4287:603::-;4399:4;4428:2;4457;4446:9;4439:21;4489:6;4483:13;4532:6;4527:2;4516:9;4512:18;4505:34;4557:4;4570:140;4584:6;4581:1;4578:13;4570:140;;;4679:14;;;4675:23;;4669:30;4645:17;;;4664:2;4641:26;4634:66;4599:10;;4570:140;;;4728:6;4725:1;4722:13;4719:2;;;4798:4;4793:2;4784:6;4773:9;4769:22;4765:31;4758:45;4719:2;-1:-1:-1;4874:2:1;4853:15;-1:-1:-1;;4849:29:1;4834:45;;;;4881:2;4830:54;;4408:482;-1:-1:-1;;;4408:482:1:o;4895:399::-;5097:2;5079:21;;;5136:2;5116:18;;;5109:30;5175:34;5170:2;5155:18;;5148:62;-1:-1:-1;;;5241:2:1;5226:18;;5219:33;5284:3;5269:19;;5069:225::o;6525:356::-;6727:2;6709:21;;;6746:18;;;6739:30;6805:34;6800:2;6785:18;;6778:62;6872:2;6857:18;;6699:182::o;7643:401::-;7845:2;7827:21;;;7884:2;7864:18;;;7857:30;7923:34;7918:2;7903:18;;7896:62;-1:-1:-1;;;7989:2:1;7974:18;;7967:35;8034:3;8019:19;;7817:227::o;9038:983::-;9300:4;9348:3;9337:9;9333:19;9379:6;9368:9;9361:25;9405:2;9443:6;9438:2;9427:9;9423:18;9416:34;9486:3;9481:2;9470:9;9466:18;9459:31;9510:6;9545;9539:13;9576:6;9568;9561:22;9614:3;9603:9;9599:19;9592:26;;9653:2;9645:6;9641:15;9627:29;;9674:4;9687:195;9701:6;9698:1;9695:13;9687:195;;;9766:13;;-1:-1:-1;;;;;9762:39:1;9750:52;;9857:15;;;;9822:12;;;;9798:1;9716:9;9687:195;;;-1:-1:-1;;;;;;;9938:32:1;;;;9933:2;9918:18;;9911:60;-1:-1:-1;;;10002:3:1;9987:19;9980:35;9899:3;9309:712;-1:-1:-1;;;9309:712:1:o;10215:128::-;10255:3;10286:1;10282:6;10279:1;10276:13;10273:2;;;10292:18;;:::i;:::-;-1:-1:-1;10328:9:1;;10263:80::o;10348:217::-;10388:1;10414;10404:2;;-1:-1:-1;;;10439:31:1;;10493:4;10490:1;10483:15;10521:4;10446:1;10511:15;10404:2;-1:-1:-1;10550:9:1;;10394:171::o;10570:422::-;10659:1;10702:5;10659:1;10716:270;10737:7;10727:8;10724:21;10716:270;;;10796:4;10792:1;10788:6;10784:17;10778:4;10775:27;10772:2;;;10805:18;;:::i;:::-;10855:7;10845:8;10841:22;10838:2;;;10875:16;;;;10838:2;10954:22;;;;10914:15;;;;10716:270;;;10720:3;10634:358;;;;;:::o;10997:140::-;11055:5;11084:47;11125:4;11115:8;11111:19;11105:4;11191:5;11221:8;11211:2;;-1:-1:-1;11262:1:1;11276:5;;11211:2;11310:4;11300:2;;-1:-1:-1;11347:1:1;11361:5;;11300:2;11392:4;11410:1;11405:59;;;;11478:1;11473:130;;;;11385:218;;11405:59;11435:1;11426:10;;11449:5;;;11473:130;11510:3;11500:8;11497:17;11494:2;;;11517:18;;:::i;:::-;-1:-1:-1;;11573:1:1;11559:16;;11588:5;;11385:218;;11687:2;11677:8;11674:16;11668:3;11662:4;11659:13;11655:36;11649:2;11639:8;11636:16;11631:2;11625:4;11622:12;11618:35;11615:77;11612:2;;;-1:-1:-1;11724:19:1;;;11756:5;;11612:2;11803:34;11828:8;11822:4;11803:34;:::i;:::-;11873:6;11869:1;11865:6;11861:19;11852:7;11849:32;11846:2;;;11884:18;;:::i;:::-;11922:20;;11201:747;-1:-1:-1;;;11201:747:1:o;11953:168::-;11993:7;12059:1;12055;12051:6;12047:14;12044:1;12041:21;12036:1;12029:9;12022:17;12018:45;12015:2;;;12066:18;;:::i;:::-;-1:-1:-1;12106:9:1;;12005:116::o;12126:125::-;12166:4;12194:1;12191;12188:8;12185:2;;;12199:18;;:::i;:::-;-1:-1:-1;12236:9:1;;12175:76::o;12256:380::-;12335:1;12331:12;;;;12378;;;12399:2;;12453:4;12445:6;12441:17;12431:27;;12399:2;12506;12498:6;12495:14;12475:18;12472:38;12469:2;;;12552:10;12547:3;12543:20;12540:1;12533:31;12587:4;12584:1;12577:15;12615:4;12612:1;12605:15;12469:2;;12311:325;;;:::o;12641:127::-;12702:10;12697:3;12693:20;12690:1;12683:31;12733:4;12730:1;12723:15;12757:4;12754:1;12747:15;12773:131;-1:-1:-1;;;;;12848:31:1;;12838:42;;12828:2;;12894:1;12891;12884:12;12828:2;12818:86;:::o;12909:118::-;12995:5;12988:13;12981:21;12974:5;12971:32;12961:2;;13017:1;13014;13007:12

Swarm Source

ipfs://51f4ebec69e49326e2c73d13f67d0347a55539c699f5e32be0f3cc4da6adde6f
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.