contract LKO is Ownable, ERC20Burnable, ERC20Mintable, ERC20Pausable {

    string public name = "LKO";
    string public symbol = "LKO";
    uint8 public decimals = 18;
    uint public INITIAL_SUPPLY = 3000000000000000000000000000;

    // map for freeze
    mapping (address => bool) public frozenAccount;

    // event for freeze
    event Freeze(address target);
    event UnFreeze(address target);

    /**
     * @dev constructor for LKO
     */
    constructor() public {
        _mint(msg.sender, INITIAL_SUPPLY);
    }

    /**
     * @dev fallback function ***DO NOT OVERRIDE***
     */
    function () external payable {
        revert();
    }

    /**
     * @dev Function to freeze address
     * @param _target The address that will be freezed.
     */
    function freezeAccount(address _target) onlyOwner public {
        require(_target != address(0));
        require(frozenAccount[_target] != true);
        frozenAccount[_target] = true;
        emit Freeze(_target);
    }

    /**
     * @dev Function to unfreeze address
     * @param _target The address that will be unfreezed.
     */
    function unFreezeAccount(address _target) onlyOwner public {
        require(_target != address(0));
        require(frozenAccount[_target] != false);
        frozenAccount[_target] = false;
        emit UnFreeze(_target);
    }

    /**
     * @dev Transfer token for a specified address
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function transfer(address _to, uint256 _value) public returns (bool) {
        require(!frozenAccount[msg.sender]);        // Check if sender is frozen
        require(!frozenAccount[_to]);               // Check if recipient is frozen
        return super.transfer(_to,_value);
    }

    /**
     * @dev Transfer tokens from one address to another
     * @param _from address The address which you want to send tokens from
     * @param _to address The address which you want to transfer to
     * @param _value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(!frozenAccount[msg.sender]);        // Check if approved is frozen
        require(!frozenAccount[_from]);             // Check if sender is frozen
        require(!frozenAccount[_to]);               // Check if recipient is frozen
        return super.transferFrom(_from, _to, _value);
    }
}
/**
 * @title LKO token
 *
 * @dev Implementation of the LKO token 
 */
function () external payable {
    revert();
}

/**
 * @dev fallback function ***DO NOT OVERRIDE***
 */