zlib 1.2.2
diff --git a/ChangeLog b/ChangeLog
index 26e551e..d60b6d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,15 @@
 
                 ChangeLog file for zlib
 
+Changes in 1.2.2 (3 October 2004)
+- Update zlib.h comments on gzip in-memory processing
+- Set adler to 1 in inflateReset() to support Java test suite [Walles]
+- Add contrib/dotzlib [Ravn]
+- Update win32/DLL_FAQ.txt [Truta]
+- Update contrib/minizip [Vollant]
+- Move contrib/visual-basic.txt to old/ [Truta]
+- Fix assembler builds in projects/visualc6/ [Truta]
+
 Changes in 1.2.1.2 (9 September 2004)
 - Update INDEX file
 - Fix trees.c to update strm->data_type (no one ever noticed!)
diff --git a/FAQ b/FAQ
index 578dbc2..4f61f10 100644
--- a/FAQ
+++ b/FAQ
@@ -117,7 +117,7 @@
     After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib
     generates an error such as:
 
-        ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: 
+        ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:
         symbol __register_frame_info: referenced symbol not found
 
     The symbol __register_frame_info is not part of zlib, it is generated by
diff --git a/INDEX b/INDEX
index 331b56b..0587e59 100644
--- a/INDEX
+++ b/INDEX
@@ -8,7 +8,7 @@
 configure       configure script for Unix
 zconf.in.h      template for zconf.h (used by configure)
 
-amiga/		makefiles for Amiga SAS C
+amiga/          makefiles for Amiga SAS C
 as400/          makefiles for IBM AS/400
 msdos/          makefiles for MSDOS
 old/            makefiles for various architectures and zlib documentation
diff --git a/Makefile b/Makefile
index 9f04797..a29e9bc 100644
--- a/Makefile
+++ b/Makefile
@@ -30,7 +30,7 @@
 
 LIBS=libz.a
 SHAREDLIB=libz.so
-SHAREDLIBV=libz.so.1.2.1.2
+SHAREDLIBV=libz.so.1.2.2
 SHAREDLIBM=libz.so.1
 
 AR=ar rc
diff --git a/Makefile.in b/Makefile.in
index 9f04797..a29e9bc 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -30,7 +30,7 @@
 
 LIBS=libz.a
 SHAREDLIB=libz.so
-SHAREDLIBV=libz.so.1.2.1.2
+SHAREDLIBV=libz.so.1.2.2
 SHAREDLIBM=libz.so.1
 
 AR=ar rc
diff --git a/README b/README
index 48f44e2..df95ae1 100644
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
 ZLIB DATA COMPRESSION LIBRARY
 
-zlib 1.2.1.2 is a general purpose data compression library.  All the code is
+zlib 1.2.2 is a general purpose data compression library.  All the code is
 thread safe.  The data format used by the zlib library is described by RFCs
 (Request for Comments) 1950 to 1952 in the files
 http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
@@ -34,7 +34,7 @@
 issue of  Dr. Dobb's Journal; a copy of the article is available in
 http://dogma.net/markn/articles/zlibtool/zlibtool.htm
 
-The changes made in version 1.2.1.2 are documented in the file ChangeLog.
+The changes made in version 1.2.2 are documented in the file ChangeLog.
 
 Unsupported third party contributions are provided in directory "contrib".
 
diff --git a/as400/compile.clp b/as400/compile.clp
index dcd2421..3c47bb4 100644
--- a/as400/compile.clp
+++ b/as400/compile.clp
@@ -118,6 +118,6 @@
                                  &MODLIB/INFTREES    &MODLIB/TREES       +
                                  &MODLIB/UNCOMPR     &MODLIB/ZUTIL)      +
                           SRCFILE(&SRCLIB/&CTLFILE) SRCMBR(BNDSRC) +
-                          TEXT('ZLIB 1.2.1') TGTRLS(V4R4M0)
+                          TEXT('ZLIB 1.2.2') TGTRLS(V4R4M0)
 
              ENDPGM
diff --git a/as400/readme.txt b/as400/readme.txt
index eef7cb2..27ca676 100644
--- a/as400/readme.txt
+++ b/as400/readme.txt
@@ -1,4 +1,4 @@
-        ZLIB version 1.2.1 for AS400 installation instructions
+        ZLIB version 1.2.2 for AS400 installation instructions
 
 I) From an AS400 *SAVF file:
 
diff --git a/as400/zlib.inc b/as400/zlib.inc
index bb24691..e31e1a7 100644
--- a/as400/zlib.inc
+++ b/as400/zlib.inc
@@ -1,7 +1,7 @@
       *  ZLIB.INC - Interface to the general purpose compression library
       *
       *  ILE RPG400 version by Patrick Monnerat, DATASPHERE.
-      *  Version 1.2.1.2
+      *  Version 1.2.2
       *
       *
       *  WARNING:
@@ -20,8 +20,8 @@
       *                               Constants
       **************************************************************************
       *
-     D ZLIB_VERSION    C                   '1.2.1.2'                            Header's version
-     D ZLIB_VERNUM     C                   X'1212'
+     D ZLIB_VERSION    C                   '1.2.2'                            Header's version
+     D ZLIB_VERNUM     C                   X'1220'
       *
      D Z_NO_FLUSH      C                   0
      D Z_SYNC_FLUSH    C                   2
diff --git a/contrib/README.contrib b/contrib/README.contrib
index eae15aa..7778980 100644
--- a/contrib/README.contrib
+++ b/contrib/README.contrib
@@ -19,6 +19,9 @@
 delphi/     by Cosmin Truta <cosmint@cs.ubbcluj.ro>
         Support for Delphi and C++ Builder
 
+dotzlib/    by Henrik Ravn <henrik@ravn.com>
+        Support for Microsoft .Net and Visual C++ .Net
+
 gzappend/   by Mark Adler <madler@alumni.caltech.edu>
         append to a gzip file -- illustrates the use of Z_BLOCK
 
@@ -60,11 +63,8 @@
 testzlib/   by Gilles Vollant <info@winimage.com>
         Example of the use of zlib
 
-untgz/      by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
+untgz/      by Pedro A. Aranda Gutierrez <paag@tid.es>
         A very simple tar.gz file extractor using zlib
 
-visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
-        How to use compress(), uncompress() and the gz* functions from VB
-
 vstudio/    by Gilles Vollant <info@winimage.com>
-        Building a minizip-enhanced zlib with Visual Studio .NET
+        Building a minizip-enhanced zlib with Microsoft Visual Studio
diff --git a/contrib/ada/readme.txt b/contrib/ada/readme.txt
index dec7ef3..ce4d2ca 100644
--- a/contrib/ada/readme.txt
+++ b/contrib/ada/readme.txt
@@ -1,12 +1,12 @@
-			ZLib for Ada thick binding (ZLib.Ada)
-			Release 1.3
+                        ZLib for Ada thick binding (ZLib.Ada)
+                        Release 1.3
 
 ZLib.Ada is a thick binding interface to the popular ZLib data
 compression library, available at http://www.gzip.org/zlib/.
 It provides Ada-style access to the ZLib C library.
 
 
-	Here are the main changes since ZLib.Ada 1.2:
+        Here are the main changes since ZLib.Ada 1.2:
 
 - Attension: ZLib.Read generic routine have a initialization requirement
   for Read_Last parameter now. It is a bit incompartible with previous version,
@@ -28,7 +28,7 @@
 - Add pragma Assertion that Ada.Streams.Stream_Element size is 8 bit.
 
 
-	How to build ZLib.Ada under GNAT
+        How to build ZLib.Ada under GNAT
 
 You should have the ZLib library already build on your computer, before
 building ZLib.Ada. Make the directory of ZLib.Ada sources current and
@@ -41,7 +41,7 @@
   gnatmake -Pzlib.gpr -L<directory where libz.a is>
 
 
-	How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2
+        How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2
 
 1. Make a project with all *.ads and *.adb files from the distribution.
 2. Build the libz.a library from the ZLib C sources.
@@ -51,7 +51,7 @@
 6. Build the executable using test.adb as a main procedure.
 
 
-	How to use ZLib.Ada
+        How to use ZLib.Ada
 
 The source files test.adb and read.adb are small demo programs that show
 the main functionality of ZLib.Ada.
diff --git a/contrib/ada/zlib-streams.adb b/contrib/ada/zlib-streams.adb
index 398664a..b6497ba 100644
--- a/contrib/ada/zlib-streams.adb
+++ b/contrib/ada/zlib-streams.adb
@@ -222,4 +222,4 @@
       return Total_Out (Stream.Writer);
    end Write_Total_Out;
 
-end ZLib.Streams;
\ No newline at end of file
+end ZLib.Streams;
diff --git a/contrib/ada/zlib-streams.ads b/contrib/ada/zlib-streams.ads
index 5c68667..f0193c6 100644
--- a/contrib/ada/zlib-streams.ads
+++ b/contrib/ada/zlib-streams.ads
@@ -111,4 +111,4 @@
       Writer     : Filter_Type;
    end record;
 
-end ZLib.Streams;
\ No newline at end of file
+end ZLib.Streams;
diff --git a/contrib/ada/zlib.gpr b/contrib/ada/zlib.gpr
index 88f51cc..296b22a 100644
--- a/contrib/ada/zlib.gpr
+++ b/contrib/ada/zlib.gpr
@@ -1,21 +1,20 @@
-project Zlib is

-

-   for Languages use ("Ada");

-   for Source_Dirs use (".");

-   for Object_Dir use ".";

-   for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo");

-

-   package Compiler is

-      for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst");

-   end Compiler;

-

-   package Linker is

-      for Default_Switches ("ada") use ("-lz");

-   end Linker;

-

-   package Builder is

-      for Default_Switches ("ada") use ("-s", "-gnatQ");

-   end Builder;

-

-end Zlib;

-

+project Zlib is
+
+   for Languages use ("Ada");
+   for Source_Dirs use (".");
+   for Object_Dir use ".";
+   for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo");
+
+   package Compiler is
+      for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst");
+   end Compiler;
+
+   package Linker is
+      for Default_Switches ("ada") use ("-lz");
+   end Linker;
+
+   package Builder is
+      for Default_Switches ("ada") use ("-s", "-gnatQ");
+   end Builder;
+
+end Zlib;
diff --git a/contrib/dotzlib/DotZLib.build b/contrib/dotzlib/DotZLib.build
new file mode 100644
index 0000000..ed19cc9
--- /dev/null
+++ b/contrib/dotzlib/DotZLib.build
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" ?>

+<project name="DotZLib" default="build" basedir="./DotZLib">

+	<description>A .Net wrapper library around ZLib1.dll</description>

+

+	<property name="nunit.location" value="c:/program files/NUnit V2.1/bin" />

+	<property name="build.root" value="bin" />

+	

+	<property name="debug" value="true" />

+	<property name="nunit" value="true" />

+

+	<property name="build.folder" value="${build.root}/debug/" if="${debug}" />

+	<property name="build.folder" value="${build.root}/release/" unless="${debug}" />

+

+	<target name="clean" description="Remove all generated files">

+		<delete dir="${build.root}" failonerror="false" />

+	</target>

+

+	<target name="build" description="compiles the source code">

+		

+		<mkdir dir="${build.folder}" />

+		<csc target="library" output="${build.folder}DotZLib.dll" debug="${debug}">

+			<references basedir="${nunit.location}">

+				<includes if="${nunit}" name="nunit.framework.dll" />

+			</references>

+			<sources>

+				<includes name="*.cs" />

+				<excludes name="UnitTests.cs" unless="${nunit}" />

+			</sources>

+			<arg value="/d:nunit" if="${nunit}" />

+		</csc>

+	</target>

+

+</project>
\ No newline at end of file
diff --git a/contrib/dotzlib/DotZLib.chm b/contrib/dotzlib/DotZLib.chm
new file mode 100644
index 0000000..0bc7df7
--- /dev/null
+++ b/contrib/dotzlib/DotZLib.chm
Binary files differ
diff --git a/contrib/dotzlib/DotZLib.sln b/contrib/dotzlib/DotZLib.sln
new file mode 100644
index 0000000..ac45ca0
--- /dev/null
+++ b/contrib/dotzlib/DotZLib.sln
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 8.00

+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotZLib", "DotZLib\DotZLib.csproj", "{BB1EE0B1-1808-46CB-B786-949D91117FC5}"

+	ProjectSection(ProjectDependencies) = postProject

+	EndProjectSection

+EndProject

+Global

+	GlobalSection(SolutionConfiguration) = preSolution

+		Debug = Debug

+		Release = Release

+	EndGlobalSection

+	GlobalSection(ProjectConfiguration) = postSolution

+		{BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.ActiveCfg = Debug|.NET

+		{BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.Build.0 = Debug|.NET

+		{BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.ActiveCfg = Release|.NET

+		{BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.Build.0 = Release|.NET

+	EndGlobalSection

+	GlobalSection(ExtensibilityGlobals) = postSolution

+	EndGlobalSection

+	GlobalSection(ExtensibilityAddIns) = postSolution

+	EndGlobalSection

+EndGlobal

diff --git a/contrib/dotzlib/DotZLib/AssemblyInfo.cs b/contrib/dotzlib/DotZLib/AssemblyInfo.cs
new file mode 100644
index 0000000..6fc0fdc
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;

+using System.Runtime.CompilerServices;

+

+//

+// General Information about an assembly is controlled through the following 

+// set of attributes. Change these attribute values to modify the information

+// associated with an assembly.

+//

+[assembly: AssemblyTitle("DotZLib")]

+[assembly: AssemblyDescription(".Net bindings for ZLib compression dll 1.2.x")]

+[assembly: AssemblyConfiguration("")]

+[assembly: AssemblyCompany("Henrik Ravn")]

+[assembly: AssemblyProduct("")]

+[assembly: AssemblyCopyright("(c) 2004 by Henrik Ravn")]

+[assembly: AssemblyTrademark("")]

+[assembly: AssemblyCulture("")]		

+

+//

+// Version information for an assembly consists of the following four values:

+//

+//      Major Version

+//      Minor Version 

+//      Build Number

+//      Revision

+//

+// You can specify all the values or you can default the Revision and Build Numbers 

+// by using the '*' as shown below:

+

+[assembly: AssemblyVersion("1.0.*")]

+

+//

+// In order to sign your assembly you must specify a key to use. Refer to the 

+// Microsoft .NET Framework documentation for more information on assembly signing.

+//

+// Use the attributes below to control which key is used for signing. 

+//

+// Notes: 

+//   (*) If no key is specified, the assembly is not signed.

+//   (*) KeyName refers to a key that has been installed in the Crypto Service

+//       Provider (CSP) on your machine. KeyFile refers to a file which contains

+//       a key.

+//   (*) If the KeyFile and the KeyName values are both specified, the 

+//       following processing occurs:

+//       (1) If the KeyName can be found in the CSP, that key is used.

+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 

+//           in the KeyFile is installed into the CSP and used.

+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.

+//       When specifying the KeyFile, the location of the KeyFile should be

+//       relative to the project output directory which is

+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is

+//       located in the project directory, you would specify the AssemblyKeyFile 

+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]

+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework

+//       documentation for more information on this.

+//

+[assembly: AssemblyDelaySign(false)]

+[assembly: AssemblyKeyFile("")]

+[assembly: AssemblyKeyName("")]

diff --git a/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/contrib/dotzlib/DotZLib/ChecksumImpl.cs
new file mode 100644
index 0000000..dfe7e90
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/ChecksumImpl.cs
@@ -0,0 +1,202 @@
+//

+// © Copyright Henrik Ravn 2004

+//

+// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 

+// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

+//

+

+using System;

+using System.Runtime.InteropServices;

+using System.Text;

+

+

+namespace DotZLib

+{

+    #region ChecksumGeneratorBase

+    /// <summary>

+    /// Implements the common functionality needed for all <see cref="ChecksumGenerator"/>s

+    /// </summary>

+    /// <example></example>

+    public abstract class ChecksumGeneratorBase : ChecksumGenerator

+    {

+        /// <summary>

+        /// The value of the current checksum

+        /// </summary>

+        protected uint _current;

+

+        /// <summary>

+        /// Initializes a new instance of the checksum generator base - the current checksum is 

+        /// set to zero

+        /// </summary>

+        public ChecksumGeneratorBase()

+        {

+            _current = 0;

+        }

+

+        /// <summary>

+        /// Initializes a new instance of the checksum generator basewith a specified value

+        /// </summary>

+        /// <param name="initialValue">The value to set the current checksum to</param>

+        public ChecksumGeneratorBase(uint initialValue)

+        {

+            _current = initialValue;

+        }

+

+        /// <summary>

+        /// Resets the current checksum to zero

+        /// </summary>

+        public void Reset() { _current = 0; }

+

+        /// <summary>

+        /// Gets the current checksum value

+        /// </summary>

+        public uint Value { get { return _current; } }

+

+        /// <summary>

+        /// Updates the current checksum with part of an array of bytes

+        /// </summary>

+        /// <param name="data">The data to update the checksum with</param>

+        /// <param name="offset">Where in <c>data</c> to start updating</param>

+        /// <param name="count">The number of bytes from <c>data</c> to use</param>

+        /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>

+        /// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>

+        /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>

+        /// <remarks>All the other <c>Update</c> methods are implmeneted in terms of this one. 

+        /// This is therefore the only method a derived class has to implement</remarks>

+        public abstract void Update(byte[] data, int offset, int count);

+

+        /// <summary>

+        /// Updates the current checksum with an array of bytes.

+        /// </summary>

+        /// <param name="data">The data to update the checksum with</param>

+        public void Update(byte[] data)

+        {

+            Update(data, 0, data.Length);

+        }

+

+        /// <summary>

+        /// Updates the current checksum with the data from a string

+        /// </summary>

+        /// <param name="data">The string to update the checksum with</param>

+        /// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>

+        public void Update(string data)

+        {

+			Update(Encoding.UTF8.GetBytes(data));

+        }

+

+        /// <summary>

+        /// Updates the current checksum with the data from a string, using a specific encoding

+        /// </summary>

+        /// <param name="data">The string to update the checksum with</param>

+        /// <param name="encoding">The encoding to use</param>

+        public void Update(string data, Encoding encoding)

+        {

+            Update(encoding.GetBytes(data));

+        }

+

+    }

+    #endregion

+

+    #region CRC32

+    /// <summary>

+    /// Implements a CRC32 checksum generator

+    /// </summary>

+    public sealed class CRC32Checksum : ChecksumGeneratorBase    

+    {

+        #region DLL imports

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern uint crc32(uint crc, int data, uint length);

+

+        #endregion

+

+        /// <summary>

+        /// Initializes a new instance of the CRC32 checksum generator

+        /// </summary>

+        public CRC32Checksum() : base() {}

+

+        /// <summary>

+        /// Initializes a new instance of the CRC32 checksum generator with a specified value

+        /// </summary>

+        /// <param name="initialValue">The value to set the current checksum to</param>

+        public CRC32Checksum(uint initialValue) : base(initialValue) {}

+

+        /// <summary>

+        /// Updates the current checksum with part of an array of bytes

+        /// </summary>

+        /// <param name="data">The data to update the checksum with</param>

+        /// <param name="offset">Where in <c>data</c> to start updating</param>

+        /// <param name="count">The number of bytes from <c>data</c> to use</param>

+        /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>

+        /// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>

+        /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>

+        public override void Update(byte[] data, int offset, int count)

+        {

+            if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();

+            if ((offset+count) > data.Length) throw new ArgumentException();

+            GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned);

+            try

+            {

+                _current = crc32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count);

+            }

+            finally

+            {

+                hData.Free();

+            }

+        }

+

+    }

+    #endregion

+

+    #region Adler

+    /// <summary>

+    /// Implements a checksum generator that computes the Adler checksum on data

+    /// </summary>

+    public sealed class AdlerChecksum : ChecksumGeneratorBase    

+    {

+        #region DLL imports

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern uint adler32(uint adler, int data, uint length);

+

+        #endregion

+

+        /// <summary>

+        /// Initializes a new instance of the Adler checksum generator

+        /// </summary>

+        public AdlerChecksum() : base() {}

+

+        /// <summary>

+        /// Initializes a new instance of the Adler checksum generator with a specified value

+        /// </summary>

+        /// <param name="initialValue">The value to set the current checksum to</param>

+        public AdlerChecksum(uint initialValue) : base(initialValue) {}

+

+        /// <summary>

+        /// Updates the current checksum with part of an array of bytes

+        /// </summary>

+        /// <param name="data">The data to update the checksum with</param>

+        /// <param name="offset">Where in <c>data</c> to start updating</param>

+        /// <param name="count">The number of bytes from <c>data</c> to use</param>

+        /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>

+        /// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>

+        /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>

+        public override void Update(byte[] data, int offset, int count)

+        {

+            if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();

+            if ((offset+count) > data.Length) throw new ArgumentException();

+            GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned);

+            try

+            {

+                _current = adler32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count);

+            }

+            finally

+            {

+                hData.Free();

+            }

+        }

+

+    }

+    #endregion

+

+}
\ No newline at end of file
diff --git a/contrib/dotzlib/DotZLib/CircularBuffer.cs b/contrib/dotzlib/DotZLib/CircularBuffer.cs
new file mode 100644
index 0000000..16997e9
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/CircularBuffer.cs
@@ -0,0 +1,83 @@
+//

+// © Copyright Henrik Ravn 2004

+//

+// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 

+// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

+//

+

+using System;

+using System.Diagnostics;

+

+namespace DotZLib

+{

+

+	/// <summary>

+	/// This class implements a circular buffer

+	/// </summary>

+	internal class CircularBuffer

+	{

+        #region Private data

+        private int _capacity;

+        private int _head;

+        private int _tail;

+        private int _size;

+        private byte[] _buffer;

+        #endregion

+

+        public CircularBuffer(int capacity)

+        {    

+            Debug.Assert( capacity > 0 );

+            _buffer = new byte[capacity];

+            _capacity = capacity;

+            _head = 0;

+            _tail = 0;

+            _size = 0;

+        }

+

+        public int Size { get { return _size; } }

+

+        public int Put(byte[] source, int offset, int count)

+        {

+            Debug.Assert( count > 0 );

+            int trueCount = Math.Min(count, _capacity - Size);

+            for (int i = 0; i < trueCount; ++i)

+                _buffer[(_tail+i) % _capacity] = source[offset+i];

+            _tail += trueCount;

+            _tail %= _capacity;

+            _size += trueCount;

+            return trueCount;

+        }

+

+        public bool Put(byte b)

+        {

+            if (Size == _capacity) // no room

+                return false;

+            _buffer[_tail++] = b;

+            _tail %= _capacity;

+            ++_size;

+            return true;

+        }

+

+        public int Get(byte[] destination, int offset, int count)

+        {

+            int trueCount = Math.Min(count,Size);

+            for (int i = 0; i < trueCount; ++i)

+                destination[offset + i] = _buffer[(_head+i) % _capacity];

+            _head += trueCount;

+            _head %= _capacity;

+            _size -= trueCount;

+            return trueCount;

+        }

+

+        public int Get()

+        {

+            if (Size == 0)

+                return -1;

+

+            int result = (int)_buffer[_head++ % _capacity];

+            --_size;

+            return result;

+        }

+

+    }

+}

diff --git a/contrib/dotzlib/DotZLib/CodecBase.cs b/contrib/dotzlib/DotZLib/CodecBase.cs
new file mode 100644
index 0000000..954db7d
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/CodecBase.cs
@@ -0,0 +1,198 @@
+//

+// © Copyright Henrik Ravn 2004

+//

+// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 

+// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

+//

+

+using System;

+using System.Runtime.InteropServices;

+

+namespace DotZLib

+{

+	/// <summary>

+	/// Implements the common functionality needed for all <see cref="Codec"/>s

+	/// </summary>

+	public abstract class CodecBase : Codec, IDisposable

+	{

+

+        #region Data members

+

+        /// <summary>

+        /// Instance of the internal zlib buffer structure that is 

+        /// passed to all functions in the zlib dll

+        /// </summary>

+        internal ZStream _ztream = new ZStream();

+

+        /// <summary>

+        /// True if the object instance has been disposed, false otherwise

+        /// </summary>

+        protected bool _isDisposed = false;

+

+        /// <summary>

+        /// The size of the internal buffers

+        /// </summary>

+        protected const int kBufferSize = 16384;

+

+        private byte[] _outBuffer = new byte[kBufferSize];

+        private byte[] _inBuffer = new byte[kBufferSize];

+

+        private GCHandle _hInput;

+        private GCHandle _hOutput;

+

+        private uint _checksum = 0;

+

+        #endregion

+

+        /// <summary>

+        /// Initializes a new instance of the <c>CodeBase</c> class. 

+        /// </summary>

+		public CodecBase()

+		{

+            try

+            {

+                _hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned);

+                _hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned);

+            }

+            catch (Exception)

+            {

+                CleanUp(false);

+                throw;

+            }

+        }

+

+

+        #region Codec Members

+

+        /// <summary>

+        /// Occurs when more processed data are available.

+        /// </summary>

+        public event DataAvailableHandler DataAvailable;

+

+        /// <summary>

+        /// Fires the <see cref="DataAvailable"/> event

+        /// </summary>

+        protected void OnDataAvailable()

+        {

+            if (_ztream.total_out > 0)

+            {

+                if (DataAvailable != null)

+                    DataAvailable( _outBuffer, 0, (int)_ztream.total_out); 

+                resetOutput();

+            }

+        }

+

+        /// <summary>

+        /// Adds more data to the codec to be processed.

+        /// </summary>

+        /// <param name="data">Byte array containing the data to be added to the codec</param>

+        /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>

+        public void Add(byte[] data)

+        {

+            Add(data,0,data.Length);

+        }

+

+        /// <summary>

+        /// Adds more data to the codec to be processed.

+        /// </summary>

+        /// <param name="data">Byte array containing the data to be added to the codec</param>

+        /// <param name="offset">The index of the first byte to add from <c>data</c></param>

+        /// <param name="count">The number of bytes to add</param>

+        /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>

+        /// <remarks>This must be implemented by a derived class</remarks>

+        public abstract void Add(byte[] data, int offset, int count);

+

+        /// <summary>

+        /// Finishes up any pending data that needs to be processed and handled.

+        /// </summary>

+        /// <remarks>This must be implemented by a derived class</remarks>

+        public abstract void Finish();

+

+        /// <summary>

+        /// Gets the checksum of the data that has been added so far

+        /// </summary>

+        public uint Checksum { get { return _checksum; } }

+

+        #endregion

+

+        #region Destructor & IDisposable stuff

+

+        /// <summary>

+        /// Destroys this instance

+        /// </summary>

+        ~CodecBase()

+        {

+            CleanUp(false);

+        }

+

+        /// <summary>

+        /// Releases any unmanaged resources and calls the <see cref="CleanUp()"/> method of the derived class

+        /// </summary>

+        public void Dispose()

+        {

+            CleanUp(true);

+        }

+

+        /// <summary>

+        /// Performs any codec specific cleanup

+        /// </summary>

+        /// <remarks>This must be implemented by a derived class</remarks>

+        protected abstract void CleanUp();

+

+        // performs the release of the handles and calls the dereived CleanUp()

+        private void CleanUp(bool isDisposing)

+        {

+            if (!_isDisposed)

+            {

+                CleanUp();

+                if (_hInput.IsAllocated)

+                    _hInput.Free();

+                if (_hOutput.IsAllocated)

+                    _hOutput.Free();

+

+                _isDisposed = true;

+            }

+        }

+

+

+        #endregion

+

+        #region Helper methods

+

+        /// <summary>

+        /// Copies a number of bytes to the internal codec buffer - ready for proccesing

+        /// </summary>

+        /// <param name="data">The byte array that contains the data to copy</param>

+        /// <param name="startIndex">The index of the first byte to copy</param>

+        /// <param name="count">The number of bytes to copy from <c>data</c></param>

+        protected void copyInput(byte[] data, int startIndex, int count)

+        {

+            Array.Copy(data, startIndex, _inBuffer,0, count);

+            _ztream.next_in = _hInput.AddrOfPinnedObject();

+            _ztream.total_in = 0;

+            _ztream.avail_in = (uint)count;

+

+        }

+

+        /// <summary>

+        /// Resets the internal output buffers to a known state - ready for processing

+        /// </summary>

+        protected void resetOutput()

+        {

+            _ztream.total_out = 0;

+            _ztream.avail_out = kBufferSize;

+            _ztream.next_out = _hOutput.AddrOfPinnedObject();

+        }

+

+        /// <summary>

+        /// Updates the running checksum property

+        /// </summary>

+        /// <param name="newSum">The new checksum value</param>

+        protected void setChecksum(uint newSum)

+        {

+            _checksum = newSum;

+        }

+        #endregion

+

+    }

+}

diff --git a/contrib/dotzlib/DotZLib/Deflater.cs b/contrib/dotzlib/DotZLib/Deflater.cs
new file mode 100644
index 0000000..d7b8dcc
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/Deflater.cs
@@ -0,0 +1,106 @@
+//

+// © Copyright Henrik Ravn 2004

+//

+// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 

+// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

+//

+

+using System;

+using System.Diagnostics;

+using System.Runtime.InteropServices;

+

+namespace DotZLib

+{

+

+    /// <summary>

+    /// Implements a data compressor, using the deflate algorithm in the ZLib dll

+    /// </summary>

+	public sealed class Deflater : CodecBase

+	{

+        #region Dll imports

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]

+        private static extern int deflateInit_(ref ZStream sz, int level, string vs, int size);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int deflate(ref ZStream sz, int flush);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int deflateReset(ref ZStream sz);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int deflateEnd(ref ZStream sz);

+        #endregion

+

+        /// <summary>

+        /// Constructs an new instance of the <c>Deflater</c>

+        /// </summary>

+        /// <param name="level">The compression level to use for this <c>Deflater</c></param>

+		public Deflater(CompressLevel level) : base()

+		{

+            int retval = deflateInit_(ref _ztream, (int)level, Info.Version, Marshal.SizeOf(_ztream));

+            if (retval != 0)

+                throw new ZLibException(retval, "Could not initialize deflater");

+

+            resetOutput();

+		}

+

+        /// <summary>

+        /// Adds more data to the codec to be processed.

+        /// </summary>

+        /// <param name="data">Byte array containing the data to be added to the codec</param>

+        /// <param name="offset">The index of the first byte to add from <c>data</c></param>

+        /// <param name="count">The number of bytes to add</param>

+        /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>

+        public override void Add(byte[] data, int offset, int count)

+        {

+            if (data == null) throw new ArgumentNullException();

+            if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();

+            if ((offset+count) > data.Length) throw new ArgumentException();

+            

+            int total = count;

+            int inputIndex = offset;

+            int err = 0;

+

+            while (err >= 0 && inputIndex < total)

+            {

+                copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize));

+                while (err >= 0 && _ztream.avail_in > 0)

+                {

+                    err = deflate(ref _ztream, (int)FlushTypes.None);

+                    if (err == 0)

+                        while (_ztream.avail_out == 0)

+                        {

+                            OnDataAvailable();

+                            err = deflate(ref _ztream, (int)FlushTypes.None);

+                        }

+                    inputIndex += (int)_ztream.total_in;

+                }

+            }

+            setChecksum( _ztream.adler );

+        }

+

+

+        /// <summary>

+        /// Finishes up any pending data that needs to be processed and handled.

+        /// </summary>

+        public override void Finish()

+        {

+            int err;

+            do 

+            {

+                err = deflate(ref _ztream, (int)FlushTypes.Finish);

+                OnDataAvailable();

+            }

+            while (err == 0);

+            setChecksum( _ztream.adler );

+            deflateReset(ref _ztream);

+            resetOutput();

+        }

+

+        /// <summary>

+        /// Closes the internal zlib deflate stream

+        /// </summary>

+        protected override void CleanUp() { deflateEnd(ref _ztream); }

+

+    }

+}

diff --git a/contrib/dotzlib/DotZLib/DotZLib.cs b/contrib/dotzlib/DotZLib/DotZLib.cs
new file mode 100644
index 0000000..410deb0
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/DotZLib.cs
@@ -0,0 +1,288 @@
+//

+// © Copyright Henrik Ravn 2004

+//

+// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 

+// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

+//

+

+using System;

+using System.IO;

+using System.Runtime.InteropServices;

+using System.Text;

+

+

+namespace DotZLib

+{

+

+    #region Internal types

+

+    /// <summary>

+    /// Defines constants for the various flush types used with zlib

+    /// </summary>

+    internal enum FlushTypes 

+    {

+        None,  Partial,  Sync,  Full,  Finish,  Block

+    }

+

+    #region ZStream structure

+    // internal mapping of the zlib zstream structure for marshalling

+    [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)]

+    internal struct ZStream

+    {

+        public IntPtr next_in;

+        public uint avail_in;

+        public uint total_in;

+

+        public IntPtr next_out;

+        public uint avail_out;

+        public uint total_out;

+

+        [MarshalAs(UnmanagedType.LPStr)]

+        string msg; 

+        uint state;

+

+        uint zalloc;

+        uint zfree;

+        uint opaque;

+

+        int data_type;

+        public uint adler;

+        uint reserved;

+    }

+

+    #endregion

+    

+    #endregion

+

+    #region Public enums

+    /// <summary>

+    /// Defines constants for the available compression levels in zlib

+    /// </summary>

+    public enum CompressLevel : int

+    {

+        /// <summary>

+        /// The default compression level with a reasonable compromise between compression and speed

+        /// </summary>

+        Default = -1,   

+        /// <summary>

+        /// No compression at all. The data are passed straight through.

+        /// </summary>

+        None = 0,

+        /// <summary>

+        /// The maximum compression rate available.

+        /// </summary>

+        Best = 9,   

+        /// <summary>

+        /// The fastest available compression level.

+        /// </summary>

+        Fastest = 1

+    }

+    #endregion

+

+    #region Exception classes

+    /// <summary>

+    /// The exception that is thrown when an error occurs on the zlib dll

+    /// </summary>

+    public class ZLibException : ApplicationException

+    {

+        /// <summary>

+        /// Initializes a new instance of the <see cref="ZLibException"/> class with a specified 

+        /// error message and error code

+        /// </summary>

+        /// <param name="errorCode">The zlib error code that caused the exception</param>

+        /// <param name="msg">A message that (hopefully) describes the error</param>

+        public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg))

+        {

+        }

+

+        /// <summary>

+        /// Initializes a new instance of the <see cref="ZLibException"/> class with a specified 

+        /// error code

+        /// </summary>

+        /// <param name="errorCode">The zlib error code that caused the exception</param>

+        public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode))

+        {

+        }

+    }

+    #endregion

+

+    #region Interfaces

+

+    /// <summary>

+    /// Declares methods and properties that enables a running checksum to be calculated 

+    /// </summary>

+    public interface ChecksumGenerator

+    {

+        /// <summary>

+        /// Gets the current value of the checksum

+        /// </summary>

+        uint Value { get; }

+

+        /// <summary>

+        /// Clears the current checksum to 0

+        /// </summary>

+        void Reset();

+

+        /// <summary>

+        /// Updates the current checksum with an array of bytes

+        /// </summary>

+        /// <param name="data">The data to update the checksum with</param>

+        void Update(byte[] data);

+

+        /// <summary>

+        /// Updates the current checksum with part of an array of bytes

+        /// </summary>

+        /// <param name="data">The data to update the checksum with</param>

+        /// <param name="offset">Where in <c>data</c> to start updating</param>

+        /// <param name="count">The number of bytes from <c>data</c> to use</param>

+        /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>

+        /// <exception cref="ArgumentNullException"><c>data</c> is a null reference</exception>

+        /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>

+        void Update(byte[] data, int offset, int count);

+

+        /// <summary>

+        /// Updates the current checksum with the data from a string

+        /// </summary>

+        /// <param name="data">The string to update the checksum with</param>

+        /// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>

+        void Update(string data);

+

+        /// <summary>

+        /// Updates the current checksum with the data from a string, using a specific encoding

+        /// </summary>

+        /// <param name="data">The string to update the checksum with</param>

+        /// <param name="encoding">The encoding to use</param>

+        void Update(string data, Encoding encoding);

+    }

+

+

+    /// <summary>

+    /// Represents the method that will be called from a codec when new data

+    /// are available.

+    /// </summary>

+    /// <paramref name="data">The byte array containing the processed data</paramref>

+    /// <paramref name="startIndex">The index of the first processed byte in <c>data</c></paramref>

+    /// <paramref name="count">The number of processed bytes available</paramref>

+    /// <remarks>On return from this method, the data may be overwritten, so grab it while you can. 

+    /// You cannot assume that startIndex will be zero.

+    /// </remarks>

+    public delegate void DataAvailableHandler(byte[] data, int startIndex, int count);

+

+    /// <summary>

+    /// Declares methods and events for implementing compressors/decompressors

+    /// </summary>

+    public interface Codec

+    {

+        /// <summary>

+        /// Occurs when more processed data are available.

+        /// </summary>

+        event DataAvailableHandler DataAvailable;

+

+        /// <summary>

+        /// Adds more data to the codec to be processed.

+        /// </summary>

+        /// <param name="data">Byte array containing the data to be added to the codec</param>

+        /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>

+        void Add(byte[] data);

+

+        /// <summary>

+        /// Adds more data to the codec to be processed.

+        /// </summary>

+        /// <param name="data">Byte array containing the data to be added to the codec</param>

+        /// <param name="offset">The index of the first byte to add from <c>data</c></param>

+        /// <param name="count">The number of bytes to add</param>

+        /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>

+        void Add(byte[] data, int offset, int count);

+

+        /// <summary>

+        /// Finishes up any pending data that needs to be processed and handled.

+        /// </summary>

+        void Finish();

+

+        /// <summary>

+        /// Gets the checksum of the data that has been added so far

+        /// </summary>

+        uint Checksum { get; }

+

+

+    }

+

+    #endregion

+

+    #region Classes

+    /// <summary>

+    /// Encapsulates general information about the ZLib library

+    /// </summary>

+    public class Info

+    {

+        #region DLL imports

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern uint zlibCompileFlags();

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern string zlibVersion();

+        #endregion

+

+        #region Private stuff

+        private uint _flags;

+

+        // helper function that unpacks a bitsize mask

+        private static int bitSize(uint bits)

+        {

+            switch (bits)

+            {

+                case 0: return 16;

+                case 1: return 32;

+                case 2: return 64;

+            }

+            return -1;

+        }

+        #endregion

+

+        /// <summary>

+        /// Constructs an instance of the <c>Info</c> class.

+        /// </summary>

+        public Info()

+        {

+            _flags = zlibCompileFlags();

+        }

+

+        /// <summary>

+        /// True if the library is compiled with debug info

+        /// </summary>

+        public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } }

+

+        /// <summary>

+        /// True if the library is compiled with assembly optimizations

+        /// </summary>

+        public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } }

+

+        /// <summary>

+        /// Gets the size of the unsigned int that was compiled into Zlib

+        /// </summary>

+        public int SizeOfUInt { get { return bitSize(_flags & 3); } }

+

+        /// <summary>

+        /// Gets the size of the unsigned long that was compiled into Zlib

+        /// </summary>

+        public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } }

+

+        /// <summary>

+        /// Gets the size of the pointers that were compiled into Zlib

+        /// </summary>

+        public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } }

+

+        /// <summary>

+        /// Gets the size of the z_off_t type that was compiled into Zlib

+        /// </summary>

+        public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } }

+

+        /// <summary>

+        /// Gets the version of ZLib as a string, e.g. "1.2.1"

+        /// </summary>

+        public static string Version { get { return zlibVersion(); } }

+    }

+

+    #endregion

+

+}

diff --git a/contrib/dotzlib/DotZLib/DotZLib.csproj b/contrib/dotzlib/DotZLib/DotZLib.csproj
new file mode 100644
index 0000000..71eeb85
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/DotZLib.csproj
@@ -0,0 +1,141 @@
+<VisualStudioProject>

+    <CSHARP

+        ProjectType = "Local"

+        ProductVersion = "7.10.3077"

+        SchemaVersion = "2.0"

+        ProjectGuid = "{BB1EE0B1-1808-46CB-B786-949D91117FC5}"

+    >

+        <Build>

+            <Settings

+                ApplicationIcon = ""

+                AssemblyKeyContainerName = ""

+                AssemblyName = "DotZLib"

+                AssemblyOriginatorKeyFile = ""

+                DefaultClientScript = "JScript"

+                DefaultHTMLPageLayout = "Grid"

+                DefaultTargetSchema = "IE50"

+                DelaySign = "false"

+                OutputType = "Library"

+                PreBuildEvent = ""

+                PostBuildEvent = ""

+                RootNamespace = "DotZLib"

+                RunPostBuildEvent = "OnBuildSuccess"

+                StartupObject = ""

+            >

+                <Config

+                    Name = "Debug"

+                    AllowUnsafeBlocks = "false"

+                    BaseAddress = "285212672"

+                    CheckForOverflowUnderflow = "false"

+                    ConfigurationOverrideFile = ""

+                    DefineConstants = "DEBUG;TRACE"

+                    DocumentationFile = "docs\DotZLib.xml"

+                    DebugSymbols = "true"

+                    FileAlignment = "4096"

+                    IncrementalBuild = "false"

+                    NoStdLib = "false"

+                    NoWarn = "1591"

+                    Optimize = "false"

+                    OutputPath = "bin\Debug\"

+                    RegisterForComInterop = "false"

+                    RemoveIntegerChecks = "false"

+                    TreatWarningsAsErrors = "false"

+                    WarningLevel = "4"

+                />

+                <Config

+                    Name = "Release"

+                    AllowUnsafeBlocks = "false"

+                    BaseAddress = "285212672"

+                    CheckForOverflowUnderflow = "false"

+                    ConfigurationOverrideFile = ""

+                    DefineConstants = "TRACE"

+                    DocumentationFile = "docs\DotZLib.xml"

+                    DebugSymbols = "false"

+                    FileAlignment = "4096"

+                    IncrementalBuild = "false"

+                    NoStdLib = "false"

+                    NoWarn = ""

+                    Optimize = "true"

+                    OutputPath = "bin\Release\"

+                    RegisterForComInterop = "false"

+                    RemoveIntegerChecks = "false"

+                    TreatWarningsAsErrors = "false"

+                    WarningLevel = "4"

+                />

+            </Settings>

+            <References>

+                <Reference

+                    Name = "System"

+                    AssemblyName = "System"

+                    HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.dll"

+                />

+                <Reference

+                    Name = "System.Data"

+                    AssemblyName = "System.Data"

+                    HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"

+                />

+                <Reference

+                    Name = "System.XML"

+                    AssemblyName = "System.Xml"

+                    HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"

+                />

+                <Reference

+                    Name = "nunit.framework"

+                    AssemblyName = "nunit.framework"

+                    HintPath = "E:\apps\NUnit V2.1\\bin\nunit.framework.dll"

+                    AssemblyFolderKey = "hklm\dn\nunit.framework"

+                />

+            </References>

+        </Build>

+        <Files>

+            <Include>

+                <File

+                    RelPath = "AssemblyInfo.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+                <File

+                    RelPath = "ChecksumImpl.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+                <File

+                    RelPath = "CircularBuffer.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+                <File

+                    RelPath = "CodecBase.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+                <File

+                    RelPath = "Deflater.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+                <File

+                    RelPath = "DotZLib.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+                <File

+                    RelPath = "GZipStream.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+                <File

+                    RelPath = "Inflater.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+                <File

+                    RelPath = "UnitTests.cs"

+                    SubType = "Code"

+                    BuildAction = "Compile"

+                />

+            </Include>

+        </Files>

+    </CSHARP>

+</VisualStudioProject>

+

diff --git a/contrib/dotzlib/DotZLib/GZipStream.cs b/contrib/dotzlib/DotZLib/GZipStream.cs
new file mode 100644
index 0000000..f861675
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/GZipStream.cs
@@ -0,0 +1,301 @@
+//

+// © Copyright Henrik Ravn 2004

+//

+// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 

+// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

+//

+

+using System;

+using System.IO;

+using System.Runtime.InteropServices;

+

+namespace DotZLib

+{

+	/// <summary>

+	/// Implements a compressed <see cref="Stream"/>, in GZip (.gz) format.

+	/// </summary>

+	public class GZipStream : Stream, IDisposable

+	{

+        #region Dll Imports

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]

+        private static extern IntPtr gzopen(string name, string mode);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int gzclose(IntPtr gzFile);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int gzwrite(IntPtr gzFile, int data, int length);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int gzread(IntPtr gzFile, int data, int length);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int gzgetc(IntPtr gzFile);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int gzputc(IntPtr gzFile, int c);

+

+        #endregion

+

+        #region Private data

+        private IntPtr _gzFile;

+        private bool _isDisposed = false;

+        private bool _isWriting;

+        #endregion

+

+        #region Constructors

+        /// <summary>

+        /// Creates a new file as a writeable GZipStream

+        /// </summary>

+        /// <param name="fileName">The name of the compressed file to create</param>

+        /// <param name="level">The compression level to use when adding data</param>

+        /// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception>

+		public GZipStream(string fileName, CompressLevel level)

+		{

+            _isWriting = true;

+            _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level));

+            if (_gzFile == IntPtr.Zero)

+                throw new ZLibException(-1, "Could not open " + fileName);

+		}

+

+        /// <summary>

+        /// Opens an existing file as a readable GZipStream

+        /// </summary>

+        /// <param name="fileName">The name of the file to open</param>

+        /// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception>

+        public GZipStream(string fileName)

+        {

+            _isWriting = false;

+            _gzFile = gzopen(fileName, "rb");

+            if (_gzFile == IntPtr.Zero)

+                throw new ZLibException(-1, "Could not open " + fileName);

+

+        }

+        #endregion

+

+        #region Access properties

+        /// <summary>

+        /// Returns true of this stream can be read from, false otherwise

+        /// </summary>

+        public override bool CanRead

+        {

+            get

+            {

+                return !_isWriting;

+            }

+        }

+    

+

+        /// <summary>

+        /// Returns false.

+        /// </summary>

+        public override bool CanSeek

+        {

+            get

+            {

+                return false;

+            }

+        }

+    

+        /// <summary>

+        /// Returns true if this tsream is writeable, false otherwise

+        /// </summary>

+        public override bool CanWrite

+        {

+            get

+            {

+                return _isWriting;

+            }

+        }

+        #endregion

+    

+        #region Destructor & IDispose stuff

+

+        /// <summary>

+        /// Destroys this instance

+        /// </summary>

+        ~GZipStream()

+        {

+            cleanUp(false);

+        }

+

+        /// <summary>

+        /// Closes the external file handle

+        /// </summary>

+        public void Dispose()

+        {

+            cleanUp(true);

+        }

+

+        // Does the actual closing of the file handle.

+        private void cleanUp(bool isDisposing)

+        {

+            if (!_isDisposed)

+            {

+                gzclose(_gzFile);

+                _isDisposed = true;

+            }

+        }

+        #endregion

+    

+        #region Basic reading and writing

+        /// <summary>

+        /// Attempts to read a number of bytes from the stream.

+        /// </summary>

+        /// <param name="buffer">The destination data buffer</param>

+        /// <param name="offset">The index of the first destination byte in <c>buffer</c></param>

+        /// <param name="count">The number of bytes requested</param>

+        /// <returns>The number of bytes read</returns>

+        /// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception>

+        /// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception>

+        /// <exception cref="ArgumentException">If <c>offset</c>  + <c>count</c> is &gt; buffer.Length</exception>

+        /// <exception cref="NotSupportedException">If this stream is not readable.</exception>

+        /// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>

+        public override int Read(byte[] buffer, int offset, int count)

+        {

+            if (!CanRead) throw new NotSupportedException();

+            if (buffer == null) throw new ArgumentNullException();

+            if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();

+            if ((offset+count) > buffer.Length) throw new ArgumentException();

+            if (_isDisposed) throw new ObjectDisposedException("GZipStream");

+

+            GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned);

+            int result;

+            try

+            {

+                result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count);

+                if (result < 0)

+                    throw new IOException();

+            }

+            finally

+            {

+                h.Free();

+            }

+            return result;

+        }

+

+        /// <summary>

+        /// Attempts to read a single byte from the stream.

+        /// </summary>

+        /// <returns>The byte that was read, or -1 in case of error or End-Of-File</returns>

+        public override int ReadByte()

+        {

+            if (!CanRead) throw new NotSupportedException();

+            if (_isDisposed) throw new ObjectDisposedException("GZipStream");

+            return gzgetc(_gzFile);

+        }

+

+        /// <summary>

+        /// Writes a number of bytes to the stream

+        /// </summary>

+        /// <param name="buffer"></param>

+        /// <param name="offset"></param>

+        /// <param name="count"></param>

+        /// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception>

+        /// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception>

+        /// <exception cref="ArgumentException">If <c>offset</c>  + <c>count</c> is &gt; buffer.Length</exception>

+        /// <exception cref="NotSupportedException">If this stream is not writeable.</exception>

+        /// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>

+        public override void Write(byte[] buffer, int offset, int count)

+        {

+            if (!CanWrite) throw new NotSupportedException();

+            if (buffer == null) throw new ArgumentNullException();

+            if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();

+            if ((offset+count) > buffer.Length) throw new ArgumentException();

+            if (_isDisposed) throw new ObjectDisposedException("GZipStream");

+

+            GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned);

+            try

+            {

+                int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count);

+                if (result < 0)

+                    throw new IOException();

+            }

+            finally

+            {

+                h.Free();

+            }

+        }

+

+        /// <summary>

+        /// Writes a single byte to the stream

+        /// </summary>

+        /// <param name="value">The byte to add to the stream.</param>

+        /// <exception cref="NotSupportedException">If this stream is not writeable.</exception>

+        /// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>

+        public override void WriteByte(byte value)

+        {

+            if (!CanWrite) throw new NotSupportedException();

+            if (_isDisposed) throw new ObjectDisposedException("GZipStream");

+

+            int result = gzputc(_gzFile, (int)value);

+            if (result < 0)

+                throw new IOException();

+        }

+        #endregion

+

+        #region Position & length stuff

+        /// <summary>

+        /// Not supported.

+        /// </summary>

+        /// <param name="value"></param>

+        /// <exception cref="NotSupportedException">Always thrown</exception>

+        public override void SetLength(long value)

+        {

+            throw new NotSupportedException();

+        }

+    

+        /// <summary>

+        ///  Not suppported.

+        /// </summary>

+        /// <param name="offset"></param>

+        /// <param name="origin"></param>

+        /// <returns></returns>

+        /// <exception cref="NotSupportedException">Always thrown</exception>

+        public override long Seek(long offset, SeekOrigin origin)

+        {

+            throw new NotSupportedException();

+        }

+    

+        /// <summary>

+        /// Flushes the <c>GZipStream</c>.

+        /// </summary>

+        /// <remarks>In this implementation, this method does nothing. This is because excessive

+        /// flushing may degrade the achievable compression rates.</remarks>

+        public override void Flush()

+        {

+            // left empty on purpose

+        }

+    

+        /// <summary>

+        /// Gets/sets the current position in the <c>GZipStream</c>. Not suppported.

+        /// </summary>

+        /// <remarks>In this implementation this property is not supported</remarks>

+        /// <exception cref="NotSupportedException">Always thrown</exception>

+        public override long Position

+        {

+            get

+            {

+                throw new NotSupportedException();

+            }

+            set

+            {

+                throw new NotSupportedException();

+            }

+        }

+    

+        /// <summary>

+        /// Gets the size of the stream. Not suppported.

+        /// </summary>

+        /// <remarks>In this implementation this property is not supported</remarks>

+        /// <exception cref="NotSupportedException">Always thrown</exception>

+        public override long Length

+        {

+            get

+            {

+                throw new NotSupportedException();

+            }

+        }

+        #endregion

+    }

+}

diff --git a/contrib/dotzlib/DotZLib/Inflater.cs b/contrib/dotzlib/DotZLib/Inflater.cs
new file mode 100644
index 0000000..4e60cda
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/Inflater.cs
@@ -0,0 +1,105 @@
+//

+// © Copyright Henrik Ravn 2004

+//

+// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 

+// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

+//

+

+using System;

+using System.Diagnostics;

+using System.Runtime.InteropServices;

+

+namespace DotZLib

+{

+    

+    /// <summary>

+    /// Implements a data decompressor, using the inflate algorithm in the ZLib dll

+    /// </summary>

+    public class Inflater : CodecBase

+	{

+        #region Dll imports

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]

+        private static extern int inflateInit_(ref ZStream sz, string vs, int size);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int inflate(ref ZStream sz, int flush);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int inflateReset(ref ZStream sz);

+

+        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]

+        private static extern int inflateEnd(ref ZStream sz);

+        #endregion

+

+        /// <summary>

+        /// Constructs an new instance of the <c>Inflater</c>

+        /// </summary>

+        public Inflater() : base()

+		{

+            int retval = inflateInit_(ref _ztream, Info.Version, Marshal.SizeOf(_ztream));

+            if (retval != 0)

+                throw new ZLibException(retval, "Could not initialize inflater");

+

+            resetOutput();

+        }

+

+

+        /// <summary>

+        /// Adds more data to the codec to be processed.

+        /// </summary>

+        /// <param name="data">Byte array containing the data to be added to the codec</param>

+        /// <param name="offset">The index of the first byte to add from <c>data</c></param>

+        /// <param name="count">The number of bytes to add</param>

+        /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>

+        public override void Add(byte[] data, int offset, int count)

+        {

+            if (data == null) throw new ArgumentNullException();

+            if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();

+            if ((offset+count) > data.Length) throw new ArgumentException();

+

+            int total = count;

+            int inputIndex = offset;

+            int err = 0;

+

+            while (err >= 0 && inputIndex < total)

+            {

+                copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize));

+                err = inflate(ref _ztream, (int)FlushTypes.None);

+                if (err == 0)

+                    while (_ztream.avail_out == 0)

+                    {

+                        OnDataAvailable();

+                        err = inflate(ref _ztream, (int)FlushTypes.None);

+                    }

+

+                inputIndex += (int)_ztream.total_in;

+            }

+            setChecksum( _ztream.adler );

+        }

+

+

+        /// <summary>

+        /// Finishes up any pending data that needs to be processed and handled.

+        /// </summary>

+        public override void Finish()

+        {

+            int err;

+            do 

+            {

+                err = inflate(ref _ztream, (int)FlushTypes.Finish);

+                OnDataAvailable();

+            }

+            while (err == 0);

+            setChecksum( _ztream.adler );

+            inflateReset(ref _ztream);

+            resetOutput();

+        }

+

+        /// <summary>

+        /// Closes the internal zlib inflate stream

+        /// </summary>

+        protected override void CleanUp() { inflateEnd(ref _ztream); }

+

+

+	}

+}

diff --git a/contrib/dotzlib/DotZLib/UnitTests.cs b/contrib/dotzlib/DotZLib/UnitTests.cs
new file mode 100644
index 0000000..2f374b6
--- /dev/null
+++ b/contrib/dotzlib/DotZLib/UnitTests.cs
@@ -0,0 +1,274 @@
+//

+// © Copyright Henrik Ravn 2004

+//

+// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 

+// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

+//

+

+using System;

+using System.Collections;

+using System.IO;

+

+// uncomment the define below to include unit tests

+//#define nunit

+#if nunit

+using NUnit.Framework;

+

+// Unit tests for the DotZLib class library

+// ----------------------------------------

+//

+// Use this with NUnit 2 from http://www.nunit.org

+//

+

+namespace DotZLibTests

+{

+    using DotZLib;

+

+    // helper methods

+    internal class Utils

+    {

+        public static bool byteArrEqual( byte[] lhs, byte[] rhs )

+        {

+            if (lhs.Length != rhs.Length)

+                return false;

+            for (int i = lhs.Length-1; i >= 0; --i)

+                if (lhs[i] != rhs[i])

+                    return false;

+            return true;

+        }

+

+    }

+

+

+    [TestFixture]

+    public class CircBufferTests

+    {

+        #region Circular buffer tests

+        [Test]

+        public void SinglePutGet()

+        {

+            CircularBuffer buf = new CircularBuffer(10);

+            Assert.AreEqual( 0, buf.Size );

+            Assert.AreEqual( -1, buf.Get() );

+

+            Assert.IsTrue(buf.Put( 1 ));

+            Assert.AreEqual( 1, buf.Size );

+            Assert.AreEqual( 1, buf.Get() );

+            Assert.AreEqual( 0, buf.Size );

+            Assert.AreEqual( -1, buf.Get() );

+        }

+

+        [Test]

+        public void BlockPutGet()

+        {

+            CircularBuffer buf = new CircularBuffer(10);

+            byte[] arr = {1,2,3,4,5,6,7,8,9,10};

+            Assert.AreEqual( 10, buf.Put(arr,0,10) );

+            Assert.AreEqual( 10, buf.Size );

+            Assert.IsFalse( buf.Put(11) );

+            Assert.AreEqual( 1, buf.Get() );

+            Assert.IsTrue( buf.Put(11) );

+

+            byte[] arr2 = (byte[])arr.Clone();

+            Assert.AreEqual( 9, buf.Get(arr2,1,9) );

+            Assert.IsTrue( Utils.byteArrEqual(arr,arr2) );

+        }

+

+        #endregion

+    }

+

+    [TestFixture]

+    public class ChecksumTests

+    {

+        #region CRC32 Tests

+        [Test]

+        public void CRC32_Null()

+        {

+            CRC32Checksum crc32 = new CRC32Checksum();

+            Assert.AreEqual( 0, crc32.Value );

+

+            crc32 = new CRC32Checksum(1);

+            Assert.AreEqual( 1, crc32.Value );

+

+            crc32 = new CRC32Checksum(556);

+            Assert.AreEqual( 556, crc32.Value );

+        }

+

+        [Test]

+        public void CRC32_Data()

+        {

+            CRC32Checksum crc32 = new CRC32Checksum();

+            byte[] data = { 1,2,3,4,5,6,7 };

+            crc32.Update(data);

+            Assert.AreEqual( 0x70e46888, crc32.Value  );

+

+            crc32 = new CRC32Checksum();

+            crc32.Update("penguin");

+            Assert.AreEqual( 0x0e5c1a120, crc32.Value );

+

+            crc32 = new CRC32Checksum(1);

+            crc32.Update("penguin");

+            Assert.AreEqual(0x43b6aa94, crc32.Value);

+

+        }

+        #endregion

+

+        #region Adler tests

+

+        [Test]

+        public void Adler_Null()

+        {

+            AdlerChecksum adler = new AdlerChecksum();

+            Assert.AreEqual(0, adler.Value);

+

+            adler = new AdlerChecksum(1);

+            Assert.AreEqual( 1, adler.Value );

+

+            adler = new AdlerChecksum(556);

+            Assert.AreEqual( 556, adler.Value );

+        }

+

+        [Test]

+        public void Adler_Data()

+        {

+            AdlerChecksum adler = new AdlerChecksum(1);

+            byte[] data = { 1,2,3,4,5,6,7 };

+            adler.Update(data);

+            Assert.AreEqual( 0x5b001d, adler.Value  );

+

+            adler = new AdlerChecksum();

+            adler.Update("penguin");

+            Assert.AreEqual(0x0bcf02f6, adler.Value );

+

+            adler = new AdlerChecksum(1);

+            adler.Update("penguin");

+            Assert.AreEqual(0x0bd602f7, adler.Value);

+

+        }

+        #endregion

+    }

+

+    [TestFixture]

+    public class InfoTests

+    {

+        #region Info tests

+        [Test]

+        public void Info_Version()

+        {

+            Info info = new Info();

+            Assert.AreEqual("1.2.2", Info.Version);

+            Assert.AreEqual(32, info.SizeOfUInt);

+            Assert.AreEqual(32, info.SizeOfULong);

+            Assert.AreEqual(32, info.SizeOfPointer);

+            Assert.AreEqual(32, info.SizeOfOffset);

+        }

+        #endregion

+    }

+

+    [TestFixture]

+    public class DeflateInflateTests

+    {

+        #region Deflate tests

+        [Test]

+        public void Deflate_Init()

+        {

+            using (Deflater def = new Deflater(CompressLevel.Default))

+            {

+            }

+        }

+

+        private ArrayList compressedData = new ArrayList();

+        private uint adler1;

+

+        private ArrayList uncompressedData = new ArrayList();

+        private uint adler2;

+

+        public void CDataAvail(byte[] data, int startIndex, int count)

+        {

+            for (int i = 0; i < count; ++i)

+                compressedData.Add(data[i+startIndex]);

+        }

+

+        [Test]

+        public void Deflate_Compress()

+        {

+            compressedData.Clear();

+

+            byte[] testData = new byte[35000];

+            for (int i = 0; i < testData.Length; ++i)

+                testData[i] = 5;

+

+            using (Deflater def = new Deflater((CompressLevel)5))

+            {

+                def.DataAvailable += new DataAvailableHandler(CDataAvail);

+                def.Add(testData);

+                def.Finish();

+                adler1 = def.Checksum;

+            }

+        }

+        #endregion

+

+        #region Inflate tests

+        [Test]

+        public void Inflate_Init()

+        {

+            using (Inflater inf = new Inflater())

+            {

+            }

+        }

+

+        private void DDataAvail(byte[] data, int startIndex, int count)

+        {

+            for (int i = 0; i < count; ++i)

+                uncompressedData.Add(data[i+startIndex]);

+        }

+

+        [Test]

+        public void Inflate_Expand()

+        { 

+            uncompressedData.Clear();

+

+            using (Inflater inf = new Inflater())

+            {

+                inf.DataAvailable += new DataAvailableHandler(DDataAvail);

+                inf.Add((byte[])compressedData.ToArray(typeof(byte)));

+                inf.Finish();

+                adler2 = inf.Checksum;

+            }

+            Assert.AreEqual( adler1, adler2 );

+        }

+        #endregion

+    }

+

+    [TestFixture]

+    public class GZipStreamTests

+    {

+        #region GZipStream test

+        [Test]

+        public void GZipStream_WriteRead()

+        {

+            using (GZipStream gzOut = new GZipStream("gzstream.gz", CompressLevel.Best))

+            {

+                BinaryWriter writer = new BinaryWriter(gzOut);

+                writer.Write("hi there");

+                writer.Write(Math.PI);

+                writer.Write(42);

+            }

+

+            using (GZipStream gzIn = new GZipStream("gzstream.gz"))

+            {

+                BinaryReader reader = new BinaryReader(gzIn);

+                string s = reader.ReadString();

+                Assert.AreEqual("hi there",s);

+                double d = reader.ReadDouble();

+                Assert.AreEqual(Math.PI, d);

+                int i = reader.ReadInt32();

+                Assert.AreEqual(42,i);

+            }

+

+        }

+        #endregion

+	}

+}

+

+#endif
\ No newline at end of file
diff --git a/contrib/dotzlib/LICENSE_1_0.txt b/contrib/dotzlib/LICENSE_1_0.txt
new file mode 100644
index 0000000..30aac2c
--- /dev/null
+++ b/contrib/dotzlib/LICENSE_1_0.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003

+

+Permission is hereby granted, free of charge, to any person or organization

+obtaining a copy of the software and accompanying documentation covered by

+this license (the "Software") to use, reproduce, display, distribute,

+execute, and transmit the Software, and to prepare derivative works of the

+Software, and to permit third-parties to whom the Software is furnished to

+do so, all subject to the following:

+

+The copyright notices in the Software and this entire statement, including

+the above license grant, this restriction and the following disclaimer,

+must be included in all copies of the Software, in whole or in part, and

+all derivative works of the Software, unless such copies or derivative

+works are solely in the form of machine-executable object code generated by

+a source language processor.

+

+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT

+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE

+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,

+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER

+DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/contrib/dotzlib/readme.txt b/contrib/dotzlib/readme.txt
new file mode 100644
index 0000000..210f4b0
--- /dev/null
+++ b/contrib/dotzlib/readme.txt
@@ -0,0 +1,58 @@
+This directory contains a .Net wrapper class library for the ZLib1.dll

+

+The wrapper includes support for inflating/deflating memory buffers, 

+.Net streaming wrappers for the gz streams part of zlib, and wrappers

+for the checksum parts of zlib. See DotZLib/UnitTests.cs for examples.

+

+Directory structure:

+--------------------

+

+LICENSE_1_0.txt       - License file.

+readme.txt            - This file.

+DotZLib.chm           - Class library documentation

+DotZLib.build         - NAnt build file

+DotZLib.sln           - Microsoft Visual Studio 2003 solution file

+

+DotZLib\*.cs          - Source files for the class library

+

+Unit tests:

+-----------

+The file DotZLib/UnitTests.cs contains unit tests for use with NUnit 2.1 or higher.

+To include unit tests in the build, define nunit before building.

+

+

+Build instructions:

+-------------------

+

+1. Using Visual Studio.Net 2003:

+   Open DotZLib.sln in VS.Net and build from there. Output file (DotZLib.dll)

+   will be found ./DotZLib/bin/release or ./DotZLib/bin/debug, depending on 

+   you are building the release or debug version of the library. Check 

+   DotZLib/UnitTests.cs for instructions on how to include unit tests in the

+   build.

+   

+2. Using NAnt:

+   Open a command prompt with access to the build environment and run nant

+   in the same directory as the DotZLib.build file.

+   You can define 2 properties on the nant command-line to control the build:

+   debug={true|false} to toggle between release/debug builds (default=true).

+   nunit={true|false} to include or esclude unit tests (default=true).

+   Also the target clean will remove binaries.

+   Output file (DotZLib.dll) will be found in either ./DotZLib/bin/release 

+   or ./DotZLib/bin/debug, depending on whether you are building the release 

+   or debug version of the library.

+

+   Examples: 

+     nant -D:debug=false -D:nunit=false

+       will build a release mode version of the library without unit tests.

+     nant

+       will build a debug version of the library with unit tests 

+     nant clean

+       will remove all previously built files.

+

+

+---------------------------------

+Copyright (c) Henrik Ravn 2004

+

+Use, modification and distribution are subject to the Boost Software License, Version 1.0. 

+(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

diff --git a/contrib/gzappend/gzappend.c b/contrib/gzappend/gzappend.c
index f2e9e4f..e9e878e 100644
--- a/contrib/gzappend/gzappend.c
+++ b/contrib/gzappend/gzappend.c
@@ -48,10 +48,10 @@
    unfriendly behavior that if gzappend fails, the gzip file is corrupted.
 
    This program was written to illustrate the use of the new Z_BLOCK option of
-   zlib 1.2.1's inflate() function.  This option returns from inflate() at each
+   zlib 1.2.x's inflate() function.  This option returns from inflate() at each
    block boundary to facilitate locating and modifying the last block bit at
    the start of the final deflate block.  Also whether using Z_BLOCK or not,
-   another required feature of zlib 1.2.1 is that inflate() now provides the
+   another required feature of zlib 1.2.x is that inflate() now provides the
    number of unusued bits in the last input byte used.  gzappend will not work
    with versions of zlib earlier than 1.2.1.
 
diff --git a/contrib/infback9/infback9.c b/contrib/infback9/infback9.c
index 103d901..f5ddde6 100644
--- a/contrib/infback9/infback9.c
+++ b/contrib/infback9/infback9.c
@@ -430,8 +430,8 @@
                 }
             }
 
-	    /* handle error breaks in while */
-	    if (mode == BAD) break;
+            /* handle error breaks in while */
+            if (mode == BAD) break;
 
             /* build code tables */
             state->next = state->codes;
diff --git a/contrib/infback9/inftree9.c b/contrib/infback9/inftree9.c
index 5fd5b4a..9b48bc5 100644
--- a/contrib/infback9/inftree9.c
+++ b/contrib/infback9/inftree9.c
@@ -9,7 +9,7 @@
 #define MAXBITS 15
 
 const char inflate9_copyright[] =
-   " inflate9 1.2.1.2 Copyright 1995-2004 Mark Adler ";
+   " inflate9 1.2.2 Copyright 1995-2004 Mark Adler ";
 /*
   If you use the zlib library in a product, an acknowledgment is welcome
   in the documentation of your product. If for some reason you cannot
@@ -64,7 +64,7 @@
     static const unsigned short lext[31] = { /* Length codes 257..285 extra */
         128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
         130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
-        133, 133, 133, 133, 144, 77, 194};
+        133, 133, 133, 133, 144, 199, 198};
     static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
         65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
diff --git a/contrib/minizip/ioapi.c b/contrib/minizip/ioapi.c
index 6ddfd36..c9e69f2 100644
--- a/contrib/minizip/ioapi.c
+++ b/contrib/minizip/ioapi.c
@@ -94,7 +94,7 @@
    uLong size;
 {
     uLong ret;
-    ret = fread(buf, 1, (size_t)size, (FILE *)stream);
+    ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
     return ret;
 }
 
@@ -106,7 +106,7 @@
    uLong size;
 {
     uLong ret;
-    ret = fwrite(buf, 1, (size_t)size, (FILE *)stream);
+    ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
     return ret;
 }
 
diff --git a/contrib/minizip/miniunz.c b/contrib/minizip/miniunz.c
index 11b7260..a6b06a2 100644
--- a/contrib/minizip/miniunz.c
+++ b/contrib/minizip/miniunz.c
@@ -317,7 +317,7 @@
 
                     printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);
                     ret = scanf("%1s",answer);
-                    if (ret != 1) 
+                    if (ret != 1)
                     {
                        exit(EXIT_FAILURE);
                     }
@@ -567,7 +567,7 @@
         return do_list(uf);
     else if (opt_do_extract==1)
     {
-        if (opt_extractdir && chdir(dirname)) 
+        if (opt_extractdir && chdir(dirname))
         {
           printf("Error changing into %s, aborting\n", dirname);
           exit(-1);
diff --git a/contrib/minizip/mztools.c b/contrib/minizip/mztools.c
index 363ee13..c1266bc 100644
--- a/contrib/minizip/mztools.c
+++ b/contrib/minizip/mztools.c
@@ -62,7 +62,7 @@
         unsigned int fnsize = READ_16(header + 26); /* file name length */
         unsigned int extsize = READ_16(header + 28); /* extra field length */
         filename[0] = extra[0] = '\0';
-        
+
         /* Header */
         if (fwrite(header, 1, 30, fpOut) == 30) {
           offset += 30;
@@ -70,7 +70,7 @@
           err = Z_ERRNO;
           break;
         }
-        
+
         /* Filename */
         if (fnsize > 0) {
           if (fread(filename, 1, fnsize, fpZip) == fnsize) {
@@ -103,7 +103,7 @@
             break;
           }
         }
-        
+
         /* Data */
         {
           int dataSize = cpsize;
@@ -133,7 +133,7 @@
             }
           }
         }
-        
+
         /* Central directory entry */
         {
           char header[46];
@@ -159,7 +159,7 @@
           /* Header */
           if (fwrite(header, 1, 46, fpOutCD) == 46) {
             offsetCD += 46;
-            
+
             /* Filename */
             if (fnsize > 0) {
               if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) {
@@ -172,7 +172,7 @@
               err = Z_STREAM_ERROR;
               break;
             }
-            
+
             /* Extra field */
             if (extsize > 0) {
               if (fwrite(extra, 1, extsize, fpOutCD) == extsize) {
@@ -182,7 +182,7 @@
                 break;
               }
             }
-            
+
             /* Comment field */
             if (comsize > 0) {
               if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) {
@@ -192,8 +192,8 @@
                 break;
               }
             }
-            
-            
+
+
           } else {
             err = Z_ERRNO;
             break;
@@ -225,17 +225,17 @@
       WRITE_32(header + 12, offsetCD);    /* size of CD */
       WRITE_32(header + 16, offset);      /* offset to CD */
       WRITE_16(header + 20, comsize);     /* comment */
-      
+
       /* Header */
       if (fwrite(header, 1, 22, fpOutCD) == 22) {
-        
+
         /* Comment field */
         if (comsize > 0) {
           if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) {
             err = Z_ERRNO;
           }
         }
-        
+
       } else {
         err = Z_ERRNO;
       }
@@ -257,14 +257,14 @@
         fclose(fpOutCD);
       }
     }
-    
+
     /* Close */
     fclose(fpZip);
     fclose(fpOut);
-    
+
     /* Wipe temporary file */
     (void)remove(fileOutTmp);
-    
+
     /* Number of recovered entries */
     if (err == Z_OK) {
       if (nRecovered != NULL) {
diff --git a/contrib/minizip/mztools.h b/contrib/minizip/mztools.h
index eee78dc..88b3459 100644
--- a/contrib/minizip/mztools.h
+++ b/contrib/minizip/mztools.h
@@ -17,14 +17,14 @@
 
 #include "unzip.h"
 
-/* Repair a ZIP file (missing central directory) 
+/* Repair a ZIP file (missing central directory)
    file: file to recover
    fileOut: output file after recovery
    fileOutTmp: temporary file name used for recovery
 */
-extern int ZEXPORT unzRepair(const char* file, 
-                             const char* fileOut, 
-                             const char* fileOutTmp, 
+extern int ZEXPORT unzRepair(const char* file,
+                             const char* fileOut,
+                             const char* fileOutTmp,
                              uLong* nRecovered,
                              uLong* bytesRecovered);
 
diff --git a/contrib/minizip/unzip.c b/contrib/minizip/unzip.c
index e804a2a..e14de9e 100644
--- a/contrib/minizip/unzip.c
+++ b/contrib/minizip/unzip.c
@@ -1,5 +1,5 @@
 /* unzip.c -- IO for uncompress .zip files using zlib
-   Version 1.01c, August 23th, 2004
+   Version 1.01d, September 22th, 2004
 
    Copyright (C) 1998-2004 Gilles Vollant
 
@@ -1250,10 +1250,12 @@
         pfile_in_zip_read_info->stream.avail_out =
             (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
 
-    if ((len>pfile_in_zip_read_info->rest_read_compressed) &&
-        (pfile_in_zip_read_info->raw))
+    if ((len>pfile_in_zip_read_info->rest_read_compressed+
+           pfile_in_zip_read_info->stream.avail_in) &&
+         (pfile_in_zip_read_info->raw))
         pfile_in_zip_read_info->stream.avail_out =
-            (uInt)pfile_in_zip_read_info->rest_read_compressed; 
+            (uInt)pfile_in_zip_read_info->rest_read_compressed+
+            pfile_in_zip_read_info->stream.avail_in;
 
     while (pfile_in_zip_read_info->stream.avail_out>0)
     {
diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c
index ce1444c..2ccd7fd 100644
--- a/contrib/minizip/zip.c
+++ b/contrib/minizip/zip.c
@@ -717,9 +717,9 @@
     if (comment==NULL)
         size_comment = 0;
     else
-        size_comment = strlen(comment);
+        size_comment = (uInt)strlen(comment);
 
-    size_filename = strlen(filename);
+    size_filename = (uInt)strlen(filename);
 
     if (zipfi == NULL)
         zi->ci.dosDate = 0;
@@ -1126,7 +1126,7 @@
     if (global_comment==NULL)
         size_global_comment = 0;
     else
-        size_global_comment = strlen(global_comment);
+        size_global_comment = (uInt)strlen(global_comment);
 
 
     centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
diff --git a/contrib/untgz/untgz.c b/contrib/untgz/untgz.c
index 3a30768..2c391e5 100644
--- a/contrib/untgz/untgz.c
+++ b/contrib/untgz/untgz.c
@@ -97,7 +97,7 @@
   struct attr_item  *next;
   char              *fname;
   int                mode;
-  time_t             time; 
+  time_t             time;
 };
 
 enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID };
diff --git a/contrib/vstudio/vc7/zlib.rc b/contrib/vstudio/vc7/zlib.rc
index 2eb7c6b..3ebe25b 100644
--- a/contrib/vstudio/vc7/zlib.rc
+++ b/contrib/vstudio/vc7/zlib.rc
@@ -2,8 +2,8 @@
 

 #define IDR_VERSION1  1

 IDR_VERSION1	VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE

-  FILEVERSION	 1,2,1,2

-  PRODUCTVERSION 1,2,1,2

+  FILEVERSION	 1,2,2

+  PRODUCTVERSION 1,2,2

   FILEFLAGSMASK	VS_FFI_FILEFLAGSMASK

   FILEFLAGS	0

   FILEOS	VOS_DOS_WINDOWS32

@@ -17,7 +17,7 @@
 

     BEGIN

       VALUE "FileDescription", "zlib data compression library\0"

-      VALUE "FileVersion",	"1.2.1.2\0"

+      VALUE "FileVersion",	"1.2.2\0"

       VALUE "InternalName",	"zlib\0"

       VALUE "OriginalFilename",	"zlib.dll\0"

       VALUE "ProductName",	"ZLib.DLL\0"

diff --git a/crc32.c b/crc32.c
index 0e04880..b39c7e1 100644
--- a/crc32.c
+++ b/crc32.c
@@ -12,11 +12,11 @@
 /* @(#) $Id$ */
 
 /*
-  Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection
-  on the static variables used to control the first-use generation of the crc
-  tables.  Therefore if you #define DYNAMIC_CRC_TABLE, you should first call
-  get_crc_table() to initialize the tables before allowing more than on thread
-  to use crc32().
+  Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
+  protection on the static variables used to control the first-use generation
+  of the crc tables.  Therefore, if you #define DYNAMIC_CRC_TABLE, you should
+  first call get_crc_table() to initialize the tables before allowing more than
+  one thread to use crc32().
  */
 
 #ifdef MAKECRCH
@@ -103,51 +103,51 @@
 {
     unsigned long c;
     int n, k;
-    unsigned long poly;				/* polynomial exclusive-or pattern */
+    unsigned long poly;                 /* polynomial exclusive-or pattern */
     /* terms of polynomial defining this crc (except x^32): */
-	static volatile int first = 1;		/* flag to limit concurrent making */
+    static volatile int first = 1;      /* flag to limit concurrent making */
     static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
 
-	/* See if another task is already doing this (not thread-safe, but better
-	   than nothing -- significantly reduces duration of vulnerability in
-	   case the advice about DYNAMIC_CRC_TABLE is ignored) */
-	if (first) {
-		first = 0;
+    /* See if another task is already doing this (not thread-safe, but better
+       than nothing -- significantly reduces duration of vulnerability in
+       case the advice about DYNAMIC_CRC_TABLE is ignored) */
+    if (first) {
+        first = 0;
 
-		/* make exclusive-or pattern from polynomial (0xedb88320UL) */
-		poly = 0UL;
-		for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++)
-			poly |= 1UL << (31 - p[n]);
+        /* make exclusive-or pattern from polynomial (0xedb88320UL) */
+        poly = 0UL;
+        for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++)
+            poly |= 1UL << (31 - p[n]);
 
-		/* generate a crc for every 8-bit value */
-		for (n = 0; n < 256; n++) {
-			c = (unsigned long)n;
-			for (k = 0; k < 8; k++)
-				c = c & 1 ? poly ^ (c >> 1) : c >> 1;
-			crc_table[0][n] = c;
-		}
+        /* generate a crc for every 8-bit value */
+        for (n = 0; n < 256; n++) {
+            c = (unsigned long)n;
+            for (k = 0; k < 8; k++)
+                c = c & 1 ? poly ^ (c >> 1) : c >> 1;
+            crc_table[0][n] = c;
+        }
 
 #ifdef BYFOUR
-		/* generate crc for each value followed by one, two, and three zeros, and
-		   then the byte reversal of those as well as the first table */
-		for (n = 0; n < 256; n++) {
-			c = crc_table[0][n];
-			crc_table[4][n] = REV(c);
-			for (k = 1; k < 4; k++) {
-				c = crc_table[0][c & 0xff] ^ (c >> 8);
-				crc_table[k][n] = c;
-				crc_table[k + 4][n] = REV(c);
-			}
-		}
+        /* generate crc for each value followed by one, two, and three zeros,
+           and then the byte reversal of those as well as the first table */
+        for (n = 0; n < 256; n++) {
+            c = crc_table[0][n];
+            crc_table[4][n] = REV(c);
+            for (k = 1; k < 4; k++) {
+                c = crc_table[0][c & 0xff] ^ (c >> 8);
+                crc_table[k][n] = c;
+                crc_table[k + 4][n] = REV(c);
+            }
+        }
 #endif /* BYFOUR */
 
-		crc_table_empty = 0;
-	}
-	else {		/* not first */
-		/* wait for the other guy to finish (not exactly efficient, but rare) */
-		while (crc_table_empty)
-			;
-	}
+        crc_table_empty = 0;
+    }
+    else {      /* not first */
+        /* wait for the other guy to finish (not efficient, but rare) */
+        while (crc_table_empty)
+            ;
+    }
 
 #ifdef MAKECRCH
     /* write out CRC tables to crc32.h */
@@ -201,10 +201,10 @@
 const unsigned long FAR * ZEXPORT get_crc_table()
 {
 #ifdef DYNAMIC_CRC_TABLE
-	if (crc_table_empty)
-		make_crc_table();
+    if (crc_table_empty)
+        make_crc_table();
 #endif /* DYNAMIC_CRC_TABLE */
-	return (const unsigned long FAR *)crc_table;
+    return (const unsigned long FAR *)crc_table;
 }
 
 /* ========================================================================= */
diff --git a/deflate.c b/deflate.c
index b402fe5..0fc53bc 100644
--- a/deflate.c
+++ b/deflate.c
@@ -1,5 +1,5 @@
 /* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2003 Jean-loup Gailly.
+ * Copyright (C) 1995-2004 Jean-loup Gailly.
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -52,7 +52,7 @@
 #include "deflate.h"
 
 const char deflate_copyright[] =
-   " deflate 1.2.1.2 Copyright 1995-2004 Jean-loup Gailly ";
+   " deflate 1.2.2 Copyright 1995-2004 Jean-loup Gailly ";
 /*
   If you use the zlib library in a product, an acknowledgment is welcome
   in the documentation of your product. If for some reason you cannot
diff --git a/gzio.c b/gzio.c
index 0ceafff..5e71b0a 100644
--- a/gzio.c
+++ b/gzio.c
@@ -455,10 +455,10 @@
                     s->z_err = Z_ERRNO;
                     break;
                 }
-		if (feof(s->file)) {	    /* avoid error for empty file */
-		    s->z_err = Z_STREAM_END;
-		    break;
-		}
+                if (feof(s->file)) {        /* avoid error for empty file */
+                    s->z_err = Z_STREAM_END;
+                    break;
+                }
             }
             s->stream.next_in = s->inbuf;
         }
diff --git a/infback.c b/infback.c
index 477b6ea..262f97c 100644
--- a/infback.c
+++ b/infback.c
@@ -434,8 +434,8 @@
                 }
             }
 
-	    /* handle error breaks in while */
-	    if (state->mode == BAD) break;
+            /* handle error breaks in while */
+            if (state->mode == BAD) break;
 
             /* build code tables */
             state->next = state->codes;
diff --git a/inflate.c b/inflate.c
index 06ca1de..c6d3826 100644
--- a/inflate.c
+++ b/inflate.c
@@ -109,6 +109,7 @@
     state = (struct inflate_state FAR *)strm->state;
     strm->total_in = strm->total_out = state->total = 0;
     strm->msg = Z_NULL;
+    strm->adler = 1;        /* to support ill-conceived Java test suite */
     state->mode = HEAD;
     state->last = 0;
     state->havedict = 0;
@@ -861,8 +862,8 @@
                 }
             }
 
-	    /* handle error breaks in while */
-	    if (state->mode == BAD) break;
+            /* handle error breaks in while */
+            if (state->mode == BAD) break;
 
             /* build code tables */
             state->next = state->codes;
diff --git a/inftrees.c b/inftrees.c
index 0ced3ae..8a896b2 100644
--- a/inftrees.c
+++ b/inftrees.c
@@ -9,7 +9,7 @@
 #define MAXBITS 15
 
 const char inflate_copyright[] =
-   " inflate 1.2.1.2 Copyright 1995-2004 Mark Adler ";
+   " inflate 1.2.2 Copyright 1995-2004 Mark Adler ";
 /*
   If you use the zlib library in a product, an acknowledgment is welcome
   in the documentation of your product. If for some reason you cannot
@@ -62,7 +62,7 @@
         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
     static const unsigned short lext[31] = { /* Length codes 257..285 extra */
         16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
-        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 194};
+        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 198};
     static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
         257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
diff --git a/old/README b/old/README
index 06ebe3d..800bf07 100644
--- a/old/README
+++ b/old/README
@@ -1,3 +1,3 @@
-This directory contains files that have not been updated for zlib 1.2.1
+This directory contains files that have not been updated for zlib 1.2.x
 
 (Volunteers are encouraged to help clean this up.  Thanks.)
diff --git a/contrib/visual-basic.txt b/old/visual-basic.txt
similarity index 100%
rename from contrib/visual-basic.txt
rename to old/visual-basic.txt
diff --git a/projects/visualc6/zlib.dsp b/projects/visualc6/zlib.dsp
index a1a401a..8f16513 100644
--- a/projects/visualc6/zlib.dsp
+++ b/projects/visualc6/zlib.dsp
@@ -418,7 +418,73 @@
 # Begin Source File

 

 SOURCE=..\..\contrib\masmx86\gvmat32.asm

+

+!IF  "$(CFG)" == "zlib - Win32 DLL Release"

+

 # PROP Exclude_From_Build 1

+

+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug"

+

+# PROP Exclude_From_Build 1

+

+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM Release"

+

+# Begin Custom Build - Assembling...

+IntDir=.\Win32_DLL_ASM_Release

+InputPath=..\..\contrib\masmx86\gvmat32.asm

+InputName=gvmat32

+

+"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"

+	ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)"

+

+# End Custom Build

+

+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM Debug"

+

+# Begin Custom Build - Assembling...

+IntDir=.\Win32_DLL_ASM_Debug

+InputPath=..\..\contrib\masmx86\gvmat32.asm

+InputName=gvmat32

+

+"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"

+	ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)"

+

+# End Custom Build

+

+!ELSEIF  "$(CFG)" == "zlib - Win32 LIB Release"

+

+# PROP Exclude_From_Build 1

+

+!ELSEIF  "$(CFG)" == "zlib - Win32 LIB Debug"

+

+# PROP Exclude_From_Build 1

+

+!ELSEIF  "$(CFG)" == "zlib - Win32 LIB ASM Release"

+

+# Begin Custom Build - Assembling...

+IntDir=.\Win32_LIB_ASM_Release

+InputPath=..\..\contrib\masmx86\gvmat32.asm

+InputName=gvmat32

+

+"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"

+	ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)"

+

+# End Custom Build

+

+!ELSEIF  "$(CFG)" == "zlib - Win32 LIB ASM Debug"

+

+# Begin Custom Build - Assembling...

+IntDir=.\Win32_LIB_ASM_Debug

+InputPath=..\..\contrib\masmx86\gvmat32.asm

+InputName=gvmat32

+

+"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"

+	ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)"

+

+# End Custom Build

+

+!ENDIF 

+

 # End Source File

 # Begin Source File

 

@@ -466,11 +532,6 @@
 # Begin Source File

 

 SOURCE=..\..\contrib\masmx86\inffas32.asm

-# PROP Exclude_From_Build 1

-# End Source File

-# Begin Source File

-

-SOURCE=..\..\contrib\masmx86\gvmat32.obj

 

 !IF  "$(CFG)" == "zlib - Win32 DLL Release"

 

@@ -482,8 +543,28 @@
 

 !ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM Release"

 

+# Begin Custom Build - Assembling...

+IntDir=.\Win32_DLL_ASM_Release

+InputPath=..\..\contrib\masmx86\inffas32.asm

+InputName=inffas32

+

+"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"

+	ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)"

+

+# End Custom Build

+

 !ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM Debug"

 

+# Begin Custom Build - Assembling...

+IntDir=.\Win32_DLL_ASM_Debug

+InputPath=..\..\contrib\masmx86\inffas32.asm

+InputName=inffas32

+

+"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"

+	ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)"

+

+# End Custom Build

+

 !ELSEIF  "$(CFG)" == "zlib - Win32 LIB Release"

 

 # PROP Exclude_From_Build 1

@@ -494,39 +575,28 @@
 

 !ELSEIF  "$(CFG)" == "zlib - Win32 LIB ASM Release"

 

-!ELSEIF  "$(CFG)" == "zlib - Win32 LIB ASM Debug"

+# Begin Custom Build - Assembling...

+IntDir=.\Win32_LIB_ASM_Release

+InputPath=..\..\contrib\masmx86\inffas32.asm

+InputName=inffas32

 

-!ENDIF 

+"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"

+	ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)"

 

-# End Source File

-# Begin Source File

-

-SOURCE=..\..\contrib\masmx86\inffas32.obj

-

-!IF  "$(CFG)" == "zlib - Win32 DLL Release"

-

-# PROP Exclude_From_Build 1

-

-!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug"

-

-# PROP Exclude_From_Build 1

-

-!ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM Release"

-

-!ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM Debug"

-

-!ELSEIF  "$(CFG)" == "zlib - Win32 LIB Release"

-

-# PROP Exclude_From_Build 1

-

-!ELSEIF  "$(CFG)" == "zlib - Win32 LIB Debug"

-

-# PROP Exclude_From_Build 1

-

-!ELSEIF  "$(CFG)" == "zlib - Win32 LIB ASM Release"

+# End Custom Build

 

 !ELSEIF  "$(CFG)" == "zlib - Win32 LIB ASM Debug"

 

+# Begin Custom Build - Assembling...

+IntDir=.\Win32_LIB_ASM_Debug

+InputPath=..\..\contrib\masmx86\inffas32.asm

+InputName=inffas32

+

+"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"

+	ml /nologo /c /Cx /coff /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)"

+

+# End Custom Build

+

 !ENDIF 

 

 # End Source File

diff --git a/qnx/package.qpg b/qnx/package.qpg
index 9986c6d..bf14280 100644
--- a/qnx/package.qpg
+++ b/qnx/package.qpg
@@ -25,10 +25,10 @@
       <QPG:Files>
          <QPG:Add file="../zconf.h" install="/opt/include/" user="root:sys" permission="644"/>
          <QPG:Add file="../zlib.h" install="/opt/include/" user="root:sys" permission="644"/>
-         <QPG:Add file="../libz.so.1.2.1.2" install="/opt/lib/" user="root:bin" permission="644"/>
-         <QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.1.2"/>
-         <QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.1.2"/>
-         <QPG:Add file="../libz.so.1.2.1.2" install="/opt/lib/" component="slib"/>
+         <QPG:Add file="../libz.so.1.2.2" install="/opt/lib/" user="root:bin" permission="644"/>
+         <QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.2"/>
+         <QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.2"/>
+         <QPG:Add file="../libz.so.1.2.2" install="/opt/lib/" component="slib"/>
       </QPG:Files>
 
       <QPG:PackageFilter>
@@ -63,7 +63,7 @@
             </QPM:ProductDescription>
 
             <QPM:ReleaseDescription>
-               <QPM:ReleaseVersion>1.2.1.2</QPM:ReleaseVersion>
+               <QPM:ReleaseVersion>1.2.2</QPM:ReleaseVersion>
                <QPM:ReleaseUrgency>Medium</QPM:ReleaseUrgency>
                <QPM:ReleaseStability>Stable</QPM:ReleaseStability>
                <QPM:ReleaseNoteMinor></QPM:ReleaseNoteMinor>
diff --git a/win32/DLL_FAQ.txt b/win32/DLL_FAQ.txt
index a3ed5dd..1746a95 100644
--- a/win32/DLL_FAQ.txt
+++ b/win32/DLL_FAQ.txt
@@ -175,7 +175,7 @@
     zlib in other programming languages.  Some of them, like Ada
     (GNAT) and Fortran (GNU G77), have C bindings implemented
     initially on Unix, and relying on the C calling convention.
-    On the other hand, the pre- .NET versions of Microsoft Visual
+    On the other hand, the pre- .Net versions of Microsoft Visual
     Basic require STDCALL, while Borland Delphi prefers, although
     it does not require, FASTCALL.
 
@@ -203,13 +203,11 @@
     zlib distribution.
 
 
- 8. I need a DLL for my Microsoft .NET project.  What can I do?
+ 8. I need to use zlib in my Microsoft .Net project.  What can I
+    do?
 
-  - We did not implement a COM wrapper around zlib, so you will
-    have to develop it yourself, or to get it from somewhere else.
-
-    If you would be so generous as to contribute such a wrapper,
-    we would like to include it in a future zlib version.
+  - Henrik Ravn has contributed a .Net wrapper around zlib.  Look
+    into contrib/dotzlib/, inside the zlib distribution.
 
 
  9. If my application uses ZLIB1.DLL, should I link it to
diff --git a/win32/VisualC.txt b/win32/VisualC.txt
new file mode 100644
index 0000000..579a5fc
--- /dev/null
+++ b/win32/VisualC.txt
@@ -0,0 +1,3 @@
+
+To build zlib using the Microsoft Visual C++ environment,
+use the appropriate project from the projects/ directory.
diff --git a/win32/zlib1.rc b/win32/zlib1.rc
index 130493a..162ab8f 100644
--- a/win32/zlib1.rc
+++ b/win32/zlib1.rc
@@ -5,8 +5,8 @@
 #else
 VS_VERSION_INFO		VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE
 #endif
-  FILEVERSION		1,2,1,2
-  PRODUCTVERSION	1,2,1,2
+  FILEVERSION		1,2,2
+  PRODUCTVERSION	1,2,2
   FILEFLAGSMASK		VS_FFI_FILEFLAGSMASK
 #ifdef _DEBUG
   FILEFLAGS		1
@@ -23,12 +23,12 @@
     //language ID = U.S. English, char set = Windows, Multilingual
     BEGIN
       VALUE "FileDescription",	"zlib data compression library\0"
-      VALUE "FileVersion",	"1.2.1.2\0"
+      VALUE "FileVersion",	"1.2.2\0"
       VALUE "InternalName",	"zlib1.dll\0"
       VALUE "LegalCopyright",	"(C) 1995-2004 Jean-loup Gailly & Mark Adler\0"
       VALUE "OriginalFilename",	"zlib1.dll\0"
       VALUE "ProductName",	"zlib\0"
-      VALUE "ProductVersion",	"1.2.1.2\0"
+      VALUE "ProductVersion",	"1.2.2\0"
       VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
     END
   END
diff --git a/zlib.3 b/zlib.3
index 54655cd..3139e24 100644
--- a/zlib.3
+++ b/zlib.3
@@ -1,4 +1,4 @@
-.TH ZLIB 3 "9 September 2004"
+.TH ZLIB 3 "3 October 2004"
 .SH NAME
 zlib \- compression/decompression library
 .SH SYNOPSIS
@@ -133,7 +133,7 @@
 Send questions and/or comments to zlib@gzip.org,
 or (for the Windows DLL version) to Gilles Vollant (info@winimage.com).
 .SH AUTHORS
-Version 1.2.1.2
+Version 1.2.2
 Copyright (C) 1995-2004 Jean-loup Gailly (jloup@gzip.org)
 and Mark Adler (madler@alumni.caltech.edu).
 .LP
diff --git a/zlib.h b/zlib.h
index 0c94166..b4ddd34 100644
--- a/zlib.h
+++ b/zlib.h
@@ -1,5 +1,5 @@
 /* zlib.h -- interface of the 'zlib' general purpose compression library
-  version 1.2.1.2, September 9th, 2004
+  version 1.2.2, October 3rd, 2004
 
   Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler
 
@@ -37,8 +37,8 @@
 extern "C" {
 #endif
 
-#define ZLIB_VERSION "1.2.1.2"
-#define ZLIB_VERNUM 0x1212
+#define ZLIB_VERSION "1.2.2"
+#define ZLIB_VERNUM 0x1220
 
 /*
      The 'zlib' compression library provides in-memory compression and
@@ -53,24 +53,22 @@
   application must provide more input and/or consume the output
   (providing more output space) before each call.
 
-     The compressed data format used by the in-memory functions is the zlib
-  format, which is a zlib wrapper documented in RFC 1950, wrapped around a
-  deflate stream, which is itself documented in RFC 1951.
+     The compressed data format used by default by the in-memory functions is
+  the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+  around a deflate stream, which is itself documented in RFC 1951.
 
      The library also supports reading and writing files in gzip (.gz) format
   with an interface similar to that of stdio using the functions that start
   with "gz".  The gzip format is different from the zlib format.  gzip is a
   gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
 
+     This library can optionally read and write gzip streams in memory as well.
+
      The zlib format was designed to be compact and fast for use in memory
   and on communications channels.  The gzip format was designed for single-
   file compression on file systems, has a larger header than zlib to maintain
   directory information, and uses a different, slower check method than zlib.
 
-     This library does not provide any functions to write gzip files in memory.
-  However such functions could be easily written using zlib's deflate function,
-  the documentation in the gzip RFC, and the examples in gzio.c.
-
      The library does not install any signal handler. The decoder checks
   the consistency of the compressed data, so the library should never
   crash even in case of corrupted input.
@@ -478,7 +476,8 @@
    16 to windowBits to write a simple gzip header and trailer around the
    compressed data instead of a zlib wrapper. The gzip header will have no
    file name, no extra data, no comment, no modification time (set to zero),
-   no header crc, and the operating system will be set to 255 (unknown).
+   no header crc, and the operating system will be set to 255 (unknown).  If a
+   gzip stream is being written, strm->adler is a crc32 instead of an adler32.
 
      The memLevel parameter specifies how much memory should be allocated
    for the internal compression state. memLevel=1 uses minimum memory but
@@ -649,7 +648,8 @@
      windowBits can also be greater than 15 for optional gzip decoding. Add
    32 to windowBits to enable zlib and gzip decoding with automatic header
    detection, or add 16 to decode only the gzip format (the zlib format will
-   return a Z_DATA_ERROR).
+   return a Z_DATA_ERROR.  If a gzip stream is being decoded, strm->adler is
+   a crc32 instead of an adler32.
 
      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
    memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative