contract CryptoAngel is CryptoAngelConstants, MintableToken, BurnableToken {

  mapping (address => bool) public frozenAccount;

  event FrozenFunds(address target, bool frozen);

  /**
   * @param target Address to be frozen
   * @param freeze either to freeze it or not
   */
  function freezeAccount(address target, bool freeze) public onlyOwner {
      frozenAccount[target] = freeze;
      FrozenFunds(target, freeze);
  }
    
  /**
   * @dev Returns token's name.
   */
  function name() pure public returns (string _name) {
      return TOKEN_NAME;
  }

  /**
   * @dev Returns token's symbol.
   */
  function symbol() pure public returns (string _symbol) {
      return TOKEN_SYMBOL;
  }

  /**
   * @dev Returns number of decimals.
   */
  function decimals() pure public returns (uint8 _decimals) {
      return TOKEN_DECIMALS_UINT8;
  }

  /**
    * @dev Function to mint tokens
    * @param _to The address that will receive the minted tokens.
    * @param _amount The amount of tokens to mint.
    * @return A boolean that indicates if the operation was successful.
  */
    function mint(address _to, uint256 _amount) onlyOwner public returns (bool) {
        require(!frozenAccount[_to]);
        super.mint(_to, _amount);
    }

    function transfer(address _to, uint256 _value) public returns (bool) {
        require(!frozenAccount[msg.sender]);
        return super.transfer(_to, _value);
    }
    
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(!frozenAccount[_from]);
        require(!frozenAccount[_to]);
        return super.transferFrom(_from, _to, _value);
    }
}
function name() pure public returns (string _name) {
    return TOKEN_NAME;
}

/**
 * @dev Returns token's name.
 */