false
true
0

Contract Address Details

0xe2892C876c5e52a4413Ba5f373D1a6E5f2e9116D

Token
The Reptilian Currency (TRC)
Creator
0xe7c3e8–6992e7 at 0x8b5fee–2340fb
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
2,949 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26069084
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
TRC




Optimization enabled
true
Compiler version
v0.8.2+commit.661d1103




Optimization runs
200
EVM Version
default




Verified at
2024-03-21T22:13:52.171304Z

Constructor Arguments

0x000000000000000000000000e7c3e8ec428d53dd4df79944df291c8c976992e7

Arg [0] (address) : 0xe7c3e8ec428d53dd4df79944df291c8c976992e7

              

TRC.sol

pragma solidity 0.8.2;

// SPDX-License-Identifier: Unlicensed

import "./Ownable.sol";
import "./ERC20.sol";
import "./SafeMath.sol";
import "./IPulseX.sol";

interface IStaking {
   function updatePool(uint256 amount) external;
}

contract TRC is Ownable, ERC20 {
	using SafeMath for uint256;
	
    mapping (address => uint256) public rOwned;
    mapping (address => uint256) public tOwned;
	mapping (address => uint256) public totalSend;
    mapping (address => uint256) public totalReceived;
	mapping (address => uint256) public lockedAmount;
	
    mapping (address => bool) public isExcludedFromFee;
	mapping (address => bool) public isExcludedFromMaxBuyPerWallet;
    mapping (address => bool) public isExcludedFromReward;
	mapping (address => bool) public isAutomatedMarketMakerPairs;
	mapping (address => bool) public isHolder;
	
    address[] private _excluded;
	
	address public burnWallet;
	address public OAWallet;
	IStaking public stakingContract;
	
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 333333333333 * (10**18);
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
	
	uint256 public liquidityFeeTotal;
    uint256 public OAFeeTotal;
	uint256 public holders;
	
	uint256[] public liquidityFee;
	uint256[] public OAFee;
	uint256[] public reflectionFee;
	uint256[] public stakingFee;
	uint256[] public burnFee;
	
	uint256 private _liquidityFee;
	uint256 private _OAFee;
	uint256 private _reflectionFee;
	uint256 private _stakingFee;
	uint256 private _burnFee;
	
	IPulseXRouter public pulseXRouter;
    address public pulseXPair;
	
	bool private swapping;
	
    uint256 public swapTokensAtAmount;
	uint256 public maxBuyPerWallet;
	
	event LockToken(uint256 amount, address user);
	event UnLockToken(uint256 amount, address user);
	event SwapTokensAmountUpdated(uint256 amount);
	
    constructor (address owner) ERC20("The Reptilian Currency", "TRC") {
		rOwned[owner] = _rTotal;
		
		pulseXRouter = IPulseXRouter(0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02);
		pulseXPair = IPulseXFactory(pulseXRouter.factory()).createPair(address(this), pulseXRouter.WPLS());
		
		burnWallet = address(0x0000000000000000000000000000000000000369);
		swapTokensAtAmount = 33333333 * (10**18);
		maxBuyPerWallet = 6666666666 * (10**18);
		
		isExcludedFromFee[owner] = true;
		isExcludedFromFee[address(this)] = true;
		
		isExcludedFromMaxBuyPerWallet[address(pulseXPair)] = true;
		isExcludedFromMaxBuyPerWallet[address(this)] = true;
		isExcludedFromMaxBuyPerWallet[owner] = true;
		
		OAFee.push(200);
		OAFee.push(200);
		OAFee.push(200);
		
		reflectionFee.push(100);
		reflectionFee.push(100);
		reflectionFee.push(100);
		
		stakingFee.push(100);
		stakingFee.push(100);
		stakingFee.push(100);
		
		burnFee.push(50);
		burnFee.push(50);
		burnFee.push(50);
		
		liquidityFee.push(50);
		liquidityFee.push(50);
		liquidityFee.push(50);
		
		_excludeFromReward(address(burnWallet));
		_excludeFromReward(address(pulseXPair));
		_excludeFromReward(address(this));
		_setAutomatedMarketMakerPair(pulseXPair, true);
		
		isHolder[owner] = true;
		holders += 1;
		
		totalReceived[owner] +=_tTotal;
		emit Transfer(address(0), owner, _tTotal);
    }
	
	receive() external payable {}
	
	function excludeFromLimit(address account, bool status) external onlyOwner {
       isExcludedFromMaxBuyPerWallet[address(account)] = status;
	   isExcludedFromFee[address(account)] = status;
    }
	
	function updateAutomatedMarketMakerPair(address pair, bool value) external onlyOwner{
        require(pair != address(0), "Zero address");
		_setAutomatedMarketMakerPair(pair, value);
		if(value)
		{
		   _excludeFromReward(address(pair));
		   isExcludedFromMaxBuyPerWallet[address(pair)] = true;
		}
		else
		{
		   _includeInReward(address(pair));
		   isExcludedFromMaxBuyPerWallet[address(pair)] = false;
		}
    }
	
    function totalSupply() public override pure returns (uint256) {
        return _tTotal;
    }
	
    function balanceOf(address account) public override view returns (uint256) {
        if (isExcludedFromReward[account]) return tOwned[account];
        return tokenFromReflection(rOwned[account]);
    }
	
    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }
	
	function _excludeFromReward(address account) internal {
        if(rOwned[account] > 0) {
            tOwned[account] = tokenFromReflection(rOwned[account]);
        }
        isExcludedFromReward[account] = true;
        _excluded.push(account);
    }
	
	function _includeInReward(address account) internal {
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                tOwned[account] = 0;
                isExcludedFromReward[account] = false;
                _excluded.pop();
                break;
            }
        }
    }
	
    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(isAutomatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value");
        isAutomatedMarketMakerPairs[pair] = value;
    }
	
	function setStakingContract(IStaking contractAddress) external onlyOwner{
	    require(address(contractAddress) != address(0), "Zero address");
	    require(address(stakingContract) == address(0), "Staking contract already set");
	   
	    stakingContract = IStaking(contractAddress);
	   
	    _excludeFromReward(address(stakingContract));
	    isExcludedFromFee[address(stakingContract)] = true;
    }
	
	function setOAWallet(address wallet) external onlyOwner {
	    require(address(wallet) != address(0), "Zero address");
	    require(address(OAWallet) == address(0), "OA wallet already set");
	   
	    OAWallet = wallet;
		
	    _excludeFromReward(address(OAWallet));
	    isExcludedFromFee[address(OAWallet)] = true;
    }
	
	function lockToken(uint256 amount, address user) external {
	    require(msg.sender == address(stakingContract), "sender not allowed");
	   
	    uint256 unlockBalance = balanceOf(user) - lockedAmount[user];
	    require(unlockBalance >= amount, "locking amount exceeds balance");
	    lockedAmount[user] += amount;
	    emit LockToken(amount, user);
    }
	
	function unlockToken(uint256 amount, address user) external {
	    require(msg.sender == address(stakingContract), "sender not allowed");
	    require(lockedAmount[user] >= amount, "amount is not correct");
	   
	    lockedAmount[user] -= amount;
	    emit UnLockToken(amount, user);
    }
	
	function unlockSend(uint256 amount, address user) external {
	    require(msg.sender == address(stakingContract), "sender not allowed");
	    require(lockedAmount[user] >= amount, "amount is not correct");
	   
	    lockedAmount[user] -= amount;
	    IERC20(address(this)).transferFrom(address(user), address(stakingContract), amount);
	    emit UnLockToken(amount, user);
    }
	
	function airdropToken(uint256 amount) external {
        require(amount > 0, "Transfer amount must be greater than zero");
	    require(balanceOf(msg.sender) - lockedAmount[msg.sender] >= amount, "transfer amount exceeds balance");
		
	    _tokenTransfer(msg.sender, address(this), amount, true, true);
	}
	
    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }
	
    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tOA) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tOA, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity, tOA);
    }
	
    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256) {
		uint256 tFee = calculateReflectionFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tOA = calculateOAFee(tAmount);
		
		uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity).sub(tOA);
        return (tTransferAmount, tFee, tLiquidity, tOA);
    }
	
    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tOA, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rOA = tOA.mul(currentRate);
		
		uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub(rOA);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }
	
    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (rOwned[_excluded[i]] > rSupply || tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(rOwned[_excluded[i]]);
            tSupply = tSupply.sub(tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
	
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        rOwned[address(this)] = rOwned[address(this)].add(rLiquidity);
        if(isExcludedFromReward[address(this)])
            tOwned[address(this)] = tOwned[address(this)].add(tLiquidity);
    }
	
    function _takeOA(uint256 tOA) private {
        uint256 currentRate =  _getRate();
        uint256 rOA = tOA.mul(currentRate);
        rOwned[address(this)] = rOwned[address(this)].add(rOA);
        if(isExcludedFromReward[address(this)])
           tOwned[address(this)] = tOwned[address(this)].add(tOA);
    }
	
	function _takeStaking(uint256 tStaking) private {
        uint256 currentRate =  _getRate();
        uint256 rStaking = tStaking.mul(currentRate);
        rOwned[address(stakingContract)] = rOwned[address(stakingContract)].add(rStaking);
        if(isExcludedFromReward[address(stakingContract)])
            tOwned[address(stakingContract)] = tOwned[address(stakingContract)].add(tStaking);
    }
	
	function _takeBurn(uint256 tBurn) private {
        uint256 currentRate =  _getRate();
        uint256 rBurn = tBurn.mul(currentRate);
        rOwned[burnWallet] = rOwned[burnWallet].add(rBurn);
        if(isExcludedFromReward[burnWallet])
            tOwned[burnWallet] = tOwned[burnWallet].add(tBurn);
    }
	
    function calculateReflectionFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_reflectionFee).div(10000);
    }
	
    function calculateOAFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_OAFee).div(10000);
    }
	
	function calculateStakingFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_stakingFee).div(10000);
    }
	
    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(10000);
    }
	
	function calculateBurnFee(uint256 _amount) private view returns (uint256) {
		return _amount.mul(_burnFee).div(10000);
    }
	
    function removeAllFee() private {
	   _reflectionFee = 0;
	   _stakingFee = 0;
	   _OAFee = 0;
	   _liquidityFee = 0;
	   _burnFee = 0;
    }
	
    function applyBuyFee() private {
	   _reflectionFee = reflectionFee[0];
	   _stakingFee = stakingFee[0];
       _OAFee = OAFee[0];
       _liquidityFee = liquidityFee[0];
	   _burnFee = burnFee[0];
    }
	
	function applySellFee() private {
	   _reflectionFee = reflectionFee[1];
	   _stakingFee = stakingFee[1];
       _OAFee = OAFee[1];
       _liquidityFee = liquidityFee[1];
	   _burnFee = burnFee[1];
    }
	
	function applyP2PFee() private {
	   _reflectionFee = reflectionFee[2];
	   _stakingFee = stakingFee[2];
       _OAFee = OAFee[2];
       _liquidityFee = liquidityFee[2];
	   _burnFee = burnFee[2];
    }
	
	function applyAirdropFee() private {
	   _reflectionFee = 10000;
	   _stakingFee = 0;
       _OAFee = 0;
       _liquidityFee = 0;
	   _burnFee = 0;
    }
	
    function _transfer(address from, address to, uint256 amount) internal override{
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
		require(balanceOf(from) - lockedAmount[from] >= amount, "transfer amount exceeds balance");
		
		if(!isHolder[address(to)]) {
		   isHolder[to] = true;
		   holders += 1;
		}
		
		if((balanceOf(from) - amount) == 0) {
		   isHolder[from] = false;
		   holders -= 1;
		}
		
		if(!isExcludedFromMaxBuyPerWallet[to] && isAutomatedMarketMakerPairs[from])
		{
            uint256 balanceRecepient = balanceOf(to);
            require(balanceRecepient + amount <= maxBuyPerWallet, "Exceeds maximum buy per wallet limit");
        }
		
        uint256 contractTokenBalance = balanceOf(address(this));
		bool canSwap = contractTokenBalance >= swapTokensAtAmount;
		
        if (canSwap && !swapping && isAutomatedMarketMakerPairs[to]) 
		{
		    uint256 tokenToLiqudity = liquidityFeeTotal.div(2);
			uint256 tokenToOA = OAFeeTotal;
			uint256 tokenToSwap = tokenToLiqudity.add(tokenToOA);
			
			if(tokenToSwap >= swapTokensAtAmount) 
			{
			    swapping = true;
				swapTokensForPLS(swapTokensAtAmount);
				uint256 PLSBalance = address(this).balance;
				
				uint256 liqudityPart = PLSBalance.mul(tokenToLiqudity).div(tokenToSwap);
				uint256 OAPart = PLSBalance - liqudityPart;
				
				if(liqudityPart > 0)
				{
				    uint256 liqudityToken = swapTokensAtAmount.mul(tokenToLiqudity).div(tokenToSwap);
					addLiquidity(liqudityToken, liqudityPart);
					liquidityFeeTotal = liquidityFeeTotal.sub(liqudityToken).sub(liqudityToken);
				}

			if(OAPart > 0) 
				{
				    (bool sent, ) = OAWallet.call{value: OAPart}("");
					OAFeeTotal = OAFeeTotal.sub(swapTokensAtAmount.mul(tokenToOA).div(tokenToSwap));
				}
				swapping = false;
			}
        }
		
        bool takeFee = true;
        if(isExcludedFromFee[from] || isExcludedFromFee[to])
		{
            takeFee = false;
        }
		else
		{
		    if(!isHolder[address(this)]) {
			   isHolder[address(this)] = true;
			   holders += 1;
			}
			
			if(!isHolder[address(stakingContract)]) {
			   isHolder[address(stakingContract)] = true;
			   holders += 1;
			}
			
			if(!isHolder[address(burnWallet)]) {
			   isHolder[address(burnWallet)] = true;
			   holders += 1;
			}
		}
        _tokenTransfer(from,to,amount,takeFee,false);
    }
	
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee, bool airdrop) private {
		totalSend[sender] += amount;
		
		if(!takeFee) 
		{
		    removeAllFee();
		}
		else if(airdrop)
		{
		    applyAirdropFee();
		}
		else if(!isAutomatedMarketMakerPairs[sender] && !isAutomatedMarketMakerPairs[recipient])
		{
			applyP2PFee();
		}
		else if(isAutomatedMarketMakerPairs[recipient])
		{
		    applySellFee();
		}
		else
		{
		    applyBuyFee();
		}
		
		uint256 _totalFee = _reflectionFee + _stakingFee + _OAFee + _liquidityFee + _burnFee;
		if(_totalFee > 0)
		{
		    uint256 _feeAmount = amount.mul(_totalFee).div(10000);
		    totalReceived[recipient] += amount.sub(_feeAmount);
		}
		else
		{
		    totalReceived[recipient] += amount;
		}
		
		uint256 tBurn = calculateBurnFee(amount);
		if(tBurn > 0)
		{
		   _takeBurn(tBurn);
		   emit Transfer(sender, address(burnWallet), tBurn);
		}
		
		uint256 tStaking = calculateStakingFee(amount);
		if(tStaking > 0) 
		{
		    _takeStaking(tStaking);
		    stakingContract.updatePool(tStaking);
		    emit Transfer(sender, address(stakingContract), tStaking);
		}
		
        if (isExcludedFromReward[sender] && !isExcludedFromReward[recipient]) 
		{
            _transferFromExcluded(sender, recipient, amount, tStaking, tBurn);
        } 
		else if (!isExcludedFromReward[sender] && isExcludedFromReward[recipient]) 
		{
            _transferToExcluded(sender, recipient, amount, tStaking, tBurn);
        } 
		else if (!isExcludedFromReward[sender] && !isExcludedFromReward[recipient]) 
		{
            _transferStandard(sender, recipient, amount, tStaking, tBurn);
        } 
		else if (isExcludedFromReward[sender] && isExcludedFromReward[recipient]) 
		{
            _transferBothExcluded(sender, recipient, amount, tStaking, tBurn);
        } 
		else 
		{
            _transferStandard(sender, recipient, amount, tStaking, tBurn);
        }
    }
	
    function _transferStandard(address sender, address recipient, uint256 tAmount, uint256 tStaking, uint256 tBurn) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tOA) = _getValues(tAmount);
        
		tTransferAmount = tTransferAmount.sub(tStaking).sub(tBurn);
		rTransferAmount = rTransferAmount.sub(tStaking.mul(_getRate())).sub(tBurn.mul(_getRate()));
		
		rOwned[sender] = rOwned[sender].sub(rAmount);
        rOwned[recipient] = rOwned[recipient].add(rTransferAmount);
		
        _takeLiquidity(tLiquidity);
        _takeOA(tOA);
        _reflectFee(rFee, tFee);
		
		liquidityFeeTotal += tLiquidity;
        OAFeeTotal += tOA;
		
		if(tOA.add(tLiquidity) > 0)
		{
		    emit Transfer(sender, address(this), tOA.add(tLiquidity));
		}
        emit Transfer(sender, recipient, tTransferAmount);
    }
	
    function _transferToExcluded(address sender, address recipient, uint256 tAmount, uint256 tStaking, uint256 tBurn) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tOA) = _getValues(tAmount);
        
		tTransferAmount = tTransferAmount.sub(tStaking).sub(tBurn);
		rTransferAmount = rTransferAmount.sub(tStaking.mul(_getRate())).sub(tBurn.mul(_getRate()));
		
		rOwned[sender] = rOwned[sender].sub(rAmount);
        tOwned[recipient] = tOwned[recipient].add(tTransferAmount);
        rOwned[recipient] = rOwned[recipient].add(rTransferAmount);  
		
        _takeLiquidity(tLiquidity);
        _takeOA(tOA);
        _reflectFee(rFee, tFee);
		
		liquidityFeeTotal += tLiquidity;
        OAFeeTotal += tOA;
		
		if(tOA.add(tLiquidity) > 0)
		{
		    emit Transfer(sender, address(this), tOA.add(tLiquidity));
		}
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount, uint256 tStaking, uint256 tBurn) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tOA) = _getValues(tAmount);
        
		tTransferAmount = tTransferAmount.sub(tStaking).sub(tBurn);
		rTransferAmount = rTransferAmount.sub(tStaking.mul(_getRate())).sub(tBurn.mul(_getRate()));
		
		tOwned[sender] = tOwned[sender].sub(tAmount);
        rOwned[sender] = rOwned[sender].sub(rAmount);
        rOwned[recipient] = rOwned[recipient].add(rTransferAmount); 
		
        _takeLiquidity(tLiquidity);
        _takeOA(tOA);
        _reflectFee(rFee, tFee);
		
		liquidityFeeTotal += tLiquidity;
        OAFeeTotal += tOA;
		
		if(tOA.add(tLiquidity) > 0)
		{
		    emit Transfer(sender, address(this), tOA.add(tLiquidity));
		}
        emit Transfer(sender, recipient, tTransferAmount);
    }
	
	function _transferBothExcluded(address sender, address recipient, uint256 tAmount, uint256 tStaking, uint256 tBurn) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tOA) = _getValues(tAmount);
        
		tTransferAmount = tTransferAmount.sub(tStaking).sub(tBurn);
		rTransferAmount = rTransferAmount.sub(tStaking.mul(_getRate())).sub(tBurn.mul(_getRate()));
		
		tOwned[sender] = tOwned[sender].sub(tAmount);
        rOwned[sender] = rOwned[sender].sub(rAmount);
        tOwned[recipient] = tOwned[recipient].add(tTransferAmount);
        rOwned[recipient] = rOwned[recipient].add(rTransferAmount);   
		
        _takeLiquidity(tLiquidity);
        _takeOA(tOA);
        _reflectFee(rFee, tFee);
		
		liquidityFeeTotal += tLiquidity;
        OAFeeTotal += tOA;
		
		if(tOA.add(tLiquidity) > 0)
		{
		    emit Transfer(sender, address(this), tOA.add(tLiquidity));
		}
        emit Transfer(sender, recipient, tTransferAmount);
    }
	
	function swapTokensForPLS(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = pulseXRouter.WPLS();
		
        _approve(address(this), address(pulseXRouter), tokenAmount);
        pulseXRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
	
	function addLiquidity(uint256 tokenAmount, uint256 PLSAmount) private {
        _approve(address(this), address(pulseXRouter), tokenAmount);
        pulseXRouter.addLiquidityETH{value: PLSAmount}(
            address(this),
            tokenAmount,
            0, 
            0,
            address(this),
            block.timestamp
        );
    }
}
        

Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

ERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

IERC20Metadata.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}
          

IPulseX.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.2;

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

interface IPulseXRouter {
   function factory() external pure returns (address);
   function WPLS() 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 swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
}
          

Ownable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"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":"LockToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"user","internalType":"address","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":"SwapTokensAmountUpdated","inputs":[{"type":"uint256","name":"amount","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":"UnLockToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"user","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"OAFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"OAFeeTotal","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"OAWallet","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdropToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"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":"","internalType":"uint256"}],"name":"burnFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"burnWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromLimit","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"holders","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAutomatedMarketMakerPairs","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromMaxBuyPerWallet","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isHolder","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFeeTotal","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lockToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockedAmount","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxBuyPerWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pulseXPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPulseXRouter"}],"name":"pulseXRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"rOwned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOAWallet","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setStakingContract","inputs":[{"type":"address","name":"contractAddress","internalType":"contract IStaking"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStaking"}],"name":"stakingContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakingFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTokensAtAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tOwned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalReceived","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSend","inputs":[{"type":"address","name":"","internalType":"address"}]},{"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":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlockSend","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlockToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateAutomatedMarketMakerPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60806040526200001f6c04350edef012dc12678834000060001962000c69565b6200002d9060001962000bf4565b6014553480156200003d57600080fd5b50604051620042a9380380620042a9833981016040819052620000609162000b99565b6040518060400160405280601681526020017f5468652052657074696c69616e2043757272656e6379000000000000000000008152506040518060400160405280600381526020016254524360e81b815250620000cc620000c66200060e60201b60201c565b62000612565b8151620000e190600490602085019062000af3565b508051620000f790600590602084019062000af3565b50506014546001600160a01b0380841660009081526006602090815260409182902093909355602380546001600160a01b0319167398bf93ebf5c380c0e6ae8e192a7e2ae08edacc021790819055815163c45a015560e01b815291519216935063c45a0155926004808301939192829003018186803b1580156200017a57600080fd5b505afa1580156200018f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b5919062000b99565b6001600160a01b031663c9c6539630602360009054906101000a90046001600160a01b03166001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021357600080fd5b505afa15801562000228573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024e919062000b99565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200029757600080fd5b505af1158015620002ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d2919062000b99565b602480546001600160a01b039283166001600160a01b0319918216178255601180549091166103691781556a1b929b9a4d1cb5143400006025556b158a8994202d87c8f06800006026558383166000818152600b60209081526040808320805460ff199081166001908117909255308086528386208054831684179055975489168552600c9093528184208054841682179055958352808320805483168717905592825291812080549092168417909155601a8054808501825560c87f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e9182018190558254808701845582018190558254808701909355910155601b8054808501825560647f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc191820181905582548087018455820181905582548087019093559101819055601c805480860182557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21190810183905581548087018355810183905581548087019092550155601d8054808501825560327f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f91820181905582548087018455820181905582548087019093559101819055601980548086018255928190527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695928301829055805480860182558301829055805494850190559201919091555462000502911662000662565b60245462000519906001600160a01b031662000662565b620005243062000662565b6024546200053d906001600160a01b0316600162000725565b6001600160a01b0381166000908152600f60205260408120805460ff1916600190811790915560188054919290916200057890849062000bc2565b90915550506001600160a01b038116600090815260096020526040812080546c04350edef012dc1267883400009290620005b490849062000bc2565b90915550506040516c04350edef012dc12678834000081526001600160a01b038216906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35062000cac565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526006602052604090205415620006bf576001600160a01b038116600090815260066020526040902054620006a590620007eb565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600d60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b6001600160a01b0382166000908152600e602052604090205460ff1615158115151415620007c05760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084015b60405180910390fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6000601454821115620008545760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401620007b7565b60006200086062000883565b90506200087c8184620008b660201b620013831790919060201c565b9392505050565b6000808062000891620008c4565b91509150620008af8183620008b660201b620013831790919060201c565b9250505090565b60006200087c828462000bdd565b60145460009081906c04350edef012dc126788340000825b60105481101562000a8c578260066000601084815481106200090e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806200098957508160076000601084815481106200096257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15620009ad576014546c04350edef012dc1267883400009450945050505062000ae1565b62000a106006600060108481548110620009d757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205485916200139662000ae5821b17901c565b925062000a75600760006010848154811062000a3c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205484916200139662000ae5821b17901c565b91508062000a838162000c4b565b915050620008dc565b5062000ab66c04350edef012dc126788340000601454620008b660201b620013831790919060201c565b82101562000adb576014546c04350edef012dc12678834000093509350505062000ae1565b90925090505b9091565b60006200087c828462000bf4565b82805462000b019062000c0e565b90600052602060002090601f01602090048101928262000b25576000855562000b70565b82601f1062000b4057805160ff191683800117855562000b70565b8280016001018555821562000b70579182015b8281111562000b7057825182559160200191906001019062000b53565b5062000b7e92915062000b82565b5090565b5b8082111562000b7e576000815560010162000b83565b60006020828403121562000bab578081fd5b81516001600160a01b03811681146200087c578182fd5b6000821982111562000bd85762000bd862000c80565b500190565b60008262000bef5762000bef62000c96565b500490565b60008282101562000c095762000c0962000c80565b500390565b60028104600182168062000c2357607f821691505b6020821081141562000c4557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000c625762000c6262000c80565b5060010190565b60008262000c7b5762000c7b62000c96565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6135ed8062000cbc6000396000f3fe6080604052600436106102975760003560e01c806382f2a18a1161015a578063a9059cbb116100c1578063dd62ed3e1161007a578063dd62ed3e1461086f578063e2f456051461088f578063ee99205c146108a5578063f2fde38b146108c5578063fcef8867146108e5578063fe3f52f4146109055761029e565b8063a9059cbb14610792578063aec9b6f4146107b2578063c64a041b146107d2578063c8e3a2ee146107ff578063cec1460b1461081f578063d4d7b19a1461083f5761029e565b806398c142cb1161011357806398c142cb146106c25780639dd373b9146106d8578063a046bc78146106f8578063a08dbe7b14610718578063a153e70814610745578063a457c2d7146107725761029e565b806382f2a18a146105fc57806388a06f8b1461061c57806388f82020146106495780638cadf61d146106795780638da5cb5b1461068f57806395d89b41146106ad5761029e565b806349ae028a116101fe5780636ba5b8b8116101b75780636ba5b8b81461055b57806370a0823114610571578063715018a6146105915780637326afe0146105a65780638188f71c146105c657806381905bf8146105dc5761029e565b806349ae028a1461047c5780634df9cfb31461049c5780634ead1ef6146104c95780634ec27aac146104e95780635342acb41461050b57806357afa4c71461053b5761029e565b8063255fe84711610250578063255fe847146103a05780632d838119146103d0578063313ce567146103f0578063371974a31461040c578063391f70c81461043c578063395093511461045c5761029e565b806306228749146102a357806306fdde03146102e0578063095ea7b3146103025780630bee3e551461033257806318160ddd1461036057806323b872dd146103805761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506011546102c3906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102ec57600080fd5b506102f5610925565b6040516102d7919061333c565b34801561030e57600080fd5b5061032261031d36600461328c565b6109b7565b60405190151581526020016102d7565b34801561033e57600080fd5b5061035261034d3660046132d3565b6109cf565b6040519081526020016102d7565b34801561036c57600080fd5b506c04350edef012dc126788340000610352565b34801561038c57600080fd5b5061032261039b36600461321f565b6109f0565b3480156103ac57600080fd5b506103226103bb3660046131af565b600e6020526000908152604090205460ff1681565b3480156103dc57600080fd5b506103526103eb3660046132d3565b610a14565b3480156103fc57600080fd5b50604051601281526020016102d7565b34801561041857600080fd5b506103226104273660046131af565b600c6020526000908152604090205460ff1681565b34801561044857600080fd5b506012546102c3906001600160a01b031681565b34801561046857600080fd5b5061032261047736600461328c565b610a9f565b34801561048857600080fd5b506103526104973660046132d3565b610ac1565b3480156104a857600080fd5b506103526104b73660046131af565b60096020526000908152604090205481565b3480156104d557600080fd5b506103526104e43660046132d3565b610ad1565b3480156104f557600080fd5b5061050961050436600461325f565b610ae1565b005b34801561051757600080fd5b506103226105263660046131af565b600b6020526000908152604090205460ff1681565b34801561054757600080fd5b506105096105563660046132d3565b610b7e565b34801561056757600080fd5b5061035260165481565b34801561057d57600080fd5b5061035261058c3660046131af565b610c22565b34801561059d57600080fd5b50610509610c8a565b3480156105b257600080fd5b506105096105c13660046132eb565b610c9e565b3480156105d257600080fd5b5061035260185481565b3480156105e857600080fd5b506105096105f736600461325f565b610d9b565b34801561060857600080fd5b506105096106173660046132eb565b610de1565b34801561062857600080fd5b506103526106373660046131af565b60066020526000908152604090205481565b34801561065557600080fd5b506103226106643660046131af565b600d6020526000908152604090205460ff1681565b34801561068557600080fd5b5061035260265481565b34801561069b57600080fd5b506000546001600160a01b03166102c3565b3480156106b957600080fd5b506102f5610f63565b3480156106ce57600080fd5b5061035260175481565b3480156106e457600080fd5b506105096106f33660046131af565b610f72565b34801561070457600080fd5b506103526107133660046132d3565b61104c565b34801561072457600080fd5b506103526107333660046131af565b60076020526000908152604090205481565b34801561075157600080fd5b506103526107603660046131af565b600a6020526000908152604090205481565b34801561077e57600080fd5b5061032261078d36600461328c565b61105c565b34801561079e57600080fd5b506103226107ad36600461328c565b6110d7565b3480156107be57600080fd5b506023546102c3906001600160a01b031681565b3480156107de57600080fd5b506103526107ed3660046131af565b60086020526000908152604090205481565b34801561080b57600080fd5b5061050961081a3660046131af565b6110e5565b34801561082b57600080fd5b5061050961083a3660046132eb565b6111b7565b34801561084b57600080fd5b5061032261085a3660046131af565b600f6020526000908152604090205460ff1681565b34801561087b57600080fd5b5061035261088a3660046131e7565b6112d2565b34801561089b57600080fd5b5061035260255481565b3480156108b157600080fd5b506013546102c3906001600160a01b031681565b3480156108d157600080fd5b506105096108e03660046131af565b6112fd565b3480156108f157600080fd5b506103526109003660046132d3565b611373565b34801561091157600080fd5b506024546102c3906001600160a01b031681565b60606004805461093490613508565b80601f016020809104026020016040519081016040528092919081815260200182805461096090613508565b80156109ad5780601f10610982576101008083540402835291602001916109ad565b820191906000526020600020905b81548152906001019060200180831161099057829003601f168201915b5050505050905090565b6000336109c58185856113a2565b5060019392505050565b601a81815481106109df57600080fd5b600091825260209091200154905081565b6000336109fe8582856114c6565b610a09858585611540565b506001949350505050565b6000601454821115610a805760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b6000610a8a611b3c565b9050610a968382611383565b9150505b919050565b6000336109c5818585610ab283836112d2565b610abc919061349a565b6113a2565b601d81815481106109df57600080fd5b601c81815481106109df57600080fd5b610ae9611b5f565b6001600160a01b038216610b0f5760405162461bcd60e51b8152600401610a779061338f565b610b198282611bb9565b8015610b5057610b2882611c79565b6001600160a01b0382166000908152600c60205260409020805460ff19166001179055610b7a565b610b5982611d39565b6001600160a01b0382166000908152600c60205260409020805460ff191690555b5050565b60008111610b9e5760405162461bcd60e51b8152600401610a77906133e1565b336000818152600a60205260409020548291610bb990610c22565b610bc391906134f1565b1015610c115760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610a77565b610c1f333083600180611e93565b50565b6001600160a01b0381166000908152600d602052604081205460ff1615610c6257506001600160a01b038116600090815260076020526040902054610a9a565b6001600160a01b038216600090815260066020526040902054610c8490610a14565b92915050565b610c92611b5f565b610c9c60006122b6565b565b6013546001600160a01b03163314610cc85760405162461bcd60e51b8152600401610a77906133b5565b6001600160a01b0381166000908152600a6020526040902054821115610d285760405162461bcd60e51b8152602060048201526015602482015274185b5bdd5b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b6044820152606401610a77565b6001600160a01b0381166000908152600a602052604081208054849290610d509084906134f1565b9091555050604080518381526001600160a01b03831660208201527f07f21a7b10dec6539c8130232c54cd2c270dfae3458016c8ddb4d29ac9d0a82b91015b60405180910390a15050565b610da3611b5f565b6001600160a01b039091166000908152600c60209081526040808320805494151560ff199586168117909155600b9092529091208054909216179055565b6013546001600160a01b03163314610e0b5760405162461bcd60e51b8152600401610a77906133b5565b6001600160a01b0381166000908152600a6020526040902054821115610e6b5760405162461bcd60e51b8152602060048201526015602482015274185b5bdd5b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b6044820152606401610a77565b6001600160a01b0381166000908152600a602052604081208054849290610e939084906134f1565b90915550506013546040516323b872dd60e01b81526001600160a01b03808416600483015290911660248201526044810183905230906323b872dd90606401602060405180830381600087803b158015610eec57600080fd5b505af1158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2491906132b7565b50604080518381526001600160a01b03831660208201527f07f21a7b10dec6539c8130232c54cd2c270dfae3458016c8ddb4d29ac9d0a82b9101610d8f565b60606005805461093490613508565b610f7a611b5f565b6001600160a01b038116610fa05760405162461bcd60e51b8152600401610a779061338f565b6013546001600160a01b031615610ff95760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e6720636f6e747261637420616c726561647920736574000000006044820152606401610a77565b601380546001600160a01b0319166001600160a01b0383811691909117918290556110249116611c79565b506013546001600160a01b03166000908152600b60205260409020805460ff19166001179055565b601981815481106109df57600080fd5b6000338161106a82866112d2565b9050838110156110ca5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a77565b610a0982868684036113a2565b6000336109c5818585611540565b6110ed611b5f565b6001600160a01b0381166111135760405162461bcd60e51b8152600401610a779061338f565b6012546001600160a01b0316156111645760405162461bcd60e51b815260206004820152601560248201527413d0481dd85b1b195d08185b1c9958591e481cd95d605a1b6044820152606401610a77565b601280546001600160a01b0319166001600160a01b03838116919091179182905561118f9116611c79565b506012546001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6013546001600160a01b031633146111e15760405162461bcd60e51b8152600401610a77906133b5565b6001600160a01b0381166000908152600a602052604081205461120383610c22565b61120d91906134f1565b90508281101561125f5760405162461bcd60e51b815260206004820152601e60248201527f6c6f636b696e6720616d6f756e7420657863656564732062616c616e636500006044820152606401610a77565b6001600160a01b0382166000908152600a60205260408120805485929061128790849061349a565b9091555050604080518481526001600160a01b03841660208201527f73984e8db8b28e5bddacc2944750532e661c7b013e2cb7995f2e27cf54bb24d2910160405180910390a1505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b611305611b5f565b6001600160a01b03811661136a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a77565b610c1f816122b6565b601b81815481106109df57600080fd5b600061138f82846134b2565b9392505050565b600061138f82846134f1565b6001600160a01b0383166114045760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a77565b6001600160a01b0382166114655760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a77565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006114d284846112d2565b9050600019811461153a578181101561152d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a77565b61153a84848484036113a2565b50505050565b6001600160a01b0383166115a45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a77565b6001600160a01b0382166116065760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a77565b600081116116265760405162461bcd60e51b8152600401610a77906133e1565b6001600160a01b0383166000908152600a6020526040902054819061164a85610c22565b61165491906134f1565b10156116a25760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610a77565b6001600160a01b0382166000908152600f602052604090205460ff16611701576001600160a01b0382166000908152600f60205260408120805460ff1916600190811790915560188054919290916116fb90849061349a565b90915550505b8061170b84610c22565b61171591906134f1565b611752576001600160a01b0383166000908152600f60205260408120805460ff19169055601880546001929061174c9084906134f1565b90915550505b6001600160a01b0382166000908152600c602052604090205460ff1615801561179357506001600160a01b0383166000908152600e602052604090205460ff165b1561180f5760006117a383610c22565b6026549091506117b3838361349a565b111561180d5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d20627579207065722077616c6c6574206c6044820152631a5b5a5d60e21b6064820152608401610a77565b505b600061181a30610c22565b6025549091508110801590819061183b5750602454600160a01b900460ff16155b801561185f57506001600160a01b0384166000908152600e602052604090205460ff165b156119c457601654600090611875906002611383565b60175490915060006118878383612306565b905060255481106119c0576024805460ff60a01b1916600160a01b1790556025546118b190612312565b4760006118c8836118c2848861248f565b90611383565b905060006118d682846134f1565b905081156119295760006118f9856118c28960255461248f90919063ffffffff16565b9050611905818461249b565b6119248161191e8360165461139690919063ffffffff16565b90611396565b601655505b80156119af576012546040516000916001600160a01b03169083908381818185875af1925050503d806000811461197c576040519150601f19603f3d011682016040523d82523d6000602084013e611981565b606091505b505090506119aa6119a1866118c28960255461248f90919063ffffffff16565b60175490611396565b601755505b50506024805460ff60a01b19169055505b5050505b6001600160a01b0385166000908152600b602052604090205460019060ff1680611a0657506001600160a01b0385166000908152600b602052604090205460ff165b15611a1357506000611b26565b306000908152600f602052604090205460ff16611a6057306000908152600f60205260408120805460ff191660019081179091556018805491929091611a5a90849061349a565b90915550505b6013546001600160a01b03166000908152600f602052604090205460ff16611ac3576013546001600160a01b03166000908152600f60205260408120805460ff191660019081179091556018805491929091611abd90849061349a565b90915550505b6011546001600160a01b03166000908152600f602052604090205460ff16611b26576011546001600160a01b03166000908152600f60205260408120805460ff191660019081179091556018805491929091611b2090849061349a565b90915550505b611b34868686846000611e93565b505050505050565b6000806000611b4961255b565b9092509050611b588282611383565b9250505090565b6000546001600160a01b03163314610c9c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a77565b6001600160a01b0382166000908152600e602052604090205460ff1615158115151415611c4e5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610a77565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526006602052604090205415611cd3576001600160a01b038116600090815260066020526040902054611cb990610a14565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600d60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b60005b601054811015610b7a57816001600160a01b031660108281548110611d7157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611e815760108054611d9c906001906134f1565b81548110611dba57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601080546001600160a01b039092169183908110611df457634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600782526040808220829055600d90925220805460ff191690556010805480611e5a57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055610b7a565b80611e8b81613543565b915050611d3c565b6001600160a01b03851660009081526008602052604081208054859290611ebb90849061349a565b90915550829050611ee957611ee4600060208190556021819055601f819055601e819055602255565b611f8e565b8015611f0e57611ee461271060205560006021819055601f819055601e819055602255565b6001600160a01b0385166000908152600e602052604090205460ff16158015611f5057506001600160a01b0384166000908152600e602052604090205460ff16155b15611f5d57611ee4612744565b6001600160a01b0384166000908152600e602052604090205460ff1615611f8657611ee4612843565b611f8e612931565b6000602254601e54601f54602154602054611fa9919061349a565b611fb3919061349a565b611fbd919061349a565b611fc7919061349a565b90508015612021576000611fe16127106118c2878561248f565b9050611fed8582611396565b6001600160a01b0387166000908152600960205260408120805490919061201590849061349a565b9091555061204f915050565b6001600160a01b0385166000908152600960205260408120805486929061204990849061349a565b90915550505b600061205a85612a1f565b9050801561209f5761206b81612a3c565b6011546040518281526001600160a01b03918216918916906000805160206135988339815191529060200160405180910390a35b60006120aa86612afc565b9050801561214e576120bb81612b19565b6013546040516328f582d360e11b8152600481018390526001600160a01b03909116906351eb05a690602401600060405180830381600087803b15801561210157600080fd5b505af1158015612115573d6000803e3d6000fd5b50506013546040518481526001600160a01b039182169350908b1691506000805160206135988339815191529060200160405180910390a35b6001600160a01b0388166000908152600d602052604090205460ff16801561218f57506001600160a01b0387166000908152600d602052604090205460ff16155b156121a6576121a18888888486612bd8565b6122ac565b6001600160a01b0388166000908152600d602052604090205460ff161580156121e757506001600160a01b0387166000908152600d602052604090205460ff165b156121f9576121a18888888486612dbf565b6001600160a01b0388166000908152600d602052604090205460ff1615801561223b57506001600160a01b0387166000908152600d602052604090205460ff16155b1561224d576121a18888888486612e93565b6001600160a01b0388166000908152600d602052604090205460ff16801561228d57506001600160a01b0387166000908152600d602052604090205460ff165b1561229f576121a18888888486612f02565b6122ac8888888486612e93565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061138f828461349a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061235557634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092018101919091526023546040805163ef8ef56f60e01b81529051919093169263ef8ef56f926004808301939192829003018186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e191906131cb565b8160018151811061240257634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260235461242891309116846113a2565b60235460405163791ac94760e01b81526001600160a01b039091169063791ac9479061246190859060009086903090429060040161342a565b600060405180830381600087803b15801561247b57600080fd5b505af1158015611b34573d6000803e3d6000fd5b600061138f82846134d2565b6023546124b39030906001600160a01b0316846113a2565b60235460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561251b57600080fd5b505af115801561252f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612554919061330f565b5050505050565b60145460009081906c04350edef012dc126788340000825b6010548110156126fc578260066000601084815481106125a357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061261c57508160076000601084815481106125f557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561263e576014546c04350edef012dc12678834000094509450505050612740565b612692600660006010848154811061266657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611396565b92506126e860076000601084815481106126bc57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611396565b9150806126f481613543565b915050612573565b50601454612717906c04350edef012dc126788340000611383565b82101561273a576014546c04350edef012dc126788340000935093505050612740565b90925090505b9091565b601b60028154811061276657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602081905550601c60028154811061279957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602181905550601a6002815481106127cc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601f8190555060196002815481106127ff57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601e81905550601d60028154811061283257634e487b7160e01b600052603260045260246000fd5b600091825260209091200154602255565b601b60018154811061286557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602081905550601c60018154811061289857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602181905550601a6001815481106128cb57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601f8190555060196001815481106128fe57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601e81905550601d60018154811061283257634e487b7160e01b600052603260045260246000fd5b601b60008154811061295357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602081905550601c60008154811061298657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602181905550601a6000815481106129b957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601f8190555060196000815481106129ec57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601e81905550601d60008154811061283257634e487b7160e01b600052603260045260246000fd5b6000610c846127106118c26022548561248f90919063ffffffff16565b6000612a46611b3c565b90506000612a54838361248f565b6011546001600160a01b0316600090815260066020526040902054909150612a7c9082612306565b601180546001600160a01b0390811660009081526006602090815260408083209590955592549091168152600d909152205460ff1615612af7576011546001600160a01b0316600090815260076020526040902054612adb9084612306565b6011546001600160a01b03166000908152600760205260409020555b505050565b6000610c846127106118c26021548561248f90919063ffffffff16565b6000612b23611b3c565b90506000612b31838361248f565b6013546001600160a01b0316600090815260066020526040902054909150612b599082612306565b601380546001600160a01b0390811660009081526006602090815260408083209590955592549091168152600d909152205460ff1615612af7576013546001600160a01b0316600090815260076020526040902054612bb89084612306565b6013546001600160a01b0316600090815260076020526040902055505050565b6000806000806000806000612bec8a612fa0565b9650965096509650965096509650612c118861191e8b8761139690919063ffffffff16565b9350612c44612c28612c21611b3c565b8a9061248f565b61191e612c3d612c36611b3c565b8d9061248f565b8990611396565b6001600160a01b038d16600090815260076020526040902054909650612c6a908b611396565b6001600160a01b038d16600090815260076020908152604080832093909355600690522054612c999088611396565b6001600160a01b03808e1660009081526006602052604080822093909355908d1681522054612cc89087612306565b6001600160a01b038c16600090815260066020526040902055612cea82612ffb565b612cf381612ffb565b612cfd8584613083565b8160166000828254612d0f919061349a565b925050819055508060176000828254612d28919061349a565b9091555060009050612d3a8284612306565b1115612d7657306001600160a01b038d16600080516020613598833981519152612d648486612306565b60405190815260200160405180910390a35b8a6001600160a01b03168c6001600160a01b031660008051602061359883398151915286604051612da991815260200190565b60405180910390a3505050505050505050505050565b6000806000806000806000612dd38a612fa0565b9650965096509650965096509650612df88861191e8b8761139690919063ffffffff16565b9350612e08612c28612c21611b3c565b6001600160a01b038d16600090815260066020526040902054909650612e2e9088611396565b6001600160a01b03808e16600090815260066020908152604080832094909455918e16815260079091522054612e649085612306565b6001600160a01b038c16600090815260076020908152604080832093909355600690522054612cc89087612306565b6000806000806000806000612ea78a612fa0565b9650965096509650965096509650612ecc8861191e8b8761139690919063ffffffff16565b9350612edc612c28612c21611b3c565b6001600160a01b038d16600090815260066020526040902054909650612c999088611396565b6000806000806000806000612f168a612fa0565b9650965096509650965096509650612f3b8861191e8b8761139690919063ffffffff16565b9350612f4b612c28612c21611b3c565b6001600160a01b038d16600090815260076020526040902054909650612f71908b611396565b6001600160a01b038d16600090815260076020908152604080832093909355600690522054612e2e9088611396565b6000806000806000806000806000806000612fba8c6130a7565b93509350935093506000806000612fdb8f878787612fd6611b3c565b6130f6565b919f509d509b509599509397509195509350505050919395979092949650565b6000613005611b3c565b90506000613013838361248f565b306000908152600660205260409020549091506130309082612306565b30600090815260066020908152604080832093909355600d9052205460ff1615612af7573060009081526007602052604090205461306e9084612306565b30600090815260076020526040902055505050565b6014546130909083611396565b6014556015546130a09082612306565b6015555050565b60008060008060006130b886613158565b905060006130c587613175565b905060006130d288613192565b905060006130e68261191e85818d89611396565b9993985091965094509092505050565b6000808080613105898661248f565b90506000613113898761248f565b90506000613121898861248f565b9050600061312f898961248f565b905060006131438261191e85818989611396565b949d949c50929a509298505050505050505050565b6000610c846127106118c26020548561248f90919063ffffffff16565b6000610c846127106118c2601e548561248f90919063ffffffff16565b6000610c846127106118c2601f548561248f90919063ffffffff16565b6000602082840312156131c0578081fd5b813561138f81613574565b6000602082840312156131dc578081fd5b815161138f81613574565b600080604083850312156131f9578081fd5b823561320481613574565b9150602083013561321481613574565b809150509250929050565b600080600060608486031215613233578081fd5b833561323e81613574565b9250602084013561324e81613574565b929592945050506040919091013590565b60008060408385031215613271578182fd5b823561327c81613574565b9150602083013561321481613589565b6000806040838503121561329e578182fd5b82356132a981613574565b946020939093013593505050565b6000602082840312156132c8578081fd5b815161138f81613589565b6000602082840312156132e4578081fd5b5035919050565b600080604083850312156132fd578182fd5b82359150602083013561321481613574565b600080600060608486031215613323578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b818110156133685785810183015185820160400152820161334c565b818111156133795783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b6020808252601290820152711cd95b99195c881b9bdd08185b1b1bddd95960721b604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156134795784516001600160a01b031683529383019391830191600101613454565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156134ad576134ad61355e565b500190565b6000826134cd57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156134ec576134ec61355e565b500290565b6000828210156135035761350361355e565b500390565b60028104600182168061351c57607f821691505b6020821081141561353d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135575761355761355e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610c1f57600080fd5b8015158114610c1f57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122056082ba8172949aab7b4d6ac486c79927909a1a718c1014d870b1b0477ce9d3b64736f6c63430008020033000000000000000000000000e7c3e8ec428d53dd4df79944df291c8c976992e7

Deployed ByteCode

0x6080604052600436106102975760003560e01c806382f2a18a1161015a578063a9059cbb116100c1578063dd62ed3e1161007a578063dd62ed3e1461086f578063e2f456051461088f578063ee99205c146108a5578063f2fde38b146108c5578063fcef8867146108e5578063fe3f52f4146109055761029e565b8063a9059cbb14610792578063aec9b6f4146107b2578063c64a041b146107d2578063c8e3a2ee146107ff578063cec1460b1461081f578063d4d7b19a1461083f5761029e565b806398c142cb1161011357806398c142cb146106c25780639dd373b9146106d8578063a046bc78146106f8578063a08dbe7b14610718578063a153e70814610745578063a457c2d7146107725761029e565b806382f2a18a146105fc57806388a06f8b1461061c57806388f82020146106495780638cadf61d146106795780638da5cb5b1461068f57806395d89b41146106ad5761029e565b806349ae028a116101fe5780636ba5b8b8116101b75780636ba5b8b81461055b57806370a0823114610571578063715018a6146105915780637326afe0146105a65780638188f71c146105c657806381905bf8146105dc5761029e565b806349ae028a1461047c5780634df9cfb31461049c5780634ead1ef6146104c95780634ec27aac146104e95780635342acb41461050b57806357afa4c71461053b5761029e565b8063255fe84711610250578063255fe847146103a05780632d838119146103d0578063313ce567146103f0578063371974a31461040c578063391f70c81461043c578063395093511461045c5761029e565b806306228749146102a357806306fdde03146102e0578063095ea7b3146103025780630bee3e551461033257806318160ddd1461036057806323b872dd146103805761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506011546102c3906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102ec57600080fd5b506102f5610925565b6040516102d7919061333c565b34801561030e57600080fd5b5061032261031d36600461328c565b6109b7565b60405190151581526020016102d7565b34801561033e57600080fd5b5061035261034d3660046132d3565b6109cf565b6040519081526020016102d7565b34801561036c57600080fd5b506c04350edef012dc126788340000610352565b34801561038c57600080fd5b5061032261039b36600461321f565b6109f0565b3480156103ac57600080fd5b506103226103bb3660046131af565b600e6020526000908152604090205460ff1681565b3480156103dc57600080fd5b506103526103eb3660046132d3565b610a14565b3480156103fc57600080fd5b50604051601281526020016102d7565b34801561041857600080fd5b506103226104273660046131af565b600c6020526000908152604090205460ff1681565b34801561044857600080fd5b506012546102c3906001600160a01b031681565b34801561046857600080fd5b5061032261047736600461328c565b610a9f565b34801561048857600080fd5b506103526104973660046132d3565b610ac1565b3480156104a857600080fd5b506103526104b73660046131af565b60096020526000908152604090205481565b3480156104d557600080fd5b506103526104e43660046132d3565b610ad1565b3480156104f557600080fd5b5061050961050436600461325f565b610ae1565b005b34801561051757600080fd5b506103226105263660046131af565b600b6020526000908152604090205460ff1681565b34801561054757600080fd5b506105096105563660046132d3565b610b7e565b34801561056757600080fd5b5061035260165481565b34801561057d57600080fd5b5061035261058c3660046131af565b610c22565b34801561059d57600080fd5b50610509610c8a565b3480156105b257600080fd5b506105096105c13660046132eb565b610c9e565b3480156105d257600080fd5b5061035260185481565b3480156105e857600080fd5b506105096105f736600461325f565b610d9b565b34801561060857600080fd5b506105096106173660046132eb565b610de1565b34801561062857600080fd5b506103526106373660046131af565b60066020526000908152604090205481565b34801561065557600080fd5b506103226106643660046131af565b600d6020526000908152604090205460ff1681565b34801561068557600080fd5b5061035260265481565b34801561069b57600080fd5b506000546001600160a01b03166102c3565b3480156106b957600080fd5b506102f5610f63565b3480156106ce57600080fd5b5061035260175481565b3480156106e457600080fd5b506105096106f33660046131af565b610f72565b34801561070457600080fd5b506103526107133660046132d3565b61104c565b34801561072457600080fd5b506103526107333660046131af565b60076020526000908152604090205481565b34801561075157600080fd5b506103526107603660046131af565b600a6020526000908152604090205481565b34801561077e57600080fd5b5061032261078d36600461328c565b61105c565b34801561079e57600080fd5b506103226107ad36600461328c565b6110d7565b3480156107be57600080fd5b506023546102c3906001600160a01b031681565b3480156107de57600080fd5b506103526107ed3660046131af565b60086020526000908152604090205481565b34801561080b57600080fd5b5061050961081a3660046131af565b6110e5565b34801561082b57600080fd5b5061050961083a3660046132eb565b6111b7565b34801561084b57600080fd5b5061032261085a3660046131af565b600f6020526000908152604090205460ff1681565b34801561087b57600080fd5b5061035261088a3660046131e7565b6112d2565b34801561089b57600080fd5b5061035260255481565b3480156108b157600080fd5b506013546102c3906001600160a01b031681565b3480156108d157600080fd5b506105096108e03660046131af565b6112fd565b3480156108f157600080fd5b506103526109003660046132d3565b611373565b34801561091157600080fd5b506024546102c3906001600160a01b031681565b60606004805461093490613508565b80601f016020809104026020016040519081016040528092919081815260200182805461096090613508565b80156109ad5780601f10610982576101008083540402835291602001916109ad565b820191906000526020600020905b81548152906001019060200180831161099057829003601f168201915b5050505050905090565b6000336109c58185856113a2565b5060019392505050565b601a81815481106109df57600080fd5b600091825260209091200154905081565b6000336109fe8582856114c6565b610a09858585611540565b506001949350505050565b6000601454821115610a805760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b6000610a8a611b3c565b9050610a968382611383565b9150505b919050565b6000336109c5818585610ab283836112d2565b610abc919061349a565b6113a2565b601d81815481106109df57600080fd5b601c81815481106109df57600080fd5b610ae9611b5f565b6001600160a01b038216610b0f5760405162461bcd60e51b8152600401610a779061338f565b610b198282611bb9565b8015610b5057610b2882611c79565b6001600160a01b0382166000908152600c60205260409020805460ff19166001179055610b7a565b610b5982611d39565b6001600160a01b0382166000908152600c60205260409020805460ff191690555b5050565b60008111610b9e5760405162461bcd60e51b8152600401610a77906133e1565b336000818152600a60205260409020548291610bb990610c22565b610bc391906134f1565b1015610c115760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610a77565b610c1f333083600180611e93565b50565b6001600160a01b0381166000908152600d602052604081205460ff1615610c6257506001600160a01b038116600090815260076020526040902054610a9a565b6001600160a01b038216600090815260066020526040902054610c8490610a14565b92915050565b610c92611b5f565b610c9c60006122b6565b565b6013546001600160a01b03163314610cc85760405162461bcd60e51b8152600401610a77906133b5565b6001600160a01b0381166000908152600a6020526040902054821115610d285760405162461bcd60e51b8152602060048201526015602482015274185b5bdd5b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b6044820152606401610a77565b6001600160a01b0381166000908152600a602052604081208054849290610d509084906134f1565b9091555050604080518381526001600160a01b03831660208201527f07f21a7b10dec6539c8130232c54cd2c270dfae3458016c8ddb4d29ac9d0a82b91015b60405180910390a15050565b610da3611b5f565b6001600160a01b039091166000908152600c60209081526040808320805494151560ff199586168117909155600b9092529091208054909216179055565b6013546001600160a01b03163314610e0b5760405162461bcd60e51b8152600401610a77906133b5565b6001600160a01b0381166000908152600a6020526040902054821115610e6b5760405162461bcd60e51b8152602060048201526015602482015274185b5bdd5b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b6044820152606401610a77565b6001600160a01b0381166000908152600a602052604081208054849290610e939084906134f1565b90915550506013546040516323b872dd60e01b81526001600160a01b03808416600483015290911660248201526044810183905230906323b872dd90606401602060405180830381600087803b158015610eec57600080fd5b505af1158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2491906132b7565b50604080518381526001600160a01b03831660208201527f07f21a7b10dec6539c8130232c54cd2c270dfae3458016c8ddb4d29ac9d0a82b9101610d8f565b60606005805461093490613508565b610f7a611b5f565b6001600160a01b038116610fa05760405162461bcd60e51b8152600401610a779061338f565b6013546001600160a01b031615610ff95760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e6720636f6e747261637420616c726561647920736574000000006044820152606401610a77565b601380546001600160a01b0319166001600160a01b0383811691909117918290556110249116611c79565b506013546001600160a01b03166000908152600b60205260409020805460ff19166001179055565b601981815481106109df57600080fd5b6000338161106a82866112d2565b9050838110156110ca5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a77565b610a0982868684036113a2565b6000336109c5818585611540565b6110ed611b5f565b6001600160a01b0381166111135760405162461bcd60e51b8152600401610a779061338f565b6012546001600160a01b0316156111645760405162461bcd60e51b815260206004820152601560248201527413d0481dd85b1b195d08185b1c9958591e481cd95d605a1b6044820152606401610a77565b601280546001600160a01b0319166001600160a01b03838116919091179182905561118f9116611c79565b506012546001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6013546001600160a01b031633146111e15760405162461bcd60e51b8152600401610a77906133b5565b6001600160a01b0381166000908152600a602052604081205461120383610c22565b61120d91906134f1565b90508281101561125f5760405162461bcd60e51b815260206004820152601e60248201527f6c6f636b696e6720616d6f756e7420657863656564732062616c616e636500006044820152606401610a77565b6001600160a01b0382166000908152600a60205260408120805485929061128790849061349a565b9091555050604080518481526001600160a01b03841660208201527f73984e8db8b28e5bddacc2944750532e661c7b013e2cb7995f2e27cf54bb24d2910160405180910390a1505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b611305611b5f565b6001600160a01b03811661136a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a77565b610c1f816122b6565b601b81815481106109df57600080fd5b600061138f82846134b2565b9392505050565b600061138f82846134f1565b6001600160a01b0383166114045760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a77565b6001600160a01b0382166114655760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a77565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006114d284846112d2565b9050600019811461153a578181101561152d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a77565b61153a84848484036113a2565b50505050565b6001600160a01b0383166115a45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a77565b6001600160a01b0382166116065760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a77565b600081116116265760405162461bcd60e51b8152600401610a77906133e1565b6001600160a01b0383166000908152600a6020526040902054819061164a85610c22565b61165491906134f1565b10156116a25760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610a77565b6001600160a01b0382166000908152600f602052604090205460ff16611701576001600160a01b0382166000908152600f60205260408120805460ff1916600190811790915560188054919290916116fb90849061349a565b90915550505b8061170b84610c22565b61171591906134f1565b611752576001600160a01b0383166000908152600f60205260408120805460ff19169055601880546001929061174c9084906134f1565b90915550505b6001600160a01b0382166000908152600c602052604090205460ff1615801561179357506001600160a01b0383166000908152600e602052604090205460ff165b1561180f5760006117a383610c22565b6026549091506117b3838361349a565b111561180d5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d20627579207065722077616c6c6574206c6044820152631a5b5a5d60e21b6064820152608401610a77565b505b600061181a30610c22565b6025549091508110801590819061183b5750602454600160a01b900460ff16155b801561185f57506001600160a01b0384166000908152600e602052604090205460ff165b156119c457601654600090611875906002611383565b60175490915060006118878383612306565b905060255481106119c0576024805460ff60a01b1916600160a01b1790556025546118b190612312565b4760006118c8836118c2848861248f565b90611383565b905060006118d682846134f1565b905081156119295760006118f9856118c28960255461248f90919063ffffffff16565b9050611905818461249b565b6119248161191e8360165461139690919063ffffffff16565b90611396565b601655505b80156119af576012546040516000916001600160a01b03169083908381818185875af1925050503d806000811461197c576040519150601f19603f3d011682016040523d82523d6000602084013e611981565b606091505b505090506119aa6119a1866118c28960255461248f90919063ffffffff16565b60175490611396565b601755505b50506024805460ff60a01b19169055505b5050505b6001600160a01b0385166000908152600b602052604090205460019060ff1680611a0657506001600160a01b0385166000908152600b602052604090205460ff165b15611a1357506000611b26565b306000908152600f602052604090205460ff16611a6057306000908152600f60205260408120805460ff191660019081179091556018805491929091611a5a90849061349a565b90915550505b6013546001600160a01b03166000908152600f602052604090205460ff16611ac3576013546001600160a01b03166000908152600f60205260408120805460ff191660019081179091556018805491929091611abd90849061349a565b90915550505b6011546001600160a01b03166000908152600f602052604090205460ff16611b26576011546001600160a01b03166000908152600f60205260408120805460ff191660019081179091556018805491929091611b2090849061349a565b90915550505b611b34868686846000611e93565b505050505050565b6000806000611b4961255b565b9092509050611b588282611383565b9250505090565b6000546001600160a01b03163314610c9c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a77565b6001600160a01b0382166000908152600e602052604090205460ff1615158115151415611c4e5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610a77565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526006602052604090205415611cd3576001600160a01b038116600090815260066020526040902054611cb990610a14565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600d60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b60005b601054811015610b7a57816001600160a01b031660108281548110611d7157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611e815760108054611d9c906001906134f1565b81548110611dba57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601080546001600160a01b039092169183908110611df457634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600782526040808220829055600d90925220805460ff191690556010805480611e5a57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055610b7a565b80611e8b81613543565b915050611d3c565b6001600160a01b03851660009081526008602052604081208054859290611ebb90849061349a565b90915550829050611ee957611ee4600060208190556021819055601f819055601e819055602255565b611f8e565b8015611f0e57611ee461271060205560006021819055601f819055601e819055602255565b6001600160a01b0385166000908152600e602052604090205460ff16158015611f5057506001600160a01b0384166000908152600e602052604090205460ff16155b15611f5d57611ee4612744565b6001600160a01b0384166000908152600e602052604090205460ff1615611f8657611ee4612843565b611f8e612931565b6000602254601e54601f54602154602054611fa9919061349a565b611fb3919061349a565b611fbd919061349a565b611fc7919061349a565b90508015612021576000611fe16127106118c2878561248f565b9050611fed8582611396565b6001600160a01b0387166000908152600960205260408120805490919061201590849061349a565b9091555061204f915050565b6001600160a01b0385166000908152600960205260408120805486929061204990849061349a565b90915550505b600061205a85612a1f565b9050801561209f5761206b81612a3c565b6011546040518281526001600160a01b03918216918916906000805160206135988339815191529060200160405180910390a35b60006120aa86612afc565b9050801561214e576120bb81612b19565b6013546040516328f582d360e11b8152600481018390526001600160a01b03909116906351eb05a690602401600060405180830381600087803b15801561210157600080fd5b505af1158015612115573d6000803e3d6000fd5b50506013546040518481526001600160a01b039182169350908b1691506000805160206135988339815191529060200160405180910390a35b6001600160a01b0388166000908152600d602052604090205460ff16801561218f57506001600160a01b0387166000908152600d602052604090205460ff16155b156121a6576121a18888888486612bd8565b6122ac565b6001600160a01b0388166000908152600d602052604090205460ff161580156121e757506001600160a01b0387166000908152600d602052604090205460ff165b156121f9576121a18888888486612dbf565b6001600160a01b0388166000908152600d602052604090205460ff1615801561223b57506001600160a01b0387166000908152600d602052604090205460ff16155b1561224d576121a18888888486612e93565b6001600160a01b0388166000908152600d602052604090205460ff16801561228d57506001600160a01b0387166000908152600d602052604090205460ff165b1561229f576121a18888888486612f02565b6122ac8888888486612e93565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061138f828461349a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061235557634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092018101919091526023546040805163ef8ef56f60e01b81529051919093169263ef8ef56f926004808301939192829003018186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e191906131cb565b8160018151811061240257634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260235461242891309116846113a2565b60235460405163791ac94760e01b81526001600160a01b039091169063791ac9479061246190859060009086903090429060040161342a565b600060405180830381600087803b15801561247b57600080fd5b505af1158015611b34573d6000803e3d6000fd5b600061138f82846134d2565b6023546124b39030906001600160a01b0316846113a2565b60235460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561251b57600080fd5b505af115801561252f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612554919061330f565b5050505050565b60145460009081906c04350edef012dc126788340000825b6010548110156126fc578260066000601084815481106125a357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061261c57508160076000601084815481106125f557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561263e576014546c04350edef012dc12678834000094509450505050612740565b612692600660006010848154811061266657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611396565b92506126e860076000601084815481106126bc57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611396565b9150806126f481613543565b915050612573565b50601454612717906c04350edef012dc126788340000611383565b82101561273a576014546c04350edef012dc126788340000935093505050612740565b90925090505b9091565b601b60028154811061276657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602081905550601c60028154811061279957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602181905550601a6002815481106127cc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601f8190555060196002815481106127ff57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601e81905550601d60028154811061283257634e487b7160e01b600052603260045260246000fd5b600091825260209091200154602255565b601b60018154811061286557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602081905550601c60018154811061289857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602181905550601a6001815481106128cb57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601f8190555060196001815481106128fe57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601e81905550601d60018154811061283257634e487b7160e01b600052603260045260246000fd5b601b60008154811061295357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602081905550601c60008154811061298657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154602181905550601a6000815481106129b957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601f8190555060196000815481106129ec57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601e81905550601d60008154811061283257634e487b7160e01b600052603260045260246000fd5b6000610c846127106118c26022548561248f90919063ffffffff16565b6000612a46611b3c565b90506000612a54838361248f565b6011546001600160a01b0316600090815260066020526040902054909150612a7c9082612306565b601180546001600160a01b0390811660009081526006602090815260408083209590955592549091168152600d909152205460ff1615612af7576011546001600160a01b0316600090815260076020526040902054612adb9084612306565b6011546001600160a01b03166000908152600760205260409020555b505050565b6000610c846127106118c26021548561248f90919063ffffffff16565b6000612b23611b3c565b90506000612b31838361248f565b6013546001600160a01b0316600090815260066020526040902054909150612b599082612306565b601380546001600160a01b0390811660009081526006602090815260408083209590955592549091168152600d909152205460ff1615612af7576013546001600160a01b0316600090815260076020526040902054612bb89084612306565b6013546001600160a01b0316600090815260076020526040902055505050565b6000806000806000806000612bec8a612fa0565b9650965096509650965096509650612c118861191e8b8761139690919063ffffffff16565b9350612c44612c28612c21611b3c565b8a9061248f565b61191e612c3d612c36611b3c565b8d9061248f565b8990611396565b6001600160a01b038d16600090815260076020526040902054909650612c6a908b611396565b6001600160a01b038d16600090815260076020908152604080832093909355600690522054612c999088611396565b6001600160a01b03808e1660009081526006602052604080822093909355908d1681522054612cc89087612306565b6001600160a01b038c16600090815260066020526040902055612cea82612ffb565b612cf381612ffb565b612cfd8584613083565b8160166000828254612d0f919061349a565b925050819055508060176000828254612d28919061349a565b9091555060009050612d3a8284612306565b1115612d7657306001600160a01b038d16600080516020613598833981519152612d648486612306565b60405190815260200160405180910390a35b8a6001600160a01b03168c6001600160a01b031660008051602061359883398151915286604051612da991815260200190565b60405180910390a3505050505050505050505050565b6000806000806000806000612dd38a612fa0565b9650965096509650965096509650612df88861191e8b8761139690919063ffffffff16565b9350612e08612c28612c21611b3c565b6001600160a01b038d16600090815260066020526040902054909650612e2e9088611396565b6001600160a01b03808e16600090815260066020908152604080832094909455918e16815260079091522054612e649085612306565b6001600160a01b038c16600090815260076020908152604080832093909355600690522054612cc89087612306565b6000806000806000806000612ea78a612fa0565b9650965096509650965096509650612ecc8861191e8b8761139690919063ffffffff16565b9350612edc612c28612c21611b3c565b6001600160a01b038d16600090815260066020526040902054909650612c999088611396565b6000806000806000806000612f168a612fa0565b9650965096509650965096509650612f3b8861191e8b8761139690919063ffffffff16565b9350612f4b612c28612c21611b3c565b6001600160a01b038d16600090815260076020526040902054909650612f71908b611396565b6001600160a01b038d16600090815260076020908152604080832093909355600690522054612e2e9088611396565b6000806000806000806000806000806000612fba8c6130a7565b93509350935093506000806000612fdb8f878787612fd6611b3c565b6130f6565b919f509d509b509599509397509195509350505050919395979092949650565b6000613005611b3c565b90506000613013838361248f565b306000908152600660205260409020549091506130309082612306565b30600090815260066020908152604080832093909355600d9052205460ff1615612af7573060009081526007602052604090205461306e9084612306565b30600090815260076020526040902055505050565b6014546130909083611396565b6014556015546130a09082612306565b6015555050565b60008060008060006130b886613158565b905060006130c587613175565b905060006130d288613192565b905060006130e68261191e85818d89611396565b9993985091965094509092505050565b6000808080613105898661248f565b90506000613113898761248f565b90506000613121898861248f565b9050600061312f898961248f565b905060006131438261191e85818989611396565b949d949c50929a509298505050505050505050565b6000610c846127106118c26020548561248f90919063ffffffff16565b6000610c846127106118c2601e548561248f90919063ffffffff16565b6000610c846127106118c2601f548561248f90919063ffffffff16565b6000602082840312156131c0578081fd5b813561138f81613574565b6000602082840312156131dc578081fd5b815161138f81613574565b600080604083850312156131f9578081fd5b823561320481613574565b9150602083013561321481613574565b809150509250929050565b600080600060608486031215613233578081fd5b833561323e81613574565b9250602084013561324e81613574565b929592945050506040919091013590565b60008060408385031215613271578182fd5b823561327c81613574565b9150602083013561321481613589565b6000806040838503121561329e578182fd5b82356132a981613574565b946020939093013593505050565b6000602082840312156132c8578081fd5b815161138f81613589565b6000602082840312156132e4578081fd5b5035919050565b600080604083850312156132fd578182fd5b82359150602083013561321481613574565b600080600060608486031215613323578283fd5b8351925060208401519150604084015190509250925092565b6000602080835283518082850152825b818110156133685785810183015185820160400152820161334c565b818111156133795783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b6020808252601290820152711cd95b99195c881b9bdd08185b1b1bddd95960721b604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156134795784516001600160a01b031683529383019391830191600101613454565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156134ad576134ad61355e565b500190565b6000826134cd57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156134ec576134ec61355e565b500290565b6000828210156135035761350361355e565b500390565b60028104600182168061351c57607f821691505b6020821081141561353d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135575761355761355e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610c1f57600080fd5b8015158114610c1f57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122056082ba8172949aab7b4d6ac486c79927909a1a718c1014d870b1b0477ce9d3b64736f6c63430008020033