/**
The Absolute Greatest To Have Ever Played AND Lived!

         ........................................................................'',,,,,,,''''''''''
      ....................................''.......................................''',,''''''......
    ................................',''',,''''''''''''''........     ..............................
   ...........................'''',;::::::;;;;,,'''''''''.'''''......   ............................
   .......................'''',::cccllcllccllcc:;;;;,,'''''''''''...................................
    ...................',',;::cllc:::;,;;;:ccllcccccc:;;,',,''''.''''''.............................
     ...............',;;;ccllc:c:,','..'''''',,;cllc:::::::;,,''''''''''............................
         ..........;::loooolc:;,..............';:;,,,,,;:::::;;,,''''''''''.........................
               ..,:looxxoc:;,,,......................'',,;cc:col:;,'...'''''''......................
              ..,:clolll:;,,'''.........................',;;;loocc;,'......'''''....................
             .',:c:::;;;,,'''''''.........................'';:c::cc;'...............................
           ..,:::;''',''''''''.''............................',;;;;:;,'...........................  
          .',,;;;,'''''''.......'.............................'',;:;,,'.......................      
  ..     .,;'',,,;,,''...........'''...'......................',;:;;;,,,'...................        
.........';,',;:c:;,,'..........''''.''''.....................'';:loool:,'................          
.........',,;coxxxdc;''..............''''''..................',:okOOOOkdl:;,'.............          
.........,:cok0KKK0ko:'..............'''''''..............',:ldkOOO0000Okdlc;'..........            
.......',:lxO0KKKKK0Odl:,'......'''''''''''',,,,,,,,,,;;clodkOO000OOOOOOkxdoc;'.........            
......',:cxO00000KKKK0OOxdolc:::::;,,,,,,;;;:loooddddxkkOOOOOOOkkkkkkkkkkkkxo:;,'........           
......',:lxOOOOOOO0000000000OOkxdddlccc:clodxO00000000000OOOOOOOkkxxxdddxxkxol:;,'.......           
.....',;:lxkkkkkO000KKKKKKKKKKK0000OkkkxxkO000OOOOOOOOOOkkkkkxxddddddxxdxxxdoc:;,''.......          
.....',:cldxxxxxkkkOOOO000000O0000000000OOO0000000000000OOOOOkkxxddddddoddxdoc:;''.......           
......,:loxxxxkkOO00000KKKKKKKKKKKKK00KKKKKKK00Okkkkkkkkkkkkkxxxddddddddddddol:;,'........          
.....';ldxxxxkkxxxkkkkOOOOOOOO000KKK00OOkkxxddxxxkkkOOOOOkkkxxxxdddddddoooddol:;'.........          
   ..,:ldxxxxkxxkkOOO0000OOOkkkkkkkkxxxxxxkOOO00000OOkkxxxxxkkxxxdddddooooooolc:,''....'.....'..    
    .,;ldxxxkkxxddddxxxkkO000000000000000KKKKKK00OOkOOOOOkkxxxxxxxxddddooooooolll:,'.......,dkd:.   
    .';cdxxxxxkxxkkkkkkxxxxxdddddxxxxkkkkkkkxxxddxxxxxxxxxkkOOO000OOkkxdooodddodolc;'. ....:ddoc'.  
   ..':lddxxxxkkkkOOOOOOO0000OOOOkkkkxxxxxxddxxxkkOOOO0000000OOkxdoloooooodddddoooo:'.....,clc:;;.  
 ..:;,ldxxxxxkkO0KKKKK0OOOOOOO0000KKKKKKKKKKKKKKKKKKKKKK0000Oxxoc;,;:cclooddddddool:'....;coool:c;..
 .lko;cdxkkkkxdodkO00KKKXXXKK000000000000000KKKKKKXKKK00Okxdoc;,'',;::cclodddddddooc'...;ldxxxdol:'.
..;ol,:dxkkxdoc::codxxkkOO0KKXXXKKKKK000KKKKKKXXKK00OOxol:,,'..';coddxxdooodxddddddl;..,loooolloo:'.
...:c;,lxxxdoc:;,,,,,;;;:codkO00KKKKKKKKKKKKKKK00kxxdlc;'..'',:ldkOOOOOkxdddddxxxddo:'':olc;;;cod:..
...:oc;lxxdddddooc;''''..';:codxOO000000000000Okdollcc;,'',,;;:clodxxxxxxdddddxxxxxdl;;lllll::lddc'.
...cxdcokxxxOOOOkxdl:;;,,,,;;clodxkOOOOOOOOOkkxolccc::;'........''',;:clooddxxxxkxxddlcloodolcldxl'.
...cddldkxxxxxxdol:;,''....',;:clodxxxxxxxxxxdol::;;,'......'''',,,'',;:cloxxxkkkxxddooodxddolldxl,.
...cdoldkkxdlc:;'..............',;cloddddddoolc:;,''..........,;,'',,;::clodxxxxxxxddoodkkxddddxdo,.
...cxddkOOxoc:;,'...';,......'....';coxxxxxdoc:,''..'',;,.....,oo:;;:ccloodxxxxxxxxdddodkkkkkkkxxd;.
...cxxxk0Okoc:::;,';lo:.....,c:;;;,,;okO000kdl:;;;;;;;:lc,..',:ooolooodxxkkxxkkxxxxddoodkkkkkOOOOx;.
..'lkkkkOOOxdoloooooool:;;;;clllllolcd0KKKKOxolodoolclllllccllllooooodxxkkkkkkkxxxddoolodxxxkkkkko'.
..'okkkkOOOkkkkxddddooollllccccloodddOKXXXK0kxdxkxddlcccc::::ccccclodxxkkkkkkkkkxxdooccccclldxxxl;''
..,dOOkkkOOOOOOOkxdolllcc::ccclloodxk0XXXXXKOxxkkkkxxdoolcc:::cclodxkkOOOOOOkkkxxdolc:;',:ldxxo:,'''
..'d0K0kkOO00OOOOkkxdolllccclodxkkkkOKXXXXKKOkxkOOOOOOOkkxxdxxxkkOOOO00OOOOOOkkxddoc:,.  .,;;,...''.
...lO0OkxkO000000OOkxddoooodxkO00OOkOKXXXXKK0kxkOOOOOO000000000000000000000Okkxdoolc;'.        ..'''
...,okOkkkOO00000000OOOOOO00KK000OOkOKXXXXKK0kxxkOOOO0000000KK00000KKK0000OOkxxddolc:,.        ..''.
.....:dkkxkO0000KKKKXXXXXXKKKKKK00OOOKXXXXKK0kxxkOO00000000000K0000KK0000OOkkxddooll:,..        ....
.......,:lxkOO0KKXXXXXXXXXKKKK000K0OO0KXXKK00kkkOO000OkxdxxkOO000000000OOOkkxdooooolc,..        ....
.........'lxkO0KKKKKKKKKKK0OkdodO000O0KXXKK0OkkkOOOOOOOxl:::ldxxkOOOOOOOkkxxddooooooc;'..     ..... 
....     .;dxkO00000000OOkxoc;:dOKK000KXXK0OOkkOO000000Oo:;,,;;clddxxxxxxddoooooodooc;'..    ...... 
          .lxxkkkkOOOkkxdoc;,,;d0KKK0KKXXKK00OOkO00000Oxocccc:;,,;:llooooollcloodool:;,..    .....  
         ..:doodddddddolc;'',;cdkO0000KKKKKK0OkkOOkkxolcloooool:,'',;:ccllllccoooolc:;,'.     ....  
      ...'';olcc::ccc:;,'..,:cllllldxkOOOOOOkxddoc:;,,;cccloolc;;,'...',:clocclool:::;;'.      ..   
  ....',,,'':llc;;::;'...',;:::::;,,;clloooool:;'....',;;,,,;,'........';ccllcllc:;:::;,.      .   .
..',,,,,'''.,clocclc,.......''''''.....'',,,,'.........''..............':ccccccc:;::::;,..   ..   ..
,,,,,,''.....':lllll:'..........................................';:;;;,:cccccc:;;:cc::;'..  .... ...
,,,,'..........;ccccc:;,,,,'...  ..'.................'',;,..',;clllcc::clccc::;;:cccc:,........ ....
,,,'............';::::::;;cllc;,...;cccccllc:;:loolccdollc;:cloddoollc:cc::;;;:ccccc:,....'...  ....
,''...............;:;;::;:cloooolc;;:coddxxxdodxkkkdoolclooodddddooolc:::;;,,:ccccc:,.........  ....
''.............. .;:;,,,,;cllodddddollooooooolooloolcodxdoooddddddddolc::;,,;cccc::,.........  .....
'................';:::;,',:cllllooodxkkxdddddddddddxkkxdooooddddddddolc:;,,;::c::;,......'..   .....
..................;::::;,,,;clllllllodxkkkkkkxxxxddollllllooddddxddolc:;,,;;::::;,.....''..   ......
..................,;;;;;,,'';cllllcc:::cccllllc::;;;;;;::lddxxxxxdol:;,,,,;;;::;,.....'''..   ......
...................',;;;,'...,:loolc;;,,'''''''''''',,,;codxkkxxdol:,''',,;;;;,'.....'''..  ........
...................',;;;,'....'coodol:,'............',;codxkkxdoc:;'..'',,,,,,'......''..      .....
................ ..',;;;,'......;loddoc;;,..........,:ldxxkkxdl:,'....',,,'''..........   ....      
................  ..',,,,'...   .,:llodol:;,',,,,,,;:looddoolc;,.....',,''''..........  ............
.................  ..'',''...    ..,;clllolcc::::ccclllcc::;,'......',,,'''.........   .............
...............'.. ...'''...      ...',;:cccc:;:::ccc::;,,'...   .',,,,''..........   .........     
........... ...,,......'...        .....',,,,,'''''',''.....   ..',,,''...... ..       .............
..............';:,.........         ....................    ...',,,''.......       .................
..............':cc:;......           .......            ......'''.........        ................ .
..............,:llcc,.....            ...................................        ...............  ..
..............':lllc:.....             ................................           ............   ...
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this;
        return msg.data;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
    unchecked {
        _approve(sender, _msgSender(), currentAllowance - amount);
    }

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
    unchecked {
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
    }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
    unchecked {
        _balances[sender] = senderBalance - amount;
    }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    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);
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
    external
    payable
    returns (
        uint256 amountToken,
        uint256 amountETH,
        uint256 liquidity
    );
}

interface IDexFactory {
    function createPair(address tokenA, address tokenB)
    external
    returns (address pair);
}

contract Zlatan is ERC20, Ownable {

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IDexRouter public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address public ZlatanAddress;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyTotalFees;
    uint256 public buyZlatanFee;
    uint256 public buyLiquidityFee;

    uint256 public sellTotalFees;
    uint256 public sellZlatanFee;
    uint256 public sellLiquidityFee;

    uint256 public tokensForZlatan;
    uint256 public tokensForLiquidity;

    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event EnabledTrading(bool tradingActive);
    event RemovedLimits();
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event UpdatedMaxBuyAmount(uint256 newAmount);
    event UpdatedMaxSellAmount(uint256 newAmount);
    event UpdatedMaxWalletAmount(uint256 newAmount);
    event UpdatedZlatanAddress(address indexed newWallet);
    event UpdatedRewardsAddress(address indexed newWallet);
    event MaxTransactionExclusion(address _address, bool excluded);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() ERC20("ZLATAN", "THE GREATEST") {

        address newOwner = msg.sender; 

        IDexRouter _uniswapV2Router = IDexRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        _excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IDexFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 totalSupply = 100000000 * 1e18;

        maxBuyAmount = totalSupply *  30 / 1000;
        maxSellAmount = totalSupply *  30 / 1000;
        maxWalletAmount = totalSupply * 30 / 1000;
        swapTokensAtAmount = totalSupply * 50 / 100000; 

        buyZlatanFee = 5;
        buyLiquidityFee = 5;
        buyTotalFees = buyZlatanFee + buyLiquidityFee;

        sellZlatanFee = 10;
        sellLiquidityFee = 10;
        sellTotalFees = sellZlatanFee + sellLiquidityFee;

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);

        ZlatanAddress = address(0x3F665848fceAc6B251C81E215b8D03D3950b3C36);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        _createInitialSupply(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {}

    function setMaxZlatanBuy(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max buy amount lower than 0.1%");
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }

    function setMaxZlatanSell(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max sell amount lower than 0.1%");
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        emit RemovedLimits();
    }

    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != uniswapV2Pair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function setMaxZlatanWallet(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 3 / 1000)/1e18, "Cannot set max wallet amount lower than 0.3%");
        maxWalletAmount = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

        function setZlatanBuyFee(uint256 _buyZlatanFee, uint256 _buyLiquidityFee) external onlyOwner {
        buyLiquidityFee = _buyLiquidityFee;
        buyZlatanFee = _buyZlatanFee;
        require(buyLiquidityFee + buyZlatanFee <= 20, "Buy fees can't be more than 20%");

    }

        function setZlatanSellFee(uint256 _sellZlatanFee, uint256 _sellLiquidityFee) external onlyOwner {
        sellLiquidityFee = _sellLiquidityFee;
        sellZlatanFee = _sellZlatanFee;
        require(sellLiquidityFee + sellZlatanFee <= 20, "Sell fees can't be more than 20%");

    }

    // change the minimum amount of tokens to sell from fees
    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= totalSupply() * 1 / 1000, "Swap amount cannot be higher than 0.1% total supply.");
        swapTokensAtAmount = newAmount;

    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    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, "amount must be greater than 0");

        if(limitsInEffect){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead)){
                if(!tradingActive){
                    require(_isExcludedMaxTransactionAmount[from] || _isExcludedMaxTransactionAmount[to], "Trading is not active.");
                    require(from == owner(), "Trading is enabled");
                }

                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
                }
                else if (!_isExcludedMaxTransactionAmount[to] && !_isExcludedMaxTransactionAmount[from]){
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on Trades, not on wallet transfers

        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees /100;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForZlatan += fees * sellZlatanFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount * buyTotalFees / 100;
                tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForZlatan += fees * buyZlatanFee / buyTotalFees;
            }

            if(fees > 0){
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    // once enabled, can never be turned off
    function enableZlatan(bool _status) external onlyOwner {
        require(!tradingActive, "Cannot re enable trading");
        tradingActive = _status;
        swapEnabled = true;
        emit EnabledTrading(tradingActive);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(owner()),
            block.timestamp
        );

    }

    function setZlatanAddress(address _ZlatanAddress) external onlyOwner {
        require(_ZlatanAddress != address(0), "_ZlatanAddress address cannot be 0");
        ZlatanAddress = payable(_ZlatanAddress);
        emit UpdatedZlatanAddress(_ZlatanAddress);
    }

   
    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForZlatan;

        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 10){
            contractBalance = swapTokensAtAmount * 10;
        }

        bool success;

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;

        swapTokensForEth(contractBalance - liquidityTokens);

        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForZlatan = ethBalance * tokensForZlatan / (totalTokensToSwap - (tokensForLiquidity/2));

        ethForLiquidity -= ethForZlatan;

        tokensForLiquidity = 0;
        tokensForZlatan = 0;

        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

        (success,) = address(ZlatanAddress).call{value: address(this).balance}("");
    }

    function claimStuckTokens(address _token) external onlyOwner {
        if (_token == address(0x0)) {
            payable(owner()).transfer(address(this).balance);
            return;
        }
        IERC20 erc20token = IERC20(_token);
        uint256 balance = erc20token.balanceOf(address(this));
        erc20token.transfer(owner(), balance);
    }
    
}