ETH Price: $2,562.59 (-1.86%)

Token

Rabbits (RBITS)
 

Overview

Max Total Supply

1,000,000,000,000,000 RBITS

Holders

133

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,439,311.896441425 RBITS

Value
$0.00
0xEa9611Ee7C9Cc6d2b21A1d841ca16B703457431E
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:
Rabbits

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-01
*/

/*
                                   
RBITS: A frictionless yield NFT/gaming token

TG: https://t.me/rbitsportal

X: https://twitter.com/RBitsOfficial

Web: https://rbits.xyz

dev notes:
- High Tax on launch (25%)
- After setFees is called to set the new tax rate, it can never be set higher than 5%
- No limits

*/


pragma solidity ^0.8.18;
// SPDX-License-Identifier: Unlicensed
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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



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

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

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

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

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

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

}

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 Rabbits is Context, IERC20, Ownable {
  
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => uint256) private _specialFees; // fee amount for special addresses
    mapping( address => bool) private _hasSpecialFee; // addresses eligible for special fees
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromReward;  // addresses excluded from reflection rewards
    
    address[] private _excludedFromReward; // addresses not eligible for reflection rewards

    address payable public _platformFundAddress = payable(0xe941e3adA31bF3e6300eBcfeB8D12BA7AFE8EA2b);
   
    uint256 public numTokensToSell = 500000 * 10**6 * 10**9; // 500 billion
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _TTOTAL = 1000000000 * 10**6 * 10**9;  // 1 quadrillion
    uint256 private constant WHALETHRESHOLD = 5000000 * 10**6 * 10**9; // 0.5 trillion
    uint256 private constant MAXLIQUIFYAMOUNT = 10000000 * 10**6 * 10**9; // 1 trillion

    uint256 private _rTotal = (MAX - (MAX % _TTOTAL));

    string private constant NAME = "Rabbits";
    string private constant SYMBOL = "RBITS";
    uint8 private constant DECIMALS = 9;
    
    // initially, high taxes to seed project funds
    uint256 public _taxFee = 0;                    // percentage that is distributed to all holders
    uint256 private _prevTaxFee = _taxFee;
    
    uint256 public _liquidityFee = 0;              // percentage that is added to LP
    uint256 private _prevLiquidityFee = _liquidityFee;

    uint256 public _projectFee = 2500;             // percentage that is added to project fund
    uint256 private _prevProjectFee = _projectFee;

    uint256 public _totalLiqFee = 0;               // total fee to be liquified 
    uint256 private _prevTotalLiqFee = _totalLiqFee;

    // target tax rate (5%)
    // tax can be modified but new taxrate must be equal to or less than 5%
    uint256 private constant TARGETFEE = 500;
    bool private _transferTaxEnabled = false;
    uint256 public _totalFee = 0;
    
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    
    bool private inSwapAndLiquify;
    
    bool public swapAndLiquifyEnabled = false;
    bool public swapAndLiquifyMaxAmountEnabled = true;

    uint256 private _timeLock = 0;

    event SetFee(address account, uint256 newFee, bool enabled);
    event SetFees(uint256 newRewardFee, uint256 newLiquidityFee, uint256 newProjectFee, bool transferTax);
    event SetPlatformFundAddress(address newAddress);
    event ExcludeFromReward(address addr);
    event IncludeInReward(address addr);
    event SetSwapAndLiquifyMaxAmount(uint256 amount);
    event SetSwapAndLiquifyEnabled(bool swapEnabled, bool maxAmountEnabled);
    event RescueETH(uint256 amount, address addr);
    event RescueERC20(uint256 amount, address addr);
    event RemoveLiquidity(uint256 percentage);
    event AddInitialLiquidity();
    event OpenTrading();

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {
        _rOwned[_msgSender()] = _rTotal;
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        // ETH Mainnet

        // 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, fund address and this contract from fee
        _hasSpecialFee[ owner() ] = true;
        _hasSpecialFee[ address(this) ] = true;
        _hasSpecialFee[ _platformFundAddress ] = true;

        //exclude pair from receiving reflection rewards
        _isExcludedFromReward[ uniswapV2Pair ] = true;
        
        _totalLiqFee = _liquidityFee + _projectFee;
        _prevTotalLiqFee = _totalLiqFee;

        _timeLock = block.timestamp;

        emit Transfer(address(0), _msgSender(), _TTOTAL);
    }

    function name() external pure returns (string memory) {
        return NAME;
    }

    function symbol() external pure returns (string memory) {
        return SYMBOL;
    }

    function decimals() external pure returns (uint8) {
        return DECIMALS;
    }

    function totalSupply() external pure override returns (uint256) {
        return _TTOTAL;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcludedFromReward[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) external view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue);
        return true;
    }

    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcludedFromReward[account];
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) {
        require(tAmount <= _TTOTAL);
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal);
        uint256 currentRate = _getRate();
        return rAmount / currentRate;
    }

    function isFeeForAddressEnabled(address account) external view returns (bool) {
        return _hasSpecialFee[ account ];
    }

    function getFeeForAddress(address account) external view returns (uint256) {
        return  _specialFees[ account ];
    }

    function setPlatformFundAddress(address newAddress) external onlyOwner() {
        require( newAddress != address(0) );
        _platformFundAddress = payable(newAddress);

        emit SetPlatformFundAddress(newAddress);
    }

   function setFees(uint256 newRewardFee, uint256 newLiquidityFee, uint256 newProjectFee, bool transferTax) 
     external onlyOwner() {
        require( (newRewardFee + newLiquidityFee + newProjectFee) <= TARGETFEE); // cannot be more than 5%
        
        _taxFee = newRewardFee;
        _liquidityFee = newLiquidityFee;
        _projectFee = newProjectFee;
        _transferTaxEnabled = transferTax; // if enabled, tax transfers between wallets

        _totalLiqFee = _liquidityFee + _projectFee;

        emit SetFees(newRewardFee, newLiquidityFee, newProjectFee, transferTax);
    }

    function openTrading() external onlyOwner() {
        swapAndLiquifyEnabled = true;

        emit OpenTrading();
    }

    function setFee(address account, uint256 newFee, bool enabled) external onlyOwner {
        require( newFee <= TARGETFEE ); // cannot be more than 5%

        _specialFees[ account ] = newFee;
        _hasSpecialFee[ account ] = enabled;

        emit SetFee(account, newFee, enabled);
    }

    function excludeFromReward(address account) external onlyOwner() {
        require(!_isExcludedFromReward[account]);
        require(_excludedFromReward.length < 100);
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcludedFromReward[account] = true;
        _excludedFromReward.push(account);

        emit ExcludeFromReward(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcludedFromReward[account]);
        require(_excludedFromReward.length < 100);
        uint len = _excludedFromReward.length;
        for (uint256 i = 0; i < len; i++) {
            if (_excludedFromReward[i] == account) {
                _excludedFromReward[i] = _excludedFromReward[len - 1];
                uint256 currentRate = _getRate();
                _rOwned[account] = _tOwned[account] * currentRate;
                _tOwned[account] = 0;
                _isExcludedFromReward[account] = false;
                _excludedFromReward.pop();

                emit IncludeInReward(account);
                break;
            }
        }
    }

    function setSwapAndLiquifyEnabled(bool swapEnabled, bool maxAmountEnabled) external onlyOwner {
        swapAndLiquifyEnabled = swapEnabled;
        swapAndLiquifyMaxAmountEnabled = maxAmountEnabled;

        emit SetSwapAndLiquifyEnabled(swapAndLiquifyEnabled, swapAndLiquifyMaxAmountEnabled);
    }

    function setSwapAndLiquifyMaxAmount(uint256 amount) external onlyOwner {
        require( amount > 0 );
        require( amount <= MAXLIQUIFYAMOUNT);
        numTokensToSell = amount;

        emit SetSwapAndLiquifyMaxAmount(numTokensToSell);
    }

    // contract gains ETH over time
    function rescueETH(uint256 amount) external onlyOwner {
        payable( msg.sender ).transfer(amount);

        emit RescueETH(amount, msg.sender );
    }

    // rescue tokens accidently sent to contract address
    function rescueERC20(address tokenAddress) external onlyOwner() {
        //require(tokenAddress != address(this));
        require(tokenAddress != address(uniswapV2Pair));

        IERC20 token = IERC20(tokenAddress);
        uint256 amount = token.balanceOf(address(this));
        require(amount > 0);

        bool success = token.transfer(_msgSender(), amount);
        require(success);

        emit RescueERC20( amount, tokenAddress );
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal - rFee;
        _totalFee = _totalFee + tFee;
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = tAmount * _taxFee / (10**4);
        uint256 tLiquidity = tAmount * _totalLiqFee / (10**4);
        uint256 tTransferAmount = tAmount - tFee - tLiquidity;
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) 
        private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        uint256 rLiquidity = tLiquidity * currentRate;
        uint256 rTransferAmount = rAmount - rFee - rLiquidity;
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _TTOTAL;
        uint len = _excludedFromReward.length;
        for (uint256 i = 0; i < len; i++) {
            if (_rOwned[_excludedFromReward[i]] > rSupply || 
                _tOwned[_excludedFromReward[i]] > tSupply) 
                    return (_rTotal, _TTOTAL);
            rSupply = rSupply - _rOwned[_excludedFromReward[i]];
            tSupply = tSupply - _tOwned[_excludedFromReward[i]];
        }
        if (rSupply < (_rTotal / _TTOTAL)) return (_rTotal, _TTOTAL);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
        if(_isExcludedFromReward[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)] + tLiquidity;
    }
    
    function saveAllFees() private {
        _prevTaxFee = _taxFee;
        _prevTotalLiqFee = _totalLiqFee;
        _prevProjectFee = _projectFee;
        _prevLiquidityFee = _liquidityFee;
    }
  
    function setTaxes(address from, address to) private returns (bool) {
        
        uint256 totalFee = _taxFee + _liquidityFee + _projectFee;
        if( totalFee == 0 ) {
            return false;
        }

        // don't tax normal transfers between wallets if transferTax is disabled
        bool isSimpleTransfer = (from != uniswapV2Pair && to != uniswapV2Pair && !_transferTaxEnabled);
        if (isSimpleTransfer && !_hasSpecialFee[from]) {
            _taxFee = 0;
            _liquidityFee = 0;
            _projectFee = 0;
            _totalLiqFee = 0;
            return false;
        }

        // if the tax rate is not yet the target tax rate, lock the tax rate on buy
        // this provides a dynamic taxrate to cushion the impact when sniper whales exit
        if( totalFee > TARGETFEE && from == uniswapV2Pair && !_hasSpecialFee[to] ) {
            if( balanceOf(to) >= WHALETHRESHOLD ) {
                _hasSpecialFee[to] = true;
                _specialFees[to]   = totalFee;
            }
        }

        if( !_hasSpecialFee[from] && !_hasSpecialFee[to]) {
            // dont change tax fee
            return false;
        }

        // either one or both of the addresses have a special fee, take the lowest
        address lowestFeeAccount = from;
        if( _hasSpecialFee[from] && _hasSpecialFee[to]) {
            lowestFeeAccount = ( _specialFees[from] > _specialFees[to] ? to : from );
        } else if ( _hasSpecialFee[to] ) {
            lowestFeeAccount = to;
        }

        // get the fee (which can be zero)
        uint256 fee = _specialFees[ lowestFeeAccount ];
        
        // set fees
        _taxFee = fee * _taxFee / totalFee;
        _liquidityFee = fee * _liquidityFee / totalFee;
        _projectFee = fee * _projectFee / totalFee;
        _totalLiqFee = _liquidityFee + _projectFee;

        return true;
    }

    function restoreAllFees(address from, address to) private {
        _taxFee = _prevTaxFee;
        _totalLiqFee = _prevTotalLiqFee;
        _projectFee = _prevProjectFee;
        _liquidityFee = _prevLiquidityFee;

        // remove special fee if new balance is near zero
        if( _hasSpecialFee[to] && balanceOf(to) < (1 * 10**9) ) {
            _specialFees[to] = 0;
            _hasSpecialFee[to] = false;
        }

        if( _hasSpecialFee[from] && balanceOf(from) < (1 * 10**9) ) {
            _specialFees[from] = 0;
            _hasSpecialFee[from] = false;
        }
    }
 
    function _approve(address addr, address spender, uint256 amount) private {
        require(addr != address(0) );
        require(spender != address(0) );

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0));
        require(to != address(0));
        require(amount <= balanceOf(from));

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinTokenBalance = contractTokenBalance > numTokensToSell;
        
        // save all the fees
        saveAllFees();

        setTaxes(from,to);
                
        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled &&
            _totalLiqFee > 0
        ) {
            if( swapAndLiquifyMaxAmountEnabled ) {
                contractTokenBalance = numTokensToSell;
            }
            
            swapAndLiquify(contractTokenBalance);
        }
        
        //transfer amount, it will deduct fee and reflect tokens
        _tokenTransfer(from,to,amount);

        // restore all the fees
        restoreAllFees(from, to);
    }

    function swapAndLiquify(uint256 tAmount) private lockTheSwap {
        uint256 forLiquidity = tAmount * _liquidityFee / _totalLiqFee;
        uint256 forWallets = tAmount - forLiquidity;
        
        if(forLiquidity > 0 && _liquidityFee > 0)
        {
            // sell half the tokens for ETH and add liquidity
            uint256 half = forLiquidity / 2;
            uint256 otherHalf = forLiquidity - half;
    
            uint256 initialBalance = address(this).balance;
            swapTokensForETH(half);

            uint256 newBalance = address(this).balance - initialBalance;
            addLiquidity(otherHalf, newBalance);
        }
                
        if(forWallets > 0 && _projectFee > 0) 
        {
            // sell tokens for ETH and send to project fund
            uint256 initialBalance = address(this).balance;
            swapTokensForETH(forWallets);

            uint256 newBalance = address(this).balance - initialBalance;
            
            _platformFundAddress.transfer(newBalance);
        }

    }

    function swapTokensForETH(uint256 tokenAmount) private {
        // generate the pair path of token -> weth 
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        if( _allowances[ address(this)][address(uniswapV2Router)] < tokenAmount )
            _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    // remove at most 10% of the liquidity tokens in the contract and each withdrawal triggers
    // an automatic 4-week time lock.
    // this does not impact initial liquidity
    function removeLiquidity(uint256 percentage) external onlyOwner lockTheSwap {
        require(_timeLock <= block.timestamp);
        require(percentage <= 1000);
        
        uint256 liquidity = IERC20(uniswapV2Pair).balanceOf(address(this));
        require( liquidity > 0);

        uint256 amount = liquidity * percentage / (10**4); // at most 10%
        
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), amount);
        uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this), amount, 0, 0, msg.sender, block.timestamp + 60 );

        // set a new timed lock
        _timeLock = block.timestamp + (4 weeks);

        emit RemoveLiquidity(percentage);
    }

    // function that generates LP tokens from taxes
    function addLiquidity(uint256 tokenAmount, uint256 ETHAmount) private {        
        if( _allowances[ address(this)][address(uniswapV2Router)] < tokenAmount )
            _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    // function to add initial liquidity
    // owner of the LP tokens is the deployer wallet
    // received LP tokens need to be locked or burned
    function addInitialLiquidity() external payable onlyOwner {
        _approve(address(this), address(uniswapV2Router), MAX);
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), MAX);
        
        uniswapV2Router.addLiquidityETH{value: msg.value}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        
        emit AddInitialLiquidity();
    }

    //this method is responsible for taking all fee
    function _tokenTransfer(address sender, address recipient, uint256 amount) private {
        if (_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

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

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

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

     //to receive ETH from router when swapping
    receive() external payable {}

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"AddInitialLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ExcludeFromReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"IncludeInReward","type":"event"},{"anonymous":false,"inputs":[],"name":"OpenTrading","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":"percentage","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"RescueERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"RescueETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRewardFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newProjectFee","type":"uint256"},{"indexed":false,"internalType":"bool","name":"transferTax","type":"bool"}],"name":"SetFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetPlatformFundAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"swapEnabled","type":"bool"},{"indexed":false,"internalType":"bool","name":"maxAmountEnabled","type":"bool"}],"name":"SetSwapAndLiquifyEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetSwapAndLiquifyMaxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_platformFundAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_projectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalLiqFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addInitialLiquidity","outputs":[],"stateMutability":"payable","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":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getFeeForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isFeeForAddressEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"numTokensToSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"removeLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"newFee","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRewardFee","type":"uint256"},{"internalType":"uint256","name":"newLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"newProjectFee","type":"uint256"},{"internalType":"bool","name":"transferTax","type":"bool"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setPlatformFundAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"swapEnabled","type":"bool"},{"internalType":"bool","name":"maxAmountEnabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapAndLiquifyMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyMaxAmountEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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"},{"stateMutability":"payable","type":"receive"}]

60c0604052600980546001600160a01b03191673e941e3ada31bf3e6300ebcfeb8d12ba7afe8ea2b179055681b1ae4d6e2ef500000600a556200004f69d3c21bcecceda100000060001962000372565b6200005d90600019620003ab565b600b556000600c819055600d819055600e819055600f8190556109c46010819055601155601281905560138190556014805460ff1916905560158190556016805462ffff00191662010000179055601755348015620000bb57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b543360009081526002602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a015592600480830193928290030181865afa15801562000164573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018a9190620003c7565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fe9190620003c7565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200024c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002729190620003c7565b6001600160a01b0390811660a05281166080526001600560006200029e6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526005845282812080548616600190811790915560095483168252838220805487168217905560a0519092168152600790935291208054909216179055601054600e546200031d9190620003f9565b60128190556013554260175560405169d3c21bcecceda1000000815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3506200040f565b6000826200039057634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b81810381811115620003c157620003c162000395565b92915050565b600060208284031215620003da57600080fd5b81516001600160a01b0381168114620003f257600080fd5b9392505050565b80820180821115620003c157620003c162000395565b60805160a051612e5e620004c1600039600081816104dd015281816108d201528181611114015281816111f8015281816116ab01528181611a0d01528181611b4e01528181611b8b0152611c2901526000818161031301528181610864015281816108a201528181610942015281816111c60152818161127201528181612402015281816124c0015281816124f701528181612533015281816125bb015281816125f801526126340152612e5e6000f3fe6080604052600436106102555760003560e01c806368839377116101395780639e252f00116100b6578063c9567bf91161007a578063c9567bf91461075a578063ccec37161461076f578063dd62ed3e1461078f578063deb4e9e6146107d5578063ee464430146107f5578063f2fde38b1461080b57600080fd5b80639e252f00146106ba5780639f731699146106da578063a457c2d7146106fa578063a9059cbb1461071a578063be07a5351461073a57600080fd5b80638da5cb5b116100fd5780638da5cb5b1461060e57806395d89b411461062c5780639834af511461065a5780639c8f9f231461067a5780639de08e1b1461069a57600080fd5b806368839377146105745780636bc87c3a1461058a57806370a08231146105a0578063715018a6146105c057806388f82020146105d557600080fd5b8063310c165f116101d25780634549b039116101965780634549b0391461048b57806345ba883e146104ab57806349bd5a5e146104cb5780634a74bb02146104ff57806352390c021461051e578063682bcb101461053e57600080fd5b8063310c165f146103e0578063313ce567146104195780633685d4191461043557806339509351146104555780633b124fe71461047557600080fd5b806318160ddd1161021957806318160ddd1461034d5780631834848c1461036a57806323b872dd1461038a578063283f7820146103aa5780632d838119146103c057600080fd5b80630210a83d1461026157806306fdde031461026b578063095ea7b3146102ad5780630bfe9327146102dd5780631694505e1461030157600080fd5b3661025c57005b600080fd5b61026961082b565b005b34801561027757600080fd5b506040805180820190915260078152665261626269747360c81b60208201525b6040516102a491906129f8565b60405180910390f35b3480156102b957600080fd5b506102cd6102c8366004612a5e565b610a22565b60405190151581526020016102a4565b3480156102e957600080fd5b506102f360105481565b6040519081526020016102a4565b34801561030d57600080fd5b506103357f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102a4565b34801561035957600080fd5b5069d3c21bcecceda10000006102f3565b34801561037657600080fd5b50610269610385366004612a8a565b610a39565b34801561039657600080fd5b506102cd6103a5366004612aa3565b610ac3565b3480156103b657600080fd5b506102f360155481565b3480156103cc57600080fd5b506102f36103db366004612a8a565b610b15565b3480156103ec57600080fd5b506102cd6103fb366004612ae4565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561042557600080fd5b50604051600981526020016102a4565b34801561044157600080fd5b50610269610450366004612ae4565b610b43565b34801561046157600080fd5b506102cd610470366004612a5e565b610d4d565b34801561048157600080fd5b506102f3600c5481565b34801561049757600080fd5b506102f36104a6366004612b0f565b610d84565b3480156104b757600080fd5b506102696104c6366004612b3f565b610dd6565b3480156104d757600080fd5b506103357f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b506016546102cd90610100900460ff1681565b34801561052a57600080fd5b50610269610539366004612ae4565b610e85565b34801561054a57600080fd5b506102f3610559366004612ae4565b6001600160a01b031660009081526004602052604090205490565b34801561058057600080fd5b506102f360125481565b34801561059657600080fd5b506102f3600e5481565b3480156105ac57600080fd5b506102f36105bb366004612ae4565b610fd4565b3480156105cc57600080fd5b50610269611033565b3480156105e157600080fd5b506102cd6105f0366004612ae4565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561061a57600080fd5b506000546001600160a01b0316610335565b34801561063857600080fd5b50604080518082019091526005815264524249545360d81b6020820152610297565b34801561066657600080fd5b50600954610335906001600160a01b031681565b34801561068657600080fd5b50610269610695366004612a8a565b6110a7565b3480156106a657600080fd5b506102696106b5366004612b81565b61135f565b3480156106c657600080fd5b506102696106d5366004612a8a565b611402565b3480156106e657600080fd5b506102696106f5366004612ae4565b61148f565b34801561070657600080fd5b506102cd610715366004612a5e565b61151a565b34801561072657600080fd5b506102cd610735366004612a5e565b611551565b34801561074657600080fd5b50610269610755366004612baf565b61155e565b34801561076657600080fd5b5061026961161b565b34801561077b57600080fd5b5061026961078a366004612ae4565b61167f565b34801561079b57600080fd5b506102f36107aa366004612bf0565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156107e157600080fd5b506016546102cd9062010000900460ff1681565b34801561080157600080fd5b506102f3600a5481565b34801561081757600080fd5b50610269610826366004612ae4565b611830565b6000546001600160a01b0316331461085e5760405162461bcd60e51b815260040161085590612c1e565b60405180910390fd5b61088b307f00000000000000000000000000000000000000000000000000000000000000006000196118f7565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260001960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af115801561091b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093f9190612c41565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d719343061097a30610fd4565b60008061098f6000546001600160a01b031690565b426040518863ffffffff1660e01b81526004016109b196959493929190612c5e565b60606040518083038185885af11580156109cf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906109f49190612c99565b50506040517f6a30f1c3e92e35430d2fe4f3d14fdc9e80963f522722a42c8bb9ea96c8468be39150600090a1565b6000610a2f3384846118f7565b5060015b92915050565b6000546001600160a01b03163314610a635760405162461bcd60e51b815260040161085590612c1e565b60008111610a7057600080fd5b69021e19e0c9bab2400000811115610a8757600080fd5b600a8190556040518181527f6c24780670b954fda389cad23ebd3f2e36024cac8688d6d01ea538a415acc0c8906020015b60405180910390a150565b6000610ad084848461197e565b6001600160a01b038416600090815260066020908152604080832033808552925290912054610b0b918691610b06908690612cdd565b6118f7565b5060019392505050565b6000600b54821115610b2657600080fd5b6000610b30611aa4565b9050610b3c8184612cf0565b9392505050565b6000546001600160a01b03163314610b6d5760405162461bcd60e51b815260040161085590612c1e565b6001600160a01b03811660009081526007602052604090205460ff16610b9257600080fd5b600854606411610ba157600080fd5b60085460005b81811015610d4857826001600160a01b031660088281548110610bcc57610bcc612d12565b6000918252602090912001546001600160a01b031603610d36576008610bf3600184612cdd565b81548110610c0357610c03612d12565b600091825260209091200154600880546001600160a01b039092169183908110610c2f57610c2f612d12565b6000918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155610c60611aa4565b6001600160a01b038516600090815260036020526040902054909150610c87908290612d28565b6001600160a01b038516600090815260026020908152604080832093909355600381528282208290556007905220805460ff191690556008805480610cce57610cce612d3f565b6000828152602090819020600019908301810180546001600160a01b03191690559091019091556040516001600160a01b03861681527fb31990b399410eeea874c2c81063feb4b5e55f66f46004a8306f10a81f031d3f91015b60405180910390a150505050565b80610d4081612d55565b915050610ba7565b505050565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610a2f918590610b06908690612d6e565b600069d3c21bcecceda1000000831115610d9d57600080fd5b81610dbc576000610dad84611ac7565b50939550610a33945050505050565b6000610dc784611ac7565b50929550610a33945050505050565b6000546001600160a01b03163314610e005760405162461bcd60e51b815260040161085590612c1e565b6101f4821115610e0f57600080fd5b6001600160a01b03831660008181526004602090815260408083208690556005825291829020805460ff19168515159081179091558251938452908301859052908201527fd12bcdb5e9d1b97987843d1dc1654e96429c968a5efbc5a47dab1955052282469060600160405180910390a1505050565b6000546001600160a01b03163314610eaf5760405162461bcd60e51b815260040161085590612c1e565b6001600160a01b03811660009081526007602052604090205460ff1615610ed557600080fd5b600854606411610ee457600080fd5b6001600160a01b03811660009081526002602052604090205415610f3e576001600160a01b038116600090815260026020526040902054610f2490610b15565b6001600160a01b0382166000908152600360205260409020555b6001600160a01b0381166000818152600760209081526040808320805460ff191660019081179091556008805491820181559093527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390920180546001600160a01b0319168417905590519182527f6f6f36b62c3e3a776fc3052d503097ffb886d7eb4546e768132fef82747e30b99101610ab8565b6001600160a01b03811660009081526007602052604081205460ff161561101157506001600160a01b031660009081526003602052604090205490565b6001600160a01b038216600090815260026020526040902054610a3390610b15565b6000546001600160a01b0316331461105d5760405162461bcd60e51b815260040161085590612c1e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146110d15760405162461bcd60e51b815260040161085590612c1e565b6016805460ff191660011790556017544210156110ed57600080fd5b6103e88111156110fc57600080fd5b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111879190612d81565b90506000811161119657600080fd5b60006127106111a58484612d28565b6111af9190612cf0565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015611243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112679190612c41565b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663af2979eb3083600080336112a842603c612d6e565b6040518763ffffffff1660e01b81526004016112c996959493929190612c5e565b6020604051808303816000875af11580156112e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130c9190612d81565b5061131a426224ea00612d6e565b6017556040518381527f9a5a8a32afd899e7f95003c6e21c9fab2d50e11992439d14472229180c60c7aa9060200160405180910390a150506016805460ff1916905550565b6000546001600160a01b031633146113895760405162461bcd60e51b815260040161085590612c1e565b6016805462ffff001916610100841515810262ff000019169190911762010000841515810291909117928390556040805160ff93850484161515815291909304909116151560208201527f713c5f6067a01bbc8ab2c74ee7c874f0bcdb36451730f908ac27b400dbd46a2e910160405180910390a15050565b6000546001600160a01b0316331461142c5760405162461bcd60e51b815260040161085590612c1e565b604051339082156108fc029083906000818181858888f19350505050158015611459573d6000803e3d6000fd5b50604080518281523360208201527f7f17703ee24d8f408d31d01ef25820bcbc748bffd067dab90be2c45902d06b099101610ab8565b6000546001600160a01b031633146114b95760405162461bcd60e51b815260040161085590612c1e565b6001600160a01b0381166114cc57600080fd5b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f0cb29960ab2291c263da3d62348b3476891418110f0053ca2d5a187b75c2930d90602001610ab8565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610a2f918590610b06908690612cdd565b6000610a2f33848461197e565b6000546001600160a01b031633146115885760405162461bcd60e51b815260040161085590612c1e565b6101f4826115968587612d6e565b6115a09190612d6e565b11156115ab57600080fd5b600c849055600e83905560108290556014805460ff19168215151790556115d28284612d6e565b601255604080518581526020810185905290810183905281151560608201527f9a1defcceea916450b3570882b6912de8cc8cef6b43b67d24a09c7b7cc836dd390608001610d28565b6000546001600160a01b031633146116455760405162461bcd60e51b815260040161085590612c1e565b6016805461ff0019166101001790556040517f51cd7cc33235a1c89f708fecec535bf7cca0f94ed05216751befb052ca83e67990600090a1565b6000546001600160a01b031633146116a95760405162461bcd60e51b815260040161085590612c1e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316036116e757600080fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117549190612d81565b90506000811161176357600080fd5b60006001600160a01b03831663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af11580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e69190612c41565b9050806117f257600080fd5b604080518381526001600160a01b03861660208201527f60618878f568657ff82503ea9ace78596d0361a04bc1696f1918a614f805e3a69101610d28565b6000546001600160a01b0316331461185a5760405162461bcd60e51b815260040161085590612c1e565b6001600160a01b03811661189c5760405162461bcd60e51b815260206004820152600960248201526814995b9bdd5b98d95960ba1b6044820152606401610855565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661190a57600080fd5b6001600160a01b03821661191d57600080fd5b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661199157600080fd5b6001600160a01b0382166119a457600080fd5b6119ad83610fd4565b8111156119b957600080fd5b60006119c430610fd4565b600a5490915081116119e9600c54600d55601254601355601054601155600e54600f55565b6119f38585611b16565b50808015611a04575060165460ff16155b8015611a4257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611a555750601654610100900460ff165b8015611a6357506000601254115b15611a885760165462010000900460ff1615611a7f57600a5491505b611a8882611e51565b611a93858585611f62565b611a9d858561205f565b5050505050565b6000806000611ab1612147565b9092509050611ac08183612cf0565b9250505090565b6000806000806000806000806000611ade8a6122ed565b9250925092506000806000611afc8d8686611af7611aa4565b612354565b919f909e50909c50959a5093985091965092945050505050565b600080601054600e54600c54611b2c9190612d6e565b611b369190612d6e565b905080600003611b4a576000915050610a33565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614158015611bc057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614155b8015611bcf575060145460ff16155b9050808015611bf757506001600160a01b03851660009081526005602052604090205460ff16155b15611c1b5750506000600c819055600e819055601081905560128190559050610a33565b6101f482118015611c5d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316145b8015611c8257506001600160a01b03841660009081526005602052604090205460ff16155b15611cd15769010f0cf064dd59200000611c9b85610fd4565b10611cd1576001600160a01b0384166000908152600560209081526040808320805460ff19166001179055600490915290208290555b6001600160a01b03851660009081526005602052604090205460ff16158015611d1357506001600160a01b03841660009081526005602052604090205460ff16155b15611d2357600092505050610a33565b6001600160a01b038516600090815260056020526040902054859060ff168015611d6557506001600160a01b03851660009081526005602052604090205460ff165b15611da1576001600160a01b0380861660009081526004602052604080822054928916825290205411611d985785611d9a565b845b9050611dc5565b6001600160a01b03851660009081526005602052604090205460ff1615611dc55750835b6001600160a01b038116600090815260046020526040902054600c548490611ded9083612d28565b611df79190612cf0565b600c55600e548490611e099083612d28565b611e139190612cf0565b600e556010548490611e259083612d28565b611e2f9190612cf0565b6010819055600e54611e419190612d6e565b6012555060019695505050505050565b6016805460ff19166001179055601254600e5460009190611e729084612d28565b611e7c9190612cf0565b90506000611e8a8284612cdd565b9050600082118015611e9e57506000600e54115b15611ee7576000611eb0600284612cf0565b90506000611ebe8285612cdd565b905047611eca836123ab565b6000611ed68247612cdd565b9050611ee283826125a7565b505050505b600081118015611ef957506000601054115b15611f535747611f08826123ab565b6000611f148247612cdd565b6009546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015611f4f573d6000803e3d6000fd5b5050505b50506016805460ff1916905550565b6001600160a01b03831660009081526007602052604090205460ff168015611fa357506001600160a01b03821660009081526007602052604090205460ff16155b15611fb357610d488383836126b9565b6001600160a01b03831660009081526007602052604090205460ff16158015611ff457506001600160a01b03821660009081526007602052604090205460ff165b1561200457610d488383836127e2565b6001600160a01b03831660009081526007602052604090205460ff16801561204457506001600160a01b03821660009081526007602052604090205460ff165b1561205457610d4883838361288e565b610d48838383612903565b600d54600c55601354601255601154601055600f54600e556001600160a01b03811660009081526005602052604090205460ff1680156120aa5750633b9aca006120a882610fd4565b105b156120dd576001600160a01b038116600090815260046020908152604080832083905560059091529020805460ff191690555b6001600160a01b03821660009081526005602052604090205460ff1680156121105750633b9aca0061210e83610fd4565b105b15612143576001600160a01b038216600090815260046020908152604080832083905560059091529020805460ff191690555b5050565b600b54600854600091829169d3c21bcecceda100000090835b818110156122ab5783600260006008848154811061218057612180612d12565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806121eb57508260036000600884815481106121c4576121c4612d12565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612209575050600b549469d3c21bcecceda1000000945092505050565b600260006008838154811061222057612220612d12565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461224f9085612cdd565b9350600360006008838154811061226857612268612d12565b60009182526020808320909101546001600160a01b031683528201929092526040019020546122979084612cdd565b9250806122a381612d55565b915050612160565b5069d3c21bcecceda1000000600b546122c49190612cf0565b8310156122e3575050600b549369d3c21bcecceda10000009350915050565b5090939092509050565b600080600080612710600c54866123049190612d28565b61230e9190612cf0565b90506000612710601254876123239190612d28565b61232d9190612cf0565b905060008161233c8489612cdd565b6123469190612cdd565b979296509094509092505050565b60008080806123638589612d28565b905060006123718689612d28565b9050600061237f8789612d28565b905060008161238e8486612cdd565b6123989190612cdd565b939b939a50919850919650505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106123e0576123e0612d12565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561245e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124829190612d9a565b8160018151811061249557612495612d12565b6001600160a01b039283166020918202929092018101919091523060009081526006825260408082207f0000000000000000000000000000000000000000000000000000000000000000909416825292909152205482111561251c5761251c307f0000000000000000000000000000000000000000000000000000000000000000846118f7565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790612571908590600090869030904290600401612db7565b600060405180830381600087803b15801561258b57600080fd5b505af115801561259f573d6000803e3d6000fd5b505050505050565b3060009081526006602090815260408083207f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316845290915290205482111561261d5761261d307f0000000000000000000000000000000000000000000000000000000000000000846118f7565b60405163f305d71960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f305d7199083906126769030908790600090819084904290600401612c5e565b60606040518083038185885af1158015612694573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a9d9190612c99565b6000806000806000806126cb87611ac7565b6001600160a01b038f16600090815260036020526040902054959b509399509197509550935091506126fe908890612cdd565b6001600160a01b038a1660009081526003602090815260408083209390935560029052205461272e908790612cdd565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205461275e908690612d6e565b6001600160a01b03891660009081526002602052604090205561278081612948565b61278a84836129d2565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516127cf91815260200190565b60405180910390a3505050505050505050565b6000806000806000806127f487611ac7565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612827908790612cdd565b6001600160a01b03808b16600090815260026020908152604080832094909455918b1681526003909152205461285e908490612d6e565b6001600160a01b03891660009081526003602090815260408083209390935560029052205461275e908690612d6e565b6000806000806000806128a087611ac7565b6001600160a01b038f16600090815260036020526040902054959b509399509197509550935091506128d3908890612cdd565b6001600160a01b038a16600090815260036020908152604080832093909355600290522054612827908790612cdd565b60008060008060008061291587611ac7565b6001600160a01b038f16600090815260026020526040902054959b5093995091975095509350915061272e908790612cdd565b6000612952611aa4565b905060006129608284612d28565b3060009081526002602052604090205490915061297e908290612d6e565b3060009081526002602090815260408083209390935560079052205460ff1615610d4857306000908152600360205260409020546129bd908490612d6e565b30600090815260036020526040902055505050565b81600b546129e09190612cdd565b600b556015546129f1908290612d6e565b6015555050565b600060208083528351808285015260005b81811015612a2557858101830151858201604001528201612a09565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612a5b57600080fd5b50565b60008060408385031215612a7157600080fd5b8235612a7c81612a46565b946020939093013593505050565b600060208284031215612a9c57600080fd5b5035919050565b600080600060608486031215612ab857600080fd5b8335612ac381612a46565b92506020840135612ad381612a46565b929592945050506040919091013590565b600060208284031215612af657600080fd5b8135610b3c81612a46565b8015158114612a5b57600080fd5b60008060408385031215612b2257600080fd5b823591506020830135612b3481612b01565b809150509250929050565b600080600060608486031215612b5457600080fd5b8335612b5f81612a46565b9250602084013591506040840135612b7681612b01565b809150509250925092565b60008060408385031215612b9457600080fd5b8235612b9f81612b01565b91506020830135612b3481612b01565b60008060008060808587031215612bc557600080fd5b8435935060208501359250604085013591506060850135612be581612b01565b939692955090935050565b60008060408385031215612c0357600080fd5b8235612c0e81612a46565b91506020830135612b3481612a46565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b600060208284031215612c5357600080fd5b8151610b3c81612b01565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215612cae57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a3357610a33612cc7565b600082612d0d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610a3357610a33612cc7565b634e487b7160e01b600052603160045260246000fd5b600060018201612d6757612d67612cc7565b5060010190565b80820180821115610a3357610a33612cc7565b600060208284031215612d9357600080fd5b5051919050565b600060208284031215612dac57600080fd5b8151610b3c81612a46565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612e075784516001600160a01b031683529383019391830191600101612de2565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212208124de5d895ae77a377cd1bc421fb541f130eeb60f1ef92a44cf7aeb99dd214364736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102555760003560e01c806368839377116101395780639e252f00116100b6578063c9567bf91161007a578063c9567bf91461075a578063ccec37161461076f578063dd62ed3e1461078f578063deb4e9e6146107d5578063ee464430146107f5578063f2fde38b1461080b57600080fd5b80639e252f00146106ba5780639f731699146106da578063a457c2d7146106fa578063a9059cbb1461071a578063be07a5351461073a57600080fd5b80638da5cb5b116100fd5780638da5cb5b1461060e57806395d89b411461062c5780639834af511461065a5780639c8f9f231461067a5780639de08e1b1461069a57600080fd5b806368839377146105745780636bc87c3a1461058a57806370a08231146105a0578063715018a6146105c057806388f82020146105d557600080fd5b8063310c165f116101d25780634549b039116101965780634549b0391461048b57806345ba883e146104ab57806349bd5a5e146104cb5780634a74bb02146104ff57806352390c021461051e578063682bcb101461053e57600080fd5b8063310c165f146103e0578063313ce567146104195780633685d4191461043557806339509351146104555780633b124fe71461047557600080fd5b806318160ddd1161021957806318160ddd1461034d5780631834848c1461036a57806323b872dd1461038a578063283f7820146103aa5780632d838119146103c057600080fd5b80630210a83d1461026157806306fdde031461026b578063095ea7b3146102ad5780630bfe9327146102dd5780631694505e1461030157600080fd5b3661025c57005b600080fd5b61026961082b565b005b34801561027757600080fd5b506040805180820190915260078152665261626269747360c81b60208201525b6040516102a491906129f8565b60405180910390f35b3480156102b957600080fd5b506102cd6102c8366004612a5e565b610a22565b60405190151581526020016102a4565b3480156102e957600080fd5b506102f360105481565b6040519081526020016102a4565b34801561030d57600080fd5b506103357f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016102a4565b34801561035957600080fd5b5069d3c21bcecceda10000006102f3565b34801561037657600080fd5b50610269610385366004612a8a565b610a39565b34801561039657600080fd5b506102cd6103a5366004612aa3565b610ac3565b3480156103b657600080fd5b506102f360155481565b3480156103cc57600080fd5b506102f36103db366004612a8a565b610b15565b3480156103ec57600080fd5b506102cd6103fb366004612ae4565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561042557600080fd5b50604051600981526020016102a4565b34801561044157600080fd5b50610269610450366004612ae4565b610b43565b34801561046157600080fd5b506102cd610470366004612a5e565b610d4d565b34801561048157600080fd5b506102f3600c5481565b34801561049757600080fd5b506102f36104a6366004612b0f565b610d84565b3480156104b757600080fd5b506102696104c6366004612b3f565b610dd6565b3480156104d757600080fd5b506103357f0000000000000000000000001b3097ab47e38f9cf5ba623d79ef1d974dfa2c3a81565b34801561050b57600080fd5b506016546102cd90610100900460ff1681565b34801561052a57600080fd5b50610269610539366004612ae4565b610e85565b34801561054a57600080fd5b506102f3610559366004612ae4565b6001600160a01b031660009081526004602052604090205490565b34801561058057600080fd5b506102f360125481565b34801561059657600080fd5b506102f3600e5481565b3480156105ac57600080fd5b506102f36105bb366004612ae4565b610fd4565b3480156105cc57600080fd5b50610269611033565b3480156105e157600080fd5b506102cd6105f0366004612ae4565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561061a57600080fd5b506000546001600160a01b0316610335565b34801561063857600080fd5b50604080518082019091526005815264524249545360d81b6020820152610297565b34801561066657600080fd5b50600954610335906001600160a01b031681565b34801561068657600080fd5b50610269610695366004612a8a565b6110a7565b3480156106a657600080fd5b506102696106b5366004612b81565b61135f565b3480156106c657600080fd5b506102696106d5366004612a8a565b611402565b3480156106e657600080fd5b506102696106f5366004612ae4565b61148f565b34801561070657600080fd5b506102cd610715366004612a5e565b61151a565b34801561072657600080fd5b506102cd610735366004612a5e565b611551565b34801561074657600080fd5b50610269610755366004612baf565b61155e565b34801561076657600080fd5b5061026961161b565b34801561077b57600080fd5b5061026961078a366004612ae4565b61167f565b34801561079b57600080fd5b506102f36107aa366004612bf0565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156107e157600080fd5b506016546102cd9062010000900460ff1681565b34801561080157600080fd5b506102f3600a5481565b34801561081757600080fd5b50610269610826366004612ae4565b611830565b6000546001600160a01b0316331461085e5760405162461bcd60e51b815260040161085590612c1e565b60405180910390fd5b61088b307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6000196118f7565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8116600483015260001960248301527f0000000000000000000000001b3097ab47e38f9cf5ba623d79ef1d974dfa2c3a169063095ea7b3906044016020604051808303816000875af115801561091b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093f9190612c41565b507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d719343061097a30610fd4565b60008061098f6000546001600160a01b031690565b426040518863ffffffff1660e01b81526004016109b196959493929190612c5e565b60606040518083038185885af11580156109cf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906109f49190612c99565b50506040517f6a30f1c3e92e35430d2fe4f3d14fdc9e80963f522722a42c8bb9ea96c8468be39150600090a1565b6000610a2f3384846118f7565b5060015b92915050565b6000546001600160a01b03163314610a635760405162461bcd60e51b815260040161085590612c1e565b60008111610a7057600080fd5b69021e19e0c9bab2400000811115610a8757600080fd5b600a8190556040518181527f6c24780670b954fda389cad23ebd3f2e36024cac8688d6d01ea538a415acc0c8906020015b60405180910390a150565b6000610ad084848461197e565b6001600160a01b038416600090815260066020908152604080832033808552925290912054610b0b918691610b06908690612cdd565b6118f7565b5060019392505050565b6000600b54821115610b2657600080fd5b6000610b30611aa4565b9050610b3c8184612cf0565b9392505050565b6000546001600160a01b03163314610b6d5760405162461bcd60e51b815260040161085590612c1e565b6001600160a01b03811660009081526007602052604090205460ff16610b9257600080fd5b600854606411610ba157600080fd5b60085460005b81811015610d4857826001600160a01b031660088281548110610bcc57610bcc612d12565b6000918252602090912001546001600160a01b031603610d36576008610bf3600184612cdd565b81548110610c0357610c03612d12565b600091825260209091200154600880546001600160a01b039092169183908110610c2f57610c2f612d12565b6000918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155610c60611aa4565b6001600160a01b038516600090815260036020526040902054909150610c87908290612d28565b6001600160a01b038516600090815260026020908152604080832093909355600381528282208290556007905220805460ff191690556008805480610cce57610cce612d3f565b6000828152602090819020600019908301810180546001600160a01b03191690559091019091556040516001600160a01b03861681527fb31990b399410eeea874c2c81063feb4b5e55f66f46004a8306f10a81f031d3f91015b60405180910390a150505050565b80610d4081612d55565b915050610ba7565b505050565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610a2f918590610b06908690612d6e565b600069d3c21bcecceda1000000831115610d9d57600080fd5b81610dbc576000610dad84611ac7565b50939550610a33945050505050565b6000610dc784611ac7565b50929550610a33945050505050565b6000546001600160a01b03163314610e005760405162461bcd60e51b815260040161085590612c1e565b6101f4821115610e0f57600080fd5b6001600160a01b03831660008181526004602090815260408083208690556005825291829020805460ff19168515159081179091558251938452908301859052908201527fd12bcdb5e9d1b97987843d1dc1654e96429c968a5efbc5a47dab1955052282469060600160405180910390a1505050565b6000546001600160a01b03163314610eaf5760405162461bcd60e51b815260040161085590612c1e565b6001600160a01b03811660009081526007602052604090205460ff1615610ed557600080fd5b600854606411610ee457600080fd5b6001600160a01b03811660009081526002602052604090205415610f3e576001600160a01b038116600090815260026020526040902054610f2490610b15565b6001600160a01b0382166000908152600360205260409020555b6001600160a01b0381166000818152600760209081526040808320805460ff191660019081179091556008805491820181559093527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390920180546001600160a01b0319168417905590519182527f6f6f36b62c3e3a776fc3052d503097ffb886d7eb4546e768132fef82747e30b99101610ab8565b6001600160a01b03811660009081526007602052604081205460ff161561101157506001600160a01b031660009081526003602052604090205490565b6001600160a01b038216600090815260026020526040902054610a3390610b15565b6000546001600160a01b0316331461105d5760405162461bcd60e51b815260040161085590612c1e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146110d15760405162461bcd60e51b815260040161085590612c1e565b6016805460ff191660011790556017544210156110ed57600080fd5b6103e88111156110fc57600080fd5b6040516370a0823160e01b81523060048201526000907f0000000000000000000000001b3097ab47e38f9cf5ba623d79ef1d974dfa2c3a6001600160a01b0316906370a0823190602401602060405180830381865afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111879190612d81565b90506000811161119657600080fd5b60006127106111a58484612d28565b6111af9190612cf0565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81166004830152602482018390529192507f0000000000000000000000001b3097ab47e38f9cf5ba623d79ef1d974dfa2c3a9091169063095ea7b3906044016020604051808303816000875af1158015611243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112679190612c41565b506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663af2979eb3083600080336112a842603c612d6e565b6040518763ffffffff1660e01b81526004016112c996959493929190612c5e565b6020604051808303816000875af11580156112e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130c9190612d81565b5061131a426224ea00612d6e565b6017556040518381527f9a5a8a32afd899e7f95003c6e21c9fab2d50e11992439d14472229180c60c7aa9060200160405180910390a150506016805460ff1916905550565b6000546001600160a01b031633146113895760405162461bcd60e51b815260040161085590612c1e565b6016805462ffff001916610100841515810262ff000019169190911762010000841515810291909117928390556040805160ff93850484161515815291909304909116151560208201527f713c5f6067a01bbc8ab2c74ee7c874f0bcdb36451730f908ac27b400dbd46a2e910160405180910390a15050565b6000546001600160a01b0316331461142c5760405162461bcd60e51b815260040161085590612c1e565b604051339082156108fc029083906000818181858888f19350505050158015611459573d6000803e3d6000fd5b50604080518281523360208201527f7f17703ee24d8f408d31d01ef25820bcbc748bffd067dab90be2c45902d06b099101610ab8565b6000546001600160a01b031633146114b95760405162461bcd60e51b815260040161085590612c1e565b6001600160a01b0381166114cc57600080fd5b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f0cb29960ab2291c263da3d62348b3476891418110f0053ca2d5a187b75c2930d90602001610ab8565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610a2f918590610b06908690612cdd565b6000610a2f33848461197e565b6000546001600160a01b031633146115885760405162461bcd60e51b815260040161085590612c1e565b6101f4826115968587612d6e565b6115a09190612d6e565b11156115ab57600080fd5b600c849055600e83905560108290556014805460ff19168215151790556115d28284612d6e565b601255604080518581526020810185905290810183905281151560608201527f9a1defcceea916450b3570882b6912de8cc8cef6b43b67d24a09c7b7cc836dd390608001610d28565b6000546001600160a01b031633146116455760405162461bcd60e51b815260040161085590612c1e565b6016805461ff0019166101001790556040517f51cd7cc33235a1c89f708fecec535bf7cca0f94ed05216751befb052ca83e67990600090a1565b6000546001600160a01b031633146116a95760405162461bcd60e51b815260040161085590612c1e565b7f0000000000000000000000001b3097ab47e38f9cf5ba623d79ef1d974dfa2c3a6001600160a01b0316816001600160a01b0316036116e757600080fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117549190612d81565b90506000811161176357600080fd5b60006001600160a01b03831663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af11580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e69190612c41565b9050806117f257600080fd5b604080518381526001600160a01b03861660208201527f60618878f568657ff82503ea9ace78596d0361a04bc1696f1918a614f805e3a69101610d28565b6000546001600160a01b0316331461185a5760405162461bcd60e51b815260040161085590612c1e565b6001600160a01b03811661189c5760405162461bcd60e51b815260206004820152600960248201526814995b9bdd5b98d95960ba1b6044820152606401610855565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661190a57600080fd5b6001600160a01b03821661191d57600080fd5b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661199157600080fd5b6001600160a01b0382166119a457600080fd5b6119ad83610fd4565b8111156119b957600080fd5b60006119c430610fd4565b600a5490915081116119e9600c54600d55601254601355601054601155600e54600f55565b6119f38585611b16565b50808015611a04575060165460ff16155b8015611a4257507f0000000000000000000000001b3097ab47e38f9cf5ba623d79ef1d974dfa2c3a6001600160a01b0316856001600160a01b031614155b8015611a555750601654610100900460ff165b8015611a6357506000601254115b15611a885760165462010000900460ff1615611a7f57600a5491505b611a8882611e51565b611a93858585611f62565b611a9d858561205f565b5050505050565b6000806000611ab1612147565b9092509050611ac08183612cf0565b9250505090565b6000806000806000806000806000611ade8a6122ed565b9250925092506000806000611afc8d8686611af7611aa4565b612354565b919f909e50909c50959a5093985091965092945050505050565b600080601054600e54600c54611b2c9190612d6e565b611b369190612d6e565b905080600003611b4a576000915050610a33565b60007f0000000000000000000000001b3097ab47e38f9cf5ba623d79ef1d974dfa2c3a6001600160a01b0316856001600160a01b031614158015611bc057507f0000000000000000000000001b3097ab47e38f9cf5ba623d79ef1d974dfa2c3a6001600160a01b0316846001600160a01b031614155b8015611bcf575060145460ff16155b9050808015611bf757506001600160a01b03851660009081526005602052604090205460ff16155b15611c1b5750506000600c819055600e819055601081905560128190559050610a33565b6101f482118015611c5d57507f0000000000000000000000001b3097ab47e38f9cf5ba623d79ef1d974dfa2c3a6001600160a01b0316856001600160a01b0316145b8015611c8257506001600160a01b03841660009081526005602052604090205460ff16155b15611cd15769010f0cf064dd59200000611c9b85610fd4565b10611cd1576001600160a01b0384166000908152600560209081526040808320805460ff19166001179055600490915290208290555b6001600160a01b03851660009081526005602052604090205460ff16158015611d1357506001600160a01b03841660009081526005602052604090205460ff16155b15611d2357600092505050610a33565b6001600160a01b038516600090815260056020526040902054859060ff168015611d6557506001600160a01b03851660009081526005602052604090205460ff165b15611da1576001600160a01b0380861660009081526004602052604080822054928916825290205411611d985785611d9a565b845b9050611dc5565b6001600160a01b03851660009081526005602052604090205460ff1615611dc55750835b6001600160a01b038116600090815260046020526040902054600c548490611ded9083612d28565b611df79190612cf0565b600c55600e548490611e099083612d28565b611e139190612cf0565b600e556010548490611e259083612d28565b611e2f9190612cf0565b6010819055600e54611e419190612d6e565b6012555060019695505050505050565b6016805460ff19166001179055601254600e5460009190611e729084612d28565b611e7c9190612cf0565b90506000611e8a8284612cdd565b9050600082118015611e9e57506000600e54115b15611ee7576000611eb0600284612cf0565b90506000611ebe8285612cdd565b905047611eca836123ab565b6000611ed68247612cdd565b9050611ee283826125a7565b505050505b600081118015611ef957506000601054115b15611f535747611f08826123ab565b6000611f148247612cdd565b6009546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015611f4f573d6000803e3d6000fd5b5050505b50506016805460ff1916905550565b6001600160a01b03831660009081526007602052604090205460ff168015611fa357506001600160a01b03821660009081526007602052604090205460ff16155b15611fb357610d488383836126b9565b6001600160a01b03831660009081526007602052604090205460ff16158015611ff457506001600160a01b03821660009081526007602052604090205460ff165b1561200457610d488383836127e2565b6001600160a01b03831660009081526007602052604090205460ff16801561204457506001600160a01b03821660009081526007602052604090205460ff165b1561205457610d4883838361288e565b610d48838383612903565b600d54600c55601354601255601154601055600f54600e556001600160a01b03811660009081526005602052604090205460ff1680156120aa5750633b9aca006120a882610fd4565b105b156120dd576001600160a01b038116600090815260046020908152604080832083905560059091529020805460ff191690555b6001600160a01b03821660009081526005602052604090205460ff1680156121105750633b9aca0061210e83610fd4565b105b15612143576001600160a01b038216600090815260046020908152604080832083905560059091529020805460ff191690555b5050565b600b54600854600091829169d3c21bcecceda100000090835b818110156122ab5783600260006008848154811061218057612180612d12565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806121eb57508260036000600884815481106121c4576121c4612d12565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612209575050600b549469d3c21bcecceda1000000945092505050565b600260006008838154811061222057612220612d12565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461224f9085612cdd565b9350600360006008838154811061226857612268612d12565b60009182526020808320909101546001600160a01b031683528201929092526040019020546122979084612cdd565b9250806122a381612d55565b915050612160565b5069d3c21bcecceda1000000600b546122c49190612cf0565b8310156122e3575050600b549369d3c21bcecceda10000009350915050565b5090939092509050565b600080600080612710600c54866123049190612d28565b61230e9190612cf0565b90506000612710601254876123239190612d28565b61232d9190612cf0565b905060008161233c8489612cdd565b6123469190612cdd565b979296509094509092505050565b60008080806123638589612d28565b905060006123718689612d28565b9050600061237f8789612d28565b905060008161238e8486612cdd565b6123989190612cdd565b939b939a50919850919650505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106123e0576123e0612d12565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561245e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124829190612d9a565b8160018151811061249557612495612d12565b6001600160a01b039283166020918202929092018101919091523060009081526006825260408082207f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d909416825292909152205482111561251c5761251c307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846118f7565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612571908590600090869030904290600401612db7565b600060405180830381600087803b15801561258b57600080fd5b505af115801561259f573d6000803e3d6000fd5b505050505050565b3060009081526006602090815260408083207f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316845290915290205482111561261d5761261d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846118f7565b60405163f305d71960e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063f305d7199083906126769030908790600090819084904290600401612c5e565b60606040518083038185885af1158015612694573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a9d9190612c99565b6000806000806000806126cb87611ac7565b6001600160a01b038f16600090815260036020526040902054959b509399509197509550935091506126fe908890612cdd565b6001600160a01b038a1660009081526003602090815260408083209390935560029052205461272e908790612cdd565b6001600160a01b03808b1660009081526002602052604080822093909355908a168152205461275e908690612d6e565b6001600160a01b03891660009081526002602052604090205561278081612948565b61278a84836129d2565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516127cf91815260200190565b60405180910390a3505050505050505050565b6000806000806000806127f487611ac7565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612827908790612cdd565b6001600160a01b03808b16600090815260026020908152604080832094909455918b1681526003909152205461285e908490612d6e565b6001600160a01b03891660009081526003602090815260408083209390935560029052205461275e908690612d6e565b6000806000806000806128a087611ac7565b6001600160a01b038f16600090815260036020526040902054959b509399509197509550935091506128d3908890612cdd565b6001600160a01b038a16600090815260036020908152604080832093909355600290522054612827908790612cdd565b60008060008060008061291587611ac7565b6001600160a01b038f16600090815260026020526040902054959b5093995091975095509350915061272e908790612cdd565b6000612952611aa4565b905060006129608284612d28565b3060009081526002602052604090205490915061297e908290612d6e565b3060009081526002602090815260408083209390935560079052205460ff1615610d4857306000908152600360205260409020546129bd908490612d6e565b30600090815260036020526040902055505050565b81600b546129e09190612cdd565b600b556015546129f1908290612d6e565b6015555050565b600060208083528351808285015260005b81811015612a2557858101830151858201604001528201612a09565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612a5b57600080fd5b50565b60008060408385031215612a7157600080fd5b8235612a7c81612a46565b946020939093013593505050565b600060208284031215612a9c57600080fd5b5035919050565b600080600060608486031215612ab857600080fd5b8335612ac381612a46565b92506020840135612ad381612a46565b929592945050506040919091013590565b600060208284031215612af657600080fd5b8135610b3c81612a46565b8015158114612a5b57600080fd5b60008060408385031215612b2257600080fd5b823591506020830135612b3481612b01565b809150509250929050565b600080600060608486031215612b5457600080fd5b8335612b5f81612a46565b9250602084013591506040840135612b7681612b01565b809150509250925092565b60008060408385031215612b9457600080fd5b8235612b9f81612b01565b91506020830135612b3481612b01565b60008060008060808587031215612bc557600080fd5b8435935060208501359250604085013591506060850135612be581612b01565b939692955090935050565b60008060408385031215612c0357600080fd5b8235612c0e81612a46565b91506020830135612b3481612a46565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b600060208284031215612c5357600080fd5b8151610b3c81612b01565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215612cae57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a3357610a33612cc7565b600082612d0d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610a3357610a33612cc7565b634e487b7160e01b600052603160045260246000fd5b600060018201612d6757612d67612cc7565b5060010190565b80820180821115610a3357610a33612cc7565b600060208284031215612d9357600080fd5b5051919050565b600060208284031215612dac57600080fd5b8151610b3c81612a46565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612e075784516001600160a01b031683529383019391830191600101612de2565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212208124de5d895ae77a377cd1bc421fb541f130eeb60f1ef92a44cf7aeb99dd214364736f6c63430008120033

Deployed Bytecode Sourcemap

13291:24950:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34665:481;;;:::i;:::-;;17631:84;;;;;;;;;;-1:-1:-1;17703:4:0;;;;;;;;;;;;-1:-1:-1;;;17703:4:0;;;;17631:84;;;;;;;:::i;:::-;;;;;;;;18562:163;;;;;;;;;;-1:-1:-1;18562:163:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;18562:163:0;1023:187:1;14968:33:0;;;;;;;;;;;;;;;;;;;1361:25:1;;;1349:2;1334:18;14968:33:0;1215:177:1;15497:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1587:32:1;;;1569:51;;1557:2;1542:18;15497:51:0;1397:229:1;17911:97:0;;;;;;;;;;-1:-1:-1;14191:26:0;17911:97;;23294:254;;;;;;;;;;-1:-1:-1;23294:254:0;;;;;:::i;:::-;;:::i;18733:268::-;;;;;;;;;;-1:-1:-1;18733:268:0;;;;;:::i;:::-;;:::i;15456:28::-;;;;;;;;;;;;;;;;20020:203;;;;;;;;;;-1:-1:-1;20020:203:0;;;;;:::i;:::-;;:::i;20231:129::-;;;;;;;;;;-1:-1:-1;20231:129:0;;;;;:::i;:::-;-1:-1:-1;;;;;20327:25:0;20303:4;20327:25;;;:14;:25;;;;;;;;;20231:129;17819:84;;;;;;;;;;-1:-1:-1;17819:84:0;;14607:1;2671:36:1;;2659:2;2644:18;17819:84:0;2529:184:1;22222:751:0;;;;;;;;;;-1:-1:-1;22222:751:0;;;;;:::i;:::-;;:::i;19009:217::-;;;;;;;;;;-1:-1:-1;19009:217:0;;;;;:::i;:::-;;:::i;14673:26::-;;;;;;;;;;;;;;;;19609:403;;;;;;;;;;-1:-1:-1;19609:403:0;;;;;:::i;:::-;;:::i;21478:298::-;;;;;;;;;;-1:-1:-1;21478:298:0;;;;;:::i;:::-;;:::i;15555:38::-;;;;;;;;;;;;;;;15648:41;;;;;;;;;;-1:-1:-1;15648:41:0;;;;;;;;;;;21784:430;;;;;;;;;;-1:-1:-1;21784:430:0;;;;;:::i;:::-;;:::i;20368:125::-;;;;;;;;;;-1:-1:-1;20368:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;20462:23:0;20434:7;20462:23;;;:12;:23;;;;;;;20368:125;15118:31;;;;;;;;;;;;;;;;14824:32;;;;;;;;;;;;;;;;18016:208;;;;;;;;;;-1:-1:-1;18016:208:0;;;;;:::i;:::-;;:::i;4801:148::-;;;;;;;;;;;;;:::i;19469:132::-;;;;;;;;;;-1:-1:-1;19469:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;19563:30:0;19539:4;19563:30;;;:21;:30;;;;;;;;;19469:132;4181:79;;;;;;;;;;-1:-1:-1;4219:7:0;4246:6;-1:-1:-1;;;;;4246:6:0;4181:79;;17723:88;;;;;;;;;;-1:-1:-1;17797:6:0;;;;;;;;;;;;-1:-1:-1;;;17797:6:0;;;;17723:88;;13921:97;;;;;;;;;;-1:-1:-1;13921:97:0;;;;-1:-1:-1;;;;;13921:97:0;;;33164:734;;;;;;;;;;-1:-1:-1;33164:734:0;;;;;:::i;:::-;;:::i;22981:305::-;;;;;;;;;;-1:-1:-1;22981:305:0;;;;;:::i;:::-;;:::i;23593:159::-;;;;;;;;;;-1:-1:-1;23593:159:0;;;;;:::i;:::-;;:::i;20501:232::-;;;;;;;;;;-1:-1:-1;20501:232:0;;;;;:::i;:::-;;:::i;19234:227::-;;;;;;;;;;-1:-1:-1;19234:227:0;;;;;:::i;:::-;;:::i;18232:169::-;;;;;;;;;;-1:-1:-1;18232:169:0;;;;;:::i;:::-;;:::i;20740:600::-;;;;;;;;;;-1:-1:-1;20740:600:0;;;;;:::i;:::-;;:::i;21348:122::-;;;;;;;;;;;;;:::i;23818:461::-;;;;;;;;;;-1:-1:-1;23818:461:0;;;;;:::i;:::-;;:::i;18409:145::-;;;;;;;;;;-1:-1:-1;18409:145:0;;;;;:::i;:::-;-1:-1:-1;;;;;18519:18:0;;;18492:7;18519:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18409:145;15696:49;;;;;;;;;;-1:-1:-1;15696:49:0;;;;;;;;;;;14030:55;;;;;;;;;;;;;;;;5104:215;;;;;;;;;;-1:-1:-1;5104:215:0;;;;;:::i;:::-;;:::i;34665:481::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;;;;;;;;;34734:54:::1;34751:4;34766:15;-1:-1:-1::0;;34734:8:0::1;:54::i;:::-;34799:60;::::0;-1:-1:-1;;;34799:60:0;;-1:-1:-1;;;;;34837:15:0::1;5796:32:1::0;;34799:60:0::1;::::0;::::1;5778:51:1::0;-1:-1:-1;;5845:18:1;;;5838:34;34806:13:0::1;34799:29;::::0;::::1;::::0;5751:18:1;;34799:60:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34880:15;-1:-1:-1::0;;;;;34880:31:0::1;;34919:9;34952:4;34972:24;34990:4;34972:9;:24::i;:::-;35011:1;35027::::0;35043:7:::1;4219::::0;4246:6;-1:-1:-1;;;;;4246:6:0;;4181:79;35043:7:::1;35065:15;34880:211;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;35117:21:0::1;::::0;::::1;::::0;-1:-1:-1;35117:21:0;;::::1;34665:481::o:0;18562:163::-;18639:4;18656:39;535:10;18679:7;18688:6;18656:8;:39::i;:::-;-1:-1:-1;18713:4:0;18562:163;;;;;:::o;23294:254::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;23394:1:::1;23385:6;:10;23376:21;;;::::0;::::1;;14374:24;23417:6;:26;;23408:36;;;::::0;::::1;;23455:15;:24:::0;;;23497:43:::1;::::0;1361:25:1;;;23497:43:0::1;::::0;1349:2:1;1334:18;23497:43:0::1;;;;;;;;23294:254:::0;:::o;18733:268::-;18833:4;18850:36;18860:6;18868:9;18879:6;18850:9;:36::i;:::-;-1:-1:-1;;;;;18928:19:0;;;;;;:11;:19;;;;;;;;535:10;18928:33;;;;;;;;;18897:74;;18906:6;;18928:42;;18964:6;;18928:42;:::i;:::-;18897:8;:74::i;:::-;-1:-1:-1;18989:4:0;18733:268;;;;;:::o;20020:203::-;20086:7;20125;;20114;:18;;20106:27;;;;;;20144:19;20166:10;:8;:10::i;:::-;20144:32;-1:-1:-1;20194:21:0;20144:32;20194:7;:21;:::i;:::-;20187:28;20020:203;-1:-1:-1;;;20020:203:0:o;22222:751::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22304:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;22296:39;;;::::0;::::1;;22354:19;:26:::0;22383:3:::1;-1:-1:-1::0;22346:41:0::1;;;::::0;::::1;;22409:19;:26:::0;22398:8:::1;22446:520;22470:3;22466:1;:7;22446:520;;;22525:7;-1:-1:-1::0;;;;;22499:33:0::1;:19;22519:1;22499:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;22499:22:0::1;:33:::0;22495:460:::1;;22578:19;22598:7;22604:1;22598:3:::0;:7:::1;:::i;:::-;22578:28;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;22553:19:::1;:22:::0;;-1:-1:-1;;;;;22578:28:0;;::::1;::::0;22573:1;;22553:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;:53:::0;;-1:-1:-1;;;;;;22553:53:0::1;-1:-1:-1::0;;;;;22553:53:0;;;::::1;::::0;;;::::1;::::0;;;22647:10:::1;:8;:10::i;:::-;-1:-1:-1::0;;;;;22695:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;22625:32;;-1:-1:-1;22695:30:0::1;::::0;22625:32;;22695:30:::1;:::i;:::-;-1:-1:-1::0;;;;;22676:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:49;;;;22744:7:::1;:16:::0;;;;;:20;;;22783:21:::1;:30:::0;;;:38;;-1:-1:-1;;22783:38:0::1;::::0;;22840:19:::1;:25:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;22840:25:0;;;;;;;-1:-1:-1;;;;;;22840:25:0::1;::::0;;;;;;;;22891:24:::1;::::0;-1:-1:-1;;;;;1587:32:1;;1569:51;;22891:24:0::1;::::0;1542:18:1;22891:24:0::1;;;;;;;;22934:5;22446:520;22285:688;22222:751:::0;:::o;22495:460::-:1;22475:3:::0;::::1;::::0;::::1;:::i;:::-;;;;22446:520;;;;22285:688;22222:751:::0;:::o;19009:217::-;535:10;19099:4;19148:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19148:34:0;;;;;;;;;;19099:4;;19116:80;;19139:7;;19148:47;;19185:10;;19148:47;:::i;19609:403::-;19701:7;14191:26;19729:7;:18;;19721:27;;;;;;19764:17;19759:246;;19799:15;19823:19;19834:7;19823:10;:19::i;:::-;-1:-1:-1;19798:44:0;;-1:-1:-1;19857:14:0;;-1:-1:-1;;;;;19857:14:0;19759:246;19906:23;19937:19;19948:7;19937:10;:19::i;:::-;-1:-1:-1;19904:52:0;;-1:-1:-1;19971:22:0;;-1:-1:-1;;;;;19971:22:0;21478:298;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;15399:3:::1;21580:6;:19;;21571:30;;;::::0;::::1;;-1:-1:-1::0;;;;;21640:23:0;::::1;;::::0;;;:12:::1;:23;::::0;;;;;;;:32;;;21683:14:::1;:25:::0;;;;;;:35;;-1:-1:-1;;21683:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;21736:32;;8446:51:1;;;8513:18;;;8506:34;;;8556:18;;;8549:50;21736:32:0::1;::::0;8434:2:1;8419:18;21736:32:0::1;;;;;;;21478:298:::0;;;:::o;21784:430::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21869:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;21868:31;21860:40;;;::::0;::::1;;21919:19;:26:::0;21948:3:::1;-1:-1:-1::0;21911:41:0::1;;;::::0;::::1;;-1:-1:-1::0;;;;;21966:16:0;::::1;21985:1;21966:16:::0;;;:7:::1;:16;::::0;;;;;:20;21963:108:::1;;-1:-1:-1::0;;;;;22042:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;22022:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;22003:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;21963:108:::1;-1:-1:-1::0;;;;;22081:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;;;:37;;-1:-1:-1;;22081:37:0::1;22114:4;22081:37:::0;;::::1;::::0;;;22129:19:::1;:33:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;22129:33:0::1;::::0;::::1;::::0;;22180:26;;1569:51:1;;;22180:26:0::1;::::0;1542:18:1;22180:26:0::1;1397:229:1::0;18016:208:0;-1:-1:-1;;;;;18106:30:0;;18082:7;18106:30;;;:21;:30;;;;;;;;18102:59;;;-1:-1:-1;;;;;;18145:16:0;;;;;:7;:16;;;;;;;18016:208::o;18102:59::-;-1:-1:-1;;;;;18199:16:0;;;;;;:7;:16;;;;;;18179:37;;:19;:37::i;4801:148::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;4908:1:::1;4892:6:::0;;4871:40:::1;::::0;-1:-1:-1;;;;;4892:6:0;;::::1;::::0;4871:40:::1;::::0;4908:1;;4871:40:::1;4939:1;4922:19:::0;;-1:-1:-1;;;;;;4922:19:0::1;::::0;;4801:148::o;33164:734::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;16488:16:::1;:23:::0;;-1:-1:-1;;16488:23:0::1;16507:4;16488:23;::::0;;33259:9:::2;::::0;33272:15:::2;-1:-1:-1::0;33259:28:0::2;33251:37;;;::::0;::::2;;33321:4;33307:10;:18;;33299:27;;;::::0;::::2;;33367:46;::::0;-1:-1:-1;;;33367:46:0;;33407:4:::2;33367:46;::::0;::::2;1569:51:1::0;33347:17:0::2;::::0;33374:13:::2;-1:-1:-1::0;;;;;33367:31:0::2;::::0;::::2;::::0;1542:18:1;;33367:46:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33347:66;;33445:1;33433:9;:13;33424:23;;;::::0;::::2;;33460:14;33503:5;33477:22;33489:10:::0;33477:9;:22:::2;:::i;:::-;:32;;;;:::i;:::-;33545:63;::::0;-1:-1:-1;;;33545:63:0;;-1:-1:-1;;;;;33583:15:0::2;5796:32:1::0;;33545:63:0::2;::::0;::::2;5778:51:1::0;5845:18;;;5838:34;;;;;-1:-1:-1;33552:13:0::2;33545:29:::0;;::::2;::::0;::::2;::::0;5751:18:1;;33545:63:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;33619:15:0::2;:63;;33705:4;33712:6:::0;33720:1:::2;::::0;33726:10:::2;33738:20;:15;33756:2;33738:20;:::i;:::-;33619:141;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;33818:27:0::2;:15;33837:7;33818:27;:::i;:::-;33806:9;:39:::0;33863:27:::2;::::0;1361:25:1;;;33863:27:0::2;::::0;1349:2:1;1334:18;33863:27:0::2;;;;;;;-1:-1:-1::0;;16534:16:0::1;:24:::0;;-1:-1:-1;;16534:24:0::1;::::0;;-1:-1:-1;33164:734:0:o;22981:305::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;23086:21:::1;:35:::0;;-1:-1:-1;;23132:49:0;23086:35:::1;::::0;::::1;;::::0;::::1;-1:-1:-1::0;;23132:49:0;;;;;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;23199:79:::1;::::0;;23086:35:::1;23224:21:::0;;::::1;::::0;::::1;8986:14:1::0;8979:22;8961:41;;23247:30:0;;;::::1;::::0;;::::1;9045:14:1::0;9038:22;9033:2;9018:18;;9011:50;23199:79:0::1;::::0;8934:18:1;23199:79:0::1;;;;;;;22981:305:::0;;:::o;23593:159::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;23658:38:::1;::::0;23667:10:::1;::::0;23658:38;::::1;;;::::0;23689:6;;23658:38:::1;::::0;;;23689:6;23667:10;23658:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;23714:30:0::1;::::0;;9246:25:1;;;23732:10:0::1;9302:2:1::0;9287:18;;9280:60;23714:30:0::1;::::0;9219:18:1;23714:30:0::1;9072:274:1::0;20501:232:0;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20594:24:0;::::1;20585:35;;;::::0;::::1;;20631:20;:42:::0;;-1:-1:-1;;;;;;20631:42:0::1;-1:-1:-1::0;;;;;20631:42:0;::::1;::::0;;::::1;::::0;;;20691:34:::1;::::0;1569:51:1;;;20691:34:0::1;::::0;1557:2:1;1542:18;20691:34:0::1;1397:229:1::0;19234:227:0;535:10;19329:4;19378:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19378:34:0;;;;;;;;;;19329:4;;19346:85;;19369:7;;19378:52;;19415:15;;19378:52;:::i;18232:169::-;18312:4;18329:42;535:10;18353:9;18364:6;18329:9;:42::i;20740:600::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;15399:3:::1;20927:13:::0;20894:30:::1;20909:15:::0;20894:12;:30:::1;:::i;:::-;:46;;;;:::i;:::-;20893:61;;20884:71;;;::::0;::::1;;21002:7;:22:::0;;;21035:13:::1;:31:::0;;;21077:11:::1;:27:::0;;;21115:19:::1;:33:::0;;-1:-1:-1;;21115:33:0::1;::::0;::::1;;;::::0;;21221:27:::1;21077::::0;21035:31;21221:27:::1;:::i;:::-;21206:12;:42:::0;21266:66:::1;::::0;;9576:25:1;;;9632:2;9617:18;;9610:34;;;9660:18;;;9653:34;;;9730:14;;9723:22;9718:2;9703:18;;9696:50;21266:66:0::1;::::0;9563:3:1;9548:19;21266:66:0::1;9351:401:1::0;21348:122:0;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;21403:21:::1;:28:::0;;-1:-1:-1;;21403:28:0::1;;;::::0;;21449:13:::1;::::0;::::1;::::0;21403:28;;21449:13:::1;21348:122::o:0;23818:461::-;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;23976:13:::1;-1:-1:-1::0;;;;;23952:38:0::1;:12;-1:-1:-1::0;;;;;23952:38:0::1;::::0;23944:47:::1;;;::::0;::::1;;24067:30;::::0;-1:-1:-1;;;24067:30:0;;24091:4:::1;24067:30;::::0;::::1;1569:51:1::0;24026:12:0;;24004::::1;::::0;-1:-1:-1;;;;;24067:15:0;::::1;::::0;::::1;::::0;1542:18:1;;24067:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24050:47;;24125:1;24116:6;:10;24108:19;;;::::0;::::1;;24140:12;-1:-1:-1::0;;;;;24155:14:0;::::1;;535:10:::0;24155:36:::1;::::0;-1:-1:-1;;;;;;24155:36:0::1;::::0;;;;;;-1:-1:-1;;;;;5796:32:1;;;24155:36:0::1;::::0;::::1;5778:51:1::0;5845:18;;;5838:34;;;5751:18;;24155:36:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24140:51;;24210:7;24202:16;;;::::0;::::1;;24236:35;::::0;;9246:25:1;;;-1:-1:-1;;;;;9307:32:1;;9302:2;9287:18;;9280:60;24236:35:0::1;::::0;9219:18:1;24236:35:0::1;9072:274:1::0;5104:215:0;4393:6;;-1:-1:-1;;;;;4393:6:0;535:10;4393:22;4385:44;;;;-1:-1:-1;;;4385:44:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5193:22:0;::::1;5185:44;;;::::0;-1:-1:-1;;;5185:44:0;;10246:2:1;5185:44:0::1;::::0;::::1;10228:21:1::0;10285:1;10265:18;;;10258:29;-1:-1:-1;;;10303:18:1;;;10296:39;10352:18;;5185:44:0::1;10044:332:1::0;5185:44:0::1;5266:6;::::0;;5245:38:::1;::::0;-1:-1:-1;;;;;5245:38:0;;::::1;::::0;5266:6;::::1;::::0;5245:38:::1;::::0;::::1;5294:6;:17:::0;;-1:-1:-1;;;;;;5294:17:0::1;-1:-1:-1::0;;;;;5294:17:0;;;::::1;::::0;;;::::1;::::0;;5104:215::o;29594:257::-;-1:-1:-1;;;;;29686:18:0;;29678:28;;;;;;-1:-1:-1;;;;;29725:21:0;;29717:31;;;;;;-1:-1:-1;;;;;29761:17:0;;;;;;;:11;:17;;;;;;;;:26;;;;;;;;;;;;;:35;;;29812:31;;1361:25:1;;;29812:31:0;;1334:18:1;29812:31:0;;;;;;;29594:257;;;:::o;29859:1358::-;-1:-1:-1;;;;;29981:18:0;;29973:27;;;;;;-1:-1:-1;;;;;30019:16:0;;30011:25;;;;;;30065:15;30075:4;30065:9;:15::i;:::-;30055:6;:25;;30047:34;;;;;;30094:28;30125:24;30143:4;30125:9;:24::i;:::-;30210:15;;30094:55;;-1:-1:-1;30187:38:0;;30276:13;26896:7;;26882:11;:21;26933:12;;26914:16;:31;26974:11;;26956:15;:29;27016:13;;26996:17;:33;26840:197;30276:13;30302:17;30311:4;30316:2;30302:8;:17::i;:::-;;30648:19;:53;;;;-1:-1:-1;30685:16:0;;;;30684:17;30648:53;:91;;;;;30726:13;-1:-1:-1;;;;;30718:21:0;:4;-1:-1:-1;;;;;30718:21:0;;;30648:91;:129;;;;-1:-1:-1;30756:21:0;;;;;;;30648:129;:162;;;;;30809:1;30794:12;;:16;30648:162;30630:393;;;30841:30;;;;;;;30837:110;;;30916:15;;30893:38;;30837:110;30975:36;30990:20;30975:14;:36::i;:::-;31109:30;31124:4;31129:2;31132:6;31109:14;:30::i;:::-;31185:24;31200:4;31206:2;31185:14;:24::i;:::-;29962:1255;;29859:1358;;;:::o;25630:160::-;25671:7;25692:15;25709;25728:19;:17;:19::i;:::-;25691:56;;-1:-1:-1;25691:56:0;-1:-1:-1;25765:17:0;25691:56;;25765:17;:::i;:::-;25758:24;;;;25630:160;:::o;24434:419::-;24493:7;24502;24511;24520;24529;24538;24559:23;24584:12;24598:18;24620:20;24632:7;24620:11;:20::i;:::-;24558:82;;;;;;24652:15;24669:23;24694:12;24710:50;24722:7;24731:4;24737:10;24749;:8;:10::i;:::-;24710:11;:50::i;:::-;24651:109;;;;-1:-1:-1;24651:109:0;;-1:-1:-1;24811:15:0;;-1:-1:-1;24828:4:0;;-1:-1:-1;24834:10:0;;-1:-1:-1;24434:419:0;;-1:-1:-1;;;;;24434:419:0:o;27047:1927::-;27108:4;27135:16;27180:11;;27164:13;;27154:7;;:23;;;;:::i;:::-;:37;;;;:::i;:::-;27135:56;;27206:8;27218:1;27206:13;27202:59;;27244:5;27237:12;;;;;27202:59;27355:21;27388:13;-1:-1:-1;;;;;27380:21:0;:4;-1:-1:-1;;;;;27380:21:0;;;:44;;;;;27411:13;-1:-1:-1;;;;;27405:19:0;:2;-1:-1:-1;;;;;27405:19:0;;;27380:44;:68;;;;-1:-1:-1;27429:19:0;;;;27428:20;27380:68;27355:94;;27464:16;:41;;;;-1:-1:-1;;;;;;27485:20:0;;;;;;:14;:20;;;;;;;;27484:21;27464:41;27460:205;;;-1:-1:-1;;27532:1:0;27522:7;:11;;;27548:13;:17;;;27580:11;:15;;;27610:12;:16;;;27532:1;-1:-1:-1;27641:12:0;;27460:205;15399:3;27856:8;:20;:45;;;;;27888:13;-1:-1:-1;;;;;27880:21:0;:4;-1:-1:-1;;;;;27880:21:0;;27856:45;:68;;;;-1:-1:-1;;;;;;27906:18:0;;;;;;:14;:18;;;;;;;;27905:19;27856:68;27852:247;;;14284:23;27946:13;27956:2;27946:9;:13::i;:::-;:31;27942:146;;-1:-1:-1;;;;;27999:18:0;;;;;;:14;:18;;;;;;;;:25;;-1:-1:-1;;27999:25:0;28020:4;27999:25;;;28043:12;:16;;;;;:29;;;27942:146;-1:-1:-1;;;;;28116:20:0;;;;;;:14;:20;;;;;;;;28115:21;:44;;;;-1:-1:-1;;;;;;28141:18:0;;;;;;:14;:18;;;;;;;;28140:19;28115:44;28111:125;;;28219:5;28212:12;;;;;;28111:125;-1:-1:-1;;;;;28378:20:0;;28332:24;28378:20;;;:14;:20;;;;;;28359:4;;28378:20;;:42;;;;-1:-1:-1;;;;;;28402:18:0;;;;;;:14;:18;;;;;;;;28378:42;28374:227;;;-1:-1:-1;;;;;28479:16:0;;;;;;;:12;:16;;;;;;;28458:18;;;;;;;;:37;:49;;28503:4;28458:49;;;28498:2;28458:49;28437:72;;28374:227;;;-1:-1:-1;;;;;28532:18:0;;;;;;:14;:18;;;;;;;;28527:74;;;-1:-1:-1;28587:2:0;28527:74;-1:-1:-1;;;;;28671:32:0;;28657:11;28671:32;;;:12;:32;;;;;;28761:7;;28771:8;;28755:13;;28671:32;28755:13;:::i;:::-;:24;;;;:::i;:::-;28745:7;:34;28812:13;;28828:8;;28806:19;;:3;:19;:::i;:::-;:30;;;;:::i;:::-;28790:13;:46;28867:11;;28881:8;;28861:17;;:3;:17;:::i;:::-;:28;;;;:::i;:::-;28847:11;:42;;;28915:13;;:27;;28847:42;28915:27;:::i;:::-;28900:12;:42;-1:-1:-1;28962:4:0;;27047:1927;-1:-1:-1;;;;;;27047:1927:0:o;31225:1072::-;16488:16;:23;;-1:-1:-1;;16488:23:0;16507:4;16488:23;;;31346:12:::1;::::0;31330:13:::1;::::0;16488:16;;31346:12;31320:23:::1;::::0;:7;:23:::1;:::i;:::-;:38;;;;:::i;:::-;31297:61:::0;-1:-1:-1;31369:18:0::1;31390:22;31297:61:::0;31390:7;:22:::1;:::i;:::-;31369:43;;31451:1;31436:12;:16;:37;;;;;31472:1;31456:13;;:17;31436:37;31433:456;;;31562:12;31577:16;31592:1;31577:12:::0;:16:::1;:::i;:::-;31562:31:::0;-1:-1:-1;31608:17:0::1;31628:19;31562:31:::0;31628:12;:19:::1;:::i;:::-;31608:39:::0;-1:-1:-1;31693:21:0::1;31729:22;31746:4:::0;31729:16:::1;:22::i;:::-;31768:18;31789:38;31813:14:::0;31789:21:::1;:38;:::i;:::-;31768:59;;31842:35;31855:9;31866:10;31842:12;:35::i;:::-;31484:405;;;;31433:456;31933:1;31920:10;:14;:33;;;;;31952:1;31938:11;;:15;31920:33;31917:371;;;32066:21;32102:28;32119:10:::0;32102:16:::1;:28::i;:::-;32147:18;32168:38;32192:14:::0;32168:21:::1;:38;:::i;:::-;32235:20;::::0;:41:::1;::::0;32147:59;;-1:-1:-1;;;;;;32235:20:0::1;::::0;:41;::::1;;;::::0;32147:59;;32235:20:::1;:41:::0;:20;:41;32147:59;32235:20;:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;31965:323;;31917:371;-1:-1:-1::0;;16534:16:0;:24;;-1:-1:-1;;16534:24:0;;;-1:-1:-1;31225:1072:0:o;35207:628::-;-1:-1:-1;;;;;35305:29:0;;;;;;:21;:29;;;;;;;;:66;;;;-1:-1:-1;;;;;;35339:32:0;;;;;;:21;:32;;;;;;;;35338:33;35305:66;35301:527;;;35388:48;35410:6;35418:9;35429:6;35388:21;:48::i;35301:527::-;-1:-1:-1;;;;;35459:29:0;;;;;;:21;:29;;;;;;;;35458:30;:66;;;;-1:-1:-1;;;;;;35492:32:0;;;;;;:21;:32;;;;;;;;35458:66;35454:374;;;35541:46;35561:6;35569:9;35580:6;35541:19;:46::i;35454:374::-;-1:-1:-1;;;;;35609:29:0;;;;;;:21;:29;;;;;;;;:65;;;;-1:-1:-1;;;;;;35642:32:0;;;;;;:21;:32;;;;;;;;35609:65;35605:223;;;35691:48;35713:6;35721:9;35732:6;35691:21;:48::i;35605:223::-;35772:44;35790:6;35798:9;35809:6;35772:17;:44::i;28982:603::-;29061:11;;29051:7;:21;29098:16;;29083:12;:31;29139:15;;29125:11;:29;29181:17;;29165:13;:33;-1:-1:-1;;;;;29274:18:0;;-1:-1:-1;29274:18:0;;;-1:-1:-1;29274:18:0;;;;;;;;:49;;;;;29313:9;29296:13;29306:2;29296:9;:13::i;:::-;:27;29274:49;29270:144;;;-1:-1:-1;;;;;29341:16:0;;29360:1;29341:16;;;:12;:16;;;;;;;;:20;;;29376:14;:18;;;;;:26;;-1:-1:-1;;29376:26:0;;;29270:144;-1:-1:-1;;;;;29430:20:0;;;;;;:14;:20;;;;;;;;:53;;;;;29473:9;29454:15;29464:4;29454:9;:15::i;:::-;:29;29430:53;29426:152;;;-1:-1:-1;;;;;29501:18:0;;29522:1;29501:18;;;:12;:18;;;;;;;;:22;;;29538:14;:20;;;;;:28;;-1:-1:-1;;29538:28:0;;;29426:152;28982:603;;:::o;25798:663::-;25895:7;;25960:19;:26;25848:7;;;;14191:26;;25848:7;25997:350;26021:3;26017:1;:7;25997:350;;;26084:7;26050;:31;26058:19;26078:1;26058:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;26058:22:0;26050:31;;;;;;;;;;;;;:41;;:104;;;26147:7;26113;:31;26121:19;26141:1;26121:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;26121:22:0;26113:31;;;;;;;;;;;;;:41;26050:104;26046:157;;;-1:-1:-1;;26186:7:0;;;14191:26;;-1:-1:-1;25798:663:0;-1:-1:-1;;;25798:663:0:o;26046:157::-;26238:7;:31;26246:19;26266:1;26246:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;26246:22:0;26238:31;;;;;;;;;;;;;26228:41;;:7;:41;:::i;:::-;26218:51;;26304:7;:31;26312:19;26332:1;26312:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;26312:22:0;26304:31;;;;;;;;;;;;;26294:41;;:7;:41;:::i;:::-;26284:51;-1:-1:-1;26026:3:0;;;;:::i;:::-;;;;25997:350;;;;14191:26;26372:7;;:17;;;;:::i;:::-;26361:7;:29;26357:60;;;-1:-1:-1;;26400:7:0;;;14191:26;;-1:-1:-1;25798:663:0;-1:-1:-1;;25798:663:0:o;26357:60::-;-1:-1:-1;26436:7:0;;26445;;-1:-1:-1;25798:663:0;-1:-1:-1;25798:663:0:o;24861:329::-;24921:7;24930;24939;24959:12;24995:5;24984:7;;24974;:17;;;;:::i;:::-;:27;;;;:::i;:::-;24959:42;;25012:18;25059:5;25043:12;;25033:7;:22;;;;:::i;:::-;:32;;;;:::i;:::-;25012:53;-1:-1:-1;25076:23:0;25012:53;25102:14;25112:4;25102:7;:14;:::i;:::-;:27;;;;:::i;:::-;25076:53;25165:4;;-1:-1:-1;25171:10:0;;-1:-1:-1;24861:329:0;;-1:-1:-1;;;24861:329:0:o;25198:424::-;25323:7;;;;25379:21;25389:11;25379:7;:21;:::i;:::-;25361:39;-1:-1:-1;25411:12:0;25426:18;25433:11;25426:4;:18;:::i;:::-;25411:33;-1:-1:-1;25455:18:0;25476:24;25489:11;25476:10;:24;:::i;:::-;25455:45;-1:-1:-1;25511:23:0;25455:45;25537:14;25547:4;25537:7;:14;:::i;:::-;:27;;;;:::i;:::-;25583:7;;;;-1:-1:-1;25609:4:0;;-1:-1:-1;25198:424:0;;-1:-1:-1;;;;;;;25198:424:0:o;32305:669::-;32448:16;;;32462:1;32448:16;;;;;;;;32424:21;;32448:16;;;;;;;;;;-1:-1:-1;32448:16:0;32424:40;;32493:4;32475;32480:1;32475:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;32475:23:0;;;-1:-1:-1;;;;;32475:23:0;;;;;32519:15;-1:-1:-1;;;;;32519:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32509:4;32514:1;32509:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32509:32:0;;;:7;;;;;;;;;;:32;;;;32579:4;32558:27;;;;:11;:27;;;;;;32594:15;32558:53;;;;;;;;;;;:67;-1:-1:-1;32554:149:0;;;32641:62;32658:4;32673:15;32691:11;32641:8;:62::i;:::-;32742:224;;-1:-1:-1;;;32742:224:0;;-1:-1:-1;;;;;32742:15:0;:66;;;;:224;;32823:11;;32849:1;;32893:4;;32920;;32940:15;;32742:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32360:614;32305:669;:::o;33959:547::-;34073:4;34052:27;;;;:11;:27;;;;;;;;34088:15;-1:-1:-1;;;;;34052:53:0;;;;;;;;;:67;-1:-1:-1;34048:149:0;;;34135:62;34152:4;34167:15;34185:11;34135:8;:62::i;:::-;34240:258;;-1:-1:-1;;;34240:258:0;;-1:-1:-1;;;;;34240:15:0;:31;;;;34279:9;;34240:258;;34312:4;;34332:11;;34358:1;;;;34312:4;;34472:15;;34240:258;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36943:564::-;37046:15;37063:23;37088:12;37102:23;37137:12;37151:18;37173:19;37184:7;37173:10;:19::i;:::-;-1:-1:-1;;;;;37221:15:0;;;;;;:7;:15;;;;;;37045:147;;-1:-1:-1;37045:147:0;;-1:-1:-1;37045:147:0;;-1:-1:-1;37045:147:0;-1:-1:-1;37045:147:0;-1:-1:-1;37045:147:0;-1:-1:-1;37221:25:0;;37239:7;;37221:25;:::i;:::-;-1:-1:-1;;;;;37203:15:0;;;;;;:7;:15;;;;;;;;:43;;;;37275:7;:15;;;;:25;;37293:7;;37275:25;:::i;:::-;-1:-1:-1;;;;;37257:15:0;;;;;;;:7;:15;;;;;;:43;;;;37332:18;;;;;;;:36;;37353:15;;37332:36;:::i;:::-;-1:-1:-1;;;;;37311:18:0;;;;;;:7;:18;;;;;:57;37379:26;37394:10;37379:14;:26::i;:::-;37416:23;37428:4;37434;37416:11;:23::i;:::-;37472:9;-1:-1:-1;;;;;37455:44:0;37464:6;-1:-1:-1;;;;;37455:44:0;;37483:15;37455:44;;;;1361:25:1;;1349:2;1334:18;;1215:177;37455:44:0;;;;;;;;37034:473;;;;;;36943:564;;;:::o;36358:577::-;36459:15;36476:23;36501:12;36515:23;36551:12;36565:18;36587:19;36598:7;36587:10;:19::i;:::-;-1:-1:-1;;;;;36635:15:0;;;;;;:7;:15;;;;;;36458:148;;-1:-1:-1;36458:148:0;;-1:-1:-1;36458:148:0;;-1:-1:-1;36458:148:0;-1:-1:-1;36458:148:0;-1:-1:-1;36458:148:0;-1:-1:-1;36635:25:0;;36458:148;;36635:25;:::i;:::-;-1:-1:-1;;;;;36617:15:0;;;;;;;:7;:15;;;;;;;;:43;;;;36692:18;;;;;:7;:18;;;;;:36;;36713:15;;36692:36;:::i;:::-;-1:-1:-1;;;;;36671:18:0;;;;;;:7;:18;;;;;;;;:57;;;;36760:7;:18;;;;:36;;36781:15;;36760:36;:::i;37518:632::-;37621:15;37638:23;37663:12;37677:23;37712:12;37726:18;37748:19;37759:7;37748:10;:19::i;:::-;-1:-1:-1;;;;;37796:15:0;;;;;;:7;:15;;;;;;37620:147;;-1:-1:-1;37620:147:0;;-1:-1:-1;37620:147:0;;-1:-1:-1;37620:147:0;-1:-1:-1;37620:147:0;-1:-1:-1;37620:147:0;-1:-1:-1;37796:25:0;;37814:7;;37796:25;:::i;:::-;-1:-1:-1;;;;;37778:15:0;;;;;;:7;:15;;;;;;;;:43;;;;37850:7;:15;;;;:25;;37868:7;;37850:25;:::i;35843:507::-;35942:15;35959:23;35984:12;36009:23;36034:12;36048:18;36070:19;36081:7;36070:10;:19::i;:::-;-1:-1:-1;;;;;36118:15:0;;;;;;:7;:15;;;;;;35941:148;;-1:-1:-1;35941:148:0;;-1:-1:-1;35941:148:0;;-1:-1:-1;35941:148:0;-1:-1:-1;35941:148:0;-1:-1:-1;35941:148:0;-1:-1:-1;36118:25:0;;35941:148;;36118:25;:::i;26473:355::-;26536:19;26558:10;:8;:10::i;:::-;26536:32;-1:-1:-1;26579:18:0;26600:24;26536:32;26600:10;:24;:::i;:::-;26676:4;26660:22;;;;:7;:22;;;;;;26579:45;;-1:-1:-1;26660:35:0;;26579:45;;26660:35;:::i;:::-;26651:4;26635:22;;;;:7;:22;;;;;;;;:60;;;;26709:21;:36;;;;;;26706:114;;;26801:4;26785:22;;;;:7;:22;;;;;;:35;;26810:10;;26785:35;:::i;:::-;26776:4;26760:22;;;;:7;:22;;;;;:60;26525:303;;26473:355;:::o;24287:139::-;24375:4;24365:7;;:14;;;;:::i;:::-;24355:7;:24;24402:9;;:16;;24414:4;;24402:16;:::i;:::-;24390:9;:28;-1:-1:-1;;24287:139:0:o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;622:70;567:131;:::o;703:315::-;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1631:180::-;1690:6;1743:2;1731:9;1722:7;1718:23;1714:32;1711:52;;;1759:1;1756;1749:12;1711:52;-1:-1:-1;1782:23:1;;1631:180;-1:-1:-1;1631:180:1:o;1816:456::-;1893:6;1901;1909;1962:2;1950:9;1941:7;1937:23;1933:32;1930:52;;;1978:1;1975;1968:12;1930:52;2017:9;2004:23;2036:31;2061:5;2036:31;:::i;:::-;2086:5;-1:-1:-1;2143:2:1;2128:18;;2115:32;2156:33;2115:32;2156:33;:::i;:::-;1816:456;;2208:7;;-1:-1:-1;;;2262:2:1;2247:18;;;;2234:32;;1816:456::o;2277:247::-;2336:6;2389:2;2377:9;2368:7;2364:23;2360:32;2357:52;;;2405:1;2402;2395:12;2357:52;2444:9;2431:23;2463:31;2488:5;2463:31;:::i;2718:118::-;2804:5;2797:13;2790:21;2783:5;2780:32;2770:60;;2826:1;2823;2816:12;2841:309;2906:6;2914;2967:2;2955:9;2946:7;2942:23;2938:32;2935:52;;;2983:1;2980;2973:12;2935:52;3019:9;3006:23;2996:33;;3079:2;3068:9;3064:18;3051:32;3092:28;3114:5;3092:28;:::i;:::-;3139:5;3129:15;;;2841:309;;;;;:::o;3155:450::-;3229:6;3237;3245;3298:2;3286:9;3277:7;3273:23;3269:32;3266:52;;;3314:1;3311;3304:12;3266:52;3353:9;3340:23;3372:31;3397:5;3372:31;:::i;:::-;3422:5;-1:-1:-1;3474:2:1;3459:18;;3446:32;;-1:-1:-1;3530:2:1;3515:18;;3502:32;3543:30;3502:32;3543:30;:::i;:::-;3592:7;3582:17;;;3155:450;;;;;:::o;4042:376::-;4104:6;4112;4165:2;4153:9;4144:7;4140:23;4136:32;4133:52;;;4181:1;4178;4171:12;4133:52;4220:9;4207:23;4239:28;4261:5;4239:28;:::i;:::-;4286:5;-1:-1:-1;4343:2:1;4328:18;;4315:32;4356:30;4315:32;4356:30;:::i;4423:446::-;4506:6;4514;4522;4530;4583:3;4571:9;4562:7;4558:23;4554:33;4551:53;;;4600:1;4597;4590:12;4551:53;4636:9;4623:23;4613:33;;4693:2;4682:9;4678:18;4665:32;4655:42;;4744:2;4733:9;4729:18;4716:32;4706:42;;4798:2;4787:9;4783:18;4770:32;4811:28;4833:5;4811:28;:::i;:::-;4423:446;;;;-1:-1:-1;4423:446:1;;-1:-1:-1;;4423:446:1:o;4874:388::-;4942:6;4950;5003:2;4991:9;4982:7;4978:23;4974:32;4971:52;;;5019:1;5016;5009:12;4971:52;5058:9;5045:23;5077:31;5102:5;5077:31;:::i;:::-;5127:5;-1:-1:-1;5184:2:1;5169:18;;5156:32;5197:33;5156:32;5197:33;:::i;5267:332::-;5469:2;5451:21;;;5508:1;5488:18;;;5481:29;-1:-1:-1;;;5541:2:1;5526:18;;5519:39;5590:2;5575:18;;5267:332::o;5883:245::-;5950:6;6003:2;5991:9;5982:7;5978:23;5974:32;5971:52;;;6019:1;6016;6009:12;5971:52;6051:9;6045:16;6070:28;6092:5;6070:28;:::i;6133:607::-;-1:-1:-1;;;;;6492:15:1;;;6474:34;;6539:2;6524:18;;6517:34;;;;6582:2;6567:18;;6560:34;;;;6625:2;6610:18;;6603:34;;;;6674:15;;;6668:3;6653:19;;6646:44;6454:3;6706:19;;6699:35;;;;6423:3;6408:19;;6133:607::o;6745:306::-;6833:6;6841;6849;6902:2;6890:9;6881:7;6877:23;6873:32;6870:52;;;6918:1;6915;6908:12;6870:52;6947:9;6941:16;6931:26;;6997:2;6986:9;6982:18;6976:25;6966:35;;7041:2;7030:9;7026:18;7020:25;7010:35;;6745:306;;;;;:::o;7056:127::-;7117:10;7112:3;7108:20;7105:1;7098:31;7148:4;7145:1;7138:15;7172:4;7169:1;7162:15;7188:128;7255:9;;;7276:11;;;7273:37;;;7290:18;;:::i;7321:217::-;7361:1;7387;7377:132;;7431:10;7426:3;7422:20;7419:1;7412:31;7466:4;7463:1;7456:15;7494:4;7491:1;7484:15;7377:132;-1:-1:-1;7523:9:1;;7321:217::o;7543:127::-;7604:10;7599:3;7595:20;7592:1;7585:31;7635:4;7632:1;7625:15;7659:4;7656:1;7649:15;7675:168;7748:9;;;7779;;7796:15;;;7790:22;;7776:37;7766:71;;7817:18;;:::i;7848:127::-;7909:10;7904:3;7900:20;7897:1;7890:31;7940:4;7937:1;7930:15;7964:4;7961:1;7954:15;7980:135;8019:3;8040:17;;;8037:43;;8060:18;;:::i;:::-;-1:-1:-1;8107:1:1;8096:13;;7980:135::o;8120:125::-;8185:9;;;8206:10;;;8203:36;;;8219:18;;:::i;8610:184::-;8680:6;8733:2;8721:9;8712:7;8708:23;8704:32;8701:52;;;8749:1;8746;8739:12;8701:52;-1:-1:-1;8772:16:1;;8610:184;-1:-1:-1;8610:184:1:o;10513:251::-;10583:6;10636:2;10624:9;10615:7;10611:23;10607:32;10604:52;;;10652:1;10649;10642:12;10604:52;10684:9;10678:16;10703:31;10728:5;10703:31;:::i;10769:980::-;11031:4;11079:3;11068:9;11064:19;11110:6;11099:9;11092:25;11136:2;11174:6;11169:2;11158:9;11154:18;11147:34;11217:3;11212:2;11201:9;11197:18;11190:31;11241:6;11276;11270:13;11307:6;11299;11292:22;11345:3;11334:9;11330:19;11323:26;;11384:2;11376:6;11372:15;11358:29;;11405:1;11415:195;11429:6;11426:1;11423:13;11415:195;;;11494:13;;-1:-1:-1;;;;;11490:39:1;11478:52;;11585:15;;;;11550:12;;;;11526:1;11444:9;11415:195;;;-1:-1:-1;;;;;;;11666:32:1;;;;11661:2;11646:18;;11639:60;-1:-1:-1;;;11730:3:1;11715:19;11708:35;11627:3;10769:980;-1:-1:-1;;;10769:980:1:o

Swarm Source

ipfs://8124de5d895ae77a377cd1bc421fb541f130eeb60f1ef92a44cf7aeb99dd2143
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.