From: Subject: PKWARE - Enterprise Solutions - White Papers Date: Sun, 27 Apr 2003 17:21:57 +0200 MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_0000_01C30CE1.812F6E10"; type="text/html" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 This is a multi-part message in MIME format. ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.pkware.com/products/enterprise/white_papers/appnote.html PKWARE - Enterprise Solutions - White Papers
3D"" 3D"" 3D"" 3D""
3DPKWARE 3D""
3D"Contact 3D""=20 3D"Site 3D""=20 3D"FREE
3D""=20
">
3D""
3D""=20
3D""=20
3D""
3D""=20 3DProducts=20 3D""=20 3DStore 3D""=20 3D"Technical 3D""=20 3D""=20 3D""=20 3D"News 3D""=20 3DCompany 3D""=20
3D""=20
3D""=20
3DOverview=20
3D"Individuals
3D"FREE
3D""=20
3DProducts=20 3D"Products:
3D""=20
3D""=20
3D""=20 White Papers
3D""=20 3D""=20 3D""=20
3D""
Note: This application note = is also=20 available as an on-line=20 text file and a downloadable .ZIP = file.=20
File: APPNOTE.TXT - .ZIP File Format = Specification
Version: 4.5
Revised: 11/01/2001
Copyright =A9 1989 - 2001 PKWARE Inc., = All Rights=20 Reserved.
  1. Disclaimer=20
  2. General=20 Format of a .ZIP file=20
    1. Local=20 file header=20
    2. File=20 data=20
    3. Data=20 descriptor=20
    4. Central=20 directory structure=20
    5. Zip64=20 end of central directory record=20
    6. Zip64=20 end of central directory locator=20
    7. End=20 of central directory record=20
    8. Explanation=20 of fields=20
    9. General=20 notes
  3. UnShrinking=20 - Method 1=20
  4. Expanding=20 - Methods 2-5=20
  5. Imploding=20 - Method 6=20
  6. Tokenizing=20 - Method 7=20
  7. Deflating=20 - Method 8=20
  8. Decryption=20
  9. Change=20 Process=20
  10. Acknowledgements=20
  11. References=20

  1. Disclaimer
  2. Although PKWARE will attempt to supply current and = accurate=20 information relating to its file formats, algorithms, and = the=20 subject programs, the possibility of error can not be = eliminated.=20 PKWARE therefore expressly disclaims any warranty that the = information contained in the associated materials relating = to the=20 subject programs and/or the format of the files created or = accessed by the subject programs and/or the algorithms = used by the=20 subject programs, or any other matter, is current, correct = or=20 accurate as delivered. Any risk of damage due to any = possible=20 inaccurate information is assumed by the user of the = information.=20 Furthermore, the information relating to the subject = programs=20 and/or the file formats created or accessed by the subject = programs and/or the algorithms used by the subject = programs is=20 subject to change without notice.

  3. General Format of a .ZIP file
  4. Files stored in arbitrary order. Large zipfiles can = span=20 multiple diskette media or be split into user-defined = segment=20 sizes.

    Overall zipfile format:

    [local file header1]
    [file data = 1]
    [data_descriptor=20 1]
    .
    .
    .
    [local file header n]
    [file data = n]
    [data_descriptor n]
    [central = directory]
    [zip64 end=20 of central directory record]
    [zip64 end of central = directory=20 locator]
    [end of central directory record] =

    1. Local file header:
    2. local file header signature 4 bytes (0x04034b50)
      version needed to extract 2 bytes
      general purpose bit flag 2 bytes
      compression method 2 bytes
      last mod file time 2 bytes
      last mod file date 2 bytes
      crc-32 4 bytes
      compressed size 4 bytes
      uncompressed size 4 bytes
      file name length 2 bytes
      extra field length 2 bytes
      file name (variable size)
      extra field (variable = size)

    3. File data:
    4. Immediately following the local header for a file = is the=20 compressed or stored data for the file. The series of = [local=20 file header][file data][data descriptor] repeats for = each file=20 in the .ZIP archive.

    5. Data descriptor:
    6. crc-32 4 bytes
      compressed size 4 bytes
      uncompressed size 4 bytes

      This descriptor exists only if bit 3 of the general = purpose=20 bit flag is set (see below). It is byte aligned and=20 immediately follows the last byte of compressed data. = This=20 descriptor is used only when it was not possible to = seek in=20 the output zip file, e.g., when the output zip file = was=20 standard output or a non seekable device. For Zip64 = format=20 archives, the compressed and uncompressed sizes are 8 = bytes=20 each.

    7. Central directory structure:
    8. [file header 1]
      .
      .
      .
      [file header=20 n]
      [digital signature]
      [end of central directory = record]

      File header:

      central file header signature 4 bytes (0x02014b50)
      version made by 2 bytes
      version needed to extract 2 bytes
      general purpose bit flag 2 bytes
      compression method 2 bytes
      last mod file time 2 bytes
      last mod file date 2 bytes
      crc-32 4 bytes
      compressed size 4 bytes
      uncompressed size 4 bytes
      file name length 2 bytes
      extra field length 2 bytes
      file comment length 2 bytes
      disk number start 2 bytes
      internal file attributes 2 bytes
      external file attributes 4 bytes
      relative offset of local header 4 bytes
      file name (variable size)
      extra field (variable size)
      file comment (variable size)

      Digital signature:

      header signature 4 bytes (0x05054b50)
      size of data 2 bytes
      signature data (variable = size)

    9. Zip64 end of central directory record:
    10. zip64 end of central dir signature 4 bytes (0x06064b50)
      size of zip64 end of central directory = record 8 bytes
      version made by 2 bytes
      version needed to extract 2 bytes
      number of this disk 4 bytes
      number of the disk with the start of the central = directory 4 bytes
      total number of entries in the central directory = on=20 this disk 8 bytes
      total number of entries in the central = directory 8 bytes
      size of the central directory 8 bytes
      offset of start of central directory with = respect to=20 the starting disk number 8 bytes
      zip64 extensible data sector (variable size)

    11. Zip64 end of central directory locator:
    12. zip64 end of central dir locator signature 4 bytes (0x07064b50)
      number of the disk with the start of the zip64 = end of=20 central directory 4 bytes
      relative offset of the zip64 end of central = directory=20 record 8 bytes
      total number of disks 4 bytes

    13. End of central dir record:
    14. end of central dir signature 4 bytes (0x06054b50)
      number of this disk 2 bytes
      number of the disk with the start of the central = directory 2 bytes
      total number of entries in the central directory = on=20 this disk 2 bytes
      total number of entries in the central = directory 2 bytes
      size of the central directory 4 bytes
      offset of start of central directory
      with = respect=20 to the starting disk number
      4 bytes
      .ZIP file comment length 2 bytes
      .ZIP file comment (variable size)

    15. Explanation of fields:
    16. version made by (2 bytes)

      The upper byte indicates the compatibility of the = file=20 attribute information. If the external file attributes = are=20 compatible with MS-DOS and can be read by PKZIP for = DOS=20 version 2.04g then this value will be zero. If these=20 attributes are not compatible, then this value will = identify=20 the host system on which the attributes are = compatible.=20 Software can use this information to determine the = line record=20 format for text files etc. The current mappings = are:

      0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file=20 systems)
      1 - Amiga
      2 - OpenVMS
      3 - UNIX
      4 - VM/CMS
      5 - Atari ST
      6 - OS/2 H.P.F.S.
      7 - Macintosh
      8 - Z-System
      9 - CP/M
      10 - Windows NTFS
      11 - MVS
      12 - VSE
      13 - Acorn Risc
      14 - VFAT
      15 - Alternate MVS
      16 - BeOS
      17 - Tandem
      18 thru 255 - unused =

      The lower byte indicates the version number of the = software=20 used to encode the file. The value/10 indicates the = major=20 version number, and the value mod 10 is the minor = version=20 number.

      version needed to extract (2 bytes)

      The minimum software version needed to extract the = file,=20 mapped as above. For Zip64 format archives, this value = should=20 not be less than 45.

      general purpose bit flag: (2 bytes)

      Bit 0: If set, indicates = that the file=20 is encrypted.
      (For Method 6=20 - Imploding)
      Bit 1: If the compression = method used=20 was type 6, Imploding, then this bit, if set, = indicates=20 an 8K sliding dictionary was used. If clear, = then a 4K=20 sliding dictionary was used.
      Bit 2: If the compression = method used=20 was type 6, Imploding, then this bit, if set, = indicates=20 an 3 Shannon-Fano trees were used to encode the = sliding=20 dictionary output. If clear, then 2 Shannon-Fano = trees=20 were used.
      (For Methods=20 8 and 9 - Deflating)
      Bit 2 Bit 1  
      0 0 Normal (-en) compression option was = used.=20
      0 1 Maximum (-exx/-ex) compression option = was=20 used.
      1 0 Fast (-ef) compression option was = used.
      1 1 Super Fast (-es) compression option was = used.=20

      Note: Bits 1 and 2 are = undefined if=20 the compression method is any = other.

      Bit 3: If this bit is set, = the fields=20 crc-32, compressed size and uncompressed size = are set to=20 zero in the local header. The correct values are = put in=20 the data descriptor immediately following the = compressed=20 data. (Note: PKZIP version 2.04g for DOS only = recognizes=20 this bit for method 8 compression, newer = versions of=20 PKZIP recognize this bit for any compression=20 method.)
      Bit 4: Reserved for use with = method 8,=20 for enhanced deflating.
      Bit 5: If this bit is set, = this=20 indicates that the file is compressed patched=20 data.(Note: Requires PKZIP version 2.70 or=20 greater)
      Bit 6: Currently = unused.
      Bit 7: Currently = unused.
      Bit 8: Currently = unused.
      Bit 9: Currently = unused.
      Bit 10: Currently = unused.
      Bit 11: Currently = unused.
      Bit 12: Reserved by PKWARE = for enhanced=20 compression.
      Bit 13: Reserved by = PKWARE.
      Bit 14: Reserved by = PKWARE.
      Bit 15: Reserved by=20 PKWARE.

      compression method: (2 bytes)

      (see accompanying documentation for algorithm=20 descriptions)

      0 - The file is stored (no compression)
      1 - The file is Shrunk
      2 - The file is Reduced with compression factor = 1
      3 - The file is Reduced with compression factor = 2
      4 - The file is Reduced with compression factor = 3
      5 - The file is Reduced with compression factor = 4
      6 - The file is Imploded
      7 - Reserved for Tokenizing compression algorithm =
      8 - The file is Deflated
      9 - Enhanced Deflating using = Deflate64(tm)
      10 - PKWARE Date Compression Library=20 Imploding

      date and time fields: (2 bytes each)

      The date and time are encoded in standard MS-DOS = format. If=20 input came from standard input, the date and time are = those at=20 which compression was started for this = data.

      CRC-32: (4 bytes)

      The CRC-32 algorithm was generously contributed by = David=20 Schwaderer and can be found in his excellent book "C=20 Programmers Guide to NetBIOS" published by Howard W. = Sams=20 & Co. Inc. The 'magic number' for the CRC is = 0xdebb20e3.=20 The proper CRC pre and post conditioning is used, = meaning that=20 the CRC register is pre-conditioned with all ones (a = starting=20 value of 0xffffffff) and the value is post-conditioned = by=20 taking the one's complement of the CRC residual. If = bit 3 of=20 the general purpose flag is set, this field is set to = zero in=20 the local header and the correct value is put in the = data=20 descriptor and in the central = directory.

      compressed size: (4 bytes)
      uncompressed size: (4 = bytes)=20

      The size of the file compressed and uncompressed,=20 respectively. If bit 3 of the general purpose bit flag = is set,=20 these fields are set to zero in the local header and = the=20 correct values are put in the data descriptor and in = the=20 central directory. If an archive is in zip64 format = and the=20 value in this field is 0xFFFFFFFF, the size will be in = the=20 corresponding 8 byte zip64 extended information extra=20 field.

      file name length: (2 bytes)
      extra field length: = (2=20 bytes)
      file comment length: (2 bytes)

      The length of the file name, extra field, and = comment=20 fields respectively. The combined length of any = directory=20 record and these three fields should not generally = exceed=20 65,535 bytes. If input came from standard input, the = file name=20 length is set to zero.

      disk number start: (2 bytes)

      The number of the disk on which this file begins. = If an=20 archive is in zip64 format and the value in this field = is=20 0xFFFF, the size will be in the corresponding 4 byte = zip64=20 extended information extra field.

      internal file attributes: (2 bytes)

      The lowest bit of this field indicates, if set, = that the=20 file is apparently an ASCII or text file. If not set, = that the=20 file apparently contains binary data. The remaining = bits are=20 unused in version 1.0.

      external file attributes: (4 bytes)

      The mapping of the external attributes is = host-system=20 dependent (see 'version made by'). For MS-DOS, the low = order=20 byte is the MS-DOS directory attribute byte. If input = came=20 from standard input, this field is set to = zero.

      relative offset of local header: (4 bytes)

      This is the offset from the start of the first disk = on=20 which this file appears, to where the local header = should be=20 found. If an archive is in zip64 format and the value = in this=20 field is 0xFFFFFFFF, the size will be in the = corresponding 8=20 byte zip64 extended information extra = field.

      file name: (Variable)

      The name of the file, with optional relative path. = The path=20 stored should not contain a drive or device letter, or = a=20 leading slash. All slashes should be forward slashes = '/' as=20 opposed to backwards slashes '\' for compatibility = with Amiga=20 and UNIX file systems, etc. If input came from = standard input,=20 there is no file name field.

      extra field: (Variable)

      This is for future expansion. If additional = information=20 needs to be stored in the future, it should be stored = here.=20 Earlier versions of the software can then safely skip = this=20 file, and find the next file or header. This field = will be 0=20 length in version 1.0.

      In order to allow different programs and different = types of=20 information to be stored in the 'extra' field in .ZIP = files,=20 the following structure should be used for all = programs=20 storing data in this field:

      header1+data1 + header2+data2 . . .

      Each header should consist of:

      Header ID 2 bytes
      Data Size 2 bytes

      Note: all fields stored in Intel=20 low-byte/high-byte order.

      The Header ID field indicates the type of data that = is in=20 the following data block.

      Header ID's of 0 thru 31 are reserved for use by = PKWARE.=20 The remaining ID's can be used by third party vendors = for=20 proprietary usage.

      The current Header ID mappings defined by PKWARE = are:

      0x0007 AV Info
      0x0009 OS/2
      0x000A NTFS
      0x000c OpenVMS
      0x000d UNIX
      0x000f Patch Descriptor
      0x0014 PKCS#7 Store for X.509 Certificates
      0x0015 X.509 Certificate ID and Signature for = individual=20 file
      0x0016 X.509 Certificate ID for Central=20 Directory

      Third party mappings commonly used are:

      0x0065 IBM S/390 attributes - uncompressed
      0x0066 IBM S/390 attributes - compressed
      0x4b46 FWKCS MD5 (see below)
      0x07c8 Macintosh
      0x4341 Acorn/SparkFS
      0x4453 Windows NT security descriptor (binary = ACL)
      0x4704 VM/CMS
      0x470f MVS
      0x4c41 OS/2 access control list (text ACL)
      0x4d49 Info-ZIP OpenVMS
      0x5455 extended timestamp
      0x5855 Info-ZIP UNIX (original, also OS/2, NT, = etc)
      0x6542 BeOS/BeBox
      0x756e ASi UNIX
      0x7855 Info-ZIP UNIX (new)
      0xfd4a SMS/QDOS

      The Data Size field indicates the size of the = following=20 data block. Programs can use this value to skip to the = next=20 header block, passing over any data blocks that are = not of=20 interest.

      Note: As stated above, the size of = the=20 entire .ZIP file header, including the file name, = comment, and=20 extra field should not exceed 64K in size.

      In case two different programs should appropriate = the same=20 Header ID value, it is strongly recommended that each = program=20 place a unique signature of at least two bytes in size = (and=20 preferably 4 bytes or bigger) at the start of each = data area.=20 Every program should verify that its unique signature = is=20 present, in addition to the Header ID value being = correct,=20 before assuming that it is a block of known type.

      -OS/2 Extra Field:

      The following is the layout of the OS/2 attributes = "extra"=20 block. (Last Revision 09/05/95)

      Note: all fields stored in Intel=20 low-byte/high-byte order.

      Value Size Description
      0x0009 2 bytes Tag for this "extra" block type
      TSize 2 bytes Size for the following data block
      BSize Long Uncompressed Block Size
      CType 2 bytes Compression type
      EACRC Long CRC value for uncompress block
      (var) variable Compressed block

      The OS/2 extended attribute structure (FEA2LIST) is = compressed and then stored in it's entirety within = this=20 structure. There will only ever be one "block" of data = in=20 VarFields[].

      -UNIX Extra Field:

      The following is the layout of the UNIX "extra" = block.

      Note: all fields are stored in = Intel=20 low-byte/high-byte order.

      Value Size Description
      0x000d 2 bytes Tag for this "extra" block type
      TSize 2 bytes Size for the following data block
      Atime 4 bytes File last access time
      Mtime 4 bytes File last modification time
      Uid 2 bytes File user ID
      Gid 2 bytes File group ID
      (var) variable Variable length data field =

      The variable length data field will contain file = type=20 specific data. Currently the only values allowed are = the=20 original "linked to" file names for hard or symbolic=20 links.

      -OpenVMS Extra Field:

      The following is the layout of the OpenVMS = attributes=20 "extra" block.

      Note: all fields stored in Intel=20 low-byte/high-byte order.

      Value Size Description
      0x000c 2 bytes Tag for this "extra" block type
      TSize 2 bytes Size of the total "extra" block
      CRC 4 bytes 32-bit CRC for remainder of the = block
      Tag1 2 bytes VMS attribute tag value #1
      Size1 2 bytes Size of attribute #1, in bytes
      (var.) Size1 Attribute #1 data
      .
      .
      .
         
      TagN 2 bytes VMS attribute tage value #N
      SizeN 2 bytes Size of attribute #N, in bytes
      (var.) SizeN Attribute #N data

      Rules:

      1. There will be one or more of attributes present, = which=20 will each be preceded by the above TagX & SizeX = values.=20 These values are identical to the ATR$C_XXXX and = ATR$S_XXXX=20 constants which are defined in ATR.H under OpenVMS = C.=20 Neither of these values will ever be zero.=20
      2. No word alignment or padding is performed.=20
      3. A well-behaved PKZIP/OpenVMS program should = never=20 produce more than one sub-block with the same TagX = value.=20 Also, there will never be more than one "extra" = block of=20 type 0x000c in a particular directory record. =

      -NTFS Extra Field:

      The following is the layout of the NTFS attributes = "extra"=20 block.

      Note: At this time, the Mtime, = Atime and=20 Ctime values may be used on any Win32 system.

      Value Size Description
      0x000a 2 bytes Tag for this "extra" block type
      TSize 2 bytes Size of the total "extra" block
      Reserved 4 bytes Reserved for future use
      Tag1 2 bytes NTFS attribute tag value #1
      Size1 2 bytes Size of attribute #1, in bytes
      (var.) Size1 Attribute #1 data
      .
      .
      .
         
      TagN 2 bytes NTFS attribute tag value #N
      SizeN 2 bytes Size of attribute #N, in bytes
      (var.) SizeN Attribute #N data

      For NTFS, values for Tag1 through TagN are as = follows:=20 (currently only one set of attributes is defined for = NTFS)

      Tag Size Description
      0x0001 2 bytes Tag for attribute #1
      Size1 2 bytes Size of attribute #1, in bytes
      Mtime 8 bytes File last modification time
      Atime 8 bytes File last access time
      Ctime 8 bytes File creation time

      -PATCH Descriptor Extra Field:

      The following is the layout of the Patch Descriptor = "extra"=20 block.

      Note: all fields stored in Intel=20 low-byte/high-byte order.

      Value Size Description
      0x000f 2 bytes Tag for this "extra" block type
      TSize 2 bytes Size of the total "extra" block
      Version 2 bytes Version of the descriptor
      Flags 4 bytes Actions and reactions (see below)
      OldSize 4 bytes Size of the file about to be patched
      OldCRC 4 bytes 32-bit CRC of the file about to be = patched
      NewSize 4 bytes Size of the resulting file
      NewCRC 4 bytes 32-bit CRC of the resulting file=20

      Actions and reactions

      Bits Description
      0 Use for autodetection
      1 Treat as selfpatch
      2-3 RESERVED
      4-5 Action (see below)
      6-7 RESERVED
      8-9 Reaction (see below) to absent file
      10-11 Reaction (see below) to newer file
      12-13 Reaction (see below) to unknown file
      14-15 RESERVED
      16-31 RESERVED

      Actions

      Action Value
      none 0
      add 1
      delete 2
      patch 3

      Reactions

      Reaction Value
      ask 0
      skip 1
      ignore 2
      fail 3

      -PKCS#7 Store for X.509 Certificates

      Note: all fields stored in Intel=20 low-byte/high-byte order.

      Value Size Description
      0x0014 2 bytes Tag for this "extra" block type
      SSize 2 bytes Size of the stored data
      SData (variable) Data about the store
           
      SData
      Value
      Size Description
      Version 2 bytes Version number
      StoreD (variable) Actual store data

      -X.509 Certificate ID and Signature for individual = file

      Note: all fields stored in Intel=20 low-byte/high-byte order.

      Value Size Description
      0x0015 2 bytes Tag for this "extra" block type
      CSize 2 bytes Size of Method
      Method (variable)  
           
      Method
      Value
      Size Description
      Version 2 bytes Version number
      AlgID 2 bytes Algorithm ID used for signing
      IDSize 2 bytes Size of Certificate ID data
      CertID (variable) Certificate ID data
      SigSize 2 bytes Size of Signature data
      Sig (variable) Signature data
           
      CertID
      Value
      Size Description
      Size1 4 bytes Size of CertID
      Size1 4 bytes A bug in version one causes this value to = appear=20 twice.
      IssSize 4 bytes Issuer data size
      Issuer (variable) Issuer data
      SerSize 4 bytes Serial Number size
      Serial (variable) Serial Number data

      -X.509 Certificate ID and Signature for central=20 directory

      Note: all fields stored in Intel=20 low-byte/high-byte order.

      Value Size Description
      0x0016 2 bytes Tag for this "extra" block type
      CSize 2 bytes Size of Method
      Method (variable)  

      -ZIP64 Extended Information Extra Field:

      The following is the layout of the ZIP64 extended=20 information "extra" block. If one of the size or = offset fields=20 in the Local or Central directory record is too small = to hold=20 the required data, a ZIP64 extended information record = is=20 created. The order of the fields in the ZIP64 extended = information record is fixed, but the fields will only = appear=20 if the corresponding Local or Central directory record = field=20 is set to 0xFFFF or 0xFFFFFFFF.

      Note: all fields stored in Intel=20 low-byte/high-byte order.

      Value Size Description
      0x0001 2 bytes Tag for this "extra" block type
      Size 2 bytes Size of this "extra" block
      Original Size 8 bytes Original uncompresseed file size
      Compressed Size 8 bytes Size of compressed data
      Relative Header Offset 8 bytes Offset of local header record
      Disk Start Number 4 bytes Number of the disk on which this file=20 starts

      This entry in the Local header must include BOTH = original=20 and compressed file sizes.

      - FWKCS MD5 Extra Field:

      The FWKCS Contents_Signature System, used in = automatically=20 identifying files independent of file name, optionally = adds=20 and uses an extra field to support the rapid creation = of an=20 enhanced contents_signature:

      Header ID =3D 0x4b46
      Data Size =3D 0x0013
      Preface =3D 'M','D','5'

      followed by 16 bytes containing the uncompressed = file's=20 128_bit MD5 hash(1),=20 low byte first.

      When FWKCS revises a zipfile central directory to = add this=20 extra field for a file, it also replaces the central = directory=20 entry for that file's uncompressed file length with a = measured=20 value.

      FWKCS provides an option to strip this extra field, = if=20 present, from a zipfile central directory. In adding = this=20 extra field, FWKCS preserves Zipfile Authenticity=20 Verification; if stripping this extra field, FWKCS = preserves=20 all versions of AV through PKZIP version 2.04g.

      FWKCS, and FWKCS Contents_Signature System, are = trademarks=20 of Frederick W. Kantor.

      (1) R.=20 Rivest, RFC1321.TXT, MIT Laboratory for Computer = Science and=20 RSA Data Security, Inc., April 1992. ll.76-77: "The = MD5=20 algorithm is being placed in the public domain for = review and=20 possible adoption as a standard."

      file comment: (Variable)

      The comment for this file.

      number of this disk: (2 bytes)

      The number of this disk, which contains central = directory=20 end record. If an archive is in zip64 format and the = value in=20 this field is 0xFFFF, the size will be in the = corresponding 4=20 byte zip64 end of central directory = field.

      number of the disk with the start of the central = directory:=20 (2 bytes)

      The number of the disk on which the central = directory=20 starts. If an archive is in zip64 format and the value = in this=20 field is 0xFFFF, the size will be in the corresponding = 4 byte=20 zip64 end of central directory field.

      total number of entries in the central dir on this = disk: (2=20 bytes)

      The number of central directory entries on this = disk. If an=20 archive is in zip64 format and the value in this field = is=20 0xFFFF, the size will be in the corresponding 8 byte = zip64 end=20 of central directory field.

      total number of entries in the central dir: (2 = bytes)

      The total number of files in the .ZIP file. If an = archive=20 is in zip64 format and the value in this field is = 0xFFFF, the=20 size will be in the corresponding 8 byte zip64 end of = central=20 directory field.

      size of the central directory: (4 bytes)

      The size (in bytes) of the entire central = directory. If an=20 archive is in zip64 format and the value in this field = is=20 0xFFFFFFFF, the size will be in the corresponding 8 = byte zip64=20 end of central directory field.

      offset of start of central directory with respect to = the=20 starting disk number: (4 bytes)

      Offset of the start of the central directory on the = disk on=20 which the central directory starts. If an archive is = in zip64=20 format and the value in this field is 0xFFFFFFFF, the = size=20 will be in the corresponding 8 byte zip64 end of = central=20 directory field.

      .ZIP file comment length: (2 bytes)

      The length of the comment for this .ZIP=20 file.

      .ZIP file comment: (Variable)

      The comment for this .ZIP file.

      zip64 extensible data sector (variable size)

      (currently reserved for use by = PKWARE)

    17. General notes:
      1. All fields unless otherwise noted are unsigned and = stored=20 in Intel low-byte:high-byte, low-word:high-word order. =
      2. String fields are not null terminated, since the = length is=20 given explicitly.=20
      3. Local headers should not span disk boundaries. = Also, even=20 though the central directory can span disk boundaries, = no=20 single record in the central directory should be split = across=20 disks.=20
      4. The entries in the central directory may not = necessarily=20 be in the same order that files appear in the .ZIP = file.=20
      5. Spanned/Split archives created using PKZIP for = Windows=20 (V2.50 or greater), PKZIP Command Line (V2.50 or = greater), or=20 PKZIP Explorer will include a special spanning = signature as=20 the first 4 bytes of the first segment of the archive. = This=20 signature (0x08074b50) will be followed immediately by = the=20 local header signature for the first file in the = archive. A=20 special spanning marker may also appear in = spanned/split=20 archives if the spanning or splitting process starts = but only=20 requires one segement. In this case the 0x08074b50 = signature=20 will be replaced with the temporary spanning marker = signature=20 of 0x30304b50. Spanned/split archives created with = this=20 special signature are compatible with all versions of = PKZIP=20 from PKWARE. Split archives can only be uncompressed = by other=20 versions of PKZIP that know how to create a split = archive.=20
      6. If one of the fields in the end of central = directory=20 record is too small to hold required data, the field = should be=20 set to -1 (0xFFFF or 0xFFFFFFFF) and the Zip64 format = record=20 should be created.=20
      7. The end of central directory record and the Zip64 = end of=20 central directory locator record must reside on the = same disk=20 when splitting or spanning an archive. =

  5. UnShrinking - Method 1
  6. Shrinking is a Dynamic Ziv-Lempel-Welch compression = algorithm=20 with partial clearing. The initial code size is 9 bits, = and the=20 maximum code size is 13 bits. Shrinking differs from = conventional=20 Dynamic Ziv-Lempel-Welch implementations in several = respects:

    1. The code size is controlled by the compressor, and = is not=20 automatically increased when codes larger than the = current code=20 size are created (but not necessarily used). When the=20 decompressor encounters the code sequence 256 (decimal) = followed=20 by 1, it should increase the code size read from the = input=20 stream to the next bit size. No blocking of the codes is = performed, so the next code at the increased size should = be read=20 from the input stream immediately after where the = previous code=20 at the smaller bit size was read. Again, the = decompressor should=20 not increase the code size used until the sequence 256,1 = is=20 encountered.=20
    2. When the table becomes full, total clearing is not=20 performed. Rather, when the compressor emits the code = sequence=20 256,2 (decimal), the decompressor should clear all leaf = nodes=20 from the Ziv-Lempel tree, and continue to use the = current code=20 size. The nodes that are cleared from the Ziv-Lempel = tree are=20 then re-used, with the lowest code value re-used first, = and the=20 highest code value re-used last. The compressor can emit = the=20 sequence 256,2 at any time.

  7. Expanding - Methods 2-5
  8. The Reducing algorithm is actually a combination of two = distinct algorithms. The first algorithm compresses = repeated byte=20 sequences, and the second algorithm takes the compressed = stream=20 from the first algorithm and applies a probabilistic = compression=20 method.

    The probabilistic compression stores an array of = 'follower=20 sets' S(j), for j=3D0 to 255, corresponding to each = possible ASCII=20 character. Each set contains between 0 and 32 characters, = to be=20 denoted as S(j)[0],...,S(j)[m], where m<32. The sets = are stored=20 at the beginning of the data area for a Reduced file, in = reverse=20 order, with S(255) first, and S(0) last.

    The sets are encoded as { N(j), = S(j)[0],...,S(j)[N(j)-1] },=20 where N(j) is the size of set S(j). N(j) can be 0, in = which case=20 the follower set for S(j) is empty. Each N(j) value is = encoded in=20 6 bits, followed by N(j) eight bit character values = corresponding=20 to S(j)[0] to S(j)[N(j)-1] respectively. If N(j) is 0, = then no=20 values for S(j) are stored, and the value for N(j-1) = immediately=20 follows.

    Immediately after the follower sets, is the compressed = data=20 stream. The compressed data stream can be interpreted for = the=20 probabilistic decompression as follows:

    let =
    Last-Character <- 0.
    
    loop until done
        if the follower set S(Last-Character) is empty then
            read 8 bits from the input stream, and copy this
              value to the output stream.
        otherwise if the follower set S(Last-Character) is non-empty then
            read 1 bit from the input stream.
            if this bit is not zero then
                read 8 bits from the input stream, and copy this
                  value to the output stream.
            otherwise if this bit is zero then
                read B(N(Last-Character)) bits from the input
                  stream, and assign this value to I.
                Copy the value of S(Last-Character)[I] to the output stream.
        assign the last value placed on the output stream to
          Last-Character.
    end loop 

    B(N(j)) is defined as the minimal number of bits = required to=20 encode the value N(j)-1.

    The decompressed stream from above can then be expanded = to=20 re-create the original file as follows:

    let State =
    <- 0.
    
    loop until done
        read 8 bits from the input stream into C.
        case State of
            0: if C is not equal to DLE (144 decimal) then
                   copy C to the output stream.
               otherwise if C is equal to DLE then
                   let State <- 1.
    
            1: if C is non-zero then
                   let V <- C.
                   let Len <- L(V)
                   let State <- F(Len).
               otherwise if C is zero then
                   copy the value 144 (decimal) to the output stream.
                   let State <- 0
    
            2: let Len <- Len + C
               let State <- 3.
    
            3: move backwards D(V,C) bytes in the output stream
               (if this position is before the start of the output
                stream, then assume that all the data before the
                start of the output stream is filled with zeros).
               copy Len+3 bytes from this position to the output stream.
               let State <- 0.
        end case=20
    end loop 

    The functions F,L, and D are dependent on the = 'compression=20 factor', 1 through 4, and are defined as follows:

    For compression factor 1:

    L(X) equals the lower 7 bits of X.
    F(X) equals 2 = if X=20 equals 127 otherwise F(X) equals 3.
    D(X,Y) equals = the (upper=20 1 bit of X) * 256 + Y + 1.

    For compression factor 2:

    L(X) equals the lower 6 bits of X.
    F(X) equals 2 = if X=20 equals 63 otherwise F(X) equals 3.
    D(X,Y) equals the = (upper=20 2 bits of X) * 256 + Y + 1.

    For compression factor 3:

    L(X) equals the lower 5 bits of X.
    F(X) equals 2 = if X=20 equals 31 otherwise F(X) equals 3.
    D(X,Y) equals the = (upper=20 3 bits of X) * 256 + Y + 1.

    For compression factor 4:

    L(X) equals the lower 4 bits of X.
    F(X) equals 2 = if X=20 equals 15 otherwise F(X) equals 3.
    D(X,Y) equals the = (upper=20 4 bits of X) * 256 + Y + 1.

  9. Imploding - Method 6
  10. The Imploding algorithm is actually a combination of = two=20 distinct algorithms. The first algorithm compresses = repeated byte=20 sequences using a sliding dictionary. The second algorithm = is used=20 to compress the encoding of the sliding dictionary output, = using=20 multiple Shannon-Fano trees.

    The Imploding algorithm can use a 4K or 8K sliding = dictionary=20 size. The dictionary size used can be determined by bit 1 = in the=20 general purpose flag word; a 0 bit indicates a 4K = dictionary while=20 a 1 bit indicates an 8K dictionary.

    The Shannon-Fano trees are stored at the start of the=20 compressed file. The number of trees stored is defined by = bit 2 in=20 the general purpose flag word; a 0 bit indicates two trees = stored,=20 a 1 bit indicates three trees are stored. If 3 trees are = stored,=20 the first Shannon-Fano tree represents the encoding of the = Literal=20 characters, the second tree represents the encoding of the = Length=20 information, the third represents the encoding of the = Distance=20 information. When 2 Shannon-Fano trees are stored, the = Length tree=20 is stored first, followed by the Distance tree.

    The Literal Shannon-Fano tree, if present is used to = represent=20 the entire ASCII character set, and contains 256 values. = This tree=20 is used to compress any data not compressed by the sliding = dictionary algorithm. When this tree is present, the = Minimum Match=20 Length for the sliding dictionary is 3. If this tree is = not=20 present, the Minimum Match Length is 2.

    The Length Shannon-Fano tree is used to compress the = Length=20 part of the (length,distance) pairs from the sliding = dictionary=20 output. The Length tree contains 64 values, ranging from = the=20 Minimum Match Length, to 63 plus the Minimum Match = Length.

    The Distance Shannon-Fano tree is used to compress the = Distance=20 part of the (length,distance) pairs from the sliding = dictionary=20 output. The Distance tree contains 64 values, ranging from = 0 to=20 63, representing the upper 6 bits of the distance value. = The=20 distance values themselves will be between 0 and the = sliding=20 dictionary size, either 4K or 8K.

    The Shannon-Fano trees themselves are stored in a = compressed=20 format. The first byte of the tree data represents the = number of=20 bytes of data representing the (compressed) Shannon-Fano = tree=20 minus 1. The remaining bytes represent the Shannon-Fano = tree data=20 encoded as:

    High 4 bits: Number of values at this bit length + 1. (1 -=20 16)
    Low 4 bits: Bit Length needed to represent value + 1. (1 - = 16)=20

    The Shannon-Fano codes can be constructed from the bit = lengths=20 using the following algorithm:

    1. Sort the Bit Lengths in ascending order, while = retaining the=20 order of the original lengths stored in the file.=20
    2. Generate the Shannon-Fano trees:
      Code <- 0
      CodeIncrement <- 0
      LastBitLength <- 0
      i <- number of Shannon-Fano codes - 1 (either 255 or 63)
      
      loop while i >=3D 0
          Code =3D Code + CodeIncrement
          if BitLength(i) <> LastBitLength then
              LastBitLength=3DBitLength(i)
              CodeIncrement =3D 1 shifted left (16 - LastBitLength)
          ShannonCode(i) =3D Code
          i <- i - 1
      end loop 
    3. Reverse the order of all the bits in the above = ShannonCode()=20 vector, so that the most significant bit becomes the = least=20 significant bit. For example, the value 0x1234 (hex) = would=20 become 0x2C48 (hex).=20
    4. Restore the order of Shannon-Fano codes as = originally stored=20 within the file.

    Example:

    This example will show the encoding of a Shannon-Fano = tree of=20 size 8. Notice that the actual Shannon-Fano trees used = for=20 Imploding are either 64 or 256 entries in = size.

    Example: 0x02, 0x42, 0x01, 0x13

    The first byte indicates 3 values in this table. = Decoding the=20 bytes:

    0x42 =3D 5 codes of 3 bits long
    0x01 =3D 1 code = of 2 bits=20 long
    0x13 =3D 2 codes of 4 bits = long

    This would generate the original bit length array of: = (3, 3,=20 3, 3, 3, 2, 4, 4)

    There are 8 codes in this table for the values 0 thru = 7.=20 Using the algorithm to obtain the Shannon-Fano codes=20 produces:

    Val Sorted Constructed Code Reversed
    Value
    Order
    Restored
    Original
    Length
    0: 2 1100000000000000 11 101 3
    1: 3 1010000000000000 101 001 3
    2: 3 1000000000000000 001 110 3
    3: 3 0110000000000000 110 010 3
    4: 3 0100000000000000 010 100 3
    5: 3 0010000000000000 100 11 2
    6: 4 0001000000000000 1000 1000 4
    7: 4 0000000000000000 0000 0000 4

    The values in the Val, Order Restored and Original = Length=20 columns now represent the Shannon-Fano encoding tree that = can be=20 used for decoding the Shannon-Fano encoded data. How to = parse the=20 variable length Shannon-Fano values from the data stream = is beyond=20 the scope of this document. (See the references listed at = the end=20 of this document for more information.) However, = traditional=20 decoding schemes used for Huffman variable length = decoding, such=20 as the Greenlaw algorithm, can be successfully = applied.

    The compressed data stream begins immediately after the = compressed Shannon-Fano data. The compressed data stream = can be=20 interpreted as follows:

    loop until done
        read 1 bit from input stream.
    
        if this bit is non-zero then (encoded data is literal data)
            if Literal Shannon-Fano tree is present
                read and decode character using Literal Shannon-Fano tree.
            otherwise
                read 8 bits from input stream.
            copy character to the output stream.
        otherwise (encoded data is sliding dictionary match)
            if 8K dictionary size
                read 7 bits for offset Distance (lower 7 bits of offset).
            otherwise=20
                read 6 bits for offset Distance (lower 6 bits of offset).
    
            using the Distance Shannon-Fano tree, read and decode the=20
              upper 6 bits of the Distance value.
    
            using the Length Shannon-Fano tree, read and decode
              the Length value.=20
    
            Length <- Length + Minimum Match Length=20
    
            if Length =3D 63 + Minimum Match Length=20
                read 8 bits from the input stream,=20
                add this value to Length.=20
    
            move backwards Distance+1 bytes in the output stream, and=20
              copy Length characters from this position to the output
              stream. (if this position is before the start of the output=20
              stream, then assume that all the data before the start of=20
              the output stream is filled with zeros).=20
    end loop 

  11. Tokenizing - Method 7
  12. This method is not used by PKZIP.

  13. Deflating - Method 8
  14. The Deflate algorithm is similar to the Implode = algorithm using=20 a sliding dictionary of up to 32K with secondary = compression from=20 Huffman/Shannon-Fano codes.

    The compressed data is stored in blocks with a header=20 describing the block and the Huffman codes used in the = data block.=20 The header format is as follows:

    Bit 0: Last Block bit This bit is set to 1 if this is the = last=20 compressed block in the data.
    Bits 1-2: Block type  
    00 (0) - Block is stored - All = stored data=20 is byte aligned. Skip bits until next byte, then = next word =3D=20 block length, followed by the ones compliment of the = block=20 length word. Remaining data in block is the stored = data.=20
    01 (1) - Use fixed Huffman codes = for literal=20 and distance codes.
    Lit Code Bits   Dist Code Bits
    0 - 143 8   0 - 31 5
    144 - 255 9      
    256 - 279 7      
    280 - 287 8      

    Literal codes 286-287 and distance codes 30-31 = are never=20 used but participate in the huffman = construction.

    10 (2) - Dynamic Huffman codes. = (See=20 expanding Huffman codes)
    11 (3) - Reserved - Flag a "Error = in=20 compressed data" if seen.

    Expanding Huffman Codes

    If the data block is stored with dynamic Huffman codes, = the=20 Huffman codes are sent in the following compressed = format:

    5 Bits: # of Literal codes sent - 256
    All = other=20 codes are never sent
    (256 - 286)
    5 Bits: # of Dist codes - 1 (1 - 32)
    4 Bits: # of Bit Length codes - 3 (3 - 19)

    The Huffman codes are sent as bit lengths and the codes = are=20 built as described in the implode algorithm. The bit = lengths=20 themselves are compressed with Huffman codes. There are 19 = bit=20 length codes:

    0 - 15: Represent bit lengths of 0 - = 15
    16: Copy the previous bit length 3 - 6=20 times.
    The next 2 bits indicate repeat length (0 = =3D 3, ...=20 ,3 =3D 6)
    Example: Codes 8, 16 (+2 bits 11), 16 = (+2 bits=20 10) will expand to 12 bit lengths of 8 (1 + 6 + 5) =
    17: Repeat a bit length of 0 for 3 - 10 = times. (3=20 bits of length)
    18: Repeat a bit length of 0 for 11 - 138 = times=20 (7 bits of length)

    The lengths of the bit length codes are sent packed 3 = bits per=20 value (0 - 7) in the following order:

    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, = 2, 14, 1,=20 15

    The Huffman codes should be built as described in the = Implode=20 algorithm except codes are assigned starting at the = shortest bit=20 length, i.e. the shortest code should be all 0's rather = than all=20 1's. Also, codes with a bit length of zero do not = participate in=20 the tree construction. The codes are then used to decode = the bit=20 lengths for the literal and distance tables.

    The bit lengths for the literal tables are sent first = with the=20 number of entries sent described by the 5 bits sent = earlier. There=20 are up to 286 literal characters; the first 256 represent = the=20 respective 8 bit character, code 256 represents the = End-Of-Block=20 code, the remaining 29 codes represent copy lengths of 3 = thru 258.=20 There are up to 30 distance codes representing distances = from 1=20 thru 32k as described below.

    Length=20 Codes
    Code Extra
    Bits
    Length Code Extra
    Bits
    Lengths Code Extra
    Bits
    Lengths Code Extra
    Bits
    Length(s)
    257 0 3 265 1 11,12 273 3 35-42 281 5 131-162
    258 0 4 266 1 13,14 274 3 43-50 282 5 163-194
    259 0 5 267 1 15,16 275 3 51-58 283 5 195-226
    260 0 6 268 1 17,18 276 3 59-66 284 5 227-257
    261 0 7 269 2 19-22 277 4 67-82 285 0 258
    262 0 8 270 2 23-26 278 4 83-98      
    263 0 9 271 2 27-30 279 4 99-114      
    264 0 10 272 2 31-34 280 4 115-130      

    Distance=20 Codes
    Code Extra
    Bits
    Distance Code Extra
    Bits
    Distance Code Extra
    Bits
    Distance Code Extra
    Bits
    Distance
    0 0 1 8 3 17-24 16 7 257-384 24 11 4097-6144
    1 0 2 9 3 25-32 17 7 385-512 25 11 6145-8192
    2 0 3 10 4 33-48 18 8 513-768 26 12 8193-12288
    3 0 4 11 4 49-64 19 8 769-1024 27 12 12289-16384
    4 1 5,6 12 5 65-96 20 9 1025-1536 28 13 16385-24576
    5 1 7,8 13 5 97-128 21 9 1537-2048 29 13 24577-32768
    6 2 9-12 14 6 129-192 22 10 2049-3072      
    7 2 13-16 15 6 193-256 23 10 3073-4096      

    The compressed data stream begins immediately after the = compressed header data. The compressed data stream can be=20 interpreted as follows:

    do
        read header from input stream.
    
        if stored block
            skip bits until byte aligned
            read count and 1's compliment of count
            copy count bytes data block
        otherwise
            loop until end of block code sent
                decode literal character from input stream
                if literal < 256
                    copy character to the output stream
                otherwise
                    if literal =3D end of block
                        break from loop
                    otherwise
                        decode distance from input stream=20
    
                        move backwards distance bytes in the output stream, =
    and
                          copy length characters from this position to the
                          output stream.
            end loop
    while not last block=20
    
    if data descriptor exists
        skip bits until byte aligned
        read crc and sizes
    endif 

  15. Decryption
  16. The encryption used in PKZIP was generously supplied by = Roger=20 Schlafly. PKWARE is grateful to Mr. Schlafly for his = expert help=20 and advice in the field of data encryption.

    PKZIP encrypts the compressed data stream. Encrypted = files must=20 be decrypted before they can be extracted.

    Each encrypted file has an extra 12 bytes stored at the = start=20 of the data area defining the encryption header for that = file. The=20 encryption header is originally set to random values, and = then=20 itself encrypted, using three, 32-bit keys. The key values = are=20 initialized using the supplied encryption password. After = each=20 byte is encrypted, the keys are then updated using = pseudo-random=20 number generation techniques in combination with the same = CRC-32=20 algorithm used in PKZIP and described elsewhere in this=20 document.

    The following is the basic steps required to decrypt a=20 file:

    1. Initialize the three 32-bit keys with the password.=20
    2. Read and decrypt the 12-byte encryption header, = further=20 initializing the encryption keys.=20
    3. Read and decrypt the compressed data stream using = the=20 encryption keys.

    Step 1 - Initializing the encryption = keys

    Key(0) <- 305419896
    Key(1) <- 591751049
    Key(2) <- 878082192=20
    
    loop for i <- 0 to length(password)-1
        update_keys(password(i))
    end loop 

    Where update_keys() is defined = as:

    update_keys(char):
        Key(0) <- crc32(key(0),char)
        Key(1) <- Key(1) + (Key(0) & 000000ffH)=20
        Key(1) <- Key(1) * 134775813 + 1=20
        Key(2) <- crc32(key(2),key(1) >> 24)
    end update_keys 

    Where crc32(old_crc,char) is a routine = that given=20 a CRC value and a character, returns an updated CRC value = after=20 applying the CRC-32 algorithm described elsewhere in this=20 document.

    Step 2 - Decrypting the encryption header

    The purpose of this step is to further initialize the=20 encryption keys, based on random data, to render a = plaintext=20 attack on the data ineffective.

    Read the 12-byte =
    encryption header into Buffer, in locations
      Buffer(0) thru Buffer(11).
    
    loop for i <- 0 to 11
        C <- buffer(i) ^ decrypt_byte()
        update_keys(C)
        buffer(i) <- C
    end loop 

    Where decrypt_byte() is defined as:

    unsigned =
    char decrypt_byte()
        local unsigned short temp
        temp <- Key(2) | 2
        decrypt_byte <- (temp * (temp ^ 1)) >> 8=20
    end decrypt_byte 

    After the header is decrypted, the last 1 or 2 bytes in = Buffer=20 should be the high-order word/byte of the CRC for the file = being=20 decrypted, stored in Intel low-byte/high-byte order. = Versions of=20 PKZIP prior to 2.0 used a 2 byte CRC check; a 1 byte CRC = check is=20 used on versions after 2.0. This can be used to test if = the=20 password supplied is correct or not.

    Step 3 - Decrypting the compressed data stream

    The compressed data stream can be decrypted as = follows:

    loop until done=20
        read a character into C=20
        Temp <- C ^ decrypt_byte()=20
        update_keys(temp)=20
        output Temp=20
    end loop 

  17. Change Process
  18. In order for the .ZIP file format to remain a viable=20 definition, this specification should be considered as = open for=20 periodic review and revision. Although this format was = originally=20 designed with a certain level of extensibility, not all = changes in=20 technology (present or future) were or will be necessarily = considered in its design. If your application requires new = definitions to the extensible sections in this format, or = if you=20 would like to submit new data structures, please forward = your=20 request to zipformat@pkware.com. All=20 submissions will be reviewed by the ZIP File Specification = Committee for possible inclusion into future versions of = this=20 specification. Periodic revisions to this specification = will be=20 published to ensure interoperability.

  19. Acknowledgements
  20. In addition to the above mentioned contributors to = PKZIP and=20 PKUNZIP, I would like to extend special thanks to Robert = Mahoney=20 for suggesting the extension .ZIP for this software.

  21. References
  22. Fiala, Edward R., and Greene, Daniel H., "Data = compression with=20 finite windows", Communications of the ACM, Volume 32, = Number 4,=20 April 1989, pages 490-505.

    Held, Gilbert, "Data Compression, Techniques and = Applications,=20 Hardware and Software Considerations", John Wiley & = Sons,=20 1987.

    Huffman, D.A., "A method for the construction of=20 minimum-redundancy codes", Proceedings of the IRE, Volume = 40,=20 Number 9, September 1952, pages 1098-1101.

    Nelson, Mark, "LZW Data Compression", Dr. Dobbs = Journal, Volume=20 14, Number 10, October 1989, pages 29-37.

    Nelson, Mark, "The Data Compression Book", M&T = Books,=20 1991.

    Storer, James A., "Data Compression, Methods and = Theory",=20 Computer Science Press, 1988

    Welch, Terry, "A Technique for High-Performance Data=20 Compression", IEEE Computer, Volume 17, Number 6, June = 1984, pages=20 8-19.

    Ziv, J. and Lempel, A., "A universal algorithm for = sequential=20 data compression", Communications of the ACM, Volume 30, = Number 6,=20 June 1987, pages 520-540.

    Ziv, J. and Lempel, A., "Compression of individual = sequences=20 via variable-rate coding", IEEE Transactions on = Information=20 Theory, Volume 24, Number 5, September 1978, pages=20 530-536.

3D""=20
3D""=20 Products | Store | Technical=20 Support | Customer = Service | Business=20 Partners | News & = Events=20 | Company =
Copyright=20 =A9 2003 PKWARE, Inc. All rights reserved. Privacy=20 Policy
3D""
3D"" 3D"" 3D"" 3D"" 3D""
------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://127.0.0.1:1027/bug.cgi R0lGODlhCgAKAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/ mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/ /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAANgALAAAAAAKAAoA AAgTALEJHEiwoMGDCBMqXMiwYcKAAAA7 ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/1pixel.gif R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/logo_pkware.gif R0lGODlhnAAZAMQAAJ+fn/Pz89vb27e3t+fn53x8fFhYWIiIiExMTGRkZKurq5SUlMPDw3BwcM/P z0BAQP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAA nAAZAAAF/yAkjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcMhqPI7IxIEwYiAfABHg+ThAFo1sg4TV kgDaRkBECDcEpgL1YSgMSgeztkDcIdbIN2SahwioBmNGSCMEVGMQAU90IgdUCiZ4SSSSD1t1OIqV D0yDR2gJTwhoEGqEjVQOIgpPqhCGVFEkf5uQfpULmDgOm1AQBk97VHrCpwF3rSLARwYjpk+XIwNP CZ5Hl9OSxLo0fEcKAdYAmkcJtEhWI94PUmuqvH0Q8FQJJesi2dciC60O/g6IeAgo0IABj2cPVK0D MK9KqCQBix1hsiyZoyMIEFkLRsJTPQhOkOSC4JFIgQUDCv9EvPHwiKAnCtYhw0hKXat8Fcc9Gdnw 4icSMxkhNAhhZoJ/DpiQIABAD1MASiEMgLo0pgJSJxcsqInjiQECCDmFfbKtHRIHHpEAYIVEqacG bI+4egUNDDQylcqyksV2ZFF2IsI94VugQLocDfHkakmFUYmQR/JVU1uRUUN/g0ckpoJAKeQ1XCE4 0sPvAYLAbAKHKuhgQFQCUXPExZNgTCXHJHrm8YTQladm5x74XUelQVTiHDs+IGXkzhteQh/gFuJz jUp51KjEFtGwomCMSJphj3dXxNgj038DWN80EmAIph3RmRIF1vYgG+PPnQ2g4gNbueFhRX4P6EGg VyNU1AD/YxFVpsIfH/1R0ESOqMJKNEQgeEJ1DlQnXoCgkbRGRuP1gppapX0zAjm+pDBNOk5YcYcC RoyhhixEBIehckgEkM9PIFIjQn4jHUgFGg0xENyH3YVR1hS2QCmaJaYN2SIRP+JYgiiJUHHYCGsY uAYTny3Anl1nQTAbGv6RglyayvmW0C36iPilECk+QFQJOorAGImUcGnlIsqEVwJ/U55SXTrnuVTC HYjcMcJDfB3BkAMjMbDnDtbcJ1VmVwyz5U4jbKTKj2U1tBgSl3x2GgSMCbpial1+yNae1rx6hA8C IIUCAUgpBWywJSAF0Ai9+uqHsiQEgBSS/9Rk7BjGPluCHbOkYLuiPxE5sN4ApGjKzbjklmvuueim q+66mIQAADs= ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_contact_00.gif R0lGODlhOQARAMQAAIiIiPPz89vb23x8fGRkZJSUlKurq+fn57e3t0xMTFhYWMPDw5+fn8/Pz0BA QHBwcP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAAA5ABEAAAXtICSOZGmeaKqubOu+cCzPdA0FgPMcLcOvB0bJ0YA8hCyDokEAtIishmNY PPYeEAYWYngUApBCYTAIOwgCnBWyGAAEEIKOBLUKHgDwSUtCJBZNRg9SDQIOBgFjCw4CB4cAClxQ I3VCCQwDBSh8I3x8VlBQjYRSEEEQpXRVQgp5KXwNCFlYn0KhRQEPcg2pIr0ilRACCgR6Jp60yUa2 RVB8RKV3qFOqy6YBgSd+DIF+TE6gzYgPAwZEjgiQ00UjugVEAZdkKQheel1fYbIPcF0CDXgGwGnz RgSALSIOHJSFihwcGxAjSpxIsaJFiiEAADs= ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_div.gif R0lGODlhCQARAIAAAIyMjP///yH5BAAAAAAALAAAAAAJABEAAAIUjI8HqWzrIJOJItuiC/jtzn3b mBQAOw== ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_site_00.gif R0lGODlhLwARAMQAAJSUlIiIiFhYWExMTHx8fMPDw+fn59vb22RkZKurq/Pz88/Pz7e3t5+fn0BA QHBwcP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAAAvABEAAAXTICSOZGmeaKqubOu+cCzP4vE4hPg0ELOoDocoSAsgCgMG5GCA7ICOxYI4 IwAgTQiAwRgIlIkHQEFyCBIJgRDSeATIAEDgiio4lLqGAREwIAsIdEMEAQEEQgUCC2dOBHYHKQx3 eU48DQgLAQ9lDQICDUIGTJ+VEFEqkpBPTw0DD2JlU1FrAF48T6cnDUqrt5abC3hDCwiYQgsDCr2m PycJA7U/q31dgAGxhVNsAki3jg6QKG14WxALD2BiZCMPB1w2WASEvISCNDRP9/pawvv+/wBDAAA7 ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_free_00.gif R0lGODlhUQARAKIAAIeHh1FRUXNzc6ampkBAQGZmZszMzP///yH5BAAAAAAALAAAAABRABEAAAP/ eLrc/jDKSau9OOvNu/9gqAxCORylcKLmQZbGYpRArA1rJdjTEOAxwsBACAJwrl/uQDT4NqRLsRJd TFWH6UjgICq0SKcrdhoOXVxXzrkST8WR6jf2y/LkMsI8Cyjs9EpcBAIAAWgoBQB6Bj91AQCKBkQD ehCUg18FBYZZBFOXaQpedl5eRUJHpHpRU0ViBSetToY8DgMFkl8kBbo2t7l5c6WAACW4qoeyTAF1 ypu1DXhFlHtbXZWui3oCsAHYkquCQeAzseMKhXGhduxCub+1w0yrhtSbwuEHP023+ub84iytmwKp kycXnoTkIVDnQKE6jBwCwHfoFkRmdShFOlAAD5OIjyBDihxJsqTJkyASAAA7 ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_prod_01.gif R0lGODlhOgAQAMQAALxIP7ErIuW4tfrx8MZkXe/U09ucl7Y5MctybPXj4dCAe+CqpsFWTurGxNaO if///6wdEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAAA6ABAAAAXLICSOZGmeaKqubOu+cCyzB8MAL3DMsjM0A4Gr4WAhDLyRowE5PHAsImuZ FFEhD9tD0AgIHgUc4dFIFLOMBwRQ2AbS5EAbGXMUGIbB+wlRJLxCDQZyZ1oQAgIBCQoQVHYBXXU/ AgwQaVZMVFJSaGpSOo1MaUU9TCOXoambhZdSSqYEAwulJKiOTKtYhrlUAAQAfDBXIqijA0ULBXlF sg1qDgkGWX0JCAgD0jswDAgkB6RrDgQiAQ7clQTmpOlQAQrd6ZVV8/T19vf4JyEAOw== ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_store_00.gif R0lGODlhKgAQAMQAAHBwcFhYWLe3t+fn59vb26urq0xMTPPz83x8fIiIiJSUlMPDw2RkZJ+fn8/P z0BAQP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAAAqABAAAAWLICSOZGmeaKqubOu+MDQQcU02zwOIAG27hgIhMIA8HD9XoDAC5BwExgNx MAIMEEHAoLAJHoLREYKgLo1MyJLwKNa+YSMS0IDQ5aJHAof0Pqpjd3djRnsNbjABC3iBdYN9gT4w CgYBASIGCQMNAQpjhAAMCAZVbwWlDocQCw0+qhAHAgWISbW2t7gxIQA7 ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_tech_00.gif R0lGODlhZQAQAMQAALe3t1hYWKurq+fn59vb2/Pz80xMTJSUlHx8fGRkZMPDw4iIiM/Pz3BwcJ+f n0BAQP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAABlABAAAAX/ICSOZGmeaKqubOu+cCzPdG3feEsw/LASPhSQNSCUirlk48F0rBpOFJTl aJAcTGsSAjjUGI/W1FYlGQSEQDBXpoFFB0MAACkgHgljoxEwFMBLTlMAfV4FS2oQbSIBAiNvZQ0J AQkiDw0GXgQJDwgFEJcGYJduYQMPBAIBEKp2CBANC6A8DwORTmcEqACVCU6LXA90EJBWDQcFDwyg CgphCJ6NoI6KWjNvYA4LYWVIU8rFsE7KxJ9cBr/WIgDCxNzG48vgYVPfy9VfYdkO6ST24fZIJJDU rwS7P+/EzZr1pl48EcBiYAtDwEqZWwwTBlRGSCGwAAoy4ttIS2FAfKXqcRhAMNCdA3QK540U1ACB HwGZHhSEI2eVLgcBjCU4UAsUtFVAicq7p2qYDFsiBggAYI6Ag5BcljkYAJUBHQDLCgAQ4KOAgKnL vBoUYO6sAjrHAGAVhkaEAgdGFAUx63SL3xljLN37S7hw1itrDCtejCMEADs= ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_cust_00.gif R0lGODlhZwAQAMQAALe3t1hYWPPz89vb23x8fKurq+fn50xMTGRkZJSUlIiIiMPDw8/Pz0BAQHBw cJ+fn////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAABnABAAAAX/ICSOZGmeaKqubOu+cCzPdG3fuM0I+WwMsV8PZQg0DgwWIDGEPBoNB+wh bZYeCAiBwKI2D4VBwGC1eZcQRsMpBTQCA3VUQGgggA7H4ZCIQgYIDQQ8DggBSSIBBSQJBwEATgEI DwEPEA0AXoCCPI2PN14jamyXCwWLXgUBdFwOCgKYC2sKg58OXCRukBAGDQOqkTy0Aw0GXlsCir2/ AaBVIqNehUCkXtKWDQyjeZSWDpYlumkNDwproQCPzdd/Bmrla2ZtTNFSdAdA1lLs2dvfD0m+nXAj 4N0DS6F6KVBASiA0cgedkaonAACravukCOy3RmACSA5HBFhwSduaARlFbmJq6A3gyWc01OixRIyS lAAEEDBUBeDdgZYlo/HJBiGkCE/NBBzImVKEOTLWAvTZsRQBTBrGSIo4tQCSgAcFeAgoAGnAA609 nRgwJmLBA2ppw4UVYYAsDwa70oDD2/YtXbtlAgseTLiw4cOIX4QAADs= ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_bus_00.gif R0lGODlhZQAQAMQAAGRkZLe3t0xMTNvb2/Pz8+fn54iIiFhYWJSUlHx8fMPDw6urq3BwcM/Pz0BA QJ+fn////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAABlABAAAAX/ICSOZGmeaKqubOu+cCzPdG3feNvsLdHkhd0gRxw5AAcAq+HIPQQMQWI1 YBRbjkYhe1U9rNthitldZQmOAoTxgJwBDgSE/DgcuIGDQE6AywcCAgEkXyJnDA4HagxITA5NDohW A3AJBGuNgIIzDgYJSmttWQ8ABAw+TaSmbQcLA2mqpwwIDQaEAA0IAgQBSgBtDFNzTW4BZJ4EB4PB IrO1nAYGpaFuOw5twxCFbG4GD1lM2E8KJU/BPyIBAsDYZNVkDGwH7CLjNFwAC9RcCgK2dFa4dXrw QE0/W9ocDBpRiAQARvSyvWsSj+APbvUUcvrxa1+DAQpeDQDocc0AkCJDei4QQMjKiDzUMLoDR7EN gmXYVLKU0QkBlwQMDGRR5zNIqoDAACTYRTSNtAQHWpJY6TPiK1HWtO3hgvFpVBkEH4gZ8KBBQQgK ykIo0KbBIGMQeC1Qg1YthAVnR7glQWDBArhw07UpyFZEWjGB7+Ytw7ix48eQI0ueTCIEADs= ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_news_00.gif R0lGODlhVAAQAMQAAHBwcOfn5/Pz87e3t0xMTFhYWNvb23x8fJSUlIiIiGRkZKurq8PDw5+fn8/P z0BAQP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAABUABAAAAX/ICSOZGmeaKqubOu+cCzPdG2jgiM6gp33JYfQcKM5HgzIQ0cLFBAE4OhB BcgARNvxoGTOGtZlSTwj146PgBhaGKgDCMTbQCAMSAxCg2AyFxpKAwYKDwc9DwCIEIlLAw8FWTBH Cg1LagYLBV0KAAyaAAgOCSQCVF5TCQ0BEAkHBmmtAm2BRyJiSAsLMkeZS0cNCQ+LC3UNXHtJpHVw pw+cRANtnwANf121XYsKkZIPpb4PDeIQCAAAnLoQlXcj5QQHSCRmagmj5uI64LY6AgcE3C5qwRMi zIAVR8bEMMDEZwQoR5rknSrw4A41cnf0dREwoB+XGLUYLBHwjhOEVw4qVIlIoOBARBGVCD1IZ4uT FVZp1BFAcIugCAIJnBxQMCpGAEDqVgVY0BGmgADsICxQVWKAKgOnxI2DkHIEgwZZVB3doUpAgwVS iqhdy7at27dw45oIAQA7 ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_glbl_co_00.gif R0lGODlhOwAQAMQAAOfn53x8fPPz88PDw2RkZExMTLe3t1hYWJSUlIiIiNvb26urq8/Pz3BwcEBA QJ+fn////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAAA7ABAAAAXJICSOZGmeaKqubOu+cCzHjDDfMHA4BYP/qwcBEggAj6dHA2JAQAQBB0EB eRwIDkShIGA4ogNmwfGAeBvkgaN6kClJiwPUKBQQEgIHwytALA8DamYOAEp5DAEJbksjb45LDWV6 XlWMAFGDlRAEcQaLTE6PmpEQk2tvAwUJa5RvCFEAn6KipKaaBwaUrUtqbTJnBWVeD8GjkntZdxAF AViZb3mKM4VhIgoP1QyeuVUAXtc2DNhlhWaepQtILpQtAAiE6u1l8j7x9i4hADs= ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_lft_pr_over_00.gif R0lGODlhfwATAMQAAEBAQJ+fn8/Pz3BwcOfn57e3t1hYWIiIiExMTPPz86urq5SUlHx8fNvb22Rk ZMPDw////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAAB/ABMAAAX4ICSOZGmeaKqubOu+cCzPdG3feK7vfO//uoQgYRsCj0gBAoAQ1ABOpLQ3 WEAOjKl2uxoEIIEBASoAEBoOAIMIGCAKALABAoUsEIbCmLBY7LmAJ15gAxAGCgpzWAl5dAoQYw0M B3QCkYmVDgMPc4GeI4NhVwekEANeBl91hgWNZAABB3EDCggIAVmfn6GFBQ4OBaZeAU6rpGaVZQHL dqeaj7qevJAAyIMLwatwna8QDb2wDKvRgLVuwYadAQgLdatjlJUJCAya3lABceSeAsQjBeggPAjQ QEQAAiP8gUFIQEEBImASEAi4r6LFixgzatzIsaPHjyBlhAAAOw== ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_lft_pr_isb_00.gif R0lGODlhfwATAMQAAP///0BAQM/Pz6CgoHBwcNvb27e3t0xMTPPz8+fn51hYWJSUlGRkZIiIiMPD w3x8fKurqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAAB/ABMAAAX/ICCOZGmeaKqubOu+cCzPdG3feK7vfO//wKBwKFsYUAUCgFAgGRajpEqK WjhEgkejyXouuQYCoYFQeYWEAUoQAAwSJMER206xUYgAPP9gKFkDSgECIgMMAgoNKnJDaW4CA1cO EA5tAwZqkIyTlQmZR5CgbQUDhCMODHQACVcDpA6QTZiEgQCDhUq1BrQJpIRynrEAryIOb8OlMY4B YwcJAQsEbQEDAQjRgc/Rg5ZMBwMHu3oHCwemAA1QIgeKIswP7AwPEAwLerW3bkoEEEtqAQbImQvE pgGBBwWgHaAksIDAcy2WCWBz5w43AWkItqHYjRGDUgESFihQRoQCLsPY/7mb2G1XHkiCTFULENKf LQghSWrUVysQBAUIBIgkCUMiRwAWMVaDWZGbPgAOFHy70wBglAMlHEIZdKengkH4ZCqJZnNQ1SM7 A81khoDBgSZnlf1j2dQWpK/6mnYl8EzpHQAG8g1oBwCBGgdYubZU0DcsLqRtJAIGS2BvrV4iGhwo ExgiC6PcEAS2yyZXZWud2xg0hEABSERt1QBgMKdwAAgLFJDuRmBBQph2H4Pz92wA0I9p+QF9MI9A HuOxi8694/bBNELUnla3duCAHwHdXd+xzniVNScHFGBnqQ+nVOCCaSpAy2wQeU+n9SGwzqBAAgbM AHAfEQQWaOCBCCao4AqCDDbo4IMQKhgCADs= ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_lft_pr_es_02.gif R0lGODlhfwATALMAAKwdE////9OGgenDwMJZUs13cb1KQrc7Mvnw77IsI9iWkeO0sPTh4MhoYu7S 0N6loSH5BAAAAAAALAAAAAB/ABMAAAT/EMhJq7046827/2AojmRpnmiqrmzrvnAsz+JgK9dhlAXu FQNFwmIY5HaAAZLWCTwEhYvASCJEO42AAiGwEAJSquDA9AQIk4OAIDAcBoyoQdCQWBsE9XxYaBQO VgAJUBIJBWMUUwAEO4aIXwBqi39wUYhzdQB9Al0Ac2grDQOdE2cTXw8DC29xBlpcAAJaBF8KDg9J XGpGDgsOXb4LCBSuV0m9CAmQkFOsUWe1sHCybghboCgHAdvGANumzEaK4+JU4UmdirpkpqYTBQFX 7bRg54rebOXo+K4GBkMpXG0j5W3NEHvivulbBEbRKAmK4OHy9g2bBHh15i1ruPAMuX2mph7EY6Eg wACAEtwxjKVPkQ6Wdjjug+kJFjiUBqIoWIAP30aY9zzqe+gOnsUXAdagQRiLQYIFPO99SaDAyEOW CRgQqAqAS78JDRCIwoWgQL+fqWh6ZAAAKkhaTn/N+FZPJgEEJxcEcLBDagC9da6OCyBWEwNrFUoO IFPgMA5ICRAgcGDkrpEzT/fuIIpGLwMyZaqACU26NAVIplOrXs26tevXsGNPiAAAOw== ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_lft_pr_dev_00.gif R0lGODlhfwATALMAAP///0BAQKampszMzHNzc9nZ2bOzs/Ly8k1NTYCAgGZmZpmZmebm5llZWb+/ v4yMjCH5BAAAAAAALAAAAAB/ABMAAAT/EMhJq7046827/2AojmRpnmiqrmzrvnAszyJhG+KC03wb CA7EIEQQ9I6qwLAIOBgEDIABNwUUgBKmEwpgCK4HieMrEQyMB8EOSVMCmAlFAgEQKACKb2CBMDIJ cggHA3sKD3UICwEFAAF5eHFGbDNuTG5KhI1nBHWclkOYAZ1vfkZuAH0MUZMylaYBsKACorOwnqag A5kCnrA/mhIGAYesrUu4AANhBA2cvF2Mn5q7t1ZRp1Z9xTFKBw04fQWLdb8CDQcJCaSoBuIFhAcL nOneyN4D8tswvsQGDYkSCA1B5yiaEX8ACSUI4MCKggAJwpyahaChvosdMmHcuEIjx48gCEOKHEmy ZIwIADs= ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_lft_pr_free_00.gif R0lGODlhfwATALMAAP///0BAQMzMzKampnNzc01NTebm5rOzs/Ly8llZWdnZ2WZmZpmZmYyMjL+/ v4CAgCH5BAAAAAAALAAAAAB/ABMAAAT/EMhJq7046827/2AojmRpnmiqrmzrvnAszyJhE4BiP4J0 M4DDTUG5HUiMo4dApJUCjcEAIAgIBgUEADo4DhJSAyUwcBR6tanH6nyiqQEJmy0Z4CxswhRxGIj9 BkcHAgYDV0R6AIUHWlRdEgp+bA5+bSB0cIoBRJh2F3lTBAsPWXpYWwJVDQQPAHoIBQ8LOAoFWEcJ Dw1WZgxZlmsBbFUECQtywj0DwncToKioDQwPVnFVAJ5619tHC1NzVwkIb8AbZAJaVQIFQFuGWgML Ak3OPYngdgkEDMfX2YbW4gBwkMAWNCsIFhSgV04DpmsNjkGr02yMvW89rAhIAIZdpn/bceIYsHIv I5oGvxo6fHPNQQAt55TJI2QRQYIjBQ4o2LSlgcsj/nDo2VmoALYFNr85GHmFAAJMKj+xFFjAwRZh cZYJU4MMioQDBdt5GykmqKspvm5SKVAADAAGUKwYWBCgYtS7ePPq3cu3r9+/gAMLNhEBADs= ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/nav_lft_pr_vol_00.gif R0lGODlhfwATAMQAANvb23x8fPPz81hYWOfn57e3t2RkZExMTJSUlIiIiKurq8PDw8/Pz0BAQHBw cJ+fn////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAAB/ABMAAAX/ICSOZGmeaKqubOu+cCzPdG3feK7vfO//OAFDAAEATISjLTli2oZAnaCx gBgQpofjph11bQ1GVDd4QBqF7Nb2HbtlgQCgARAEGoZj12EOMxp3CQNhEAgHA2leaxBdAAaARIaI jAODYgkNDkSEmZlFBwcJAW8sDwYLDRAKA3aje30MfwQIBgIGDwR0qyRtXXECAwq5ALumAnx/Agli nAV/EAEIqKQsf13XW69nsamv1pi8i9oABN/dW3wCBwFE29vPyKnUKlMDWNiM6LDP3g0P/+EUQeAz whrAcQZqufOTStSDAfNWDEqDTxvDfAMfPAOwCKMIbfGKZNNHoAAwBQu5eBUZ4EBJRBR3jlg7YMaX A0wqX6kLYKDjgwMORlJCEGZnT4x8chlKw0llgDK4XqJgYEYEgAdVIDBIc5UqAQJmtkJwBoGAApMk qAIUC2HBAyVm0YolezVRVFxgGQV48FSqX1ID9gbo+LdwD7AP0BpezLix48eQI88IAQA7 ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/landing_pic_pr.gif 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 ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.pkware.com/images/bcrumb_pr_white.gif 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 ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://127.0.0.1:1027/js.cgi?pcaw&r=30191 NS_ActualWrite=3Ddocument.write; // Popup Blocker --> RanPostamble=3D0; NS_ActualOpen=3Dwindow.open; orig_setTimeout =3D window.setTimeout; function NS_NullWindow(){this.window;} function NS_NewOpen(url,nam,atr){ obj=3Dnew NS_NullWindow(); obj.focus =3D NS_NullWindow; obj.opener =3D this.window; return(obj); } function NS_NullWindow2(){this.window;} function NS_NewOpen2(url,nam,atr){return(new NS_NullWindow2());} function op_stop() { NS_ActualOpen2=3Dwindow.open; = window.open=3DNS_NewOpen2; } function op_start() { window.open=3DNS_ActualOpen2; } function noopen_ST(one,two) { = return(orig_setTimeout("op_stop();"+one+";;op_start();",two)); } function noopen_load() {=20 op_stop(); if(orig_onload) orig_onload(); op_start(); } function noopen_unload() { op_stop(); if(orig_onunload) orig_onunload(); = op_start(); } function postamble() {=0A= =0A= if(!RanPostamble) { RanPostamble=3D1; orig_onload =3D window.onload; orig_onunload =3D window.onunload; window.onunload =3D noopen_unload; window.onload =3D noopen_load; window.open=3DNS_ActualOpen; } } window.setTimeout =3D noopen_ST; window.open=3DNS_NewOpen; document.ignore =3D new Object(); ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.pkware.com/js/browser_2l.js var uAgent =3D navigator.userAgent if (uAgent.indexOf("Mac")!=3D-1) { if (uAgent.indexOf("MSIE")!=3D-1){ var pos =3D uAgent.indexOf('MSIE'); bVer =3D uAgent.substring(pos + 5); var pos =3D bVer.indexOf(';'); var bVer =3D bVer.substring(0,pos); bVer =3D parseInt(bVer); if (bVer=3D=3D5) {document.write('');} else {document.write('');} }=09 else {document.write('');} }=20 else { if (uAgent.indexOf("MSIE")!=3D-1){ var pos =3D uAgent.indexOf('MSIE'); bVer =3D uAgent.substring(pos + 5); var pos =3D bVer.indexOf(';'); var bVer =3D bVer.substring(0,pos); bVer =3D parseInt(bVer); if (bVer=3D=3D5) {document.write('');}=20 else=20 {document.write('');} }=20 else {document.write('');} } ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: application/octet-stream Content-Transfer-Encoding: 7bit Content-Location: http://www.pkware.com/js/rollover_2l.js if (document.images) { img1on = new Image (); img1on.src = "/images/nav_glbl_contact_01.gif"; img1off = new Image(); img1off.src = "/images/nav_glbl_contact_00.gif"; img2on = new Image (); img2on.src = "/images/nav_glbl_site_01.gif"; img2off = new Image(); img2off.src = "/images/nav_glbl_site_00.gif"; img3on = new Image (); img3on.src = "/images/nav_glbl_free_01.gif"; img3off = new Image(); img3off.src = "/images/nav_glbl_free_00.gif"; img4on = new Image (); img4on.src = "/images/nav_glbl_prod_01.gif"; img4off = new Image(); img4off.src = "/images/nav_glbl_prod_00.gif"; img5on = new Image (); img5on.src = "/images/nav_glbl_store_01.gif"; img5off = new Image(); img5off.src = "/images/nav_glbl_store_00.gif"; img6on = new Image (); img6on.src = "/images/nav_glbl_tech_01.gif"; img6off = new Image(); img6off.src = "/images/nav_glbl_tech_00.gif"; img7on = new Image (); img7on.src = "/images/nav_glbl_cust_01.gif"; img7off = new Image(); img7off.src = "/images/nav_glbl_cust_00.gif"; img8on = new Image (); img8on.src = "/images/nav_glbl_bus_01.gif"; img8off = new Image(); img8off.src = "/images/nav_glbl_bus_00.gif"; img9on = new Image (); img9on.src = "/images/nav_glbl_news_01.gif"; img9off = new Image(); img9off.src = "/images/nav_glbl_news_00.gif"; img10on = new Image (); img10on.src = "/images/nav_glbl_co_01.gif"; img10off = new Image(); img10off.src = "/images/nav_glbl_co_00.gif"; img11on = new Image (); img11on.src = "/images/nav_lft_pr_over_01.gif"; img11off = new Image(); img11off.src = "/images/nav_lft_pr_over_00.gif"; img12on = new Image (); img12on.src = "/images/nav_lft_pr_pkwin_01.gif"; img12off = new Image(); img12off.src = "/images/nav_lft_pr_pkwin_00.gif"; img13on = new Image (); img13on.src = "/images/nav_lft_pr_pkunix_01.gif"; img13off = new Image(); img13off.src = "/images/nav_lft_pr_pkunix_00.gif"; img14on = new Image (); img14on.src = "/images/nav_lft_pr_pkas_01.gif"; img14off = new Image(); img14off.src = "/images/nav_lft_pr_pkas_00.gif"; img15on = new Image (); img15on.src = "/images/nav_lft_pr_pkmain_01.gif"; img15off = new Image(); img15off.src = "/images/nav_lft_pr_pkmain_00.gif"; img16on = new Image (); img16on.src = "/images/nav_lft_pr_pkoth_01.gif"; img16off = new Image(); img16off.src = "/images/nav_lft_pr_pkoth_00.gif"; img17on = new Image (); img17on.src = "/images/nav_lft_pr_white_01.gif"; img17off = new Image(); img17off.src = "/images/nav_lft_pr_white_00.gif"; img18on = new Image (); img18on.src = "/images/nav_lft_pr_case_01.gif"; img18off = new Image(); img18off.src = "/images/nav_lft_pr_case_00.gif"; img19on = new Image (); img19on.src = "/images/nav_lft_pr_vol_01.gif"; img19off = new Image(); img19off.src = "/images/nav_lft_pr_vol_00.gif"; img20on = new Image (); img20on.src = "/images/nav_lft_pr_free_01.gif"; img20off = new Image(); img20off.src = "/images/nav_lft_pr_free_00.gif"; img21on = new Image (); img21on.src = "/images/nav_lft_pr_purch_01.gif"; img21off = new Image(); img21off.src = "/images/nav_lft_pr_purch_00.gif"; img22on = new Image (); img22on.src = "/images/nav_lft_pr_news_01.gif"; img22off = new Image(); img22off.src = "/images/nav_lft_pr_news_00.gif"; img23on = new Image (); img23on.src = "/images/nav_lft_news_what_01.gif"; img23off = new Image(); img23off.src = "/images/nav_lft_news_what_00.gif"; img24on = new Image (); img24on.src = "/images/nav_lft_news_inthe_01.gif"; img24off = new Image(); img24off.src = "/images/nav_lft_news_inthe_00.gif"; img25on = new Image (); img25on.src = "/images/nav_lft_news_prel_01.gif"; img25off = new Image(); img25off.src = "/images/nav_lft_news_prel_00.gif"; img26on = new Image (); img26on.src = "/images/nav_lft_news_ev_01.gif"; img26off = new Image(); img26off.src = "/images/nav_lft_news_ev_00.gif"; img27on = new Image (); img27on.src = "/images/nav_lft_news_news_01.gif"; img27off = new Image(); img27off.src = "/images/nav_lft_news_news_00.gif"; img28on = new Image (); img28on.src = "/images/nav_lft_news_prm_01.gif"; img28off = new Image(); img28off.src = "/images/nav_lft_news_prm_00.gif"; img29on = new Image (); img29on.src = "/images/nav_lft_co_about_01.gif"; img29off = new Image(); img29off.src = "/images/nav_lft_co_about_00.gif"; img30on = new Image (); img30on.src = "/images/nav_lft_co_mile_01.gif"; img30off = new Image(); img30off.src = "/images/nav_lft_co_mile_00.gif"; img31on = new Image (); img31on.src = "/images/nav_lft_co_mgmt_01.gif"; img31off = new Image(); img31off.src = "/images/nav_lft_co_mgmt_00.gif"; img32on = new Image (); img32on.src = "/images/nav_lft_co_car_01.gif"; img32off = new Image(); img32off.src = "/images/nav_lft_co_car_00.gif"; img35on = new Image (); img35on.src = "/images/nav_lft_bus_over_01.gif"; img35off = new Image(); img35off.src = "/images/nav_lft_bus_over_00.gif"; img36on = new Image (); img36on.src = "/images/nav_lft_bus_our_01.gif"; img36off = new Image(); img36off.src = "/images/nav_lft_bus_our_00.gif"; img37on = new Image (); img37on.src = "/images/nav_lft_sup_cntct-sup_01.gif"; img37off = new Image(); img37off.src = "/images/nav_lft_sup_cntct-sup_00.gif"; img38on = new Image (); img38on.src = "/images/nav_lft_sup_faq_01.gif"; img38off = new Image(); img38off.src = "/images/nav_lft_sup_faq_00.gif"; img39on = new Image (); img39on.src = "/images/nav_lft_sup_nwsgrps_01.gif"; img39off = new Image(); img39off.src = "/images/nav_lft_sup_nwsgrps_00.gif"; img40on = new Image (); img40on.src = "/images/nav_lft_sup_o-store-help_01.gif"; img40off = new Image(); img40off.src = "/images/nav_lft_sup_o-store-help_00.gif"; img41on = new Image (); img41on.src = "/images/nav_lft_sup_srv-ann_01.gif"; img41off = new Image(); img41off.src = "/images/nav_lft_sup_srv-ann_00.gif"; img42on = new Image (); img42on.src = "/images/nav_lft_sup_sum_01.gif"; img42off = new Image(); img42off.src = "/images/nav_lft_sup_sum_00.gif"; img43on = new Image (); img43on.src = "/images/nav_lft_cs_contact_01.gif"; img43off = new Image(); img43off.src = "/images/nav_lft_cs_contact_00.gif"; img44on = new Image (); img44on.src = "/images/nav_lft_cs_m_01.gif"; img44off = new Image(); img44off.src = "/images/nav_lft_cs_m_00.gif"; img45on = new Image (); img45on.src = "/images/nav_lft_cs_o-store-help_01.gif"; img45off = new Image(); img45off.src = "/images/nav_lft_cs_o-store-help_00.gif"; img46on = new Image (); img46on.src = "/images/nav_lft_cs_ss_01.gif"; img46off = new Image(); img46off.src = "/images/nav_lft_cs_ss_00.gif"; img47on = new Image (); img47on.src = "/images/nav_lft_cs_vol-lic_01.gif"; img47off = new Image (); img47off.src = "/images/nav_lft_cs_vol-lic_00.gif"; img48on = new Image(); img48on.src = "/images/nav_lft_pr_isb_01.gif"; img48off = new Image(); img48off.src = "/images/nav_lft_pr_isb_00.gif"; img49on = new Image(); img49on.src = "/images/nav_lft_pr_es_01.gif"; img49off = new Image(); img49off.src = "/images/nav_lft_pr_es_00.gif"; img50on = new Image(); img50on.src = "/images/nav_lft_pr_dev_01.gif"; img50off = new Image(); img50off.src = "/images/nav_lft_pr_dev_00.gif"; } function imgOn(imgName){ if (document.images) { document[imgName].src = eval(imgName + "on.src"); } } function imgOff(imgName){ if (document.images) { document[imgName].src = eval(imgName + "off.src"); } } ------=_NextPart_000_0000_01C30CE1.812F6E10 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://stats.hitbox.com/js/hbp.js _hbi=3Dnew Image();_hL=3Dlocation;_hN=3Dnavigator;function _ex(v){return = escape(eval("window._"+v)||'')};function _mv(v){return = '&'+v+'=3D'+_ex(v);};_lp=3Deval("window._lp")?eval("window._lp"):(_hL.pro= tocol.indexOf("https")>-1)?"https://":"http://";_zo=3D(new = Date()).getTimezoneOffset();_ot=3D0;_et=3D0;_ce=3D"";_oe=3D0;_ss=3D"na";_= sc=3D"na";_ln=3D"";_pl=3D"";_ja=3D"na";_sv=3D11;_cy=3D"u";_hp=3D"u";_tp=3D= eval("window._ptc");function _re(_ms,_ur,_el){return false;}function = _se(_ms,_ur,_el){if((_rf=3D=3D"undefined")||(_rf=3D=3D"")){_rf=3D"bookmar= k";};if(_et){window.onerror=3D_we;}else{window.onerror=3D_re;};_oe=3D1;_a= r+=3D_rf+"&ec=3D1";_hbi.src=3D_ar;return = true;}_iie5=3D(_hN.userAgent.indexOf('MSIE = 5')>=3D0)?true:false;_imac=3D(_hN.userAgent.indexOf('Mac')>=3D0)?true:fal= se;if(!_imac){if(window.onerror){_we=3Dwindow.onerror;_et=3D1;};};window.= onerror=3D_se;function _sb(_k){eval("var = _gt=3D/(\\w*\\.)*(\\w*\\.)/i;");_gt.exec(_hL.hostname);var = _fr=3D"co.com.org.net.";if(_fr.indexOf(RegExp.$2)>-1){eval("var = _uf=3D/(\\w*\\.)*(\\w*\\.)(\\w*\\.)/;");_uf.exec(_hL.hostname);}if((_k.hr= ef.indexOf(RegExp.$2)<0)&&(_k.protocol!=3D"javascript:")){if(_bn=3D=3D"Ne= tscape"){_hk=3D_k.href;setTimeout("_hbi.src=3D_ar+'&el=3D'+escape(_hk);",= 1);}else{_hbi.src=3D_ar+"&el=3D"+escape(_k.href);}}return = true;};function _ri(_k,_w,_i){_fl=3D_gf(_k.pathname);if(_fl!=3D""){var = _pt=3Dnew = RegExp("\..?html?|\.asp|\.cfm|\.jsp|\.cgi|\.php[3-4]?|\.pl|\.taf|\.dll","= i");if((!_pt.test(_fl))&&(_fl.indexOf(".")>-1)){if(_bn=3D=3D"Netscape"){s= etTimeout("_hbi.src=3D_ar+'&fn=3D'+escape(_fl);",1);}else{_hbi.src=3D_ar+= "&fn=3D"+escape(_fl);}}else{_sb(_k);}}else{_sb(_k);}if(_w.li&&_w.li[_i]&&= _w.li[_i].oc){return _w.li[_i].oc();}else{return true};};function = _it(){if(_ot)_wo();_lo=3Dnew Object();_lo.li=3Dnew = Array(document.links.length);for(var = i=3D0;i=3D0){_be=3D_x.indexOf("CP=3D")+3}else{return"null";}return = _x.substring(_be,_ed);}_dt=3D(new = Date()).getHours();_lm=3D(Date.parse(document.lastModified));if((_bn=3D=3D= "MSIE")&&(_bv>=3D400)){_ln=3D_hN.userLanguage;}if(_bn=3D=3D"Netscape"){if= (_bv>=3D400)_ln=3D_hN.language;if(_bv>300)for(var = i=3D0;i<_hN.plugins.length;i++)_pl+=3D_hN.plugins[i].name+":"};if(_hL.sea= rch&&_cp=3D=3D"null"){_cp=3D_cr(location.search,"x")};if(document.cookie.= indexOf("CP=3D")>-1){_ce=3D"y";_hd=3D(_cr(document.cookie,"*"));if((_hd!=3D= "null")&&(_cp=3D=3D"null")){_cp=3D_hd;}else{document.ignore=3D"CP=3D"+_cp= +"*; path=3D/; expires=3DWed, 1 Jan 2020 00:00:00 = GMT";};}else{document.ignore=3D"CP=3D"+_cp+"*; path=3D/; expires=3DWed, = 1 Jan 2020 00:00:00 = GMT";_ce=3D(document.cookie.indexOf("CP=3D")>-1)?"y":"n";};_ja=3D_hN.java= Enabled()?"y":"n";if(window.screen){_sv=3D12;_ss=3Dscreen.width+'*'+scree= n.height;_sc=3D(_bn=3D=3D'MSIE')?screen.colorDepth:screen.pixelDepth;if(_= sc=3D=3D'undefined'){_sc=3D'na';}}_ra=3Dnew = Array();if(_ra.toSource){_sv=3D13;};if((_bn=3D=3D"MSIE")&&(_ra.shift)){_s= v=3D13;};if((_iie5)&&(!_imac)){if(_hN.appMinorVersion.toString().indexOf(= "Privacy")>-1){_ce=3D"p";};document.body.addBehavior("#default#homePage")= ;_hp=3Ddocument.body.isHomePage(_hL.href)?"y":"n";document.body.addBehavi= or("#default#clientCaps");_cy=3Ddocument.body.connectionType;}_hcv=3D(typ= eof = _hcv=3D=3D"undefined")?61:_hcv;if(_hcv>61){_ct=3D""}else{_gn=3D"ehg.hitbo= x.com"};_ar=3D_lp+_gn+"/HG?hc=3D"+_mn+"&hb=3D"+escape(_acct)+"&cd=3D1&hv=3D= 6&n=3D"+escape(_pn);if((_hcv>61)||(typeof = _mlc!=3D"undefined")){_ct=3D"";if(_mlc!=3D"n")_ar+=3D"&vcon=3D"+escape(_m= lc)};_ar+=3D_mv("bn")+_mv("bv")+_mv("ce")+_mv("ss")+_mv("sc")+_mv("dt")+_= mv("sv")+_mv("zo")+_mv("epg")+_mv("lm")+_mv("cy")+_mv("hp")+_mv("ja")+_mv= ("ln")+_mv("prc")+_mv("oid")+_mv("pl")+_mv("cp")+"&con=3D"+escape(_ct);if= (_tp){_ar+=3D"&pt=3D"+_tp};_ar+=3D"&rf=3D";if(_iie5){eval("try = {_rf=3Descape(top."Hidden-Referrer")+\"\";}catch (_e) = {_rf=3Descape("Hidden-Referrer")+\"\";}");}else{if(top.document){_rf=3Des= cape(top."Hidden-Referrer")+"";}};if((_rf=3D=3D"undefined")||(_rf=3D=3D""= )){_rf=3D"bookmark";};_ar+=3D_rf;if(!_oe){if(_et){window.onerror=3D_we;}e= lse{window.onerror=3D_re;}_hbi.src=3D_ar;};if((_sv>11)&&(!_imac)){if(wind= ow.onload){_wo=3Dwindow.onload;_ot=3D1;};window.onload=3D_it;}=0A= ------=_NextPart_000_0000_01C30CE1.812F6E10--