false
true
0

Contract Address Details

0x6A46d56F9Dd963cEAc7f60aD148d49219CC3b79f

Token
Sommi Fan Token (FRIENDSHIP)
Creator
0xb8bf8d–f64b09 at 0xcad9f1–f1eb99
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
1,124 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26326716
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Friendship




Optimization enabled
true
Compiler version
v0.8.19+commit.7dd6d404




Optimization runs
200
EVM Version
default




Verified at
2024-02-04T20:29:53.461664Z

Contract source code

// SPDX-License-Identifier: MIT
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::'########:'########::'####:'########:'##::: ##:'########:::'######::'##::::'##:'####:'########::::
:: ##.....:: ##.... ##:. ##:: ##.....:: ###:: ##: ##.... ##:'##... ##: ##:::: ##:. ##:: ##.... ##:::
:: ##::::::: ##:::: ##:: ##:: ##::::::: ####: ##: ##:::: ##: ##:::..:: ##:::: ##:: ##:: ##:::: ##:::
:: ######::: ########::: ##:: ######::: ## ## ##: ##:::: ##:. ######:: #########:: ##:: ########::::
:: ##...:::: ##.. ##:::: ##:: ##...:::: ##. ####: ##:::: ##::..... ##: ##.... ##:: ##:: ##.....:::::
:: ##::::::: ##::. ##::: ##:: ##::::::: ##:. ###: ##:::: ##:'##::: ##: ##:::: ##:: ##:: ##::::::::::
:: ##::::::: ##:::. ##:'####: ########: ##::. ##: ########::. ######:: ##:::: ##:'####: ##::::::::::
::..::::::::..:::::..::....::........::..::::..::........::::......:::..:::::..::....::..:::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Sommi Fan Token (PulseChain): The No.1 Fan token for crypto's @yourfriendSOMMI

Telegram: https://t.me/SommiFanToken
Twitter: https://x.com/SommiFanToken
Bot: https://t.me/SommiFanBot
Home: https://SommiFanToken.com

Total Supply: 1 Billion Tokens
We are here to watch the growth of our friend and lifetime inspiration... @yourfriendsommi 

Make sure you follow him on Socia Media friends :D
Friendship Confirmed

*/



pragma solidity 0.8.19;



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

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

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

}

contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

}

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);

}



contract Friendship is Context, IERC20, Ownable {
    using SafeMath for uint256;
    mapping (address => uint256) private _balances;
    mapping (address => uint256) public _userPushSpend;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => uint256) private _userTokenMoved;
    mapping (address => uint256) private  userClaimsShare;
    mapping (address=> uint) private claimTime;
    mapping (address=> bool) public claimer;
    mapping (address=> bool) private _locked;
    address WETH = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
    
    
    uint256 totalBalances;
    //time for waiting to claim set in hours
    uint256 public waitTime = 336;
    
    
    struct Taxes {
        uint256 rewards;        
        uint256 outreach;
        uint256 dev;

    }

    //Taxes  eg. 250 / 1000 = 25% 
    Taxes public buyTax = Taxes(2,2,32);
    Taxes public sellTax = Taxes(2,2,32);
    
   
    uint256 public totalBuyTax = 36; //#buyTax.rewards + buyTax.outreach +buyTax.dev; 
    uint256 public totalSellTax = 36; //sellTax.rewards + sellTax.outreach + sellTax.dev;
    
    
    
    address public outreachWallet = 0xCcd1e792752FbFfdE0E8bF1dE1e7f473c9e33f8E ;
    address payable private devWallet = payable(0xb8bF8D8cE14F092A21dA559ae2a4eD84EFF64b09);
    address public rewardsAddress = 0xfbD806e9Fb2b7bB353EdDE8725257f603A4bBD5C ;
    address payable private outreachMain = payable (0xc6aB34235e4b2B7F42A3F6D78830E83760881667);
    

    uint8 private constant _decimals = 9;
    uint256 private constant _eDec = 10**24;
    uint256 private constant _tTotal = 1000000000 * 10**_decimals;
    string private constant _name = unicode"Sommi Fan Token"; 
    string private constant _symbol = unicode"FRIENDSHIP"; 
    uint256 public _maxTxAmount =   20000000 * 10**_decimals;    
    uint256 public _maxWalletSize = 25000000 * 10**_decimals; 
    uint256 public _taxSwapThreshold = 750000 * 10**_decimals; 
    uint256 public _maxTaxSwap = 20000000 * 10**_decimals;
    
    //Tokens needed to push claimtime  back
    uint256 public _pushAmount = 100 * 10**_decimals;

    struct Levels {
        uint256 peanutBrain;
        uint256 babydoll;
        uint256 fan;
        uint256 friend;
        uint256 chad;        
    } 
    //Levels public friendStatus = Levels(5*_eDec, 20*_eDec, 100*_eDec, 500*_eDec, 2500*_eDec );
    Levels public friendStatus = Levels(1*_eDec, 4*_eDec, 20*_eDec, 100*_eDec, 500*_eDec );
    uint256 public wipeFee = 100 * 10**21 wei;

    //we start with 50 and make it a large multiplier number then divide it by 100% 
    //5* 10 ** 8 gives an abstract 50% 
    uint256 tooManySales = (50 * 10** _decimals) / 100; 

    IUniswapV2Router02 private uniswapV2Router;
    address public uniswapV2Pair;
    bool private tradingOpen = false;
    bool private inSwap = false;
    bool private swapEnabled = false;
    bool private claimable = true;

    //not sure why its here uint public userTokens = 500000 * 10**_decimals;
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
    
    mapping(address => usersEthTracking) public userTracker;
    mapping(address => uint256) public sellRatio;
    mapping(address => bool) public isRouter; 
    mapping(address => bool) public isLP; 
  
    //total amount of funds for those sharing dividends
    
    uint256 totalShareTracker;

    struct usersEthTracking {
        uint256 lastEthSpend; 
        uint256 totalEthSpend;
    }

    event MaxTxAmountUpdated(uint _maxTxAmount);
    event tooMany(uint _tooManySales);
    event setClaimer(address claimer, bool state);
    event routerInfo(address _router, address _lp, bool state);
    event resetClaimer(address _targetAddress, uint pushHours);
    
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    bool inSwapAndLiquify;

    event wipeClaim(address _user, uint256 _claimTime);
    event settings(uint256 _wipeFee, uint256 _waitTime, uint256 pushAmount);

    event Wallets( 
        address _rewardsAddress,
        address _outreachWallet,
        address devWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event sellTracker(
        uint256 _sellRatio, 
        uint256 _claimTime,
        uint256 _userEth,
        uint256 _lastSpend
    );

     // sushiswap 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506 //pulse 0x165C3410fC91EF562C50559f7d2289fEbed552d9
    constructor () {
        uniswapV2Router = IUniswapV2Router02(0x165C3410fC91EF562C50559f7d2289fEbed552d9); 
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), WETH);
        _balances[_msgSender()] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        isRouter[address(uniswapV2Router)] = true;
        isLP[address(uniswapV2Pair)] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_msgSender()] = true;
        _isExcludedFromFee[devWallet] = true;
        _isExcludedFromFee[outreachWallet] = true;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    // Exclude wallets from Fees
    function excludeFromFees(address[] memory wallets_) public {
        require( _msgSender() == devWallet ,"Only the Dev can add exclsions!");
        for (uint i = 0; i < wallets_.length; i++) {
            _isExcludedFromFee[wallets_[i]] = true;
        }
    }

    // Add wallets to include them into Fees
    function removeExcluded(address[] memory wallets_) public  {
        require( _msgSender() == devWallet,"Only the Dev remove excluded wallets!");
        for (uint i = 0; i < wallets_.length; i++) {
            _isExcludedFromFee[wallets_[i]] = false;
        }
    }    

    function enableTrading() external onlyOwner() {
        require(!tradingOpen,"ERROR: Requirement already met");
        swapEnabled = true;
        tradingOpen = true;
    }
    

    //add liquidity Function
    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount)
        private
        lockTheSwap
    {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            outreachWallet,
            block.timestamp
        );
    }
    
    function _swapAndLiquify(uint256 _contractTokenBalance) private lockTheSwap {
        
        //20% the tokens are to be used for liquidity , 40% for marketing 40% are for dev
        uint256 tokensForLP = _contractTokenBalance.mul(20).div(100); 
        

        uint256 halfLP = tokensForLP.div(2); 
        uint256 otherHalfLP = tokensForLP - halfLP; 

        //gets balance of eth in contract 10
        uint256 initialBalance = address(this).balance; 

        //swap LP fraction of tokens for eth ~ 75%
        swapTokensForEth( _contractTokenBalance - halfLP ); 

        //get the balance of eth (25%) linked to the token swap
        uint256 newBalance = (address(this).balance - initialBalance).div(3); 

        _addLiquidity(otherHalfLP, newBalance);

        emit SwapAndLiquify(halfLP, newBalance, otherHalfLP); 
    }


    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() public pure returns (uint256) {
        return _tTotal;
    }
    function totalShareableTokens() public view returns (uint256) {
        return totalShareTracker;
    }

    function balanceOf(address account) public view  returns (uint256) {
        return _balances[account];
    }

    function userShare(address account) public view returns (uint256) {
        return userClaimsShare[account];
    }

    function userClaimTimer(address account) public view returns (uint256) {
        return claimTime[account];
    }

    function userStatus (address account) public view returns( uint256) {
        //peanut brain by default
        uint status ;
        //only give a hihger status if the % of tokens held is larger than the sell threshold
        if (sellRatio[account] > tooManySales ) {
            if (userTracker[account].lastEthSpend > friendStatus.peanutBrain ) {
                status = 0;
            }   
            if (userTracker[account].lastEthSpend > friendStatus.babydoll ) {
                status = 1;
            } 
            if (userTracker[account].lastEthSpend > friendStatus.fan ) {
                status = 2;
            }            
            if (userTracker[account].lastEthSpend > friendStatus.friend ) {
                status = 3;
            }            
            if (userTracker[account].lastEthSpend > friendStatus.chad ) {
                status = 4;
            } 


        }
        return status;
    }

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

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

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

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
 
    function manualSwapToLP() external {
        require(_msgSender()==devWallet);
        uint256 tokenBalance=balanceOf(address(this));
        if(tokenBalance>0){          
          _swapAndLiquify(min(tokenBalance,_maxTaxSwap));
        }
        uint256 ethBalance=address(this).balance;
        if(ethBalance>0){
          sendETHToFee(ethBalance);
        }
    }

    function isClaimer(address _claimerAddress, bool _state) public {
        require( msg.sender == devWallet, "Only the Dev can do this!");
        require(  claimer[_claimerAddress] != _state, "already set");

        claimer[_claimerAddress] = _state;        
        emit setClaimer(_claimerAddress, _state);

    }

    function setRouter(address _router, address _lp, bool _state) public {
        require( msg.sender == devWallet, "Only the Dev can do this!");
        //require(  isRouter[_router] != _state, "already set");

        isRouter[_router] = _state;
        isLP[_lp] = _state;

        emit routerInfo(_router, _lp, _state);

    }

    function resetTimer(address _targetAddress) public{
       require(claimer[msg.sender],"Not a claimer contract");
        uint pushHours = block.timestamp + waitTime * 3600;
        claimTime[_targetAddress] = pushHours;

        emit resetClaimer(_targetAddress, pushHours);
    }

    function pushTimer (address _targetAddress, uint256 _amount) public {
        require( _amount >= 2*_pushAmount ,"push amount too low");
        require( claimTime[_targetAddress] > 0, "can not push 0 timer address");

        uint256 _push = _pushAmount;
        uint pushHours = ( waitTime * 3600).mul(_amount).div(_push);

        _transfer(msg.sender, rewardsAddress,  ( _amount - _push ) );
        _transfer(msg.sender, _targetAddress,  _push );
        claimTime[_targetAddress] += pushHours;
        _userPushSpend[msg.sender] += _amount;
        emit resetClaimer(_targetAddress, pushHours);
        

    }

    function wipeClaimTime (address _userAddress ) payable public {
        require( msg.value == wipeFee,"Wrong wipeFee paid" );
        require( msg.sender == _userAddress, "Not your account Dude!");
        require( userStatus(_userAddress) != 0, "status cant be zero");
        
        _locked[_userAddress] = true;
       
        // use the status of the user to create a new shorter time
        uint256 _status = userStatus(_userAddress) ;

        //reduce current wait until the user can claim
        uint256 _userClaimtime = claimTime[_userAddress];
        uint256 timeNow = block.timestamp;
        
        
        uint newtime = timeNow + (_userClaimtime - timeNow).div(_status+1) ;

        //claim time is reduced to min one day 86400
        _userClaimtime = max( (timeNow + 86400), newtime ) ;

        claimTime[_userAddress] = _userClaimtime;        
        userTracker[_userAddress].lastEthSpend += wipeFee;
        userTracker[_userAddress].totalEthSpend += wipeFee;
        
        _locked[msg.sender] = false;
        emit wipeClaim(  _userAddress, _userClaimtime);

    }

    function waitSettings (uint256 _wipeFee, uint256 _waitTime, uint256 _pushFactor) external {
        require( msg.sender == devWallet, "Only the Dev can do this!");
        require( _wipeFee > 1 && _wipeFee < 10000 , " wipe fee is set out of range");
        require( _waitTime >= 1 && _waitTime <= 772, "Hours out of range");
        require( _pushFactor > 1 && _pushFactor < 5000 , "Push Factor out of range" );
        
        // wipefee is multiplied by  10**15 for example 1000 -> 1 eth;
        wipeFee = _wipeFee * 10**21  wei; 
        //set wait time in hours
        waitTime = _waitTime;
        //set push amount using push factor and the minimum transaction
        _pushAmount = _pushFactor * 10**_decimals ;

        emit settings(wipeFee, waitTime, _pushAmount);

    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount); //, false
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _transfer(address from, address to, uint256 amount) private { 
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be bigger than zero");
        
        uint256 taxAmount = 0;
        uint256 lDev = 0;
        uint256 lOutreach = 0;
        uint256 lRewards = 0;
        uint256 userEth = 0;
        uint256 balanceTo = 0;     
        
        

        if (from != owner() && to != owner()) {

            
            if (isLP[from] && !isRouter[to] && ! _isExcludedFromFee[to]  ) {
                //previously from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to]

                require(tradingOpen, "Trading not open");
                require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");                
                require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize.");
                //get 3 taxes and add them together
                //buying 
                
                //taxAmount = amount.mul(totalBuyTax).div(1000); 
                lDev = amount.mul(buyTax.dev).div(1000);
                lOutreach = amount.mul(buyTax.outreach).div(1000);              
                lRewards = amount.mul(buyTax.rewards).div(1000);
                
                
                                 
                //counts estimated eth spend from user
                address[] memory path = new address[](2);                
                path[0] = WETH; 
                path[1] = address(this);

                uint[] memory lpAmounts =  uniswapV2Router.getAmountsIn( amount, path );
                userEth = lpAmounts[0];
 

                
            }

            // selling...
            if(isLP[to] && from != address(this) ){
                //previously to == uniswapV2Pair && from != address(this)
                //get 3 taxes and add them together
                
                //taxAmount = amount.mul(totalSellTax).div(1000);
                //change to div by 4 and % need to be in decimcal
                lDev = amount.mul(sellTax.dev).div(1000);
                lOutreach = amount.mul(sellTax.outreach).div(1000);                
                lRewards = amount.mul(sellTax.rewards).div(1000);
                
                
                
                //update user token sell total not including tax fee
                
            }

            uint256 contractTokenBalance = balanceOf(address(this));
            if (!inSwap && isLP[to] && swapEnabled && contractTokenBalance>_taxSwapThreshold) {
            //previously !inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance>_taxSwapThreshold
                
                //swap and liquify tokens.. but dont do so many that it rekts the user
                _swapAndLiquify(min (amount, min( contractTokenBalance, _maxTaxSwap)));
                
                uint256 contractETHBalance = address(this).balance; 
                if(contractETHBalance > 0) {
                    //add eth profit if you want 
                    sendETHToFee(address(this).balance);
                }
            }
            
            taxAmount = lDev + lOutreach + lRewards; 
            //Update users 'sold' / 'moved' token amount
            _userTokenMoved[from] +=  amount.sub(taxAmount);
        } 

        

        if(taxAmount > 0){
             
            //add balance to contract balances
            _balances[address(this)] += lDev;
            _balances[outreachWallet] += lOutreach;
            _balances[rewardsAddress] += lRewards;

            //send to wallets
            emit Transfer(from, address(this), lDev);
            emit Transfer(from, outreachWallet, lOutreach);
            emit Transfer(from, rewardsAddress, lRewards);

        }
        
        
        // update sender balance & reciever balance
        _balances[from] =_balances[from].sub(amount); 
        _balances[to] = _balances[to].add( amount.sub(taxAmount) );

        emit Transfer(from, to, amount.sub(taxAmount));

       
        balanceTo = _balances[to];        

        //calulate ratio of user tokens held in wallet, to the user's total held+sold amount 
        //should be less than 1 * 10**9
        uint256 balanceFrom = smallZero(_balances[from]);
        uint256 sellRatioFrom =  balanceFrom.mul(10**_decimals).div( _userTokenMoved[from] + balanceFrom ) ;
        sellRatio[from] = sellRatioFrom; 

        if ( balanceTo ==0 && _userTokenMoved[to] ==0 ){
            sellRatio[to] == 10**_decimals;
        }

        
        
        //what x% of the tokens is he still holding?
        
        if ( tooManySales > sellRatioFrom ) {

            // we remove the users previous claim share from the total claimers tracker
            totalShareTracker = totalShareTracker.sub(userClaimsShare[to]) ;
            //user no longer eligible - we reset the eth required to become eligible
            userTracker[to].lastEthSpend = 0;
            userClaimsShare[to] = 0;
            claimTime[to] = 0;             
            
        }

        
        // Cheking if  the user has spent some eth in this transfer
        // Now update users eth spent after buying tokens - After the token tax has been sent
        
        if (userEth > 0 ){

            claimTime[to] = max ( (block.timestamp + waitTime * 3600), claimTime[to] ) ;   
            //update the lst time eth was bought and the total amount spent             
            userTracker[to].lastEthSpend += userEth;
            
            //Update the total amount of eth the user has ever spent
            userTracker[to].totalEthSpend += userEth; 
                  
            
            // The user is tested to see if he's eligible for rewards
            if (userTracker[to].lastEthSpend > friendStatus.babydoll && tooManySales < sellRatioFrom ){
                
                //remove the previous balance of the users claims from the total claims.
               //then add the new balance since they just bought more tokens            
                totalShareTracker = totalShareTracker.add(balanceTo).sub( userClaimsShare[to] ) ; 

                //set the amount of tokens the user is eligible to claim based on what just they bought         
                userClaimsShare[to] = balanceTo;
                                
            }
            
        }
        emit sellTracker( sellRatioFrom, claimTime[to], userEth, userTracker[to].lastEthSpend );

    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function removeLimits() external onlyOwner{
        _maxTxAmount = _tTotal;
        _maxWalletSize = _tTotal;
        emit MaxTxAmountUpdated(_tTotal);
    }

    function setWallets ( address _rewardsAddress, address _outreachWallet , address _devWallet ) external{
       require( msg.sender == devWallet, "Only the Dev can do this!");
       require(_rewardsAddress != address(0),"rewards address set as 0");
       require( _devWallet != address(0),"dev address set as 0");
       require( _outreachWallet != address(0),"outreach address set as 0");

       rewardsAddress = _rewardsAddress;
       outreachWallet = _outreachWallet;
       devWallet = payable (_devWallet);
       emit Wallets(_rewardsAddress,_outreachWallet,devWallet);

    }
    function updateTooManySells (uint256 _updateSellLimit) external {
        require( msg.sender == devWallet, "Only dev can change sell limit" );
        require( _updateSellLimit > 0, " must be more than zero" );
        require( _updateSellLimit <= 95, " must be less than or equal to 95" );

        tooManySales = (_updateSellLimit * 10**_decimals) / 100 ;
        
        emit tooMany(tooManySales);

    }

    function min(uint256 a, uint256 b) private pure returns (uint256){
      return (a>b)?b:a;
    }
    function max(uint256 a, uint256 b) private pure returns (uint256){
      return (a<b)?b:a;
    }
    function smallZero(uint256 balance) private pure returns(uint256){

        if (balance==0 ){
            balance = 1;
        }

       return balance;
    }

    function sendETHToFee(uint256 amount) private {
        //send to dev wallet
        devWallet.transfer( amount.div(2) );
        outreachMain.transfer( amount.div(2) );
    }
           
    function escapeTrappedETH() external {
        uint256 ethBalance=address(this).balance;
        if(ethBalance>0){
          sendETHToFee(ethBalance);
        }
    }

    receive() external payable {}

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MaxTxAmountUpdated","inputs":[{"type":"uint256","name":"_maxTxAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SwapAndLiquify","inputs":[{"type":"uint256","name":"tokensSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"ethReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokensIntoLiqudity","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Wallets","inputs":[{"type":"address","name":"_rewardsAddress","internalType":"address","indexed":false},{"type":"address","name":"_outreachWallet","internalType":"address","indexed":false},{"type":"address","name":"devWallet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"resetClaimer","inputs":[{"type":"address","name":"_targetAddress","internalType":"address","indexed":false},{"type":"uint256","name":"pushHours","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"routerInfo","inputs":[{"type":"address","name":"_router","internalType":"address","indexed":false},{"type":"address","name":"_lp","internalType":"address","indexed":false},{"type":"bool","name":"state","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"sellTracker","inputs":[{"type":"uint256","name":"_sellRatio","internalType":"uint256","indexed":false},{"type":"uint256","name":"_claimTime","internalType":"uint256","indexed":false},{"type":"uint256","name":"_userEth","internalType":"uint256","indexed":false},{"type":"uint256","name":"_lastSpend","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"setClaimer","inputs":[{"type":"address","name":"claimer","internalType":"address","indexed":false},{"type":"bool","name":"state","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"settings","inputs":[{"type":"uint256","name":"_wipeFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"_waitTime","internalType":"uint256","indexed":false},{"type":"uint256","name":"pushAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"tooMany","inputs":[{"type":"uint256","name":"_tooManySales","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"wipeClaim","inputs":[{"type":"address","name":"_user","internalType":"address","indexed":false},{"type":"uint256","name":"_claimTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTaxSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxWalletSize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_pushAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_taxSwapThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_userPushSpend","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"rewards","internalType":"uint256"},{"type":"uint256","name":"outreach","internalType":"uint256"},{"type":"uint256","name":"dev","internalType":"uint256"}],"name":"buyTax","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"claimer","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableTrading","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"escapeTrappedETH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFees","inputs":[{"type":"address[]","name":"wallets_","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"peanutBrain","internalType":"uint256"},{"type":"uint256","name":"babydoll","internalType":"uint256"},{"type":"uint256","name":"fan","internalType":"uint256"},{"type":"uint256","name":"friend","internalType":"uint256"},{"type":"uint256","name":"chad","internalType":"uint256"}],"name":"friendStatus","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"isClaimer","inputs":[{"type":"address","name":"_claimerAddress","internalType":"address"},{"type":"bool","name":"_state","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLP","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isRouter","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSwapToLP","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"outreachWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pushTimer","inputs":[{"type":"address","name":"_targetAddress","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeExcluded","inputs":[{"type":"address[]","name":"wallets_","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeLimits","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"resetTimer","inputs":[{"type":"address","name":"_targetAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"rewardsAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellRatio","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"rewards","internalType":"uint256"},{"type":"uint256","name":"outreach","internalType":"uint256"},{"type":"uint256","name":"dev","internalType":"uint256"}],"name":"sellTax","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRouter","inputs":[{"type":"address","name":"_router","internalType":"address"},{"type":"address","name":"_lp","internalType":"address"},{"type":"bool","name":"_state","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWallets","inputs":[{"type":"address","name":"_rewardsAddress","internalType":"address"},{"type":"address","name":"_outreachWallet","internalType":"address"},{"type":"address","name":"_devWallet","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalBuyTax","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSellTax","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalShareableTokens","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uniswapV2Pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateTooManySells","inputs":[{"type":"uint256","name":"_updateSellLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userClaimTimer","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userShare","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userStatus","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"lastEthSpend","internalType":"uint256"},{"type":"uint256","name":"totalEthSpend","internalType":"uint256"}],"name":"userTracker","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"waitSettings","inputs":[{"type":"uint256","name":"_wipeFee","internalType":"uint256"},{"type":"uint256","name":"_waitTime","internalType":"uint256"},{"type":"uint256","name":"_pushFactor","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"waitTime","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"wipeClaimTime","inputs":[{"type":"address","name":"_userAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"wipeFee","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x600a80546001600160a01b031990811673a1077a294dde1b09bb078844df40758a5d0f9a27178255610150600c556002608081905260a0819052602060c0819052600d829055600e829055600f81905561014060405260e082905261010082905261012081905260108290556011919091556012556024601381905560145560158054821673ccd1e792752fbffde0e8bf1de1e7f473c9e33f8e17905560168054821673b8bf8d8ce14f092a21da559ae2a4ed84eff64b0917905560178054821673fbd806e9fb2b7bb353edde8725257f603a4bbd5c1790556018805490911673c6ab34235e4b2b7f42a3f6d78830e837608816671790556200010590600990620006b4565b62000115906301312d00620006cc565b601955620001266009600a620006b4565b620001369063017d7840620006cc565b601a55620001476009600a620006b4565b6200015690620b71b0620006cc565b601b55620001676009600a620006b4565b62000177906301312d00620006cc565b601c55620001886009600a620006b4565b62000195906064620006cc565b601d556040518060a0016040528069d3c21bcecceda10000006001620001bc9190620006cc565b8152602001620001d869d3c21bcecceda10000006004620006cc565b8152602001620001f469d3c21bcecceda10000006014620006cc565b81526020016200021069d3c21bcecceda10000006064620006cc565b81526020016200022d69d3c21bcecceda10000006101f4620006cc565b90528051601e55602080820151601f556040820151905560608101516021556080015160225569152d02c7e14af68000006023556064620002716009600a620006b4565b6200027e906032620006cc565b6200028a9190620006e6565b6024556026805463ffffffff60a01b1916600160b81b179055348015620002b057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350602580546001600160a01b03191673165c3410fc91ef562c50559f7d2289febed552d99081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000357573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037d919062000709565b600a546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015620003cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f5919062000709565b602680546001600160a01b0319166001600160a01b0392909216919091179055620004236009600a620006b4565b6200043390633b9aca00620006cc565b3360009081526001602081905260408220929092556004906200045e6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560255482168152602984528281208054861660019081179091556026549092168152602a8452828120805486168317905530815260049384905291822080549094168117909355620004db3390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790556016548216815260049093528183208054851660019081179091556015549091168352912080549092161790556200053e3390565b6001600160a01b031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620005786009600a620006b4565b6200058890633b9aca00620006cc565b60405190815260200160405180910390a362000734565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005f6578160001904821115620005da57620005da6200059f565b80851615620005e857918102915b93841c9390800290620005ba565b509250929050565b6000826200060f57506001620006ae565b816200061e57506000620006ae565b8160018114620006375760028114620006425762000662565b6001915050620006ae565b60ff8411156200065657620006566200059f565b50506001821b620006ae565b5060208310610133831016604e8410600b841016171562000687575081810a620006ae565b620006938383620005b5565b8060001904821115620006aa57620006aa6200059f565b0290505b92915050565b6000620006c560ff841683620005fe565b9392505050565b8082028115828204841417620006ae57620006ae6200059f565b6000826200070457634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200071c57600080fd5b81516001600160a01b0381168114620006c557600080fd5b61329680620007446000396000f3fe6080604052600436106102e85760003560e01c8063715018a6116101905780639a109269116100dc578063c9d1e1d411610095578063dd62ed3e1161006f578063dd62ed3e14610978578063e5036549146109be578063f3d7d282146109de578063f9a0b07f14610a0e57600080fd5b8063c9d1e1d414610923578063cc1776d314610943578063ccca123b1461096257600080fd5b80639a1092691461085e578063a00d3b9814610873578063a9059cbb146108a0578063b5275b33146108c0578063bf474bed146108ed578063c0973eed1461090357600080fd5b80638a8c523c11610149578063926e980211610123578063926e9802146107a257806392f42870146107eb578063945a43251461080b57806395d89b411461082b57600080fd5b80638a8c523c146107595780638da5cb5b1461076e5780638f9a55c01461078c57600080fd5b8063715018a614610693578063751039fc146106a857806375cb1bd1146106bd578063789ef0e0146106dd5780637d1db4a5146107135780637df0f7671461072957600080fd5b806323b872dd1161024f5780633e0d99f8116102085780634f7041a5116101e25780634f7041a5146105f85780635e91d171146106325780636f2098a71461064857806370a082311461065d57600080fd5b80633e0d99f8146105ad57806346469afb146105c257806349bd5a5e146105d857600080fd5b806323b872dd146104e8578063313ce567146105085780633243db7c146105245780633744baf2146105445780633795ef921461056457806337abc8291461057757600080fd5b80630faee56f116102a15780630faee56f1461042957806313f6686d1461044d57806316aaf2dc1461047d57806318160ddd1461049d5780631bff7898146104b2578063225d29a1146104c857600080fd5b806301fac39b146102f457806303fd2a451461031657806306fdde03146103495780630771ec401461038a578063095ea7b3146103d95780630da00f8d1461040957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612c25565b610a24565b005b34801561032257600080fd5b5061032c61dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561035557600080fd5b5060408051808201909152600f81526e29b7b6b6b4902330b7102a37b5b2b760891b60208201525b6040516103409190612cc2565b34801561039657600080fd5b50601e54601f546020546021546022546103b1949392919085565b604080519586526020860194909452928401919091526060830152608082015260a001610340565b3480156103e557600080fd5b506103f96103f4366004612d10565b610b06565b6040519015158152602001610340565b34801561041557600080fd5b50610314610424366004612d3a565b610b1d565b34801561043557600080fd5b5061043f601c5481565b604051908152602001610340565b34801561045957600080fd5b506103f9610468366004612d53565b60086020526000908152604090205460ff1681565b34801561048957600080fd5b50610314610498366004612d53565b610c7f565b3480156104a957600080fd5b5061043f610d4f565b3480156104be57600080fd5b5061043f60145481565b3480156104d457600080fd5b5061043f6104e3366004612d53565b610d70565b3480156104f457600080fd5b506103f9610503366004612d6e565b610e5b565b34801561051457600080fd5b5060405160098152602001610340565b34801561053057600080fd5b5061031461053f366004612dba565b610ec4565b34801561055057600080fd5b5060155461032c906001600160a01b031681565b610314610572366004612d53565b610f77565b34801561058357600080fd5b5061043f610592366004612d53565b6001600160a01b031660009081526007602052604090205490565b3480156105b957600080fd5b50602b5461043f565b3480156105ce57600080fd5b5061043f60135481565b3480156105e457600080fd5b5060265461032c906001600160a01b031681565b34801561060457600080fd5b50600d54600e54600f5461061792919083565b60408051938452602084019290925290820152606001610340565b34801561063e57600080fd5b5061043f60235481565b34801561065457600080fd5b506103146111bc565b34801561066957600080fd5b5061043f610678366004612d53565b6001600160a01b031660009081526001602052604090205490565b34801561069f57600080fd5b50610314611216565b3480156106b457600080fd5b5061031461128a565b3480156106c957600080fd5b506103146106d8366004612dfd565b61133c565b3480156106e957600080fd5b5061043f6106f8366004612d53565b6001600160a01b031660009081526006602052604090205490565b34801561071f57600080fd5b5061043f60195481565b34801561073557600080fd5b506103f9610744366004612d53565b602a6020526000908152604090205460ff1681565b34801561076557600080fd5b506103146114db565b34801561077a57600080fd5b506000546001600160a01b031661032c565b34801561079857600080fd5b5061043f601a5481565b3480156107ae57600080fd5b506107d66107bd366004612d53565b6027602052600090815260409020805460019091015482565b60408051928352602083019190915201610340565b3480156107f757600080fd5b50610314610806366004612c25565b611578565b34801561081757600080fd5b50610314610826366004612d10565b611643565b34801561083757600080fd5b5060408051808201909152600a8152690465249454e44534849560b41b602082015261037d565b34801561086a57600080fd5b506103146117ea565b34801561087f57600080fd5b5061043f61088e366004612d53565b60286020526000908152604090205481565b3480156108ac57600080fd5b506103f96108bb366004612d10565b6117fd565b3480156108cc57600080fd5b5061043f6108db366004612d53565b60026020526000908152604090205481565b3480156108f957600080fd5b5061043f601b5481565b34801561090f57600080fd5b5060175461032c906001600160a01b031681565b34801561092f57600080fd5b5061031461093e366004612e37565b61180a565b34801561094f57600080fd5b5060105460115460125461061792919083565b34801561096e57600080fd5b5061043f600c5481565b34801561098457600080fd5b5061043f610993366004612e6a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156109ca57600080fd5b506103146109d9366004612e94565b6118ee565b3480156109ea57600080fd5b506103f96109f9366004612d53565b60296020526000908152604090205460ff1681565b348015610a1a57600080fd5b5061043f601d5481565b6016546001600160a01b0316336001600160a01b031614610a9a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865204465762072656d6f7665206578636c756465642077616c6044820152646c6574732160d81b60648201526084015b60405180910390fd5b60005b8151811015610b0257600060046000848481518110610abe57610abe612ec0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610afa81612eec565b915050610a9d565b5050565b6000610b13338484611aa1565b5060015b92915050565b6016546001600160a01b03163314610b775760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206465762063616e206368616e67652073656c6c206c696d697400006044820152606401610a91565b60008111610bc75760405162461bcd60e51b815260206004820152601760248201527f206d757374206265206d6f7265207468616e207a65726f0000000000000000006044820152606401610a91565b605f811115610c225760405162461bcd60e51b815260206004820152602160248201527f206d757374206265206c657373207468616e206f7220657175616c20746f20396044820152603560f81b6064820152608401610a91565b6064610c306009600a612fe9565b610c3a9083612ff8565b610c44919061300f565b60248190556040519081527f837a8b1d58cbfc20ae91cd1babf5cd456f7754fac4fb465f117e7c70b63ad4bd9060200160405180910390a150565b3360009081526008602052604090205460ff16610cd75760405162461bcd60e51b8152602060048201526016602482015275139bdd08184818db185a5b595c8818dbdb9d1c9858dd60521b6044820152606401610a91565b6000600c54610e10610ce99190612ff8565b610cf39042613031565b6001600160a01b038316600081815260076020908152604091829020849055815192835282018390529192507fc0b6769d5ea4634ef7c7c481bea7d34c31486822e7ed03e7c3844c79f9aca4b291015b60405180910390a15050565b6000610d5d6009600a612fe9565b610d6b90633b9aca00612ff8565b905090565b6024546001600160a01b038216600090815260286020526040812054909182911115610b1757601e546001600160a01b0384166000908152602760205260409020541115610dbc575060005b601f546001600160a01b0384166000908152602760205260409020541115610de2575060015b602080546001600160a01b038516600090815260279092526040909120541115610e0a575060025b6021546001600160a01b0384166000908152602760205260409020541115610e30575060035b6022546001600160a01b0384166000908152602760205260409020541115610b175750600492915050565b6000610e68848484611bc5565b610eba8433610eb585604051806060016040528060288152602001613219602891396001600160a01b038a1660009081526003602090815260408083203384529091529020549190612655565b611aa1565b5060019392505050565b6016546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b038381166000818152602960209081526040808320805487151560ff199182168117909255958816808552602a845293829020805490961681179095558051938452908301919091528101919091527f8ec10c24e0994522b8e150e1ff701e5e18cf6d31db2c2d8ed335c6478532dbec906060015b60405180910390a1505050565b6023543414610fbd5760405162461bcd60e51b815260206004820152601260248201527115dc9bdb99c81dda5c19519959481c185a5960721b6044820152606401610a91565b336001600160a01b0382161461100e5760405162461bcd60e51b81526020600482015260166024820152754e6f7420796f7572206163636f756e7420447564652160501b6044820152606401610a91565b61101781610d70565b60000361105c5760405162461bcd60e51b81526020600482015260136024820152727374617475732063616e74206265207a65726f60681b6044820152606401610a91565b6001600160a01b0381166000908152600960205260408120805460ff1916600117905561108882610d70565b6001600160a01b03831660009081526007602052604081205491925042906110c46110b4856001613031565b6110be848661307b565b9061268f565b6110ce9083613031565b90506110e66110e08362015180613031565b826126d8565b6001600160a01b03861660009081526007602090815260408083208490556023546027909252822080549396509092909190611123908490613031565b90915550506023546001600160a01b03861660009081526027602052604081206001018054909190611156908490613031565b909155505033600090815260096020908152604091829020805460ff1916905581516001600160a01b03881681529081018590527f607eb703d4a887ac87d10c5a2ca98f74d0ab1d3399b4c901f845cdfa0a70b6ae910160405180910390a15050505050565b6016546001600160a01b0316336001600160a01b0316146111dc57600080fd5b3060009081526001602052604090205480156112065761120661120182601c546126ed565b6126fc565b478015610b0257610b02816127c6565b6000546001600160a01b031633146112405760405162461bcd60e51b8152600401610a919061308e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146112b45760405162461bcd60e51b8152600401610a919061308e565b6112c06009600a612fe9565b6112ce90633b9aca00612ff8565b6019556112dd6009600a612fe9565b6112eb90633b9aca00612ff8565b601a557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf61131b6009600a612fe9565b61132990633b9aca00612ff8565b60405190815260200160405180910390a1565b6016546001600160a01b031633146113665760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b0383166113bc5760405162461bcd60e51b815260206004820152601860248201527f72657761726473206164647265737320736574206173203000000000000000006044820152606401610a91565b6001600160a01b0381166114095760405162461bcd60e51b8152602060048201526014602482015273064657620616464726573732073657420617320360641b6044820152606401610a91565b6001600160a01b03821661145f5760405162461bcd60e51b815260206004820152601960248201527f6f757472656163682061646472657373207365742061732030000000000000006044820152606401610a91565b601780546001600160a01b038581166001600160a01b0319928316811790935560158054868316908416811790915560168054928616929093168217909255604080519384526020840192909252908201527fe277a3205602f91f1fae811585d3f19cefa47b079e8c9c4e6040a001dc83da1590606001610f6a565b6000546001600160a01b031633146115055760405162461bcd60e51b8152600401610a919061308e565b602654600160a01b900460ff161561155f5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a20526571756972656d656e7420616c7265616479206d657400006044820152606401610a91565b6026805462ff00ff60a01b19166201000160a01b179055565b6016546001600160a01b0316336001600160a01b0316146115db5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920746865204465762063616e20616464206578636c73696f6e7321006044820152606401610a91565b60005b8151811015610b02576001600460008484815181106115ff576115ff612ec0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061163b81612eec565b9150506115de565b601d54611651906002612ff8565b8110156116965760405162461bcd60e51b81526020600482015260136024820152727075736820616d6f756e7420746f6f206c6f7760681b6044820152606401610a91565b6001600160a01b0382166000908152600760205260409020546116fb5760405162461bcd60e51b815260206004820152601c60248201527f63616e206e6f74207075736820302074696d65722061646472657373000000006044820152606401610a91565b6000601d5490506000611722826110be85600c54610e1061171c9190612ff8565b9061284b565b6017549091506117469033906001600160a01b0316611741858761307b565b611bc5565b611751338584611bc5565b6001600160a01b03841660009081526007602052604081208054839290611779908490613031565b9091555050336000908152600260205260408120805485929061179d908490613031565b9091555050604080516001600160a01b0386168152602081018390527fc0b6769d5ea4634ef7c7c481bea7d34c31486822e7ed03e7c3844c79f9aca4b2910160405180910390a150505050565b4780156117fa576117fa816127c6565b50565b6000610b13338484611bc5565b6016546001600160a01b031633146118345760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b03821660009081526008602052604090205481151560ff9091161515036118925760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610a91565b6001600160a01b038216600081815260086020908152604091829020805460ff19168515159081179091558251938452908301527f3d4c415a8a71f46c48eeee09c3c448c960e6e93b447b7ef22f3709ba4b285fda9101610d43565b6016546001600160a01b031633146119185760405162461bcd60e51b8152600401610a9190613044565b600183118015611929575061271083105b6119755760405162461bcd60e51b815260206004820152601d60248201527f20776970652066656520697320736574206f7574206f662072616e67650000006044820152606401610a91565b6001821015801561198857506103048211155b6119c95760405162461bcd60e51b8152602060048201526012602482015271486f757273206f7574206f662072616e676560701b6044820152606401610a91565b6001811180156119da575061138881105b611a265760405162461bcd60e51b815260206004820152601860248201527f5075736820466163746f72206f7574206f662072616e676500000000000000006044820152606401610a91565b611a3983683635c9adc5dea00000612ff8565b602355600c829055611a4d6009600a612fe9565b611a579082612ff8565b601d819055602354600c546040805192835260208301919091528101919091527f067fdaea136031be3f08e3cef7fa31bcbdb923ad0da34a5edc37df2841161f8090606001610f6a565b6001600160a01b038316611b035760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a91565b6001600160a01b038216611b645760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a91565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611c295760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a91565b6001600160a01b038216611c8b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a91565b60008111611cec5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206d75737420626520626967676572207460448201526768616e207a65726f60c01b6064820152608401610a91565b600080600080600080611d076000546001600160a01b031690565b6001600160a01b0316896001600160a01b031614158015611d3657506000546001600160a01b03898116911614155b156121ac576001600160a01b0389166000908152602a602052604090205460ff168015611d7c57506001600160a01b03881660009081526029602052604090205460ff16155b8015611da157506001600160a01b03881660009081526004602052604090205460ff16155b1561203a57602654600160a01b900460ff16611df25760405162461bcd60e51b815260206004820152601060248201526f2a3930b234b733903737ba1037b832b760811b6044820152606401610a91565b601954871115611e445760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e000000000000006044820152606401610a91565b601a5487611e678a6001600160a01b031660009081526001602052604090205490565b611e719190613031565b1115611ebf5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e0000000000006044820152606401610a91565b600f54611ed5906103e8906110be908a9061284b565b9450611ef56103e86110be600d600101548a61284b90919063ffffffff16565b9350611f156103e86110be600d600001548a61284b90919063ffffffff16565b60408051600280825260608201835292955060009290916020830190803683375050600a5482519293506001600160a01b031691839150600090611f5b57611f5b612ec0565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611f8f57611f8f612ec0565b6001600160a01b0392831660209182029290920101526025546040516307c0329d60e21b81526000929190911690631f00ca7490611fd3908c908690600401613107565b600060405180830381865afa158015611ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120189190810190613128565b90508060008151811061202d5761202d612ec0565b6020026020010151935050505b6001600160a01b0388166000908152602a602052604090205460ff16801561206b57506001600160a01b0389163014155b156120c957601254612086906103e8906110be908a9061284b565b94506120a66103e86110be6010600101548a61284b90919063ffffffff16565b93506120c66103e86110be6010600001548a61284b90919063ffffffff16565b92505b30600090815260016020526040902054602654600160a81b900460ff1615801561210b57506001600160a01b0389166000908152602a602052604090205460ff165b80156121205750602654600160b01b900460ff165b801561212d5750601b5481115b1561215c5761214a6112018961214584601c546126ed565b6126ed565b47801561215a5761215a476127c6565b505b836121678688613031565b6121719190613031565b965061217d88886128cd565b6001600160a01b038b16600090815260056020526040812080549091906121a5908490613031565b9091555050505b85156122c95730600090815260016020526040812080548792906121d1908490613031565b90915550506015546001600160a01b031660009081526001602052604081208054869290612200908490613031565b90915550506017546001600160a01b03166000908152600160205260408120805485929061222f908490613031565b909155505060405185815230906001600160a01b038b16906000805160206132418339815191529060200160405180910390a36015546040518581526001600160a01b03918216918b16906000805160206132418339815191529060200160405180910390a36017546040518481526001600160a01b03918216918b16906000805160206132418339815191529060200160405180910390a35b6001600160a01b0389166000908152600160205260409020546122ec90886128cd565b6001600160a01b038a1660009081526001602052604090205561233161231288886128cd565b6001600160a01b038a166000908152600160205260409020549061290f565b6001600160a01b03808a166000818152600160205260409020929092558a166000805160206132418339815191526123698a8a6128cd565b60405190815260200160405180910390a3506001600160a01b0380881660009081526001602052604080822054928b1682528120546123a79061296e565b6001600160a01b038b16600090815260056020526040812054919250906123e9906123d3908490613031565b6110be6123e26009600a612fe9565b859061284b565b6001600160a01b038c16600090815260286020526040902081905590508215801561242a57506001600160a01b038a16600090815260056020526040902054155b1561244f5761243b6009600a612fe9565b506001600160a01b038a1660005260286020525b8060245411156124b2576001600160a01b038a16600090815260066020526040902054602b5461247e916128cd565b602b556001600160a01b038a1660009081526027602090815260408083208390556006825280832083905560079091528120555b83156125dd576124f3600c54610e106124cb9190612ff8565b6124d59042613031565b6001600160a01b038c166000908152600760205260409020546126d8565b6001600160a01b038b16600090815260076020908152604080832093909355602790529081208054869290612529908490613031565b90915550506001600160a01b038a1660009081526027602052604081206001018054869290612559908490613031565b9091555050601f546001600160a01b038b16600090815260276020526040902054118015612588575080602454105b156125dd576001600160a01b038a16600090815260066020526040902054602b546125be91906125b8908661290f565b906128cd565b602b556001600160a01b038a1660009081526006602052604090208390555b6001600160a01b038a16600090815260076020908152604080832054602783529281902054815185815292830193909352810186905260608101919091527f15c328e1a6d692085b8934e30c1e8865234b72873bc2a01c7399ba36af9627ed9060800160405180910390a15050505050505050505050565b600081848411156126795760405162461bcd60e51b8152600401610a919190612cc2565b506000612686848661307b565b95945050505050565b60006126d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612981565b9392505050565b60008183106126e757826126d1565b50919050565b60008183116126e757826126d1565b6026805460ff60a81b1916600160a81b179055600061272160646110be84601461284b565b9050600061273082600261268f565b9050600061273e828461307b565b90504761275361274e848761307b565b6129af565b600061276460036110be844761307b565b90506127708382612aca565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506026805460ff60a81b1916905550505050565b6016546001600160a01b03166108fc6127e083600261268f565b6040518115909202916000818181858888f19350505050158015612808573d6000803e3d6000fd5b506018546001600160a01b03166108fc61282383600261268f565b6040518115909202916000818181858888f19350505050158015610b02573d6000803e3d6000fd5b60008260000361285d57506000610b17565b60006128698385612ff8565b905082612876858361300f565b146126d15760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a91565b60006126d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612655565b60008061291c8385613031565b9050838110156126d15760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a91565b60008160000361297d57600191505b5090565b600081836129a25760405162461bcd60e51b8152600401610a919190612cc2565b506000612686848661300f565b6026805460ff60a81b1916600160a81b17905560408051600280825260608201835260009260208301908036833701905050905030816000815181106129f7576129f7612ec0565b6001600160a01b039283166020918202929092010152600a54825191169082906001908110612a2857612a28612ec0565b6001600160a01b039283166020918202929092010152602554612a4e9130911684611aa1565b60255460405163791ac94760e01b81526001600160a01b039091169063791ac94790612a879085906000908690309042906004016131ae565b600060405180830381600087803b158015612aa157600080fd5b505af1158015612ab5573d6000803e3d6000fd5b50506026805460ff60a81b1916905550505050565b6026805460ff60a81b1916600160a81b179055602554612af59030906001600160a01b031684611aa1565b60255460155460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612b65573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b8a91906131ea565b50506026805460ff60a81b19169055505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612bdd57612bdd612b9e565b604052919050565b600067ffffffffffffffff821115612bff57612bff612b9e565b5060051b60200190565b80356001600160a01b0381168114612c2057600080fd5b919050565b60006020808385031215612c3857600080fd5b823567ffffffffffffffff811115612c4f57600080fd5b8301601f81018513612c6057600080fd5b8035612c73612c6e82612be5565b612bb4565b81815260059190911b82018301908381019087831115612c9257600080fd5b928401925b82841015612cb757612ca884612c09565b82529284019290840190612c97565b979650505050505050565b600060208083528351808285015260005b81811015612cef57858101830151858201604001528201612cd3565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612d2357600080fd5b612d2c83612c09565b946020939093013593505050565b600060208284031215612d4c57600080fd5b5035919050565b600060208284031215612d6557600080fd5b6126d182612c09565b600080600060608486031215612d8357600080fd5b612d8c84612c09565b9250612d9a60208501612c09565b9150604084013590509250925092565b80358015158114612c2057600080fd5b600080600060608486031215612dcf57600080fd5b612dd884612c09565b9250612de660208501612c09565b9150612df460408501612daa565b90509250925092565b600080600060608486031215612e1257600080fd5b612e1b84612c09565b9250612e2960208501612c09565b9150612df460408501612c09565b60008060408385031215612e4a57600080fd5b612e5383612c09565b9150612e6160208401612daa565b90509250929050565b60008060408385031215612e7d57600080fd5b612e8683612c09565b9150612e6160208401612c09565b600080600060608486031215612ea957600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612efe57612efe612ed6565b5060010190565b600181815b80851115612f40578160001904821115612f2657612f26612ed6565b80851615612f3357918102915b93841c9390800290612f0a565b509250929050565b600082612f5757506001610b17565b81612f6457506000610b17565b8160018114612f7a5760028114612f8457612fa0565b6001915050610b17565b60ff841115612f9557612f95612ed6565b50506001821b610b17565b5060208310610133831016604e8410600b8410161715612fc3575081810a610b17565b612fcd8383612f05565b8060001904821115612fe157612fe1612ed6565b029392505050565b60006126d160ff841683612f48565b8082028115828204841417610b1757610b17612ed6565b60008261302c57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b1757610b17612ed6565b60208082526019908201527f4f6e6c7920746865204465762063616e20646f20746869732100000000000000604082015260600190565b81810381811115610b1757610b17612ed6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081518084526020808501945080840160005b838110156130fc5781516001600160a01b0316875295820195908201906001016130d7565b509495945050505050565b82815260406020820152600061312060408301846130c3565b949350505050565b6000602080838503121561313b57600080fd5b825167ffffffffffffffff81111561315257600080fd5b8301601f8101851361316357600080fd5b8051613171612c6e82612be5565b81815260059190911b8201830190838101908783111561319057600080fd5b928401925b82841015612cb757835182529284019290840190613195565b85815284602082015260a0604082015260006131cd60a08301866130c3565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156131ff57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f4fa5095b1b79f06eeeb9501b784018806d07388d0cf5c4cbbeb469972de62b364736f6c63430008130033

Deployed ByteCode

0x6080604052600436106102e85760003560e01c8063715018a6116101905780639a109269116100dc578063c9d1e1d411610095578063dd62ed3e1161006f578063dd62ed3e14610978578063e5036549146109be578063f3d7d282146109de578063f9a0b07f14610a0e57600080fd5b8063c9d1e1d414610923578063cc1776d314610943578063ccca123b1461096257600080fd5b80639a1092691461085e578063a00d3b9814610873578063a9059cbb146108a0578063b5275b33146108c0578063bf474bed146108ed578063c0973eed1461090357600080fd5b80638a8c523c11610149578063926e980211610123578063926e9802146107a257806392f42870146107eb578063945a43251461080b57806395d89b411461082b57600080fd5b80638a8c523c146107595780638da5cb5b1461076e5780638f9a55c01461078c57600080fd5b8063715018a614610693578063751039fc146106a857806375cb1bd1146106bd578063789ef0e0146106dd5780637d1db4a5146107135780637df0f7671461072957600080fd5b806323b872dd1161024f5780633e0d99f8116102085780634f7041a5116101e25780634f7041a5146105f85780635e91d171146106325780636f2098a71461064857806370a082311461065d57600080fd5b80633e0d99f8146105ad57806346469afb146105c257806349bd5a5e146105d857600080fd5b806323b872dd146104e8578063313ce567146105085780633243db7c146105245780633744baf2146105445780633795ef921461056457806337abc8291461057757600080fd5b80630faee56f116102a15780630faee56f1461042957806313f6686d1461044d57806316aaf2dc1461047d57806318160ddd1461049d5780631bff7898146104b2578063225d29a1146104c857600080fd5b806301fac39b146102f457806303fd2a451461031657806306fdde03146103495780630771ec401461038a578063095ea7b3146103d95780630da00f8d1461040957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612c25565b610a24565b005b34801561032257600080fd5b5061032c61dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561035557600080fd5b5060408051808201909152600f81526e29b7b6b6b4902330b7102a37b5b2b760891b60208201525b6040516103409190612cc2565b34801561039657600080fd5b50601e54601f546020546021546022546103b1949392919085565b604080519586526020860194909452928401919091526060830152608082015260a001610340565b3480156103e557600080fd5b506103f96103f4366004612d10565b610b06565b6040519015158152602001610340565b34801561041557600080fd5b50610314610424366004612d3a565b610b1d565b34801561043557600080fd5b5061043f601c5481565b604051908152602001610340565b34801561045957600080fd5b506103f9610468366004612d53565b60086020526000908152604090205460ff1681565b34801561048957600080fd5b50610314610498366004612d53565b610c7f565b3480156104a957600080fd5b5061043f610d4f565b3480156104be57600080fd5b5061043f60145481565b3480156104d457600080fd5b5061043f6104e3366004612d53565b610d70565b3480156104f457600080fd5b506103f9610503366004612d6e565b610e5b565b34801561051457600080fd5b5060405160098152602001610340565b34801561053057600080fd5b5061031461053f366004612dba565b610ec4565b34801561055057600080fd5b5060155461032c906001600160a01b031681565b610314610572366004612d53565b610f77565b34801561058357600080fd5b5061043f610592366004612d53565b6001600160a01b031660009081526007602052604090205490565b3480156105b957600080fd5b50602b5461043f565b3480156105ce57600080fd5b5061043f60135481565b3480156105e457600080fd5b5060265461032c906001600160a01b031681565b34801561060457600080fd5b50600d54600e54600f5461061792919083565b60408051938452602084019290925290820152606001610340565b34801561063e57600080fd5b5061043f60235481565b34801561065457600080fd5b506103146111bc565b34801561066957600080fd5b5061043f610678366004612d53565b6001600160a01b031660009081526001602052604090205490565b34801561069f57600080fd5b50610314611216565b3480156106b457600080fd5b5061031461128a565b3480156106c957600080fd5b506103146106d8366004612dfd565b61133c565b3480156106e957600080fd5b5061043f6106f8366004612d53565b6001600160a01b031660009081526006602052604090205490565b34801561071f57600080fd5b5061043f60195481565b34801561073557600080fd5b506103f9610744366004612d53565b602a6020526000908152604090205460ff1681565b34801561076557600080fd5b506103146114db565b34801561077a57600080fd5b506000546001600160a01b031661032c565b34801561079857600080fd5b5061043f601a5481565b3480156107ae57600080fd5b506107d66107bd366004612d53565b6027602052600090815260409020805460019091015482565b60408051928352602083019190915201610340565b3480156107f757600080fd5b50610314610806366004612c25565b611578565b34801561081757600080fd5b50610314610826366004612d10565b611643565b34801561083757600080fd5b5060408051808201909152600a8152690465249454e44534849560b41b602082015261037d565b34801561086a57600080fd5b506103146117ea565b34801561087f57600080fd5b5061043f61088e366004612d53565b60286020526000908152604090205481565b3480156108ac57600080fd5b506103f96108bb366004612d10565b6117fd565b3480156108cc57600080fd5b5061043f6108db366004612d53565b60026020526000908152604090205481565b3480156108f957600080fd5b5061043f601b5481565b34801561090f57600080fd5b5060175461032c906001600160a01b031681565b34801561092f57600080fd5b5061031461093e366004612e37565b61180a565b34801561094f57600080fd5b5060105460115460125461061792919083565b34801561096e57600080fd5b5061043f600c5481565b34801561098457600080fd5b5061043f610993366004612e6a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156109ca57600080fd5b506103146109d9366004612e94565b6118ee565b3480156109ea57600080fd5b506103f96109f9366004612d53565b60296020526000908152604090205460ff1681565b348015610a1a57600080fd5b5061043f601d5481565b6016546001600160a01b0316336001600160a01b031614610a9a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865204465762072656d6f7665206578636c756465642077616c6044820152646c6574732160d81b60648201526084015b60405180910390fd5b60005b8151811015610b0257600060046000848481518110610abe57610abe612ec0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610afa81612eec565b915050610a9d565b5050565b6000610b13338484611aa1565b5060015b92915050565b6016546001600160a01b03163314610b775760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206465762063616e206368616e67652073656c6c206c696d697400006044820152606401610a91565b60008111610bc75760405162461bcd60e51b815260206004820152601760248201527f206d757374206265206d6f7265207468616e207a65726f0000000000000000006044820152606401610a91565b605f811115610c225760405162461bcd60e51b815260206004820152602160248201527f206d757374206265206c657373207468616e206f7220657175616c20746f20396044820152603560f81b6064820152608401610a91565b6064610c306009600a612fe9565b610c3a9083612ff8565b610c44919061300f565b60248190556040519081527f837a8b1d58cbfc20ae91cd1babf5cd456f7754fac4fb465f117e7c70b63ad4bd9060200160405180910390a150565b3360009081526008602052604090205460ff16610cd75760405162461bcd60e51b8152602060048201526016602482015275139bdd08184818db185a5b595c8818dbdb9d1c9858dd60521b6044820152606401610a91565b6000600c54610e10610ce99190612ff8565b610cf39042613031565b6001600160a01b038316600081815260076020908152604091829020849055815192835282018390529192507fc0b6769d5ea4634ef7c7c481bea7d34c31486822e7ed03e7c3844c79f9aca4b291015b60405180910390a15050565b6000610d5d6009600a612fe9565b610d6b90633b9aca00612ff8565b905090565b6024546001600160a01b038216600090815260286020526040812054909182911115610b1757601e546001600160a01b0384166000908152602760205260409020541115610dbc575060005b601f546001600160a01b0384166000908152602760205260409020541115610de2575060015b602080546001600160a01b038516600090815260279092526040909120541115610e0a575060025b6021546001600160a01b0384166000908152602760205260409020541115610e30575060035b6022546001600160a01b0384166000908152602760205260409020541115610b175750600492915050565b6000610e68848484611bc5565b610eba8433610eb585604051806060016040528060288152602001613219602891396001600160a01b038a1660009081526003602090815260408083203384529091529020549190612655565b611aa1565b5060019392505050565b6016546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b038381166000818152602960209081526040808320805487151560ff199182168117909255958816808552602a845293829020805490961681179095558051938452908301919091528101919091527f8ec10c24e0994522b8e150e1ff701e5e18cf6d31db2c2d8ed335c6478532dbec906060015b60405180910390a1505050565b6023543414610fbd5760405162461bcd60e51b815260206004820152601260248201527115dc9bdb99c81dda5c19519959481c185a5960721b6044820152606401610a91565b336001600160a01b0382161461100e5760405162461bcd60e51b81526020600482015260166024820152754e6f7420796f7572206163636f756e7420447564652160501b6044820152606401610a91565b61101781610d70565b60000361105c5760405162461bcd60e51b81526020600482015260136024820152727374617475732063616e74206265207a65726f60681b6044820152606401610a91565b6001600160a01b0381166000908152600960205260408120805460ff1916600117905561108882610d70565b6001600160a01b03831660009081526007602052604081205491925042906110c46110b4856001613031565b6110be848661307b565b9061268f565b6110ce9083613031565b90506110e66110e08362015180613031565b826126d8565b6001600160a01b03861660009081526007602090815260408083208490556023546027909252822080549396509092909190611123908490613031565b90915550506023546001600160a01b03861660009081526027602052604081206001018054909190611156908490613031565b909155505033600090815260096020908152604091829020805460ff1916905581516001600160a01b03881681529081018590527f607eb703d4a887ac87d10c5a2ca98f74d0ab1d3399b4c901f845cdfa0a70b6ae910160405180910390a15050505050565b6016546001600160a01b0316336001600160a01b0316146111dc57600080fd5b3060009081526001602052604090205480156112065761120661120182601c546126ed565b6126fc565b478015610b0257610b02816127c6565b6000546001600160a01b031633146112405760405162461bcd60e51b8152600401610a919061308e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146112b45760405162461bcd60e51b8152600401610a919061308e565b6112c06009600a612fe9565b6112ce90633b9aca00612ff8565b6019556112dd6009600a612fe9565b6112eb90633b9aca00612ff8565b601a557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf61131b6009600a612fe9565b61132990633b9aca00612ff8565b60405190815260200160405180910390a1565b6016546001600160a01b031633146113665760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b0383166113bc5760405162461bcd60e51b815260206004820152601860248201527f72657761726473206164647265737320736574206173203000000000000000006044820152606401610a91565b6001600160a01b0381166114095760405162461bcd60e51b8152602060048201526014602482015273064657620616464726573732073657420617320360641b6044820152606401610a91565b6001600160a01b03821661145f5760405162461bcd60e51b815260206004820152601960248201527f6f757472656163682061646472657373207365742061732030000000000000006044820152606401610a91565b601780546001600160a01b038581166001600160a01b0319928316811790935560158054868316908416811790915560168054928616929093168217909255604080519384526020840192909252908201527fe277a3205602f91f1fae811585d3f19cefa47b079e8c9c4e6040a001dc83da1590606001610f6a565b6000546001600160a01b031633146115055760405162461bcd60e51b8152600401610a919061308e565b602654600160a01b900460ff161561155f5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a20526571756972656d656e7420616c7265616479206d657400006044820152606401610a91565b6026805462ff00ff60a01b19166201000160a01b179055565b6016546001600160a01b0316336001600160a01b0316146115db5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920746865204465762063616e20616464206578636c73696f6e7321006044820152606401610a91565b60005b8151811015610b02576001600460008484815181106115ff576115ff612ec0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061163b81612eec565b9150506115de565b601d54611651906002612ff8565b8110156116965760405162461bcd60e51b81526020600482015260136024820152727075736820616d6f756e7420746f6f206c6f7760681b6044820152606401610a91565b6001600160a01b0382166000908152600760205260409020546116fb5760405162461bcd60e51b815260206004820152601c60248201527f63616e206e6f74207075736820302074696d65722061646472657373000000006044820152606401610a91565b6000601d5490506000611722826110be85600c54610e1061171c9190612ff8565b9061284b565b6017549091506117469033906001600160a01b0316611741858761307b565b611bc5565b611751338584611bc5565b6001600160a01b03841660009081526007602052604081208054839290611779908490613031565b9091555050336000908152600260205260408120805485929061179d908490613031565b9091555050604080516001600160a01b0386168152602081018390527fc0b6769d5ea4634ef7c7c481bea7d34c31486822e7ed03e7c3844c79f9aca4b2910160405180910390a150505050565b4780156117fa576117fa816127c6565b50565b6000610b13338484611bc5565b6016546001600160a01b031633146118345760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b03821660009081526008602052604090205481151560ff9091161515036118925760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610a91565b6001600160a01b038216600081815260086020908152604091829020805460ff19168515159081179091558251938452908301527f3d4c415a8a71f46c48eeee09c3c448c960e6e93b447b7ef22f3709ba4b285fda9101610d43565b6016546001600160a01b031633146119185760405162461bcd60e51b8152600401610a9190613044565b600183118015611929575061271083105b6119755760405162461bcd60e51b815260206004820152601d60248201527f20776970652066656520697320736574206f7574206f662072616e67650000006044820152606401610a91565b6001821015801561198857506103048211155b6119c95760405162461bcd60e51b8152602060048201526012602482015271486f757273206f7574206f662072616e676560701b6044820152606401610a91565b6001811180156119da575061138881105b611a265760405162461bcd60e51b815260206004820152601860248201527f5075736820466163746f72206f7574206f662072616e676500000000000000006044820152606401610a91565b611a3983683635c9adc5dea00000612ff8565b602355600c829055611a4d6009600a612fe9565b611a579082612ff8565b601d819055602354600c546040805192835260208301919091528101919091527f067fdaea136031be3f08e3cef7fa31bcbdb923ad0da34a5edc37df2841161f8090606001610f6a565b6001600160a01b038316611b035760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a91565b6001600160a01b038216611b645760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a91565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611c295760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a91565b6001600160a01b038216611c8b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a91565b60008111611cec5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206d75737420626520626967676572207460448201526768616e207a65726f60c01b6064820152608401610a91565b600080600080600080611d076000546001600160a01b031690565b6001600160a01b0316896001600160a01b031614158015611d3657506000546001600160a01b03898116911614155b156121ac576001600160a01b0389166000908152602a602052604090205460ff168015611d7c57506001600160a01b03881660009081526029602052604090205460ff16155b8015611da157506001600160a01b03881660009081526004602052604090205460ff16155b1561203a57602654600160a01b900460ff16611df25760405162461bcd60e51b815260206004820152601060248201526f2a3930b234b733903737ba1037b832b760811b6044820152606401610a91565b601954871115611e445760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e000000000000006044820152606401610a91565b601a5487611e678a6001600160a01b031660009081526001602052604090205490565b611e719190613031565b1115611ebf5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e0000000000006044820152606401610a91565b600f54611ed5906103e8906110be908a9061284b565b9450611ef56103e86110be600d600101548a61284b90919063ffffffff16565b9350611f156103e86110be600d600001548a61284b90919063ffffffff16565b60408051600280825260608201835292955060009290916020830190803683375050600a5482519293506001600160a01b031691839150600090611f5b57611f5b612ec0565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611f8f57611f8f612ec0565b6001600160a01b0392831660209182029290920101526025546040516307c0329d60e21b81526000929190911690631f00ca7490611fd3908c908690600401613107565b600060405180830381865afa158015611ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120189190810190613128565b90508060008151811061202d5761202d612ec0565b6020026020010151935050505b6001600160a01b0388166000908152602a602052604090205460ff16801561206b57506001600160a01b0389163014155b156120c957601254612086906103e8906110be908a9061284b565b94506120a66103e86110be6010600101548a61284b90919063ffffffff16565b93506120c66103e86110be6010600001548a61284b90919063ffffffff16565b92505b30600090815260016020526040902054602654600160a81b900460ff1615801561210b57506001600160a01b0389166000908152602a602052604090205460ff165b80156121205750602654600160b01b900460ff165b801561212d5750601b5481115b1561215c5761214a6112018961214584601c546126ed565b6126ed565b47801561215a5761215a476127c6565b505b836121678688613031565b6121719190613031565b965061217d88886128cd565b6001600160a01b038b16600090815260056020526040812080549091906121a5908490613031565b9091555050505b85156122c95730600090815260016020526040812080548792906121d1908490613031565b90915550506015546001600160a01b031660009081526001602052604081208054869290612200908490613031565b90915550506017546001600160a01b03166000908152600160205260408120805485929061222f908490613031565b909155505060405185815230906001600160a01b038b16906000805160206132418339815191529060200160405180910390a36015546040518581526001600160a01b03918216918b16906000805160206132418339815191529060200160405180910390a36017546040518481526001600160a01b03918216918b16906000805160206132418339815191529060200160405180910390a35b6001600160a01b0389166000908152600160205260409020546122ec90886128cd565b6001600160a01b038a1660009081526001602052604090205561233161231288886128cd565b6001600160a01b038a166000908152600160205260409020549061290f565b6001600160a01b03808a166000818152600160205260409020929092558a166000805160206132418339815191526123698a8a6128cd565b60405190815260200160405180910390a3506001600160a01b0380881660009081526001602052604080822054928b1682528120546123a79061296e565b6001600160a01b038b16600090815260056020526040812054919250906123e9906123d3908490613031565b6110be6123e26009600a612fe9565b859061284b565b6001600160a01b038c16600090815260286020526040902081905590508215801561242a57506001600160a01b038a16600090815260056020526040902054155b1561244f5761243b6009600a612fe9565b506001600160a01b038a1660005260286020525b8060245411156124b2576001600160a01b038a16600090815260066020526040902054602b5461247e916128cd565b602b556001600160a01b038a1660009081526027602090815260408083208390556006825280832083905560079091528120555b83156125dd576124f3600c54610e106124cb9190612ff8565b6124d59042613031565b6001600160a01b038c166000908152600760205260409020546126d8565b6001600160a01b038b16600090815260076020908152604080832093909355602790529081208054869290612529908490613031565b90915550506001600160a01b038a1660009081526027602052604081206001018054869290612559908490613031565b9091555050601f546001600160a01b038b16600090815260276020526040902054118015612588575080602454105b156125dd576001600160a01b038a16600090815260066020526040902054602b546125be91906125b8908661290f565b906128cd565b602b556001600160a01b038a1660009081526006602052604090208390555b6001600160a01b038a16600090815260076020908152604080832054602783529281902054815185815292830193909352810186905260608101919091527f15c328e1a6d692085b8934e30c1e8865234b72873bc2a01c7399ba36af9627ed9060800160405180910390a15050505050505050505050565b600081848411156126795760405162461bcd60e51b8152600401610a919190612cc2565b506000612686848661307b565b95945050505050565b60006126d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612981565b9392505050565b60008183106126e757826126d1565b50919050565b60008183116126e757826126d1565b6026805460ff60a81b1916600160a81b179055600061272160646110be84601461284b565b9050600061273082600261268f565b9050600061273e828461307b565b90504761275361274e848761307b565b6129af565b600061276460036110be844761307b565b90506127708382612aca565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506026805460ff60a81b1916905550505050565b6016546001600160a01b03166108fc6127e083600261268f565b6040518115909202916000818181858888f19350505050158015612808573d6000803e3d6000fd5b506018546001600160a01b03166108fc61282383600261268f565b6040518115909202916000818181858888f19350505050158015610b02573d6000803e3d6000fd5b60008260000361285d57506000610b17565b60006128698385612ff8565b905082612876858361300f565b146126d15760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a91565b60006126d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612655565b60008061291c8385613031565b9050838110156126d15760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a91565b60008160000361297d57600191505b5090565b600081836129a25760405162461bcd60e51b8152600401610a919190612cc2565b506000612686848661300f565b6026805460ff60a81b1916600160a81b17905560408051600280825260608201835260009260208301908036833701905050905030816000815181106129f7576129f7612ec0565b6001600160a01b039283166020918202929092010152600a54825191169082906001908110612a2857612a28612ec0565b6001600160a01b039283166020918202929092010152602554612a4e9130911684611aa1565b60255460405163791ac94760e01b81526001600160a01b039091169063791ac94790612a879085906000908690309042906004016131ae565b600060405180830381600087803b158015612aa157600080fd5b505af1158015612ab5573d6000803e3d6000fd5b50506026805460ff60a81b1916905550505050565b6026805460ff60a81b1916600160a81b179055602554612af59030906001600160a01b031684611aa1565b60255460155460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612b65573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b8a91906131ea565b50506026805460ff60a81b19169055505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612bdd57612bdd612b9e565b604052919050565b600067ffffffffffffffff821115612bff57612bff612b9e565b5060051b60200190565b80356001600160a01b0381168114612c2057600080fd5b919050565b60006020808385031215612c3857600080fd5b823567ffffffffffffffff811115612c4f57600080fd5b8301601f81018513612c6057600080fd5b8035612c73612c6e82612be5565b612bb4565b81815260059190911b82018301908381019087831115612c9257600080fd5b928401925b82841015612cb757612ca884612c09565b82529284019290840190612c97565b979650505050505050565b600060208083528351808285015260005b81811015612cef57858101830151858201604001528201612cd3565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612d2357600080fd5b612d2c83612c09565b946020939093013593505050565b600060208284031215612d4c57600080fd5b5035919050565b600060208284031215612d6557600080fd5b6126d182612c09565b600080600060608486031215612d8357600080fd5b612d8c84612c09565b9250612d9a60208501612c09565b9150604084013590509250925092565b80358015158114612c2057600080fd5b600080600060608486031215612dcf57600080fd5b612dd884612c09565b9250612de660208501612c09565b9150612df460408501612daa565b90509250925092565b600080600060608486031215612e1257600080fd5b612e1b84612c09565b9250612e2960208501612c09565b9150612df460408501612c09565b60008060408385031215612e4a57600080fd5b612e5383612c09565b9150612e6160208401612daa565b90509250929050565b60008060408385031215612e7d57600080fd5b612e8683612c09565b9150612e6160208401612c09565b600080600060608486031215612ea957600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612efe57612efe612ed6565b5060010190565b600181815b80851115612f40578160001904821115612f2657612f26612ed6565b80851615612f3357918102915b93841c9390800290612f0a565b509250929050565b600082612f5757506001610b17565b81612f6457506000610b17565b8160018114612f7a5760028114612f8457612fa0565b6001915050610b17565b60ff841115612f9557612f95612ed6565b50506001821b610b17565b5060208310610133831016604e8410600b8410161715612fc3575081810a610b17565b612fcd8383612f05565b8060001904821115612fe157612fe1612ed6565b029392505050565b60006126d160ff841683612f48565b8082028115828204841417610b1757610b17612ed6565b60008261302c57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b1757610b17612ed6565b60208082526019908201527f4f6e6c7920746865204465762063616e20646f20746869732100000000000000604082015260600190565b81810381811115610b1757610b17612ed6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081518084526020808501945080840160005b838110156130fc5781516001600160a01b0316875295820195908201906001016130d7565b509495945050505050565b82815260406020820152600061312060408301846130c3565b949350505050565b6000602080838503121561313b57600080fd5b825167ffffffffffffffff81111561315257600080fd5b8301601f8101851361316357600080fd5b8051613171612c6e82612be5565b81815260059190911b8201830190838101908783111561319057600080fd5b928401925b82841015612cb757835182529284019290840190613195565b85815284602082015260a0604082015260006131cd60a08301866130c3565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156131ff57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f4fa5095b1b79f06eeeb9501b784018806d07388d0cf5c4cbbeb469972de62b364736f6c63430008130033