diff --git a/lib/delphi/src/Thrift.Console.pas b/lib/delphi/src/Thrift.Console.pas
index 5d1345b..a52eeb9 100644
--- a/lib/delphi/src/Thrift.Console.pas
+++ b/lib/delphi/src/Thrift.Console.pas
@@ -1,133 +1,133 @@
-(*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *)
-
-unit Thrift.Console;
-
-interface
-
-uses
-  StdCtrls;
-
-type
-  TThriftConsole = class
-  public
-    procedure Write( const S: string); virtual;
-    procedure WriteLine( const S: string); virtual;
-  end;
-
-  TGUIConsole = class( TThriftConsole )
-  private
-    FLineBreak : Boolean;
-    FMemo : TMemo;
-
-    procedure InternalWrite( const S: string; bWriteLine: Boolean);
-  public
-    procedure Write( const S: string); override;
-    procedure WriteLine( const S: string); override;
-    constructor Create( AMemo: TMemo);
-  end;
-
-function Console: TThriftConsole;
-procedure ChangeConsole( AConsole: TThriftConsole );
-procedure RestoreConsoleToDefault;
-
-implementation
-
-var
-  FDefaultConsole : TThriftConsole;
-  FConsole : TThriftConsole;
-
-function Console: TThriftConsole;
-begin
-  Result := FConsole;
-end;
-
-{ TThriftConsole }
-
-procedure TThriftConsole.Write(const S: string);
-begin
-  System.Write( S );
-end;
-
-procedure TThriftConsole.WriteLine(const S: string);
-begin
-  System.Writeln( S );
-end;
-
-procedure ChangeConsole( AConsole: TThriftConsole );
-begin
-  FConsole := AConsole;
-end;
-
-procedure RestoreConsoleToDefault;
-begin
-  FConsole := FDefaultConsole;
-end;
-
-{ TGUIConsole }
-
-constructor TGUIConsole.Create( AMemo: TMemo);
-begin
-  inherited Create;
-  FMemo := AMemo;
-  FLineBreak := True;
-end;
-
-procedure TGUIConsole.InternalWrite(const S: string; bWriteLine: Boolean);
-var
-  idx : Integer;
-begin
-  if FLineBreak then
-  begin
-    FMemo.Lines.Add( S );
-  end else
-  begin
-    idx := FMemo.Lines.Count - 1;
-    if idx < 0 then
-    begin
-      FMemo.Lines.Add( S );
-    end;
-    FMemo.Lines[idx] := FMemo.Lines[idx] + S;
-  end;
-  FLineBreak := bWriteLine;
-end;
-
-procedure TGUIConsole.Write(const S: string);
-begin
-  InternalWrite( S, False);
-end;
-
-procedure TGUIConsole.WriteLine(const S: string);
-begin
-  InternalWrite( S, True);
-end;
-
-initialization
-begin
-  FDefaultConsole := TThriftConsole.Create;
-  FConsole := FDefaultConsole;
-end;
-
-finalization
-begin
-  FDefaultConsole.Free;
-end;
-
-end.
-
+(*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *)
+
+unit Thrift.Console;
+
+interface
+
+uses
+  StdCtrls;
+
+type
+  TThriftConsole = class
+  public
+    procedure Write( const S: string); virtual;
+    procedure WriteLine( const S: string); virtual;
+  end;
+
+  TGUIConsole = class( TThriftConsole )
+  private
+    FLineBreak : Boolean;
+    FMemo : TMemo;
+
+    procedure InternalWrite( const S: string; bWriteLine: Boolean);
+  public
+    procedure Write( const S: string); override;
+    procedure WriteLine( const S: string); override;
+    constructor Create( AMemo: TMemo);
+  end;
+
+function Console: TThriftConsole;
+procedure ChangeConsole( AConsole: TThriftConsole );
+procedure RestoreConsoleToDefault;
+
+implementation
+
+var
+  FDefaultConsole : TThriftConsole;
+  FConsole : TThriftConsole;
+
+function Console: TThriftConsole;
+begin
+  Result := FConsole;
+end;
+
+{ TThriftConsole }
+
+procedure TThriftConsole.Write(const S: string);
+begin
+  System.Write( S );
+end;
+
+procedure TThriftConsole.WriteLine(const S: string);
+begin
+  System.Writeln( S );
+end;
+
+procedure ChangeConsole( AConsole: TThriftConsole );
+begin
+  FConsole := AConsole;
+end;
+
+procedure RestoreConsoleToDefault;
+begin
+  FConsole := FDefaultConsole;
+end;
+
+{ TGUIConsole }
+
+constructor TGUIConsole.Create( AMemo: TMemo);
+begin
+  inherited Create;
+  FMemo := AMemo;
+  FLineBreak := True;
+end;
+
+procedure TGUIConsole.InternalWrite(const S: string; bWriteLine: Boolean);
+var
+  idx : Integer;
+begin
+  if FLineBreak then
+  begin
+    FMemo.Lines.Add( S );
+  end else
+  begin
+    idx := FMemo.Lines.Count - 1;
+    if idx < 0 then
+    begin
+      FMemo.Lines.Add( S );
+    end;
+    FMemo.Lines[idx] := FMemo.Lines[idx] + S;
+  end;
+  FLineBreak := bWriteLine;
+end;
+
+procedure TGUIConsole.Write(const S: string);
+begin
+  InternalWrite( S, False);
+end;
+
+procedure TGUIConsole.WriteLine(const S: string);
+begin
+  InternalWrite( S, True);
+end;
+
+initialization
+begin
+  FDefaultConsole := TThriftConsole.Create;
+  FConsole := FDefaultConsole;
+end;
+
+finalization
+begin
+  FDefaultConsole.Free;
+end;
+
+end.
+
