]> git.imager.perl.org - imager.git/commitdiff
move TIFF into its own module
authorTony Cook <tony@develop=help.com>
Wed, 25 Aug 2010 10:13:14 +0000 (10:13 +0000)
committerTony Cook <tony@develop=help.com>
Wed, 25 Aug 2010 10:13:14 +0000 (10:13 +0000)
74 files changed:
Changes
Imager.pm
Imager.xs
MANIFEST
Makefile.PL
TIFF/Makefile.PL [new file with mode: 0644]
TIFF/TIFF.pm [new file with mode: 0644]
TIFF/TIFF.xs [new file with mode: 0644]
TIFF/imtiff.c [new file with mode: 0644]
TIFF/imtiff.h [new file with mode: 0644]
TIFF/t/t10tiff.t [new file with mode: 0644]
TIFF/testimg/alpha.tif [new file with mode: 0644]
TIFF/testimg/comp4.bmp [new file with mode: 0644]
TIFF/testimg/comp4.tif [new file with mode: 0755]
TIFF/testimg/comp4bad.tif [new file with mode: 0755]
TIFF/testimg/comp4t.tif [new file with mode: 0644]
TIFF/testimg/comp8.bmp [new file with mode: 0644]
TIFF/testimg/comp8.tif [new file with mode: 0755]
TIFF/testimg/gralpha.tif [new file with mode: 0644]
TIFF/testimg/grey16.tif [new file with mode: 0755]
TIFF/testimg/grey32.tif [new file with mode: 0644]
TIFF/testimg/imager.pbm [new file with mode: 0644]
TIFF/testimg/imager.tif [new file with mode: 0644]
TIFF/testimg/pengtile.tif [new file with mode: 0644]
TIFF/testimg/penguin-base.ppm [new file with mode: 0644]
TIFF/testimg/rgb16.tif [new file with mode: 0644]
TIFF/testimg/rgb16t.tif [new file with mode: 0644]
TIFF/testimg/rgbatsep.tif [new file with mode: 0644]
TIFF/testimg/scmyk.tif [new file with mode: 0644]
TIFF/testimg/scmyka.tif [new file with mode: 0644]
TIFF/testimg/scmyka16.tif [new file with mode: 0644]
TIFF/testimg/scmykaa.tif [new file with mode: 0644]
TIFF/testimg/slab.tif [new file with mode: 0644]
TIFF/testimg/srgb.tif [new file with mode: 0644]
TIFF/testimg/srgba.tif [new file with mode: 0644]
TIFF/testimg/srgba16.tif [new file with mode: 0644]
TIFF/testimg/srgba32.tif [new file with mode: 0644]
TIFF/testimg/srgbaa.tif [new file with mode: 0644]
TIFF/testimg/tiffwarn.tif [new file with mode: 0644]
image.c
imager.h
imext.c
imext.h
imexttypes.h
lib/Imager/APIRef.pod
t/t106notiff.t
t/t106tiff.t [deleted file]
t/t50basicoo.t
t/x11rubthru.t
testimg/alpha.tif [deleted file]
testimg/comp4.tif [deleted file]
testimg/comp4bad.tif [deleted file]
testimg/comp4t.tif [deleted file]
testimg/comp8.tif [deleted file]
testimg/gralpha.tif [deleted file]
testimg/grey16.tif [deleted file]
testimg/grey32.tif [deleted file]
testimg/imager.tif [deleted file]
testimg/pengtile.tif [deleted file]
testimg/rgb16.tif [deleted file]
testimg/rgb16t.tif [deleted file]
testimg/rgbatsep.tif [deleted file]
testimg/scmyk.tif [deleted file]
testimg/scmyka.tif [deleted file]
testimg/scmyka16.tif [deleted file]
testimg/scmykaa.tif [deleted file]
testimg/slab.tif [deleted file]
testimg/srgb.tif [deleted file]
testimg/srgba.tif [deleted file]
testimg/srgba16.tif [deleted file]
testimg/srgba32.tif [deleted file]
testimg/srgbaa.tif [deleted file]
testimg/tiffwarn.tif [deleted file]
tiff.c [deleted file]

diff --git a/Changes b/Changes
index cf4b9188cc73f9db9703819a1918c50f78a737d7..c377f0d10d284243a8108b63d57c4c64e4cae119 100644 (file)
--- a/Changes
+++ b/Changes
@@ -8,7 +8,7 @@ Imager 0.78 - unreleased
    Thanks to Justin Davis.
    https://rt.cpan.org/Ticket/Display.html?id=60491
 
    Thanks to Justin Davis.
    https://rt.cpan.org/Ticket/Display.html?id=60491
 
- - moved the GIF file handling code into a sub-module in preparation
+ - moved GIF, TIFF file handling code into sub-modules in preparation
    for separate distribution.
    https://rt.cpan.org/Ticket/Display.html?id=49616 (partial)
 
    for separate distribution.
    https://rt.cpan.org/Ticket/Display.html?id=49616 (partial)
 
index d817cb8a07008e01e2291a9ad761a949c291fa00..89bbf44330532db0fba5f1c34c81109be764e88d 100644 (file)
--- a/Imager.pm
+++ b/Imager.pm
@@ -77,10 +77,6 @@ use Imager::Font;
                i_readjpeg_wiol
                i_writejpeg_wiol
 
                i_readjpeg_wiol
                i_writejpeg_wiol
 
-               i_readtiff_wiol
-               i_writetiff_wiol
-               i_writetiff_wiol_faxable
-
                i_readpnm_wiol
                i_writeppm_wiol
 
                i_readpnm_wiol
                i_writeppm_wiol
 
@@ -1385,17 +1381,6 @@ sub read {
   my $allow_incomplete = $input{allow_incomplete};
   defined $allow_incomplete or $allow_incomplete = 0;
 
   my $allow_incomplete = $input{allow_incomplete};
   defined $allow_incomplete or $allow_incomplete = 0;
 
-  if ( $input{'type'} eq 'tiff' ) {
-    my $page = $input{'page'};
-    defined $page or $page = 0;
-    $self->{IMG}=i_readtiff_wiol( $IO, $allow_incomplete, $page ); 
-    if ( !defined($self->{IMG}) ) {
-      $self->{ERRSTR}=$self->_error_as_msg(); return undef;
-    }
-    $self->{DEBUG} && print "loading a tiff file\n";
-    return $self;
-  }
-
   if ( $input{'type'} eq 'pnm' ) {
     $self->{IMG}=i_readpnm_wiol( $IO, $allow_incomplete );
     if ( !defined($self->{IMG}) ) {
   if ( $input{'type'} eq 'pnm' ) {
     $self->{IMG}=i_readpnm_wiol( $IO, $allow_incomplete );
     if ( !defined($self->{IMG}) ) {
@@ -1758,24 +1743,7 @@ sub write {
     ($IO, $fh) = $self->_get_writer_io(\%input, $input{'type'})
       or return undef;
     
     ($IO, $fh) = $self->_get_writer_io(\%input, $input{'type'})
       or return undef;
     
-    if ($input{'type'} eq 'tiff') {
-      $self->_set_opts(\%input, "tiff_", $self)
-        or return undef;
-      $self->_set_opts(\%input, "exif_", $self)
-        or return undef;
-      
-      if (defined $input{class} && $input{class} eq 'fax') {
-        if (!i_writetiff_wiol_faxable($self->{IMG}, $IO, $input{fax_fine})) {
-          $self->{ERRSTR} = $self->_error_as_msg();
-          return undef;
-        }
-      } else {
-        if (!i_writetiff_wiol($self->{IMG}, $IO)) {
-          $self->{ERRSTR} = $self->_error_as_msg();
-          return undef;
-        }
-      }
-    } elsif ( $input{'type'} eq 'pnm' ) {
+    if ( $input{'type'} eq 'pnm' ) {
       $self->_set_opts(\%input, "pnm_", $self)
         or return undef;
       if ( ! i_writeppm_wiol($self->{IMG},$IO) ) {
       $self->_set_opts(\%input, "pnm_", $self)
         or return undef;
       if ( ! i_writeppm_wiol($self->{IMG},$IO) ) {
@@ -1791,14 +1759,6 @@ sub write {
         return undef;
       }
       $self->{DEBUG} && print "writing a raw file\n";
         return undef;
       }
       $self->{DEBUG} && print "writing a raw file\n";
-    } elsif ( $input{'type'} eq 'png' ) {
-      $self->_set_opts(\%input, "png_", $self)
-        or return undef;
-      if ( !i_writepng_wiol($self->{IMG}, $IO) ) {
-        $self->{ERRSTR}='unable to write png image';
-        return undef;
-      }
-      $self->{DEBUG} && print "writing a png file\n";
     } elsif ( $input{'type'} eq 'jpeg' ) {
       $self->_set_opts(\%input, "jpeg_", $self)
         or return undef;
     } elsif ( $input{'type'} eq 'jpeg' ) {
       $self->_set_opts(\%input, "jpeg_", $self)
         or return undef;
@@ -1899,23 +1859,7 @@ sub write_multi {
     ($IO, $file) = $class->_get_writer_io($opts, $type)
       or return undef;
     
     ($IO, $file) = $class->_get_writer_io($opts, $type)
       or return undef;
     
-    if ($type eq 'tiff') {
-      $class->_set_opts($opts, "tiff_", @images)
-        or return;
-      $class->_set_opts($opts, "exif_", @images)
-        or return;
-      my $res;
-      $opts->{fax_fine} = 1 unless exists $opts->{fax_fine};
-      if ($opts->{'class'} && $opts->{'class'} eq 'fax') {
-        $res = i_writetiff_multi_wiol_faxable($IO, $opts->{fax_fine}, @work);
-      }
-      else {
-        $res = i_writetiff_multi_wiol($IO, @work);
-      }
-      unless ($res) {
-        $class->_set_error($class->_error_as_msg());
-        return undef;
-      }
+    if (0) { # eventually PNM in here, now that TIFF/GIF are elsewhere
     }
     else {
       if (@images == 1) {
     }
     else {
       if (@images == 1) {
@@ -1975,14 +1919,8 @@ sub read_multi {
     return;
   }
 
     return;
   }
 
-    my @imgs;
-  if ($type eq 'gif') {
-    @imgs = i_readgif_multi_wiol($IO);
-  }
-  elsif ($type eq 'tiff') {
-    @imgs = i_readtiff_multi_wiol($IO, -1);
-    }
-  elsif ($type eq 'pnm') {
+  my @imgs;
+  if ($type eq 'pnm') {
     @imgs = i_readpnm_multi_wiol($IO, $opts{allow_incomplete}||0);
   }
   else {
     @imgs = i_readpnm_multi_wiol($IO, $opts{allow_incomplete}||0);
   }
   else {
index 821b1a1f1c234f6358c4e99b6f433ca529e9ffcb..a4f11c70ece627f1b3952dfa24eff8092ec74935 100644 (file)
--- a/Imager.xs
+++ b/Imager.xs
@@ -559,9 +559,7 @@ static struct value_name make_color_names[] =
 
 static struct value_name translate_names[] =
 {
 
 static struct value_name translate_names[] =
 {
-#ifdef HAVE_LIBGIF
   { "giflib", pt_giflib, },
   { "giflib", pt_giflib, },
-#endif
   { "closest", pt_closest, },
   { "perturb", pt_perturb, },
   { "errdiff", pt_errdiff, },
   { "closest", pt_closest, },
   { "perturb", pt_perturb, },
   { "errdiff", pt_errdiff, },
@@ -2383,142 +2381,6 @@ i_test_format_probe(ig, length)
 
 
 
 
 
 
-#ifdef HAVE_LIBTIFF
-
-Imager::ImgRaw
-i_readtiff_wiol(ig, allow_incomplete, page=0)
-        Imager::IO     ig
-              int     allow_incomplete
-               int     page
-
-void
-i_readtiff_multi_wiol(ig, length)
-        Imager::IO     ig
-              int     length
-      PREINIT:
-        i_img **imgs;
-        int count;
-        int i;
-      PPCODE:
-        imgs = i_readtiff_multi_wiol(ig, length, &count);
-        if (imgs) {
-          EXTEND(SP, count);
-          for (i = 0; i < count; ++i) {
-            SV *sv = sv_newmortal();
-            sv_setref_pv(sv, "Imager::ImgRaw", (void *)imgs[i]);
-            PUSHs(sv);
-          }
-          myfree(imgs);
-        }
-
-
-undef_int
-i_writetiff_wiol(im, ig)
-    Imager::ImgRaw     im
-        Imager::IO     ig
-
-undef_int
-i_writetiff_multi_wiol(ig, ...)
-        Imager::IO     ig
-      PREINIT:
-        int i;
-        int img_count;
-        i_img **imgs;
-      CODE:
-        if (items < 2)
-          croak("Usage: i_writetiff_multi_wiol(ig, images...)");
-        img_count = items - 1;
-        RETVAL = 1;
-       if (img_count < 1) {
-         RETVAL = 0;
-         i_clear_error();
-         i_push_error(0, "You need to specify images to save");
-       }
-       else {
-          imgs = mymalloc(sizeof(i_img *) * img_count);
-          for (i = 0; i < img_count; ++i) {
-           SV *sv = ST(1+i);
-           imgs[i] = NULL;
-           if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
-             imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
-           }
-           else {
-             i_clear_error();
-             i_push_error(0, "Only images can be saved");
-              myfree(imgs);
-             RETVAL = 0;
-             break;
-            }
-         }
-          if (RETVAL) {
-           RETVAL = i_writetiff_multi_wiol(ig, imgs, img_count);
-          }
-         myfree(imgs);
-       }
-      OUTPUT:
-        RETVAL
-
-undef_int
-i_writetiff_wiol_faxable(im, ig, fine)
-    Imager::ImgRaw     im
-        Imager::IO     ig
-              int     fine
-
-undef_int
-i_writetiff_multi_wiol_faxable(ig, fine, ...)
-        Imager::IO     ig
-        int fine
-      PREINIT:
-        int i;
-        int img_count;
-        i_img **imgs;
-      CODE:
-        if (items < 3)
-          croak("Usage: i_writetiff_multi_wiol_faxable(ig, fine, images...)");
-        img_count = items - 2;
-        RETVAL = 1;
-       if (img_count < 1) {
-         RETVAL = 0;
-         i_clear_error();
-         i_push_error(0, "You need to specify images to save");
-       }
-       else {
-          imgs = mymalloc(sizeof(i_img *) * img_count);
-          for (i = 0; i < img_count; ++i) {
-           SV *sv = ST(2+i);
-           imgs[i] = NULL;
-           if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
-             imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
-           }
-           else {
-             i_clear_error();
-             i_push_error(0, "Only images can be saved");
-              myfree(imgs);
-             RETVAL = 0;
-             break;
-            }
-         }
-          if (RETVAL) {
-           RETVAL = i_writetiff_multi_wiol_faxable(ig, imgs, img_count, fine);
-          }
-         myfree(imgs);
-       }
-      OUTPUT:
-        RETVAL
-
-const char *
-i_tiff_libversion()
-
-bool
-i_tiff_has_compression(name)
-       const char *name
-
-#endif /* HAVE_LIBTIFF */
-
-
-#ifdef HAVE_LIBPNG
-
-#endif
 
 
 
 
 
 
index 08408e9447740d321e56477fc34592c015224ac2..eac2b5a6352f62658535d37d172f5f7b1d396f19 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -98,6 +98,39 @@ SGI/testimg/verb.rgb
 SGI/testimg/verb12.rgb
 SGI/testimg/verb16.rgb
 SGI/testimg/verb6.rgb
 SGI/testimg/verb12.rgb
 SGI/testimg/verb16.rgb
 SGI/testimg/verb6.rgb
+TIFF/Makefile.PL
+TIFF/TIFF.pm
+TIFF/TIFF.xs
+TIFF/imtiff.c
+TIFF/imtiff.h
+TIFF/testimg/alpha.tif Alpha scaling test image
+TIFF/testimg/comp4.bmp       Compressed 4-bit/pixel BMP
+TIFF/testimg/comp4.tif       4-bit/pixel paletted TIFF
+TIFF/testimg/comp4bad.tif    corrupted 4-bit/pixel paletted TIFF
+TIFF/testimg/comp4t.tif      4-bit/pixel paletted TIFF (tiled)
+TIFF/testimg/comp8.bmp       Compressed 8-bit/pixel BMP
+TIFF/testimg/comp8.tif       8-bit/pixel paletted TIFF
+TIFF/testimg/gralpha.tif       Grey alpha test image
+TIFF/testimg/grey16.tif        16-bit/sample greyscale TIFF
+TIFF/testimg/grey32.tif        32-bit/sample greyscale+alpha TIFF
+TIFF/testimg/imager.pbm        Test bi-level
+TIFF/testimg/imager.tif        Test bi-level
+TIFF/testimg/penguin-base.ppm
+TIFF/testimg/pengtile.tif      Tiled tiff image, same as penguin-base.ppm
+TIFF/testimg/rgb16.tif 16-bit/sample RGB image - strips
+TIFF/testimg/rgb16t.tif        16-bit/sample RGB image - tiled
+TIFF/testimg/rgbatsep.tif      Tiled/separated for testing RGBA codepath
+TIFF/testimg/scmyk.tif Simple CMYK TIFF image
+TIFF/testimg/scmyka.tif        CMYK with one alpha channel
+TIFF/testimg/scmyka16.tif      CMYK with one alpha channel (16-bit)
+TIFF/testimg/scmykaa.tif       CMYK with 2 alpha channels
+TIFF/testimg/slab.tif  Lab color image
+TIFF/testimg/srgb.tif  Simple RGB image
+TIFF/testimg/srgba.tif RGB with one alpha
+TIFF/testimg/srgba16.tif
+TIFF/testimg/srgba32.tif
+TIFF/testimg/srgbaa.tif        RGB with 2 alpha
+TIFF/testimg/tiffwarn.tif      Generates a warning while being read
 apidocs.perl    Build lib/Imager/APIRef.pm
 bigtest.perl   Library selection tester
 bmp.c           Reading and writing Windows BMP files
 apidocs.perl    Build lib/Imager/APIRef.pm
 bigtest.perl   Library selection tester
 bmp.c           Reading and writing Windows BMP files
@@ -311,7 +344,6 @@ t/tr18561.t         Regression tests
 t/tr18561b.t
 tags.c
 testimg/209_yonge.jpg  Regression test: #17981
 t/tr18561b.t
 tags.c
 testimg/209_yonge.jpg  Regression test: #17981
-testimg/alpha.tif      Alpha scaling test image
 testimg/alpha16.tga    16-bit/pixel TGA with alpha "channel" RT 32926
 testimg/bad1oflow.bmp   1-bit/pixel, overflow integer on 32-bit machines
 testimg/bad1wid0.bmp    1-bit/pixel, zero width
 testimg/alpha16.tga    16-bit/pixel TGA with alpha "channel" RT 32926
 testimg/bad1oflow.bmp   1-bit/pixel, overflow integer on 32-bit machines
 testimg/bad1wid0.bmp    1-bit/pixel, zero width
@@ -337,18 +369,10 @@ testimg/bad_asc.pgm       ASCII PGM with invalid image data
 testimg/bad_asc.ppm    ASCII PPM with invalid image data
 testimg/base.jpg       Base JPEG test image
 testimg/comp4.bmp       Compressed 4-bit/pixel BMP
 testimg/bad_asc.ppm    ASCII PPM with invalid image data
 testimg/base.jpg       Base JPEG test image
 testimg/comp4.bmp       Compressed 4-bit/pixel BMP
-testimg/comp4.tif       4-bit/pixel paletted TIFF
-testimg/comp4bad.tif    corrupted 4-bit/pixel paletted TIFF
-testimg/comp4t.tif      4-bit/pixel paletted TIFF (tiled)
 testimg/comp8.bmp       Compressed 8-bit/pixel BMP
 testimg/comp8.bmp       Compressed 8-bit/pixel BMP
-testimg/comp8.tif       8-bit/pixel paletted TIFF
 testimg/exiftest.jpg   Test image for EXIF parsing
 testimg/gimpgrad        A GIMP gradient file
 testimg/exiftest.jpg   Test image for EXIF parsing
 testimg/gimpgrad        A GIMP gradient file
-testimg/gralpha.tif    Grey alpha test image
-testimg/grey16.tif     16-bit/sample greyscale TIFF
-testimg/grey32.tif     32-bit/sample greyscale+alpha TIFF
 testimg/imager.pbm     Test bi-level
 testimg/imager.pbm     Test bi-level
-testimg/imager.tif     Test bi-level
 testimg/junk.ppm
 testimg/longid.tga      Test TGA with a long id string
 testimg/maxval.ppm     For ppm file maxval handling
 testimg/junk.ppm
 testimg/longid.tga      Test TGA with a long id string
 testimg/maxval.ppm     For ppm file maxval handling
@@ -360,17 +384,9 @@ testimg/maxval_asc.ppm
 testimg/multiple.ppm   Test multiple PPM reading
 testimg/newgimpgrad.ggr Test GIMP Gradient file (newer type)
 testimg/penguin-base.ppm
 testimg/multiple.ppm   Test multiple PPM reading
 testimg/newgimpgrad.ggr Test GIMP Gradient file (newer type)
 testimg/penguin-base.ppm
-testimg/pengtile.tif   Tiled tiff image, same as penguin-base.ppm
 testimg/pgm.pgm                Simple pgm for testing the right sample is in the right place
 testimg/pgm.pgm                Simple pgm for testing the right sample is in the right place
-testimg/rgb16.tif      16-bit/sample RGB image - strips
-testimg/rgb16t.tif     16-bit/sample RGB image - tiled
-testimg/rgbatsep.tif   Tiled/separated for testing RGBA codepath
 testimg/scale.ppm
 testimg/scale.ppm
-testimg/scmyk.tif      Simple CMYK TIFF image
 testimg/scmyk.jpg      Simple CMYK JPEG image
 testimg/scmyk.jpg      Simple CMYK JPEG image
-testimg/scmyka.tif     CMYK with one alpha channel
-testimg/scmyka16.tif   CMYK with one alpha channel (16-bit)
-testimg/scmykaa.tif    CMYK with 2 alpha channels
 testimg/short1.bmp      1-bit/pixel, data missing from EOF
 testimg/short24.bmp     24-bit/pixel, data missing from EOF
 testimg/short4.bmp      truncated 4bit/pixel uncompressed BMP
 testimg/short1.bmp      1-bit/pixel, data missing from EOF
 testimg/short24.bmp     24-bit/pixel, data missing from EOF
 testimg/short4.bmp      truncated 4bit/pixel uncompressed BMP
@@ -386,17 +402,10 @@ testimg/short_bin.ppm     Bin PPM with short image section
 testimg/short_bin16.pgm        16-bit Bin PGM with short image section
 testimg/short_bin16.ppm        16-bit Bin PPM with short image section
 testimg/simple.pbm
 testimg/short_bin16.pgm        16-bit Bin PGM with short image section
 testimg/short_bin16.ppm        16-bit Bin PPM with short image section
 testimg/simple.pbm
-testimg/slab.tif       Lab color image
-testimg/srgb.tif       Simple RGB image
-testimg/srgba.tif      RGB with one alpha
-testimg/srgba16.tif
-testimg/srgba32.tif
-testimg/srgbaa.tif     RGB with 2 alpha
 testimg/test.png       Standard test image as PNG
 testimg/test.raw       Standard test image as RAW
 testimg/test.tga       Standard test image as TGA
 testimg/test_gimp_pal   A simple GIMP palette file
 testimg/test.png       Standard test image as PNG
 testimg/test.raw       Standard test image as RAW
 testimg/test.tga       Standard test image as TGA
 testimg/test_gimp_pal   A simple GIMP palette file
-testimg/tiffwarn.tif   Generates a warning while being read
 testimg/winrgb2.bmp  1-bit bmp base
 testimg/winrgb24.bmp 24-bit bmp base
 testimg/winrgb24off.bmp 24-bit bmp with image data offset from header
 testimg/winrgb2.bmp  1-bit bmp base
 testimg/winrgb24.bmp 24-bit bmp base
 testimg/winrgb24off.bmp 24-bit bmp with image data offset from header
@@ -407,7 +416,6 @@ testimg/winrgb8.bmp  8-bit bmp base
 testimg/winrgb8off.bmp  8-bit bmp with image data offset from header
 testimg/zerotype.jpg   Image with a zero type entry in the EXIF data
 tga.c           Reading and writing Targa files
 testimg/winrgb8off.bmp  8-bit bmp with image data offset from header
 testimg/zerotype.jpg   Image with a zero type entry in the EXIF data
 tga.c           Reading and writing Targa files
-tiff.c
 trans2.c
 transform.perl Shell interface to Imager::Transform
 typemap
 trans2.c
 transform.perl Shell interface to Imager::Transform
 typemap
index 3a1da3c56bc185c018ed7ea67b85edccf7455631..bd144e1a99997e1fb795dec12799f3cc01215a8f 100644 (file)
@@ -545,18 +545,18 @@ sub init {
                            installed on your computer}
                   };
 
                            installed on your computer}
                   };
 
-  $formats{'tiff'}={
-                   order=>'23',
-                   def=>'HAVE_LIBTIFF',
-                   inccheck=>sub { -e catfile($_[0], 'tiffio.h') },
-                   libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
-                   libfiles=>'-ltiff',
-                   objfiles=>'tiff.o',
-                   docs=>q{
-                           In order to use tiff with this module you need to have libtiff
-                           installed on your computer},
-                   postcheck => \&postcheck_tiff,
-                  };
+  $formats{'tiff'}={
+#                  order=>'23',
+#                  def=>'HAVE_LIBTIFF',
+#                  inccheck=>sub { -e catfile($_[0], 'tiffio.h') },
+#                  libcheck=>sub { $_[0] eq "libtiff$aext" or $_ eq "libtiff.$lext" },
+#                  libfiles=>'-ltiff',
+#                  objfiles=>'tiff.o',
+#                  docs=>q{
+#                          In order to use tiff with this module you need to have libtiff
+#                          installed on your computer},
+#                  postcheck => \&postcheck_tiff,
+#                 };
 
 #   $formats{'png'}={
 #                 order=>'22',
 
 #   $formats{'png'}={
 #                 order=>'22',
@@ -966,7 +966,7 @@ Usage: $0 [--enable feature1,feature2,...] [other options]
        $0 [--disable feature1,feature2,...]  [other options]
        $0 --help
 Possible feature names are:
        $0 [--disable feature1,feature2,...]  [other options]
        $0 --help
 Possible feature names are:
-  jpeg tiff T1-fonts TT-fonts freetype2
+  jpeg T1-fonts TT-fonts freetype2
 Other options:
   --verbose | -v
     Verbose library probing (or set IM_VERBOSE in the environment)
 Other options:
   --verbose | -v
     Verbose library probing (or set IM_VERBOSE in the environment)
@@ -1043,84 +1043,84 @@ sub _tilde_expand {
   $path;
 }
 
   $path;
 }
 
-sub postcheck_tiff {
-  my ($format, $frm) = @_;
-
-  -d "probe" or mkdir "probe";
+# sub postcheck_tiff {
+#   my ($format, $frm) = @_;
 
 
-  my $tiffver_name = "probe/tiffver.txt";
+#   -d "probe" or mkdir "probe";
 
 
-  my $lib;
-  if ($Config{cc} =~ /\b(cl|bcc)\b/) {
-    $lib = "libtiff";
-  }
-  else {
-    $lib = "tiff";
-  }
+#   my $tiffver_name = "probe/tiffver.txt";
 
 
-  # setup LD_RUN_PATH to match link time
-  my $lopts = join " " , map("-L$_", @{$format->{libdir}}), " -ltiff";
-  my ($extra, $bs_load, $ld_load, $ld_run_path) =
-    ExtUtils::Liblist->ext($lopts, $VERBOSE);
-  local $ENV{LD_RUN_PATH};
+#   my $lib;
+#   if ($Config{cc} =~ /\b(cl|bcc)\b/) {
+#     $lib = "libtiff";
+#   }
+#   else {
+#     $lib = "tiff";
+#   }
 
 
-  if ($ld_run_path) {
-    print "Setting LD_RUN_PATH=$ld_run_path for TIFF probe\n" if $VERBOSE;
-    $ENV{LD_RUN_PATH} = $ld_run_path;
-  }
+#   # setup LD_RUN_PATH to match link time
+#   my $lopts = join " " , map("-L$_", @{$format->{libdir}}), " -ltiff";
+#   my ($extra, $bs_load, $ld_load, $ld_run_path) =
+#     ExtUtils::Liblist->ext($lopts, $VERBOSE);
+#   local $ENV{LD_RUN_PATH};
 
 
-  my $good =
-    eval {
-      assert_lib
-       (
-        debug => $VERBOSE,
-        incpath => $format->{incdir},
-        libpath => $format->{libdir},
-        lib => $lib,
-        header => [ qw(stdio.h tiffio.h) ],
-        function => <<FUNCTION,
-  {
-    const char *vers = TIFFGetVersion();
-    FILE *f = fopen("$tiffver_name", "wb");
-    if (!f)
-      return 1;
-    fputs(vers, f);
-    if (fclose(f))
-      return 1;
-    return 0;
-  }
-FUNCTION
-       );
-      1;
-    };
+#   if ($ld_run_path) {
+#     print "Setting LD_RUN_PATH=$ld_run_path for TIFF probe\n" if $VERBOSE;
+#     $ENV{LD_RUN_PATH} = $ld_run_path;
+#   }
 
 
-  unless ($good && -s $tiffver_name
-         && open(VERS, "< $tiffver_name")) {
-    unlink $tiffver_name unless $KEEP_FILES;
-    print <<EOS;
-    **tiff: cannot determine libtiff version number
-      tiff: DISABLED
-EOS
-    return;
-  }
+#   my $good =
+#     eval {
+#       assert_lib
+#      (
+#       debug => $VERBOSE,
+#       incpath => $format->{incdir},
+#       libpath => $format->{libdir},
+#       lib => $lib,
+#       header => [ qw(stdio.h tiffio.h) ],
+#       function => <<FUNCTION,
+#   {
+#     const char *vers = TIFFGetVersion();
+#     FILE *f = fopen("$tiffver_name", "wb");
+#     if (!f)
+#       return 1;
+#     fputs(vers, f);
+#     if (fclose(f))
+#       return 1;
+#     return 0;
+#   }
+# FUNCTION
+#      );
+#       1;
+#     };
+
+#   unless ($good && -s $tiffver_name
+#        && open(VERS, "< $tiffver_name")) {
+#     unlink $tiffver_name unless $KEEP_FILES;
+#     print <<EOS;
+#     **tiff: cannot determine libtiff version number
+#       tiff: DISABLED
+# EOS
+#     return;
+#   }
 
 
-  # version file seems to be there, load it up
-  my $ver_str = do { local $/; <VERS> };
-  close VERS;
-  unlink $tiffver_name unless $KEEP_FILES;
+  # version file seems to be there, load it up
+  my $ver_str = do { local $/; <VERS> };
+  close VERS;
+  unlink $tiffver_name unless $KEEP_FILES;
 
 
-  my ($version) = $ver_str =~ /(\d+\.\d+\.\d+)/;
+  my ($version) = $ver_str =~ /(\d+\.\d+\.\d+)/;
 
 
-  if ($version eq '3.9.0') {
-    print <<EOS;
-    **tiff: libtiff 3.9.0 introduced a serious bug, please install 3.9.1
-      tiff: DISABLED
-EOS
-    return;
-  }
+  if ($version eq '3.9.0') {
+    print <<EOS;
+    **tiff: libtiff 3.9.0 introduced a serious bug, please install 3.9.1
+      tiff: DISABLED
+EOS
+    return;
+  }
 
 
-  return 1;
-}
+  return 1;
+}
 
 # This isn't a module, but some broken tools, like
 # Module::Depends::Instrusive insist on treating it like one.
 
 # This isn't a module, but some broken tools, like
 # Module::Depends::Instrusive insist on treating it like one.
diff --git a/TIFF/Makefile.PL b/TIFF/Makefile.PL
new file mode 100644 (file)
index 0000000..e6edcef
--- /dev/null
@@ -0,0 +1,136 @@
+#!perl -w
+use strict;
+use ExtUtils::MakeMaker qw(WriteMakefile WriteEmptyMakefile);
+use Getopt::Long;
+use Config;
+
+my $verbose = $ENV{IM_VERBOSE};
+my @libpaths;
+my @incpaths;
+
+GetOptions("incpath=s", \@incpaths,
+           "libpath=s" => \@libpaths,
+           "verbose|v" => \$verbose);
+
+our $BUILDING_IMAGER;
+
+my $MM_ver = eval $ExtUtils::MakeMaker::VERSION;
+
+my %opts = 
+  (
+   NAME => 'Imager::File::TIFF',
+   VERSION_FROM => 'TIFF.pm',
+   OBJECT => 'TIFF.o imtiff.o',
+  );
+
+my @inc;
+if ($BUILDING_IMAGER) {
+  push @inc, "-I..";
+  unshift @INC, "../lib";
+}
+else {
+  unshift @INC, "inc";
+  print "TIFF: building independently\n";
+  require Imager::ExtUtils;
+  push @inc, Imager::ExtUtils->includes;
+  $opts{TYPEMAPS} = [ Imager::ExtUtils->typemap ];
+
+  # Imager required configure through use
+  my @Imager_req = ( Imager => "0.77" );
+  if ($MM_ver >= 6.46) {
+    $opts{META_MERGE} =
+      {
+       configure_requires => 
+       {
+       @Imager_req,
+       },
+       build_requires => 
+       {
+       @Imager_req,
+       "Test::More" => "0.47",
+       },
+       resources =>
+       {
+       homepage => "http://imager.perl.org/",
+       repository =>
+       {
+        url => "http://imager.perl.org/svn/trunk/Imager-File-TIFF",
+        web => "http://imager.perl.org/svnweb/public/browse/trunk/Imager-File-TIFF",
+        type => "svn",
+       },
+       },
+      };
+    $opts{PREREQ_PM} =
+      {
+       @Imager_req,
+      };
+  }
+}
+
+require Imager::Probe;
+
+my %probe =
+  (
+   name => "TIFF",
+   inccheck => sub { -e File::Spec->catfile($_[0], "tiffio.h") },
+   libbase => "tiff",
+   testcode => _tiff_test_code(),
+   testcodeheaders => [ "tiffio.h", "stdio.h", "string.h" ],
+   incpath => join($Config{path_sep}, @incpaths),
+   libpath => join($Config{path_sep}, @libpaths),
+  );
+
+my $probe_res = Imager::Probe->probe(\%probe);
+if ($probe_res) {
+  push @inc, $probe_res->{INC};
+  $opts{LIBS} = $probe_res->{LIBS};
+
+  $opts{INC} = "@inc";
+
+  if ($MM_ver > 6.06) {
+    $opts{AUTHOR} = 'Tony Cook <tony@imager.perl.org>';
+    $opts{ABSTRACT} = 'TIFF image file support for Imager';
+  }
+  
+  WriteMakefile(%opts);
+}
+else {
+  if ($BUILDING_IMAGER) {
+    WriteEmptyMakefile(%opts);
+  }
+  else {
+    # fail in good way
+    die "OS unsupported: TIFF libraries or headers not found\n";
+  }
+}
+
+sub _tiff_test_code {
+  return <<'CODE';
+static const char ver_base[] = ", Version ";
+static const size_t ver_base_len = sizeof(ver_base) - 1;
+const char *ver_str = TIFFGetVersion();
+const char *ver_start = strstr(ver_str, ver_base);
+const char *ver_end;
+int ver_len;
+
+if (ver_start && ver_start[ver_base_len] >= '3' && ver_start[ver_base_len] < '9') {
+  ver_start += ver_base_len;
+  ver_end = ver_start;
+  while (*ver_end && (*ver_end == '.' || *ver_end >= '0' && *ver_end <= '9'))
+    ++ver_end;
+  ver_len = ver_end - ver_start;
+}
+else {
+  ver_start = "(unknown)";
+  ver_len = strlen(ver_start);
+}
+
+fprintf(stderr, "TIFF: library version %.*s, header version %ld\n", ver_len, ver_start, TIFFLIB_VERSION);
+if (TIFFLIB_VERSION == 20090820) {
+  fprintf(stderr, "TIFF: this appears to be libtiff 3.9.0 which introduced a serious bug\n");
+  fprintf(stderr, "TIFF: please install 3.9.1\n");
+  return 1;
+}
+return 0;
+CODE
+}
diff --git a/TIFF/TIFF.pm b/TIFF/TIFF.pm
new file mode 100644 (file)
index 0000000..cbc42e3
--- /dev/null
@@ -0,0 +1,141 @@
+package Imager::File::TIFF;
+use strict;
+use Imager;
+use vars qw($VERSION @ISA);
+
+BEGIN {
+  $VERSION = "0.77";
+
+  eval {
+    require XSLoader;
+    XSLoader::load('Imager::File::TIFF', $VERSION);
+    1;
+  } or do {
+print STDERR "Falling back to DynaLoader ($@)\n";
+    require DynaLoader;
+    push @ISA, 'DynaLoader';
+    bootstrap Imager::File::TIFF $VERSION;
+  };
+}
+
+Imager->register_reader
+  (
+   type=>'tiff',
+   single => 
+   sub { 
+     my ($im, $io, %hsh) = @_;
+
+     my $allow_incomplete = $hsh{allow_incomplete};
+     defined $allow_incomplete or $allow_incomplete = 0;
+
+     my $page = $hsh{page};
+     defined $page or $page = 0;
+     $im->{IMG} = i_readtiff_wiol($io, $allow_incomplete, $page);
+
+     unless ($im->{IMG}) {
+       $im->_set_error(Imager->_error_as_msg);
+       return;
+     }
+
+     return $im;
+   },
+   multiple =>
+   sub {
+     my ($io, %hsh) = @_;
+
+     my @imgs = i_readtiff_multi_wiol($io);
+     unless (@imgs) {
+       Imager->_set_error(Imager->_error_as_msg);
+       return;
+     }
+
+     return map bless({ IMG => $_, ERRSTR => undef }, "Imager"), @imgs;
+   },
+  );
+
+Imager->register_writer
+  (
+   type=>'tiff',
+   single => 
+   sub { 
+     my ($im, $io, %hsh) = @_;
+
+     $im->_set_opts(\%hsh, "i_", $im);
+     $im->_set_opts(\%hsh, "tiff_", $im);
+     $im->_set_opts(\%hsh, "exif_", $im);
+
+     if (defined $hsh{class} && $hsh{class} eq "fax") {
+       my $fax_fine = $hsh{fax_fine};
+       defined $fax_fine or $fax_fine = 1;
+       if (!i_writetiff_wiol_faxable($im->{IMG}, $io, $fax_fine)) {
+        $im->{ERRSTR} = Imager->_error_as_msg();
+        return undef;
+       }
+     }
+     else {
+       unless (i_writetiff_wiol($im->{IMG}, $io)) {
+        $im->_set_error(Imager->_error_as_msg);
+        return;
+       }
+     }
+     return $im;
+   },
+   multiple =>
+   sub {
+     my ($class, $io, $opts, @ims) = @_;
+
+     Imager->_set_opts($opts, "tiff_", @ims);
+     Imager->_set_opts($opts, "exif_", @ims);
+
+     my @work = map $_->{IMG}, @ims;
+     my $tiff_class = $opts->{class};
+     defined $tiff_class or $tiff_class = "";
+
+     my $result;
+     if ($tiff_class eq "fax") {
+       my $fax_fine = $opts->{fax_fine};
+       defined $fax_fine or $fax_fine = 1;
+       $result = i_writetiff_multi_wiol_faxable($io, $fax_fine, @work);
+     }
+     else {
+       $result = i_writetiff_multi_wiol($io, @work);
+     }
+     unless ($result) {
+       $class->_set_error($class->_error_as_msg);
+       return;
+     }
+
+     return 1;
+   },
+  );
+
+__END__
+
+=head1 NAME
+
+Imager::File::TIFF - read and write TIFF files
+
+=head1 SYNOPSIS
+
+  use Imager;
+
+  my $img = Imager->new;
+  $img->read(file=>"foo.tiff")
+    or die $img->errstr;
+
+  $img->write(file => "foo.tif")
+    or die $img->errstr;
+
+=head1 DESCRIPTION
+
+Imager's TIFF support is documented in L<Imager::Files>.
+
+=head1 AUTHOR
+
+Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager, Imager::Files.
+
+=cut
diff --git a/TIFF/TIFF.xs b/TIFF/TIFF.xs
new file mode 100644 (file)
index 0000000..3765d4f
--- /dev/null
@@ -0,0 +1,145 @@
+#define PERL_NO_GET_CONTEXT
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include "imext.h"
+#include "imperl.h"
+#include "imtiff.h"
+
+DEFINE_IMAGER_CALLBACKS;
+
+MODULE = Imager::File::TIFF  PACKAGE = Imager::File::TIFF
+
+Imager::ImgRaw
+i_readtiff_wiol(ig, allow_incomplete=0, page=0)
+        Imager::IO     ig
+              int     allow_incomplete
+               int     page
+
+void
+i_readtiff_multi_wiol(ig)
+        Imager::IO     ig
+      PREINIT:
+        i_img **imgs;
+        int count;
+        int i;
+      PPCODE:
+        imgs = i_readtiff_multi_wiol(ig, &count);
+        if (imgs) {
+          EXTEND(SP, count);
+          for (i = 0; i < count; ++i) {
+            SV *sv = sv_newmortal();
+            sv_setref_pv(sv, "Imager::ImgRaw", (void *)imgs[i]);
+            PUSHs(sv);
+          }
+          myfree(imgs);
+        }
+
+
+undef_int
+i_writetiff_wiol(im, ig)
+    Imager::ImgRaw     im
+        Imager::IO     ig
+
+undef_int
+i_writetiff_multi_wiol(ig, ...)
+        Imager::IO     ig
+      PREINIT:
+        int i;
+        int img_count;
+        i_img **imgs;
+      CODE:
+        if (items < 2)
+          croak("Usage: i_writetiff_multi_wiol(ig, images...)");
+        img_count = items - 1;
+        RETVAL = 1;
+       if (img_count < 1) {
+         RETVAL = 0;
+         i_clear_error();
+         i_push_error(0, "You need to specify images to save");
+       }
+       else {
+          imgs = mymalloc(sizeof(i_img *) * img_count);
+          for (i = 0; i < img_count; ++i) {
+           SV *sv = ST(1+i);
+           imgs[i] = NULL;
+           if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
+             imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
+           }
+           else {
+             i_clear_error();
+             i_push_error(0, "Only images can be saved");
+              myfree(imgs);
+             RETVAL = 0;
+             break;
+            }
+         }
+          if (RETVAL) {
+           RETVAL = i_writetiff_multi_wiol(ig, imgs, img_count);
+          }
+         myfree(imgs);
+       }
+      OUTPUT:
+        RETVAL
+
+undef_int
+i_writetiff_wiol_faxable(im, ig, fine)
+    Imager::ImgRaw     im
+        Imager::IO     ig
+              int     fine
+
+undef_int
+i_writetiff_multi_wiol_faxable(ig, fine, ...)
+        Imager::IO     ig
+        int fine
+      PREINIT:
+        int i;
+        int img_count;
+        i_img **imgs;
+      CODE:
+        if (items < 3)
+          croak("Usage: i_writetiff_multi_wiol_faxable(ig, fine, images...)");
+        img_count = items - 2;
+        RETVAL = 1;
+       if (img_count < 1) {
+         RETVAL = 0;
+         i_clear_error();
+         i_push_error(0, "You need to specify images to save");
+       }
+       else {
+          imgs = mymalloc(sizeof(i_img *) * img_count);
+          for (i = 0; i < img_count; ++i) {
+           SV *sv = ST(2+i);
+           imgs[i] = NULL;
+           if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
+             imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
+           }
+           else {
+             i_clear_error();
+             i_push_error(0, "Only images can be saved");
+              myfree(imgs);
+             RETVAL = 0;
+             break;
+            }
+         }
+          if (RETVAL) {
+           RETVAL = i_writetiff_multi_wiol_faxable(ig, imgs, img_count, fine);
+          }
+         myfree(imgs);
+       }
+      OUTPUT:
+        RETVAL
+
+const char *
+i_tiff_libversion()
+
+bool
+i_tiff_has_compression(name)
+       const char *name
+
+
+BOOT:
+       PERL_INITIALIZE_IMAGER_CALLBACKS;
diff --git a/TIFF/imtiff.c b/TIFF/imtiff.c
new file mode 100644 (file)
index 0000000..814823b
--- /dev/null
@@ -0,0 +1,2560 @@
+#include <tiffio.h>
+#include <string.h>
+#include "imtiff.h"
+#include "imext.h"
+
+/* needed to implement our substitute TIFFIsCODECConfigured */
+#if TIFFLIB_VERSION < 20031121
+static int TIFFIsCODECConfigured(uint16 scheme);
+#endif
+
+/*
+=head1 NAME
+
+tiff.c - implements reading and writing tiff files, uses io layer.
+
+=head1 SYNOPSIS
+
+   io_glue *ig = io_new_fd( fd );
+   i_img *im   = i_readtiff_wiol(ig, -1); // no limit on how much is read
+   // or 
+   io_glue *ig = io_new_fd( fd );
+   return_code = i_writetiff_wiol(im, ig); 
+
+=head1 DESCRIPTION
+
+tiff.c implements the basic functions to read and write tiff files.
+It uses the iolayer and needs either a seekable source or an entire
+memory mapped buffer.
+
+=head1 FUNCTION REFERENCE
+
+Some of these functions are internal.
+
+=over
+
+=cut
+*/
+
+#define byteswap_macro(x) \
+     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |     \
+      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
+
+#define CLAMP8(x) ((x) < 0 ? 0 : (x) > 255 ? 255 : (x))
+#define CLAMP16(x) ((x) < 0 ? 0 : (x) > 65535 ? 65535 : (x))
+
+#define Sample16To8(num) ((num) / 257)
+
+struct tag_name {
+  char *name;
+  uint32 tag;
+};
+
+static i_img *read_one_rgb_tiled(TIFF *tif, int width, int height, int allow_incomplete);
+static i_img *read_one_rgb_lines(TIFF *tif, int width, int height, int allow_incomplete);
+
+static struct tag_name text_tag_names[] =
+{
+  { "tiff_documentname", TIFFTAG_DOCUMENTNAME, },
+  { "tiff_imagedescription", TIFFTAG_IMAGEDESCRIPTION, },
+  { "tiff_make", TIFFTAG_MAKE, },
+  { "tiff_model", TIFFTAG_MODEL, },
+  { "tiff_pagename", TIFFTAG_PAGENAME, },
+  { "tiff_software", TIFFTAG_SOFTWARE, },
+  { "tiff_datetime", TIFFTAG_DATETIME, },
+  { "tiff_artist", TIFFTAG_ARTIST, },
+  { "tiff_hostcomputer", TIFFTAG_HOSTCOMPUTER, },
+};
+
+static struct tag_name 
+compress_values[] =
+  {
+    { "none",     COMPRESSION_NONE },
+    { "ccittrle", COMPRESSION_CCITTRLE },
+    { "fax3",     COMPRESSION_CCITTFAX3 },
+    { "t4",       COMPRESSION_CCITTFAX3 },
+    { "fax4",     COMPRESSION_CCITTFAX4 },
+    { "t6",       COMPRESSION_CCITTFAX4 },
+    { "lzw",      COMPRESSION_LZW },
+    { "jpeg",     COMPRESSION_JPEG },
+    { "packbits", COMPRESSION_PACKBITS },
+    { "deflate",  COMPRESSION_ADOBE_DEFLATE },
+    { "zip",      COMPRESSION_ADOBE_DEFLATE },
+    { "oldzip",   COMPRESSION_DEFLATE },
+    { "ccittrlew", COMPRESSION_CCITTRLEW },
+  };
+
+static const int compress_value_count = 
+  sizeof(compress_values) / sizeof(*compress_values);
+
+static int 
+myTIFFIsCODECConfigured(uint16 scheme);
+
+typedef struct read_state_tag read_state_t;
+/* the setup function creates the image object, allocates the line buffer */
+typedef int (*read_setup_t)(read_state_t *state);
+
+/* the putter writes the image data provided by the getter to the
+   image, x, y, width, height describe the target area of the image,
+   extras is the extra number of pixels stored for each scanline in
+   the raster buffer, (for tiles against the right side of the
+   image) */
+
+typedef int (*read_putter_t)(read_state_t *state, int x, int y, int width, 
+                            int height, int extras);
+
+/* reads from a tiled or strip image and calls the putter.
+   This may need a second type for handling non-contiguous images
+   at some point */
+typedef int (*read_getter_t)(read_state_t *state, read_putter_t putter);
+
+struct read_state_tag {
+  TIFF *tif;
+  i_img *img;
+  void *raster;
+  unsigned long pixels_read;
+  int allow_incomplete;
+  void *line_buf;
+  uint32 width, height;
+  uint16 bits_per_sample;
+  uint16 photometric;
+
+  /* the total number of channels (samples per pixel) */
+  int samples_per_pixel;
+
+  /* if non-zero, which channel is the alpha channel, typically 3 for rgb */
+  int alpha_chan;
+
+  /* whether or not to scale the color channels based on the alpha
+     channel.  TIFF has 2 types of alpha channel, if the alpha channel
+     we use is EXTRASAMPLE_ASSOCALPHA then the color data will need to
+     be scaled to match Imager's conventions */
+  int scale_alpha;
+};
+
+static int tile_contig_getter(read_state_t *state, read_putter_t putter);
+static int strip_contig_getter(read_state_t *state, read_putter_t putter);
+
+static int setup_paletted(read_state_t *state);
+static int paletted_putter8(read_state_t *, int, int, int, int, int);
+static int paletted_putter4(read_state_t *, int, int, int, int, int);
+
+static int setup_16_rgb(read_state_t *state);
+static int setup_16_grey(read_state_t *state);
+static int putter_16(read_state_t *, int, int, int, int, int);
+
+static int setup_8_rgb(read_state_t *state);
+static int setup_8_grey(read_state_t *state);
+static int putter_8(read_state_t *, int, int, int, int, int);
+
+static int setup_32_rgb(read_state_t *state);
+static int setup_32_grey(read_state_t *state);
+static int putter_32(read_state_t *, int, int, int, int, int);
+
+static int setup_bilevel(read_state_t *state);
+static int putter_bilevel(read_state_t *, int, int, int, int, int);
+
+static int setup_cmyk8(read_state_t *state);
+static int putter_cmyk8(read_state_t *, int, int, int, int, int);
+
+static int setup_cmyk16(read_state_t *state);
+static int putter_cmyk16(read_state_t *, int, int, int, int, int);
+
+static const int text_tag_count = 
+  sizeof(text_tag_names) / sizeof(*text_tag_names);
+
+static void error_handler(char const *module, char const *fmt, va_list ap) {
+  mm_log((1, "tiff error fmt %s\n", fmt));
+  i_push_errorvf(0, fmt, ap);
+}
+
+#define WARN_BUFFER_LIMIT 10000
+static char *warn_buffer = NULL;
+static int warn_buffer_size = 0;
+
+static void warn_handler(char const *module, char const *fmt, va_list ap) {
+  char buf[1000];
+
+  buf[0] = '\0';
+#ifdef HAVE_SNPRINTF
+  vsnprintf(buf, sizeof(buf), fmt, ap);
+#else
+  vsprintf(buf, fmt, ap);
+#endif
+  mm_log((1, "tiff warning %s\n", buf));
+
+  if (!warn_buffer || strlen(warn_buffer)+strlen(buf)+2 > warn_buffer_size) {
+    int new_size = warn_buffer_size + strlen(buf) + 2;
+    char *old_buffer = warn_buffer;
+    if (new_size > WARN_BUFFER_LIMIT) {
+      new_size = WARN_BUFFER_LIMIT;
+    }
+    warn_buffer = myrealloc(warn_buffer, new_size);
+    if (!old_buffer) *warn_buffer = '\0';
+    warn_buffer_size = new_size;
+  }
+  if (strlen(warn_buffer)+strlen(buf)+2 <= warn_buffer_size) {
+    strcat(warn_buffer, buf);
+    strcat(warn_buffer, "\n");
+  }
+}
+
+static int save_tiff_tags(TIFF *tif, i_img *im);
+
+static void 
+pack_4bit_to(unsigned char *dest, const unsigned char *src, int count);
+
+
+static toff_t sizeproc(thandle_t x) {
+       return 0;
+}
+
+
+/*
+=item comp_seek(h, o, w)
+
+Compatability for 64 bit systems like latest freebsd (internal)
+
+   h - tiff handle, cast an io_glue object
+   o - offset
+   w - whence
+
+=cut
+*/
+
+static
+toff_t
+comp_seek(thandle_t h, toff_t o, int w) {
+  io_glue *ig = (io_glue*)h;
+  return (toff_t) ig->seekcb(ig, o, w);
+}
+
+/*
+=item comp_mmap(thandle_t, tdata_t*, toff_t*)
+
+Dummy mmap stub.
+
+This shouldn't ever be called but newer tifflibs want it anyway.
+
+=cut
+*/
+
+static 
+int
+comp_mmap(thandle_t h, tdata_t*p, toff_t*off) {
+  return -1;
+}
+
+/*
+=item comp_munmap(thandle_t h, tdata_t p, toff_t off)
+
+Dummy munmap stub.
+
+This shouldn't ever be called but newer tifflibs want it anyway.
+
+=cut
+*/
+
+static void
+comp_munmap(thandle_t h, tdata_t p, toff_t off) {
+  /* do nothing */
+}
+
+static i_img *read_one_tiff(TIFF *tif, int allow_incomplete) {
+  i_img *im;
+  uint32 width, height;
+  uint16 samples_per_pixel;
+  int tiled, error;
+  float xres, yres;
+  uint16 resunit;
+  int gotXres, gotYres;
+  uint16 photometric;
+  uint16 bits_per_sample;
+  uint16 planar_config;
+  uint16 inkset;
+  uint16 compress;
+  int i;
+  read_state_t state;
+  read_setup_t setupf = NULL;
+  read_getter_t getterf = NULL;
+  read_putter_t putterf = NULL;
+
+  error = 0;
+
+  TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
+  TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
+  TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel);
+  tiled = TIFFIsTiled(tif);
+  TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &photometric);
+  TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &bits_per_sample);
+  TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planar_config);
+  TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
+
+  mm_log((1, "i_readtiff_wiol: width=%d, height=%d, channels=%d\n", width, height, samples_per_pixel));
+  mm_log((1, "i_readtiff_wiol: %stiled\n", tiled?"":"not "));
+  mm_log((1, "i_readtiff_wiol: %sbyte swapped\n", TIFFIsByteSwapped(tif)?"":"not "));
+
+  /* yes, this if() is horrible */
+  if (photometric == PHOTOMETRIC_PALETTE && bits_per_sample <= 8) {
+    setupf = setup_paletted;
+    if (bits_per_sample == 8)
+      putterf = paletted_putter8;
+    else if (bits_per_sample == 4)
+      putterf = paletted_putter4;
+    else
+      mm_log((1, "unsupported paletted bits_per_sample %d\n", bits_per_sample));
+  }
+  else if (bits_per_sample == 16 
+          && photometric == PHOTOMETRIC_RGB
+          && samples_per_pixel >= 3) {
+    setupf = setup_16_rgb;
+    putterf = putter_16;
+  }
+  else if (bits_per_sample == 16
+          && photometric == PHOTOMETRIC_MINISBLACK) {
+    setupf = setup_16_grey;
+    putterf = putter_16;
+  }
+  else if (bits_per_sample == 8
+          && photometric == PHOTOMETRIC_MINISBLACK) {
+    setupf = setup_8_grey;
+    putterf = putter_8;
+  }
+  else if (bits_per_sample == 8
+          && photometric == PHOTOMETRIC_RGB) {
+    setupf = setup_8_rgb;
+    putterf = putter_8;
+  }
+  else if (bits_per_sample == 32 
+          && photometric == PHOTOMETRIC_RGB
+          && samples_per_pixel >= 3) {
+    setupf = setup_32_rgb;
+    putterf = putter_32;
+  }
+  else if (bits_per_sample == 32
+          && photometric == PHOTOMETRIC_MINISBLACK) {
+    setupf = setup_32_grey;
+    putterf = putter_32;
+  }
+  else if (bits_per_sample == 1
+          && (photometric == PHOTOMETRIC_MINISBLACK
+              || photometric == PHOTOMETRIC_MINISWHITE)
+          && samples_per_pixel == 1) {
+    setupf = setup_bilevel;
+    putterf = putter_bilevel;
+  }
+  else if (bits_per_sample == 8
+          && photometric == PHOTOMETRIC_SEPARATED
+          && inkset == INKSET_CMYK
+          && samples_per_pixel >= 4) {
+    setupf = setup_cmyk8;
+    putterf = putter_cmyk8;
+  }
+  else if (bits_per_sample == 16
+          && photometric == PHOTOMETRIC_SEPARATED
+          && inkset == INKSET_CMYK
+          && samples_per_pixel >= 4) {
+    setupf = setup_cmyk16;
+    putterf = putter_cmyk16;
+  }
+  if (tiled) {
+    if (planar_config == PLANARCONFIG_CONTIG)
+      getterf = tile_contig_getter;
+  }
+  else {
+    if (planar_config == PLANARCONFIG_CONTIG)
+      getterf = strip_contig_getter;
+  }
+  if (setupf && getterf && putterf) {
+    unsigned long total_pixels = (unsigned long)width * height;
+    memset(&state, 0, sizeof(state));
+    state.tif = tif;
+    state.allow_incomplete = allow_incomplete;
+    state.width = width;
+    state.height = height;
+    state.bits_per_sample = bits_per_sample;
+    state.samples_per_pixel = samples_per_pixel;
+    state.photometric = photometric;
+
+    if (!setupf(&state))
+      return NULL;
+    if (!getterf(&state, putterf) || !state.pixels_read) {
+      if (state.img)
+       i_img_destroy(state.img);
+      if (state.raster)
+       _TIFFfree(state.raster);
+      if (state.line_buf)
+       myfree(state.line_buf);
+      
+      return NULL;
+    }
+
+    if (allow_incomplete && state.pixels_read < total_pixels) {
+      i_tags_setn(&(state.img->tags), "i_incomplete", 1);
+      i_tags_setn(&(state.img->tags), "i_lines_read", 
+                 state.pixels_read / width);
+    }
+    im = state.img;
+    
+    if (state.raster)
+      _TIFFfree(state.raster);
+    if (state.line_buf)
+      myfree(state.line_buf);
+  }
+  else {
+    if (tiled) {
+      im = read_one_rgb_tiled(tif, width, height, allow_incomplete);
+    }
+    else {
+      im = read_one_rgb_lines(tif, width, height, allow_incomplete);
+    }
+  }
+
+  if (!im)
+    return NULL;
+
+  /* general metadata */
+  i_tags_setn(&im->tags, "tiff_bitspersample", bits_per_sample);
+  i_tags_setn(&im->tags, "tiff_photometric", photometric);
+  TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress);
+    
+  /* resolution tags */
+  TIFFGetFieldDefaulted(tif, TIFFTAG_RESOLUTIONUNIT, &resunit);
+  gotXres = TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres);
+  gotYres = TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres);
+  if (gotXres || gotYres) {
+    if (!gotXres)
+      xres = yres;
+    else if (!gotYres)
+      yres = xres;
+    i_tags_setn(&im->tags, "tiff_resolutionunit", resunit);
+    if (resunit == RESUNIT_CENTIMETER) {
+      /* from dots per cm to dpi */
+      xres *= 2.54;
+      yres *= 2.54;
+      i_tags_set(&im->tags, "tiff_resolutionunit_name", "centimeter", -1);
+    }
+    else if (resunit == RESUNIT_NONE) {
+      i_tags_setn(&im->tags, "i_aspect_only", 1);
+      i_tags_set(&im->tags, "tiff_resolutionunit_name", "none", -1);
+    }
+    else if (resunit == RESUNIT_INCH) {
+      i_tags_set(&im->tags, "tiff_resolutionunit_name", "inch", -1);
+    }
+    else {
+      i_tags_set(&im->tags, "tiff_resolutionunit_name", "unknown", -1);
+    }
+    /* tifflib doesn't seem to provide a way to get to the original rational
+       value of these, which would let me provide a more reasonable
+       precision. So make up a number. */
+    i_tags_set_float2(&im->tags, "i_xres", 0, xres, 6);
+    i_tags_set_float2(&im->tags, "i_yres", 0, yres, 6);
+  }
+
+  /* Text tags */
+  for (i = 0; i < text_tag_count; ++i) {
+    char *data;
+    if (TIFFGetField(tif, text_tag_names[i].tag, &data)) {
+      mm_log((1, "i_readtiff_wiol: tag %d has value %s\n", 
+             text_tag_names[i].tag, data));
+      i_tags_set(&im->tags, text_tag_names[i].name, data, -1);
+    }
+  }
+
+  i_tags_set(&im->tags, "i_format", "tiff", 4);
+  if (warn_buffer && *warn_buffer) {
+    i_tags_set(&im->tags, "i_warning", warn_buffer, -1);
+    *warn_buffer = '\0';
+  }
+
+  for (i = 0; i < compress_value_count; ++i) {
+    if (compress_values[i].tag == compress) {
+      i_tags_set(&im->tags, "tiff_compression", compress_values[i].name, -1);
+      break;
+    }
+  }
+  
+  return im;
+}
+
+/*
+=item i_readtiff_wiol(im, ig)
+
+=cut
+*/
+i_img*
+i_readtiff_wiol(io_glue *ig, int allow_incomplete, int page) {
+  TIFF* tif;
+  TIFFErrorHandler old_handler;
+  TIFFErrorHandler old_warn_handler;
+  i_img *im;
+
+  i_clear_error();
+  old_handler = TIFFSetErrorHandler(error_handler);
+  old_warn_handler = TIFFSetWarningHandler(warn_handler);
+  if (warn_buffer)
+    *warn_buffer = '\0';
+
+  /* Add code to get the filename info from the iolayer */
+  /* Also add code to check for mmapped code */
+
+  mm_log((1, "i_readtiff_wiol(ig %p, allow_incomplete %d, page %d)\n", ig, allow_incomplete, page));
+  
+  tif = TIFFClientOpen("(Iolayer)", 
+                      "rm", 
+                      (thandle_t) ig,
+                      (TIFFReadWriteProc) ig->readcb,
+                      (TIFFReadWriteProc) ig->writecb,
+                      (TIFFSeekProc) comp_seek,
+                      (TIFFCloseProc) ig->closecb,
+                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+                      (TIFFMapFileProc) comp_mmap,
+                      (TIFFUnmapFileProc) comp_munmap);
+  
+  if (!tif) {
+    mm_log((1, "i_readtiff_wiol: Unable to open tif file\n"));
+    i_push_error(0, "Error opening file");
+    TIFFSetErrorHandler(old_handler);
+    TIFFSetWarningHandler(old_warn_handler);
+    return NULL;
+  }
+
+  if (page != 0) {
+    if (!TIFFSetDirectory(tif, page)) {
+      mm_log((1, "i_readtiff_wiol: Unable to switch to directory %d\n", page));
+      i_push_errorf(0, "could not switch to page %d", page);
+      TIFFSetErrorHandler(old_handler);
+      TIFFSetWarningHandler(old_warn_handler);
+      TIFFClose(tif);
+      return NULL;
+    }
+  }
+
+  im = read_one_tiff(tif, allow_incomplete);
+
+  if (TIFFLastDirectory(tif)) mm_log((1, "Last directory of tiff file\n"));
+  TIFFSetErrorHandler(old_handler);
+  TIFFSetWarningHandler(old_warn_handler);
+  TIFFClose(tif);
+  return im;
+}
+
+/*
+=item i_readtiff_multi_wiol(ig, *count)
+
+Reads multiple images from a TIFF.
+
+=cut
+*/
+i_img**
+i_readtiff_multi_wiol(io_glue *ig, int *count) {
+  TIFF* tif;
+  TIFFErrorHandler old_handler;
+  TIFFErrorHandler old_warn_handler;
+  i_img **results = NULL;
+  int result_alloc = 0;
+  int dirnum = 0;
+
+  i_clear_error();
+  old_handler = TIFFSetErrorHandler(error_handler);
+  old_warn_handler = TIFFSetWarningHandler(warn_handler);
+  if (warn_buffer)
+    *warn_buffer = '\0';
+
+  /* Add code to get the filename info from the iolayer */
+  /* Also add code to check for mmapped code */
+
+  mm_log((1, "i_readtiff_wiol(ig %p, length %d)\n", ig));
+  
+  tif = TIFFClientOpen("(Iolayer)", 
+                      "rm", 
+                      (thandle_t) ig,
+                      (TIFFReadWriteProc) ig->readcb,
+                      (TIFFReadWriteProc) ig->writecb,
+                      (TIFFSeekProc) comp_seek,
+                      (TIFFCloseProc) ig->closecb,
+                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+                      (TIFFMapFileProc) comp_mmap,
+                      (TIFFUnmapFileProc) comp_munmap);
+  
+  if (!tif) {
+    mm_log((1, "i_readtiff_wiol: Unable to open tif file\n"));
+    i_push_error(0, "Error opening file");
+    TIFFSetErrorHandler(old_handler);
+    TIFFSetWarningHandler(old_warn_handler);
+    return NULL;
+  }
+
+  *count = 0;
+  do {
+    i_img *im = read_one_tiff(tif, 0);
+    if (!im)
+      break;
+    if (++*count > result_alloc) {
+      if (result_alloc == 0) {
+        result_alloc = 5;
+        results = mymalloc(result_alloc * sizeof(i_img *));
+      }
+      else {
+        i_img **newresults;
+        result_alloc *= 2;
+        newresults = myrealloc(results, result_alloc * sizeof(i_img *));
+       if (!newresults) {
+         i_img_destroy(im); /* don't leak it */
+         break;
+       }
+       results = newresults;
+      }
+    }
+    results[*count-1] = im;
+  } while (TIFFSetDirectory(tif, ++dirnum));
+
+  TIFFSetWarningHandler(old_warn_handler);
+  TIFFSetErrorHandler(old_handler);
+  TIFFClose(tif);
+  return results;
+}
+
+undef_int
+i_writetiff_low_faxable(TIFF *tif, i_img *im, int fine) {
+  uint32 width, height;
+  unsigned char *linebuf = NULL;
+  uint32 y;
+  int rc;
+  uint32 x;
+  uint32 rowsperstrip;
+  float vres = fine ? 196 : 98;
+  int luma_chan;
+
+  width    = im->xsize;
+  height   = im->ysize;
+
+  switch (im->channels) {
+  case 1:
+  case 2:
+    luma_chan = 0;
+    break;
+  case 3:
+  case 4:
+    luma_chan = 1;
+    break;
+  default:
+    /* This means a colorspace we don't handle yet */
+    mm_log((1, "i_writetiff_wiol_faxable: don't handle %d channel images.\n", im->channels));
+    return 0;
+  }
+
+  /* Add code to get the filename info from the iolayer */
+  /* Also add code to check for mmapped code */
+
+
+  mm_log((1, "i_writetiff_wiol_faxable: width=%d, height=%d, channels=%d\n", width, height, im->channels));
+  
+  if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH,      width)   )
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField width=%d failed\n", width)); return 0; }
+  if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH,     height)  )
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField length=%d failed\n", height)); return 0; }
+  if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1))
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField samplesperpixel=1 failed\n")); return 0; }
+  if (!TIFFSetField(tif, TIFFTAG_ORIENTATION,  ORIENTATION_TOPLEFT))
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Orientation=topleft\n")); return 0; }
+  if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE,   1)        )
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField bitpersample=1\n")); return 0; }
+  if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG))
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField planarconfig\n")); return 0; }
+  if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE))
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField photometric=%d\n", PHOTOMETRIC_MINISBLACK)); return 0; }
+  if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, 3))
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField compression=3\n")); return 0; }
+
+  linebuf = (unsigned char *)_TIFFmalloc( TIFFScanlineSize(tif) );
+  
+  if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
+    mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField rowsperstrip=-1\n")); return 0; }
+
+  TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+  TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rc);
+
+  mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField rowsperstrip=%d\n", rowsperstrip));
+  mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField scanlinesize=%d\n", TIFFScanlineSize(tif) ));
+  mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField planarconfig=%d == %d\n", rc, PLANARCONFIG_CONTIG));
+
+  if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float)204))
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Xresolution=204\n")); return 0; }
+  if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, vres))
+    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Yresolution=196\n")); return 0; }
+  if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH)) {
+    mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField ResolutionUnit=%d\n", RESUNIT_INCH)); return 0; 
+  }
+
+  if (!save_tiff_tags(tif, im)) {
+    return 0;
+  }
+
+  for (y=0; y<height; y++) {
+    int linebufpos=0;
+    for(x=0; x<width; x+=8) { 
+      int bits;
+      int bitpos;
+      i_sample_t luma[8];
+      uint8 bitval = 128;
+      linebuf[linebufpos]=0;
+      bits = width-x; if(bits>8) bits=8;
+      i_gsamp(im, x, x+8, y, luma, &luma_chan, 1);
+      for(bitpos=0;bitpos<bits;bitpos++) {
+       linebuf[linebufpos] |= ((luma[bitpos] < 128) ? bitval : 0);
+       bitval >>= 1;
+      }
+      linebufpos++;
+    }
+    if (TIFFWriteScanline(tif, linebuf, y, 0) < 0) {
+      mm_log((1, "i_writetiff_wiol_faxable: TIFFWriteScanline failed.\n"));
+      break;
+    }
+  }
+  if (linebuf) _TIFFfree(linebuf);
+
+  return 1;
+}
+
+static uint16
+find_compression(char const *name, uint16 *compress) {
+  int i;
+
+  for (i = 0; i < compress_value_count; ++i) {
+    if (strcmp(compress_values[i].name, name) == 0) {
+      *compress = (uint16)compress_values[i].tag;
+      return 1;
+    }
+  }
+  *compress = COMPRESSION_NONE;
+
+  return 0;
+}
+
+static uint16
+get_compression(i_img *im, uint16 def_compress) {
+  int entry;
+  int value;
+
+  if (i_tags_find(&im->tags, "tiff_compression", 0, &entry)
+      && im->tags.tags[entry].data) {
+    uint16 compress;
+    if (find_compression(im->tags.tags[entry].data, &compress)
+       && myTIFFIsCODECConfigured(compress))
+      return compress;
+  }
+  if (i_tags_get_int(&im->tags, "tiff_compression", 0, &value)) {
+    if ((uint16)value == value
+       && myTIFFIsCODECConfigured((uint16)value))
+      return (uint16)value;
+  }
+
+  return def_compress;
+}
+
+int
+i_tiff_has_compression(const char *name) {
+  uint16 compress;
+
+  if (!find_compression(name, &compress))
+    return 0;
+
+  return myTIFFIsCODECConfigured(compress);
+}
+
+static int
+set_base_tags(TIFF *tif, i_img *im, uint16 compress, uint16 photometric, 
+             uint16 bits_per_sample, uint16 samples_per_pixel) {
+  double xres, yres;
+  int resunit;
+  int got_xres, got_yres;
+  int aspect_only;
+
+  if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, im->xsize)) {
+    i_push_error(0, "write TIFF: setting width tag");
+    return 0;
+  }
+  if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, im->ysize)) {
+    i_push_error(0, "write TIFF: setting length tag");
+    return 0;
+  }
+  if (!TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT)) {
+    i_push_error(0, "write TIFF: setting orientation tag");
+    return 0;
+  }
+  if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) {
+    i_push_error(0, "write TIFF: setting planar configuration tag");
+    return 0;
+  }
+  if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric)) {
+    i_push_error(0, "write TIFF: setting photometric tag");
+    return 0;
+  }
+  if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, compress)) {
+    i_push_error(0, "write TIFF: setting compression tag");
+    return 0;
+  }
+  if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bits_per_sample)) {
+    i_push_error(0, "write TIFF: setting bits per sample tag");
+    return 0;
+  }
+  if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, samples_per_pixel)) {
+    i_push_error(0, "write TIFF: setting samples per pixel tag");
+    return 0;
+  }
+
+  got_xres = i_tags_get_float(&im->tags, "i_xres", 0, &xres);
+  got_yres = i_tags_get_float(&im->tags, "i_yres", 0, &yres);
+  if (!i_tags_get_int(&im->tags, "i_aspect_only", 0,&aspect_only))
+    aspect_only = 0;
+  if (!i_tags_get_int(&im->tags, "tiff_resolutionunit", 0, &resunit))
+    resunit = RESUNIT_INCH;
+  if (got_xres || got_yres) {
+    if (!got_xres)
+      xres = yres;
+    else if (!got_yres)
+      yres = xres;
+    if (aspect_only) {
+      resunit = RESUNIT_NONE;
+    }
+    else {
+      if (resunit == RESUNIT_CENTIMETER) {
+       xres /= 2.54;
+       yres /= 2.54;
+      }
+      else {
+       resunit  = RESUNIT_INCH;
+      }
+    }
+    if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float)xres)) {
+      i_push_error(0, "write TIFF: setting xresolution tag");
+      return 0;
+    }
+    if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, (float)yres)) {
+      i_push_error(0, "write TIFF: setting yresolution tag");
+      return 0;
+    }
+    if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, (uint16)resunit)) {
+      i_push_error(0, "write TIFF: setting resolutionunit tag");
+      return 0;
+    }
+  }
+
+  return 1;
+}
+
+static int 
+write_one_bilevel(TIFF *tif, i_img *im, int zero_is_white) {
+  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+  uint16 photometric;
+  unsigned char *in_row;
+  unsigned char *out_row;
+  unsigned out_size;
+  int x, y;
+  int invert;
+
+  mm_log((1, "tiff - write_one_bilevel(tif %p, im %p, zero_is_white %d)\n", 
+         tif, im, zero_is_white));
+
+  /* ignore a silly choice */
+  if (compress == COMPRESSION_JPEG)
+    compress = COMPRESSION_PACKBITS;
+
+  switch (compress) {
+  case COMPRESSION_CCITTRLE:
+  case COMPRESSION_CCITTFAX3:
+  case COMPRESSION_CCITTFAX4:
+    /* natural fax photometric */
+    photometric = PHOTOMETRIC_MINISWHITE;
+    break;
+
+  default:
+    /* natural for most computer images */
+    photometric = PHOTOMETRIC_MINISBLACK;
+    break;
+  }
+
+  if (!set_base_tags(tif, im, compress, photometric, 1, 1))
+    return 0;
+
+  if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
+    i_push_error(0, "write TIFF: setting rows per strip tag");
+    return 0; 
+  }
+
+  out_size = TIFFScanlineSize(tif);
+  out_row = (unsigned char *)_TIFFmalloc( out_size );
+  in_row = mymalloc(im->xsize);
+
+  invert = (photometric == PHOTOMETRIC_MINISWHITE) != (zero_is_white != 0);
+
+  for (y = 0; y < im->ysize; ++y) {
+    int mask = 0x80;
+    unsigned char *outp = out_row;
+    memset(out_row, 0, out_size);
+    i_gpal(im, 0, im->xsize, y, in_row);
+    for (x = 0; x < im->xsize; ++x) {
+      if (invert ? !in_row[x] : in_row[x]) {
+       *outp |= mask;
+      }
+      mask >>= 1;
+      if (!mask) {
+       ++outp;
+       mask = 0x80;
+      }
+    }
+    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+      _TIFFfree(out_row);
+      myfree(in_row);
+      i_push_error(0, "write TIFF: write scan line failed");
+      return 0;
+    }
+  }
+
+  _TIFFfree(out_row);
+  myfree(in_row);
+
+  return 1;
+}
+
+static int
+set_palette(TIFF *tif, i_img *im, int size) {
+  int count;
+  uint16 *colors;
+  uint16 *out[3];
+  i_color c;
+  int i, ch;
+  
+  colors = (uint16 *)_TIFFmalloc(sizeof(uint16) * 3 * size);
+  out[0] = colors;
+  out[1] = colors + size;
+  out[2] = colors + 2 * size;
+    
+  count = i_colorcount(im);
+  for (i = 0; i < count; ++i) {
+    i_getcolors(im, i, &c, 1);
+    for (ch = 0; ch < 3; ++ch)
+      out[ch][i] = c.channel[ch] * 257;
+  }
+  for (; i < size; ++i) {
+    for (ch = 0; ch < 3; ++ch)
+      out[ch][i] = 0;
+  }
+  if (!TIFFSetField(tif, TIFFTAG_COLORMAP, out[0], out[1], out[2])) {
+    _TIFFfree(colors);
+    i_push_error(0, "write TIFF: setting color map");
+    return 0;
+  }
+  _TIFFfree(colors);
+  
+  return 1;
+}
+
+static int
+write_one_paletted8(TIFF *tif, i_img *im) {
+  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+  unsigned char *out_row;
+  unsigned out_size;
+  int y;
+
+  mm_log((1, "tiff - write_one_paletted8(tif %p, im %p)\n", tif, im));
+
+  /* ignore a silly choice */
+  if (compress == COMPRESSION_JPEG ||
+      compress == COMPRESSION_CCITTRLE ||
+      compress == COMPRESSION_CCITTFAX3 ||
+      compress == COMPRESSION_CCITTFAX4)
+    compress = COMPRESSION_PACKBITS;
+
+  if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
+    i_push_error(0, "write TIFF: setting rows per strip tag");
+    return 0; 
+  }
+
+  if (!set_base_tags(tif, im, compress, PHOTOMETRIC_PALETTE, 8, 1))
+    return 0;
+
+  if (!set_palette(tif, im, 256))
+    return 0;
+
+  out_size = TIFFScanlineSize(tif);
+  out_row = (unsigned char *)_TIFFmalloc( out_size );
+
+  for (y = 0; y < im->ysize; ++y) {
+    i_gpal(im, 0, im->xsize, y, out_row);
+    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+      _TIFFfree(out_row);
+      i_push_error(0, "write TIFF: write scan line failed");
+      return 0;
+    }
+  }
+
+  _TIFFfree(out_row);
+
+  return 1;
+}
+
+static int
+write_one_paletted4(TIFF *tif, i_img *im) {
+  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+  unsigned char *in_row;
+  unsigned char *out_row;
+  unsigned out_size;
+  int y;
+
+  mm_log((1, "tiff - write_one_paletted4(tif %p, im %p)\n", tif, im));
+
+  /* ignore a silly choice */
+  if (compress == COMPRESSION_JPEG ||
+      compress == COMPRESSION_CCITTRLE ||
+      compress == COMPRESSION_CCITTFAX3 ||
+      compress == COMPRESSION_CCITTFAX4)
+    compress = COMPRESSION_PACKBITS;
+
+  if (!set_base_tags(tif, im, compress, PHOTOMETRIC_PALETTE, 4, 1))
+    return 0;
+
+  if (!set_palette(tif, im, 16))
+    return 0;
+
+  if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
+    i_push_error(0, "write TIFF: setting rows per strip tag");
+    return 0; 
+  }
+
+  in_row = mymalloc(im->xsize);
+  out_size = TIFFScanlineSize(tif);
+  out_row = (unsigned char *)_TIFFmalloc( out_size );
+
+  for (y = 0; y < im->ysize; ++y) {
+    i_gpal(im, 0, im->xsize, y, in_row);
+    memset(out_row, 0, out_size);
+    pack_4bit_to(out_row, in_row, im->xsize);
+    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+      _TIFFfree(out_row);
+      i_push_error(0, "write TIFF: write scan line failed");
+      return 0;
+    }
+  }
+
+  myfree(in_row);
+  _TIFFfree(out_row);
+
+  return 1;
+}
+
+static int
+set_direct_tags(TIFF *tif, i_img *im, uint16 compress, 
+               uint16 bits_per_sample) {
+  uint16 extras = EXTRASAMPLE_ASSOCALPHA;
+  uint16 extra_count = im->channels == 2 || im->channels == 4;
+  uint16 photometric = im->channels >= 3 ? 
+    PHOTOMETRIC_RGB : PHOTOMETRIC_MINISBLACK;
+
+  if (!set_base_tags(tif, im, compress, photometric, bits_per_sample, 
+                    im->channels)) {
+    return 0;
+  }
+  
+  if (extra_count) {
+    if (!TIFFSetField(tif, TIFFTAG_EXTRASAMPLES, extra_count, &extras)) {
+      i_push_error(0, "write TIFF: setting extra samples tag");
+      return 0;
+    }
+  }
+
+  if (compress == COMPRESSION_JPEG) {
+    int jpeg_quality;
+    if (i_tags_get_int(&im->tags, "tiff_jpegquality", 0, &jpeg_quality)
+       && jpeg_quality >= 0 && jpeg_quality <= 100) {
+      if (!TIFFSetField(tif, TIFFTAG_JPEGQUALITY, jpeg_quality)) {
+       i_push_error(0, "write TIFF: setting jpeg quality pseudo-tag");
+       return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static int 
+write_one_32(TIFF *tif, i_img *im) {
+  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+  unsigned *in_row;
+  size_t out_size;
+  uint32 *out_row;
+  int y;
+  size_t sample_count = im->xsize * im->channels;
+  size_t sample_index;
+    
+  mm_log((1, "tiff - write_one_32(tif %p, im %p)\n", tif, im));
+
+  /* only 8 and 12 bit samples are supported by jpeg compression */
+  if (compress == COMPRESSION_JPEG)
+    compress = COMPRESSION_PACKBITS;
+
+  if (!set_direct_tags(tif, im, compress, 32))
+    return 0;
+
+  in_row = mymalloc(sample_count * sizeof(unsigned));
+  out_size = TIFFScanlineSize(tif);
+  out_row = (uint32 *)_TIFFmalloc( out_size );
+
+  for (y = 0; y < im->ysize; ++y) {
+    if (i_gsamp_bits(im, 0, im->xsize, y, in_row, NULL, im->channels, 32) <= 0) {
+      i_push_error(0, "Cannot read 32-bit samples");
+      return 0;
+    }
+    for (sample_index = 0; sample_index < sample_count; ++sample_index)
+      out_row[sample_index] = in_row[sample_index];
+    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+      myfree(in_row);
+      _TIFFfree(out_row);
+      i_push_error(0, "write TIFF: write scan line failed");
+      return 0;
+    }
+  }
+
+  myfree(in_row);
+  _TIFFfree(out_row);
+  
+  return 1;
+}
+
+static int 
+write_one_16(TIFF *tif, i_img *im) {
+  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+  unsigned *in_row;
+  size_t out_size;
+  uint16 *out_row;
+  int y;
+  size_t sample_count = im->xsize * im->channels;
+  size_t sample_index;
+    
+  mm_log((1, "tiff - write_one_16(tif %p, im %p)\n", tif, im));
+
+  /* only 8 and 12 bit samples are supported by jpeg compression */
+  if (compress == COMPRESSION_JPEG)
+    compress = COMPRESSION_PACKBITS;
+
+  if (!set_direct_tags(tif, im, compress, 16))
+    return 0;
+
+  in_row = mymalloc(sample_count * sizeof(unsigned));
+  out_size = TIFFScanlineSize(tif);
+  out_row = (uint16 *)_TIFFmalloc( out_size );
+
+  for (y = 0; y < im->ysize; ++y) {
+    if (i_gsamp_bits(im, 0, im->xsize, y, in_row, NULL, im->channels, 16) <= 0) {
+      i_push_error(0, "Cannot read 16-bit samples");
+      return 0;
+    }
+    for (sample_index = 0; sample_index < sample_count; ++sample_index)
+      out_row[sample_index] = in_row[sample_index];
+    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+      myfree(in_row);
+      _TIFFfree(out_row);
+      i_push_error(0, "write TIFF: write scan line failed");
+      return 0;
+    }
+  }
+
+  myfree(in_row);
+  _TIFFfree(out_row);
+  
+  return 1;
+}
+
+static int 
+write_one_8(TIFF *tif, i_img *im) {
+  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
+  size_t out_size;
+  unsigned char *out_row;
+  int y;
+  size_t sample_count = im->xsize * im->channels;
+    
+  mm_log((1, "tiff - write_one_8(tif %p, im %p)\n", tif, im));
+
+  if (!set_direct_tags(tif, im, compress, 8))
+    return 0;
+
+  out_size = TIFFScanlineSize(tif);
+  if (out_size < sample_count)
+    out_size = sample_count;
+  out_row = (unsigned char *)_TIFFmalloc( out_size );
+
+  for (y = 0; y < im->ysize; ++y) {
+    if (i_gsamp(im, 0, im->xsize, y, out_row, NULL, im->channels) <= 0) {
+      i_push_error(0, "Cannot read 8-bit samples");
+      return 0;
+    }
+    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
+      _TIFFfree(out_row);
+      i_push_error(0, "write TIFF: write scan line failed");
+      return 0;
+    }
+  }
+  _TIFFfree(out_row);
+  
+  return 1;
+}
+
+static int
+i_writetiff_low(TIFF *tif, i_img *im) {
+  uint32 width, height;
+  uint16 channels;
+  int zero_is_white;
+
+  width    = im->xsize;
+  height   = im->ysize;
+  channels = im->channels;
+
+  mm_log((1, "i_writetiff_low: width=%d, height=%d, channels=%d, bits=%d\n", width, height, channels, im->bits));
+  if (im->type == i_palette_type) {
+    mm_log((1, "i_writetiff_low: paletted, colors=%d\n", i_colorcount(im)));
+  }
+  
+  if (i_img_is_monochrome(im, &zero_is_white)) {
+    if (!write_one_bilevel(tif, im, zero_is_white))
+      return 0;
+  }
+  else if (im->type == i_palette_type) {
+    if (i_colorcount(im) <= 16) {
+      if (!write_one_paletted4(tif, im))
+       return 0;
+    }
+    else {
+      if (!write_one_paletted8(tif, im))
+       return 0;
+    }
+  }
+  else if (im->bits > 16) {
+    if (!write_one_32(tif, im))
+      return 0;
+  }
+  else if (im->bits > 8) {
+    if (!write_one_16(tif, im))
+      return 0;
+  }
+  else {
+    if (!write_one_8(tif, im))
+      return 0;
+  }
+
+  if (!save_tiff_tags(tif, im))
+    return 0;
+
+  return 1;
+}
+
+/*
+=item i_writetiff_multi_wiol(ig, imgs, count, fine_mode)
+
+Stores an image in the iolayer object.
+
+   ig - io_object that defines source to write to 
+   imgs,count - the images to write
+
+=cut 
+*/
+
+undef_int
+i_writetiff_multi_wiol(io_glue *ig, i_img **imgs, int count) {
+  TIFF* tif;
+  TIFFErrorHandler old_handler;
+  int i;
+
+  old_handler = TIFFSetErrorHandler(error_handler);
+
+  i_clear_error();
+  mm_log((1, "i_writetiff_multi_wiol(ig 0x%p, imgs 0x%p, count %d)\n", 
+          ig, imgs, count));
+
+  /* FIXME: Enable the mmap interface */
+  
+  tif = TIFFClientOpen("No name", 
+                      "wm",
+                      (thandle_t) ig, 
+                      (TIFFReadWriteProc) ig->readcb,
+                      (TIFFReadWriteProc) ig->writecb,
+                      (TIFFSeekProc)      comp_seek,
+                      (TIFFCloseProc)     ig->closecb, 
+                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+                      (TIFFMapFileProc)   comp_mmap,
+                      (TIFFUnmapFileProc) comp_munmap);
+  
+
+
+  if (!tif) {
+    mm_log((1, "i_writetiff_multi_wiol: Unable to open tif file for writing\n"));
+    i_push_error(0, "Could not create TIFF object");
+    TIFFSetErrorHandler(old_handler);
+    return 0;
+  }
+
+  for (i = 0; i < count; ++i) {
+    if (!i_writetiff_low(tif, imgs[i])) {
+      TIFFClose(tif);
+      TIFFSetErrorHandler(old_handler);
+      return 0;
+    }
+
+    if (!TIFFWriteDirectory(tif)) {
+      i_push_error(0, "Cannot write TIFF directory");
+      TIFFClose(tif);
+      TIFFSetErrorHandler(old_handler);
+      return 0;
+    }
+  }
+
+  TIFFSetErrorHandler(old_handler);
+  (void) TIFFClose(tif);
+
+  return 1;
+}
+
+/*
+=item i_writetiff_multi_wiol_faxable(ig, imgs, count, fine_mode)
+
+Stores an image in the iolayer object.
+
+   ig - io_object that defines source to write to 
+   imgs,count - the images to write
+   fine_mode - select fine or normal mode fax images
+
+=cut 
+*/
+
+
+undef_int
+i_writetiff_multi_wiol_faxable(io_glue *ig, i_img **imgs, int count, int fine) {
+  TIFF* tif;
+  int i;
+  TIFFErrorHandler old_handler;
+
+  old_handler = TIFFSetErrorHandler(error_handler);
+
+  i_clear_error();
+  mm_log((1, "i_writetiff_multi_wiol(ig 0x%p, imgs 0x%p, count %d)\n", 
+          ig, imgs, count));
+
+  /* FIXME: Enable the mmap interface */
+  
+  tif = TIFFClientOpen("No name", 
+                      "wm",
+                      (thandle_t) ig, 
+                      (TIFFReadWriteProc) ig->readcb,
+                      (TIFFReadWriteProc) ig->writecb,
+                      (TIFFSeekProc)      comp_seek,
+                      (TIFFCloseProc)     ig->closecb, 
+                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+                      (TIFFMapFileProc)   comp_mmap,
+                      (TIFFUnmapFileProc) comp_munmap);
+  
+
+
+  if (!tif) {
+    mm_log((1, "i_writetiff_mulit_wiol: Unable to open tif file for writing\n"));
+    i_push_error(0, "Could not create TIFF object");
+    TIFFSetErrorHandler(old_handler);
+    return 0;
+  }
+
+  for (i = 0; i < count; ++i) {
+    if (!i_writetiff_low_faxable(tif, imgs[i], fine)) {
+      TIFFClose(tif);
+      TIFFSetErrorHandler(old_handler);
+      return 0;
+    }
+
+    if (!TIFFWriteDirectory(tif)) {
+      i_push_error(0, "Cannot write TIFF directory");
+      TIFFClose(tif);
+      TIFFSetErrorHandler(old_handler);
+      return 0;
+    }
+  }
+
+  (void) TIFFClose(tif);
+  TIFFSetErrorHandler(old_handler);
+
+  return 1;
+}
+
+/*
+=item i_writetiff_wiol(im, ig)
+
+Stores an image in the iolayer object.
+
+   im - image object to write out
+   ig - io_object that defines source to write to 
+
+=cut 
+*/
+undef_int
+i_writetiff_wiol(i_img *img, io_glue *ig) {
+  TIFF* tif;
+  TIFFErrorHandler old_handler;
+
+  old_handler = TIFFSetErrorHandler(error_handler);
+
+  i_clear_error();
+  mm_log((1, "i_writetiff_wiol(img %p, ig 0x%p)\n", img, ig));
+
+  /* FIXME: Enable the mmap interface */
+
+  tif = TIFFClientOpen("No name", 
+                      "wm",
+                      (thandle_t) ig, 
+                      (TIFFReadWriteProc) ig->readcb,
+                      (TIFFReadWriteProc) ig->writecb,
+                      (TIFFSeekProc)      comp_seek,
+                      (TIFFCloseProc)     ig->closecb, 
+                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+                      (TIFFMapFileProc)   comp_mmap,
+                      (TIFFUnmapFileProc) comp_munmap);
+  
+
+
+  if (!tif) {
+    mm_log((1, "i_writetiff_wiol: Unable to open tif file for writing\n"));
+    i_push_error(0, "Could not create TIFF object");
+    TIFFSetErrorHandler(old_handler);
+    return 0;
+  }
+
+  if (!i_writetiff_low(tif, img)) {
+    TIFFClose(tif);
+    TIFFSetErrorHandler(old_handler);
+    return 0;
+  }
+
+  (void) TIFFClose(tif);
+  TIFFSetErrorHandler(old_handler);
+
+  return 1;
+}
+
+
+
+/*
+=item i_writetiff_wiol_faxable(i_img *, io_glue *)
+
+Stores an image in the iolayer object in faxable tiff format.
+
+   im - image object to write out
+   ig - io_object that defines source to write to 
+
+Note, this may be rewritten to use to simply be a call to a
+lower-level function that gives more options for writing tiff at some
+point.
+
+=cut
+*/
+
+undef_int
+i_writetiff_wiol_faxable(i_img *im, io_glue *ig, int fine) {
+  TIFF* tif;
+  TIFFErrorHandler old_handler;
+
+  old_handler = TIFFSetErrorHandler(error_handler);
+
+  i_clear_error();
+  mm_log((1, "i_writetiff_wiol(img %p, ig 0x%p)\n", im, ig));
+
+  /* FIXME: Enable the mmap interface */
+  
+  tif = TIFFClientOpen("No name", 
+                      "wm",
+                      (thandle_t) ig, 
+                      (TIFFReadWriteProc) ig->readcb,
+                      (TIFFReadWriteProc) ig->writecb,
+                      (TIFFSeekProc)      comp_seek,
+                      (TIFFCloseProc)     ig->closecb, 
+                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
+                      (TIFFMapFileProc)   comp_mmap,
+                      (TIFFUnmapFileProc) comp_munmap);
+  
+
+
+  if (!tif) {
+    mm_log((1, "i_writetiff_wiol: Unable to open tif file for writing\n"));
+    i_push_error(0, "Could not create TIFF object");
+    TIFFSetErrorHandler(old_handler);
+    return 0;
+  }
+
+  if (!i_writetiff_low_faxable(tif, im, fine)) {
+    TIFFClose(tif);
+    TIFFSetErrorHandler(old_handler);
+    return 0;
+  }
+
+  (void) TIFFClose(tif);
+  TIFFSetErrorHandler(old_handler);
+
+  return 1;
+}
+
+static int save_tiff_tags(TIFF *tif, i_img *im) {
+  int i;
+  for (i = 0; i < text_tag_count; ++i) {
+    int entry;
+    if (i_tags_find(&im->tags, text_tag_names[i].name, 0, &entry)) {
+      if (!TIFFSetField(tif, text_tag_names[i].tag, 
+                       im->tags.tags[entry].data)) {
+       i_push_errorf(0, "cannot save %s to TIFF", text_tag_names[i].name);
+       return 0;
+      }
+    }
+  }
+  return 1;
+}
+
+
+static void
+unpack_4bit_to(unsigned char *dest, const unsigned char *src, 
+              int src_byte_count) {
+  while (src_byte_count > 0) {
+    *dest++ = *src >> 4;
+    *dest++ = *src++ & 0xf;
+    --src_byte_count;
+  }
+}
+
+static void pack_4bit_to(unsigned char *dest, const unsigned char *src, 
+                        int pixel_count) {
+  int i = 0;
+  while (i < pixel_count) {
+    if ((i & 1) == 0) {
+      *dest = *src++ << 4;
+    }
+    else {
+      *dest++ |= *src++;
+    }
+    ++i;
+  }
+}
+
+static i_img *
+make_rgb(TIFF *tif, int width, int height, int *alpha_chan) {
+  uint16 photometric;
+  uint16 channels, in_channels;
+  uint16 extra_count;
+  uint16 *extras;
+
+  TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &in_channels);
+  TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &photometric);
+
+  switch (photometric) {
+  case PHOTOMETRIC_SEPARATED:
+    channels = 3;
+    break;
+  
+  case PHOTOMETRIC_MINISWHITE:
+  case PHOTOMETRIC_MINISBLACK:
+    /* the TIFF RGBA functions expand single channel grey into RGB,
+       so reduce it, we move the alpha channel into the right place 
+       if needed */
+    channels = 1;
+    break;
+
+  default:
+    channels = 3;
+    break;
+  }
+  /* TIFF images can have more than one alpha channel, but Imager can't
+     this ignores the possibility of 2 channel images with 2 alpha,
+     but there's not much I can do about that */
+  *alpha_chan = 0;
+  if (TIFFGetField(tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)
+      && extra_count) {
+    *alpha_chan = channels++;
+  }
+
+  return i_img_8_new(width, height, channels);
+}
+
+static i_img *
+read_one_rgb_lines(TIFF *tif, int width, int height, int allow_incomplete) {
+  i_img *im;
+  uint32* raster = NULL;
+  uint32 rowsperstrip, row;
+  i_color *line_buf;
+  int alpha_chan;
+  int rc;
+
+  im = make_rgb(tif, width, height, &alpha_chan);
+  if (!im)
+    return NULL;
+
+  rc = TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+  mm_log((1, "i_readtiff_wiol: rowsperstrip=%d rc = %d\n", rowsperstrip, rc));
+  
+  if (rc != 1 || rowsperstrip==-1) {
+    rowsperstrip = height;
+  }
+  
+  raster = (uint32*)_TIFFmalloc(width * rowsperstrip * sizeof (uint32));
+  if (!raster) {
+    i_img_destroy(im);
+    i_push_error(0, "No space for raster buffer");
+    return NULL;
+  }
+
+  line_buf = mymalloc(sizeof(i_color) * width);
+  
+  for( row = 0; row < height; row += rowsperstrip ) {
+    uint32 newrows, i_row;
+    
+    if (!TIFFReadRGBAStrip(tif, row, raster)) {
+      if (allow_incomplete) {
+       i_tags_setn(&im->tags, "i_lines_read", row);
+       i_tags_setn(&im->tags, "i_incomplete", 1);
+       break;
+      }
+      else {
+       i_push_error(0, "could not read TIFF image strip");
+       _TIFFfree(raster);
+       i_img_destroy(im);
+       return NULL;
+      }
+    }
+    
+    newrows = (row+rowsperstrip > height) ? height-row : rowsperstrip;
+    mm_log((1, "newrows=%d\n", newrows));
+    
+    for( i_row = 0; i_row < newrows; i_row++ ) { 
+      uint32 x;
+      i_color *outp = line_buf;
+
+      for(x = 0; x<width; x++) {
+       uint32 temp = raster[x+width*(newrows-i_row-1)];
+       outp->rgba.r = TIFFGetR(temp);
+       outp->rgba.g = TIFFGetG(temp);
+       outp->rgba.b = TIFFGetB(temp);
+
+       if (alpha_chan) {
+         /* the libtiff RGBA code expands greyscale into RGBA, so put the
+            alpha in the right place and scale it */
+         int ch;
+         outp->channel[alpha_chan] = TIFFGetA(temp);
+         if (outp->channel[alpha_chan]) {
+           for (ch = 0; ch < alpha_chan; ++ch) {
+             outp->channel[ch] = outp->channel[ch] * 255 / outp->channel[alpha_chan];
+           }
+         }
+       }
+
+       outp++;
+      }
+      i_plin(im, 0, width, i_row+row, line_buf);
+    }
+  }
+
+  myfree(line_buf);
+  _TIFFfree(raster);
+  
+  return im;
+}
+
+/* adapted from libtiff 
+
+  libtiff's TIFFReadRGBATile succeeds even when asked to read an
+  invalid tile, which means we have no way of knowing whether the data
+  we received from it is valid or not.
+
+  So the caller here has set stoponerror to 1 so that
+  TIFFRGBAImageGet() will fail.
+
+  read_one_rgb_tiled() then takes that into account for i_incomplete
+  or failure.
+ */
+static int
+myTIFFReadRGBATile(TIFFRGBAImage *img, uint32 col, uint32 row, uint32 * raster)
+
+{
+    int        ok;
+    uint32     tile_xsize, tile_ysize;
+    uint32     read_xsize, read_ysize;
+    uint32     i_row;
+
+    /*
+     * Verify that our request is legal - on a tile file, and on a
+     * tile boundary.
+     */
+    
+    TIFFGetFieldDefaulted(img->tif, TIFFTAG_TILEWIDTH, &tile_xsize);
+    TIFFGetFieldDefaulted(img->tif, TIFFTAG_TILELENGTH, &tile_ysize);
+    if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 )
+    {
+      i_push_errorf(0, "Row/col passed to myTIFFReadRGBATile() must be top"
+                   "left corner of a tile.");
+      return 0;
+    }
+
+    /*
+     * The TIFFRGBAImageGet() function doesn't allow us to get off the
+     * edge of the image, even to fill an otherwise valid tile.  So we
+     * figure out how much we can read, and fix up the tile buffer to
+     * a full tile configuration afterwards.
+     */
+
+    if( row + tile_ysize > img->height )
+        read_ysize = img->height - row;
+    else
+        read_ysize = tile_ysize;
+    
+    if( col + tile_xsize > img->width )
+        read_xsize = img->width - col;
+    else
+        read_xsize = tile_xsize;
+
+    /*
+     * Read the chunk of imagery.
+     */
+    
+    img->row_offset = row;
+    img->col_offset = col;
+
+    ok = TIFFRGBAImageGet(img, raster, read_xsize, read_ysize );
+        
+    /*
+     * If our read was incomplete we will need to fix up the tile by
+     * shifting the data around as if a full tile of data is being returned.
+     *
+     * This is all the more complicated because the image is organized in
+     * bottom to top format. 
+     */
+
+    if( read_xsize == tile_xsize && read_ysize == tile_ysize )
+        return( ok );
+
+    for( i_row = 0; i_row < read_ysize; i_row++ ) {
+        memmove( raster + (tile_ysize - i_row - 1) * tile_xsize,
+                 raster + (read_ysize - i_row - 1) * read_xsize,
+                 read_xsize * sizeof(uint32) );
+        _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize,
+                     0, sizeof(uint32) * (tile_xsize - read_xsize) );
+    }
+
+    for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) {
+        _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize,
+                     0, sizeof(uint32) * tile_xsize );
+    }
+
+    return (ok);
+}
+
+static i_img *
+read_one_rgb_tiled(TIFF *tif, int width, int height, int allow_incomplete) {
+  i_img *im;
+  uint32* raster = NULL;
+  int ok = 1;
+  uint32 row, col;
+  uint32 tile_width, tile_height;
+  unsigned long pixels = 0;
+  char         emsg[1024] = "";
+  TIFFRGBAImage img;
+  i_color *line;
+  int alpha_chan;
+  
+  im = make_rgb(tif, width, height, &alpha_chan);
+  if (!im)
+    return NULL;
+  
+  if (!TIFFRGBAImageOK(tif, emsg) 
+      || !TIFFRGBAImageBegin(&img, tif, 1, emsg)) {
+    i_push_error(0, emsg);
+    i_img_destroy(im);
+    return( 0 );
+  }
+
+  TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width);
+  TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height);
+  mm_log((1, "i_readtiff_wiol: tile_width=%d, tile_height=%d\n", tile_width, tile_height));
+  
+  raster = (uint32*)_TIFFmalloc(tile_width * tile_height * sizeof (uint32));
+  if (!raster) {
+    i_img_destroy(im);
+    i_push_error(0, "No space for raster buffer");
+    TIFFRGBAImageEnd(&img);
+    return NULL;
+  }
+  line = mymalloc(tile_width * sizeof(i_color));
+  
+  for( row = 0; row < height; row += tile_height ) {
+    for( col = 0; col < width; col += tile_width ) {
+      
+      /* Read the tile into an RGBA array */
+      if (myTIFFReadRGBATile(&img, col, row, raster)) {
+       uint32 i_row, x;
+       uint32 newrows = (row+tile_height > height) ? height-row : tile_height;
+       uint32 newcols = (col+tile_width  > width ) ? width-col  : tile_width;
+
+       mm_log((1, "i_readtiff_wiol: tile(%d, %d) newcols=%d newrows=%d\n", col, row, newcols, newrows));
+       for( i_row = 0; i_row < newrows; i_row++ ) {
+         i_color *outp = line;
+         for(x = 0; x < newcols; x++) {
+           uint32 temp = raster[x+tile_width*(tile_height-i_row-1)];
+           outp->rgba.r = TIFFGetR(temp);
+           outp->rgba.g = TIFFGetG(temp);
+           outp->rgba.b = TIFFGetB(temp);
+           outp->rgba.a = TIFFGetA(temp);
+
+           if (alpha_chan) {
+             /* the libtiff RGBA code expands greyscale into RGBA, so put the
+                alpha in the right place and scale it */
+             int ch;
+             outp->channel[alpha_chan] = TIFFGetA(temp);
+             
+             if (outp->channel[alpha_chan]) {
+               for (ch = 0; ch < alpha_chan; ++ch) {
+                 outp->channel[ch] = outp->channel[ch] * 255 / outp->channel[alpha_chan];
+               }
+             }
+           }
+
+           ++outp;
+         }
+         i_plin(im, col, col+newcols, row+i_row, line);
+       }
+       pixels += newrows * newcols;
+      }
+      else {
+       if (allow_incomplete) {
+         ok = 0;
+       }
+       else {
+         goto error;
+       }
+      }
+    }
+  }
+
+  if (!ok) {
+    if (pixels == 0) {
+      i_push_error(0, "TIFF: No image data could be read from the image");
+      goto error;
+    }
+
+    /* incomplete image */
+    i_tags_setn(&im->tags, "i_incomplete", 1);
+    i_tags_setn(&im->tags, "i_lines_read", pixels / width);
+  }
+
+  myfree(line);
+  TIFFRGBAImageEnd(&img);
+  _TIFFfree(raster);
+  
+  return im;
+
+ error:
+  myfree(line);
+  _TIFFfree(raster);
+  TIFFRGBAImageEnd(&img);
+  i_img_destroy(im);
+  return NULL;
+}
+
+char const *
+i_tiff_libversion(void) {
+  return TIFFGetVersion();
+}
+
+static int 
+setup_paletted(read_state_t *state) {
+  uint16 *maps[3];
+  int i, ch;
+  int color_count = 1 << state->bits_per_sample;
+
+  state->img = i_img_pal_new(state->width, state->height, 3, 256);
+  if (!state->img)
+    return 0;
+
+  /* setup the color map */
+  if (!TIFFGetField(state->tif, TIFFTAG_COLORMAP, maps+0, maps+1, maps+2)) {
+    i_push_error(0, "Cannot get colormap for paletted image");
+    i_img_destroy(state->img);
+    return 0;
+  }
+  for (i = 0; i < color_count; ++i) {
+    i_color c;
+    for (ch = 0; ch < 3; ++ch) {
+      c.channel[ch] = Sample16To8(maps[ch][i]);
+    }
+    i_addcolors(state->img, &c, 1);
+  }
+
+  return 1;
+}
+
+static int 
+tile_contig_getter(read_state_t *state, read_putter_t putter) {
+  uint32 tile_width, tile_height;
+  uint32 this_tile_height, this_tile_width;
+  uint32 rows_left, cols_left;
+  uint32 x, y;
+
+  state->raster = _TIFFmalloc(TIFFTileSize(state->tif));
+  if (!state->raster) {
+    i_push_error(0, "tiff: Out of memory allocating tile buffer");
+    return 0;
+  }
+
+  TIFFGetField(state->tif, TIFFTAG_TILEWIDTH, &tile_width);
+  TIFFGetField(state->tif, TIFFTAG_TILELENGTH, &tile_height);
+  rows_left = state->height;
+  for (y = 0; y < state->height; y += this_tile_height) {
+    this_tile_height = rows_left > tile_height ? tile_height : rows_left;
+
+    cols_left = state->width;
+    for (x = 0; x < state->width; x += this_tile_width) {
+      this_tile_width = cols_left > tile_width ? tile_width : cols_left;
+
+      if (TIFFReadTile(state->tif,
+                      state->raster,
+                      x, y, 0, 0) < 0) {
+       if (!state->allow_incomplete) {
+         return 0;
+       }
+      }
+      else {
+       putter(state, x, y, this_tile_width, this_tile_height, tile_width - this_tile_width);
+      }
+
+      cols_left -= this_tile_width;
+    }
+
+    rows_left -= this_tile_height;
+  }
+
+  return 1;
+}
+
+static int 
+strip_contig_getter(read_state_t *state, read_putter_t putter) {
+  uint32 rows_per_strip;
+  tsize_t strip_size = TIFFStripSize(state->tif);
+  uint32 y, strip_rows, rows_left;
+
+  state->raster = _TIFFmalloc(strip_size);
+  if (!state->raster) {
+    i_push_error(0, "tiff: Out of memory allocating strip buffer");
+    return 0;
+  }
+  
+  TIFFGetFieldDefaulted(state->tif, TIFFTAG_ROWSPERSTRIP, &rows_per_strip);
+  rows_left = state->height;
+  for (y = 0; y < state->height; y += strip_rows) {
+    strip_rows = rows_left > rows_per_strip ? rows_per_strip : rows_left;
+    if (TIFFReadEncodedStrip(state->tif,
+                            TIFFComputeStrip(state->tif, y, 0),
+                            state->raster,
+                            strip_size) < 0) {
+      if (!state->allow_incomplete)
+       return 0;
+    }
+    else {
+      putter(state, 0, y, state->width, strip_rows, 0);
+    }
+    rows_left -= strip_rows;
+  }
+
+  return 1;
+}
+
+static int 
+paletted_putter8(read_state_t *state, int x, int y, int width, int height, int extras) {
+  unsigned char *p = state->raster;
+
+  state->pixels_read += (unsigned long) width * height;
+  while (height > 0) {
+    i_ppal(state->img, x, x + width, y, p);
+    p += width + extras;
+    --height;
+    ++y;
+  }
+
+  return 1;
+}
+
+static int 
+paletted_putter4(read_state_t *state, int x, int y, int width, int height, int extras) {
+  uint32 img_line_size = (width + 1) / 2;
+  uint32 skip_line_size = (width + extras + 1) / 2;
+  unsigned char *p = state->raster;
+
+  if (!state->line_buf)
+    state->line_buf = mymalloc(state->width);
+
+  state->pixels_read += (unsigned long) width * height;
+  while (height > 0) {
+    unpack_4bit_to(state->line_buf, p, img_line_size);
+    i_ppal(state->img, x, x + width, y, state->line_buf);
+    p += skip_line_size;
+    --height;
+    ++y;
+  }
+
+  return 1;
+}
+
+static void
+rgb_channels(read_state_t *state, int *out_channels) {
+  uint16 extra_count;
+  uint16 *extras;
+  
+  /* safe defaults */
+  *out_channels = 3;
+  state->alpha_chan = 0;
+  state->scale_alpha = 0;
+
+  /* plain RGB */
+  if (state->samples_per_pixel == 3)
+    return;
+  if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
+    mm_log((1, "tiff: samples != 3 but no extra samples tag\n"));
+    return;
+  }
+
+  if (!extra_count) {
+    mm_log((1, "tiff: samples != 3 but no extra samples listed"));
+    return;
+  }
+
+  ++*out_channels;
+  state->alpha_chan = 3;
+  switch (*extras) {
+  case EXTRASAMPLE_UNSPECIFIED:
+  case EXTRASAMPLE_ASSOCALPHA:
+    state->scale_alpha = 1;
+    break;
+
+  case EXTRASAMPLE_UNASSALPHA:
+    state->scale_alpha = 0;
+    break;
+
+  default:
+    mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
+           *extras));
+    state->scale_alpha = 1;
+    break;
+  }
+  mm_log((1, "tiff alpha channel %d scale %d\n", state->alpha_chan, state->scale_alpha));
+}
+
+static void
+grey_channels(read_state_t *state, int *out_channels) {
+  uint16 extra_count;
+  uint16 *extras;
+  
+  /* safe defaults */
+  *out_channels = 1;
+  state->alpha_chan = 0;
+  state->scale_alpha = 0;
+
+  /* plain grey */
+  if (state->samples_per_pixel == 1)
+    return;
+  if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
+    mm_log((1, "tiff: samples != 1 but no extra samples tag\n"));
+    return;
+  }
+
+  if (!extra_count) {
+    mm_log((1, "tiff: samples != 1 but no extra samples listed"));
+    return;
+  }
+
+  ++*out_channels;
+  state->alpha_chan = 1;
+  switch (*extras) {
+  case EXTRASAMPLE_UNSPECIFIED:
+  case EXTRASAMPLE_ASSOCALPHA:
+    state->scale_alpha = 1;
+    break;
+
+  case EXTRASAMPLE_UNASSALPHA:
+    state->scale_alpha = 0;
+    break;
+
+  default:
+    mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
+           *extras));
+    state->scale_alpha = 1;
+    break;
+  }
+}
+
+static int
+setup_16_rgb(read_state_t *state) {
+  int out_channels;
+
+  rgb_channels(state, &out_channels);
+
+  state->img = i_img_16_new(state->width, state->height, out_channels);
+  if (!state->img)
+    return 0;
+  state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
+
+  return 1;
+}
+
+static int
+setup_16_grey(read_state_t *state) {
+  int out_channels;
+
+  grey_channels(state, &out_channels);
+
+  state->img = i_img_16_new(state->width, state->height, out_channels);
+  if (!state->img)
+    return 0;
+  state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
+
+  return 1;
+}
+
+static int 
+putter_16(read_state_t *state, int x, int y, int width, int height, 
+         int row_extras) {
+  uint16 *p = state->raster;
+  int out_chan = state->img->channels;
+
+  state->pixels_read += (unsigned long) width * height;
+  while (height > 0) {
+    int i;
+    int ch;
+    unsigned *outp = state->line_buf;
+
+    for (i = 0; i < width; ++i) {
+      for (ch = 0; ch < out_chan; ++ch) {
+       outp[ch] = p[ch];
+      }
+      if (state->alpha_chan && state->scale_alpha && outp[state->alpha_chan]) {
+       for (ch = 0; ch < state->alpha_chan; ++ch) {
+         int result = 0.5 + (outp[ch] * 65535.0 / outp[state->alpha_chan]);
+         outp[ch] = CLAMP16(result);
+       }
+      }
+      p += state->samples_per_pixel;
+      outp += out_chan;
+    }
+
+    i_psamp_bits(state->img, x, x + width, y, state->line_buf, NULL, out_chan, 16);
+
+    p += row_extras * state->samples_per_pixel;
+    --height;
+    ++y;
+  }
+
+  return 1;
+}
+
+static int
+setup_8_rgb(read_state_t *state) {
+  int out_channels;
+
+  rgb_channels(state, &out_channels);
+
+  state->img = i_img_8_new(state->width, state->height, out_channels);
+  if (!state->img)
+    return 0;
+  state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
+
+  return 1;
+}
+
+static int
+setup_8_grey(read_state_t *state) {
+  int out_channels;
+
+  grey_channels(state, &out_channels);
+
+  state->img = i_img_8_new(state->width, state->height, out_channels);
+  if (!state->img)
+    return 0;
+  state->line_buf = mymalloc(sizeof(i_color) * state->width * out_channels);
+
+  return 1;
+}
+
+static int 
+putter_8(read_state_t *state, int x, int y, int width, int height, 
+         int row_extras) {
+  unsigned char *p = state->raster;
+  int out_chan = state->img->channels;
+
+  state->pixels_read += (unsigned long) width * height;
+  while (height > 0) {
+    int i;
+    int ch;
+    i_color *outp = state->line_buf;
+
+    for (i = 0; i < width; ++i) {
+      for (ch = 0; ch < out_chan; ++ch) {
+       outp->channel[ch] = p[ch];
+      }
+      if (state->alpha_chan && state->scale_alpha 
+         && outp->channel[state->alpha_chan]) {
+       for (ch = 0; ch < state->alpha_chan; ++ch) {
+         int result = (outp->channel[ch] * 255 + 127) / outp->channel[state->alpha_chan];
+       
+         outp->channel[ch] = CLAMP8(result);
+       }
+      }
+      p += state->samples_per_pixel;
+      outp++;
+    }
+
+    i_plin(state->img, x, x + width, y, state->line_buf);
+
+    p += row_extras * state->samples_per_pixel;
+    --height;
+    ++y;
+  }
+
+  return 1;
+}
+
+static int
+setup_32_rgb(read_state_t *state) {
+  int out_channels;
+
+  rgb_channels(state, &out_channels);
+
+  state->img = i_img_double_new(state->width, state->height, out_channels);
+  if (!state->img)
+    return 0;
+  state->line_buf = mymalloc(sizeof(i_fcolor) * state->width);
+
+  return 1;
+}
+
+static int
+setup_32_grey(read_state_t *state) {
+  int out_channels;
+
+  grey_channels(state, &out_channels);
+
+  state->img = i_img_double_new(state->width, state->height, out_channels);
+  if (!state->img)
+    return 0;
+  state->line_buf = mymalloc(sizeof(i_fcolor) * state->width);
+
+  return 1;
+}
+
+static int 
+putter_32(read_state_t *state, int x, int y, int width, int height, 
+         int row_extras) {
+  uint32 *p = state->raster;
+  int out_chan = state->img->channels;
+
+  state->pixels_read += (unsigned long) width * height;
+  while (height > 0) {
+    int i;
+    int ch;
+    i_fcolor *outp = state->line_buf;
+
+    for (i = 0; i < width; ++i) {
+      for (ch = 0; ch < out_chan; ++ch) {
+       outp->channel[ch] = p[ch] / 4294967295.0;
+      }
+      if (state->alpha_chan && state->scale_alpha && outp->channel[state->alpha_chan]) {
+       for (ch = 0; ch < state->alpha_chan; ++ch)
+         outp->channel[ch] /= outp->channel[state->alpha_chan];
+      }
+      p += state->samples_per_pixel;
+      outp++;
+    }
+
+    i_plinf(state->img, x, x + width, y, state->line_buf);
+
+    p += row_extras * state->samples_per_pixel;
+    --height;
+    ++y;
+  }
+
+  return 1;
+}
+
+static int
+setup_bilevel(read_state_t *state) {
+  i_color black, white;
+  state->img = i_img_pal_new(state->width, state->height, 1, 256);
+  if (!state->img)
+    return 0;
+  black.channel[0] = black.channel[1] = black.channel[2] = 
+    black.channel[3] = 0;
+  white.channel[0] = white.channel[1] = white.channel[2] = 
+    white.channel[3] = 255;
+  if (state->photometric == PHOTOMETRIC_MINISBLACK) {
+    i_addcolors(state->img, &black, 1);
+    i_addcolors(state->img, &white, 1);
+  }
+  else {
+    i_addcolors(state->img, &white, 1);
+    i_addcolors(state->img, &black, 1);
+  }
+  state->line_buf = mymalloc(state->width);
+
+  return 1;
+}
+
+static int 
+putter_bilevel(read_state_t *state, int x, int y, int width, int height, 
+              int row_extras) {
+  unsigned char *line_in = state->raster;
+  size_t line_size = (width + row_extras + 7) / 8;
+  
+  /* tifflib returns the bits in MSB2LSB order even when the file is
+     in LSB2MSB, so we only need to handle MSB2LSB */
+  state->pixels_read += (unsigned long) width * height;
+  while (height > 0) {
+    int i;
+    unsigned char *outp = state->line_buf;
+    unsigned char *inp = line_in;
+    unsigned mask = 0x80;
+
+    for (i = 0; i < width; ++i) {
+      *outp++ = *inp & mask ? 1 : 0;
+      mask >>= 1;
+      if (!mask) {
+       ++inp;
+       mask = 0x80;
+      }
+    }
+
+    i_ppal(state->img, x, x + width, y, state->line_buf);
+
+    line_in += line_size;
+    --height;
+    ++y;
+  }
+
+  return 1;
+}
+
+static void
+cmyk_channels(read_state_t *state, int *out_channels) {
+  uint16 extra_count;
+  uint16 *extras;
+  
+  /* safe defaults */
+  *out_channels = 3;
+  state->alpha_chan = 0;
+  state->scale_alpha = 0;
+
+  /* plain CMYK */
+  if (state->samples_per_pixel == 4)
+    return;
+  if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
+    mm_log((1, "tiff: CMYK samples != 4 but no extra samples tag\n"));
+    return;
+  }
+
+  if (!extra_count) {
+    mm_log((1, "tiff: CMYK samples != 4 but no extra samples listed"));
+    return;
+  }
+
+  ++*out_channels;
+  state->alpha_chan = 4;
+  switch (*extras) {
+  case EXTRASAMPLE_UNSPECIFIED:
+  case EXTRASAMPLE_ASSOCALPHA:
+    state->scale_alpha = 1;
+    break;
+
+  case EXTRASAMPLE_UNASSALPHA:
+    state->scale_alpha = 0;
+    break;
+
+  default:
+    mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
+           *extras));
+    state->scale_alpha = 1;
+    break;
+  }
+}
+
+static int
+setup_cmyk8(read_state_t *state) {
+  int channels;
+
+  cmyk_channels(state, &channels);
+  state->img = i_img_8_new(state->width, state->height, channels);
+
+  state->line_buf = mymalloc(sizeof(i_color) * state->width);
+
+  return 1;
+}
+
+static int 
+putter_cmyk8(read_state_t *state, int x, int y, int width, int height, 
+              int row_extras) {
+  unsigned char *p = state->raster;
+
+  state->pixels_read += (unsigned long) width * height;
+  while (height > 0) {
+    int i;
+    int ch;
+    i_color *outp = state->line_buf;
+
+    for (i = 0; i < width; ++i) {
+      unsigned char c, m, y, k;
+      c = p[0];
+      m = p[1];
+      y = p[2];
+      k = 255 - p[3];
+      outp->rgba.r = (k * (255 - c)) / 255;
+      outp->rgba.g = (k * (255 - m)) / 255;
+      outp->rgba.b = (k * (255 - y)) / 255;
+      if (state->alpha_chan) {
+       outp->rgba.a = p[state->alpha_chan];
+       if (state->scale_alpha 
+           && outp->rgba.a) {
+         for (ch = 0; ch < 3; ++ch) {
+           int result = (outp->channel[ch] * 255 + 127) / outp->rgba.a;
+           outp->channel[ch] = CLAMP8(result);
+         }
+       }
+      }
+      p += state->samples_per_pixel;
+      outp++;
+    }
+
+    i_plin(state->img, x, x + width, y, state->line_buf);
+
+    p += row_extras * state->samples_per_pixel;
+    --height;
+    ++y;
+  }
+
+  return 1;
+}
+
+static int
+setup_cmyk16(read_state_t *state) {
+  int channels;
+
+  cmyk_channels(state, &channels);
+  state->img = i_img_16_new(state->width, state->height, channels);
+
+  state->line_buf = mymalloc(sizeof(unsigned) * state->width * channels);
+
+  return 1;
+}
+
+static int 
+putter_cmyk16(read_state_t *state, int x, int y, int width, int height, 
+              int row_extras) {
+  uint16 *p = state->raster;
+  int out_chan = state->img->channels;
+
+  mm_log((4, "putter_cmyk16(%p, %d, %d, %d, %d, %d)\n", x, y, width, height, row_extras));
+
+  state->pixels_read += (unsigned long) width * height;
+  while (height > 0) {
+    int i;
+    int ch;
+    unsigned *outp = state->line_buf;
+
+    for (i = 0; i < width; ++i) {
+      unsigned c, m, y, k;
+      c = p[0];
+      m = p[1];
+      y = p[2];
+      k = 65535 - p[3];
+      outp[0] = (k * (65535U - c)) / 65535U;
+      outp[1] = (k * (65535U - m)) / 65535U;
+      outp[2] = (k * (65535U - y)) / 65535U;
+      if (state->alpha_chan) {
+       outp[3] = p[state->alpha_chan];
+       if (state->scale_alpha 
+           && outp[3]) {
+         for (ch = 0; ch < 3; ++ch) {
+           int result = (outp[ch] * 65535 + 32767) / outp[3];
+           outp[3] = CLAMP16(result);
+         }
+       }
+      }
+      p += state->samples_per_pixel;
+      outp += out_chan;
+    }
+
+    i_psamp_bits(state->img, x, x + width, y, state->line_buf, NULL, out_chan, 16);
+
+    p += row_extras * state->samples_per_pixel;
+    --height;
+    ++y;
+  }
+
+  return 1;
+}
+
+/*
+
+  Older versions of tifflib we support don't define this, so define it
+  ourselves.
+
+  If you want this detection to do anything useful, use a newer
+  release of tifflib.
+
+ */
+#if TIFFLIB_VERSION < 20031121
+
+int 
+TIFFIsCODECConfigured(uint16 scheme) {
+  switch (scheme) {
+    /* these schemes are all shipped with tifflib */
+ case COMPRESSION_NONE:
+ case COMPRESSION_PACKBITS:
+ case COMPRESSION_CCITTRLE:
+ case COMPRESSION_CCITTRLEW:
+ case COMPRESSION_CCITTFAX3:
+ case COMPRESSION_CCITTFAX4:
+    return 1;
+
+    /* these require external library support */
+  default:
+ case COMPRESSION_JPEG:
+ case COMPRESSION_LZW:
+ case COMPRESSION_DEFLATE:
+ case COMPRESSION_ADOBE_DEFLATE:
+    return 0;
+  }
+}
+
+#endif
+
+static int 
+myTIFFIsCODECConfigured(uint16 scheme) {
+#if TIFFLIB_VERSION < 20040724
+  if (scheme == COMPRESSION_LZW)
+    return 0;
+#endif
+
+  return TIFFIsCODECConfigured(scheme);
+}
+
+/*
+=back
+
+=head1 AUTHOR
+
+Arnar M. Hrafnkelsson <addi@umich.edu>, Tony Cook <tony@imager.perl.org>
+
+=head1 SEE ALSO
+
+Imager(3)
+
+=cut
+*/
diff --git a/TIFF/imtiff.h b/TIFF/imtiff.h
new file mode 100644 (file)
index 0000000..84222b6
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef IMAGER_IMTIFF_H
+#define IMAGER_IMTIFF_H
+
+#include "imdatatypes.h"
+
+i_img   * i_readtiff_wiol(io_glue *ig, int allow_incomplete, int page);
+i_img  ** i_readtiff_multi_wiol(io_glue *ig, int *count);
+undef_int i_writetiff_wiol(i_img *im, io_glue *ig);
+undef_int i_writetiff_multi_wiol(io_glue *ig, i_img **imgs, int count);
+undef_int i_writetiff_wiol_faxable(i_img *im, io_glue *ig, int fine);
+undef_int i_writetiff_multi_wiol_faxable(io_glue *ig, i_img **imgs, int count, int fine);
+char const * i_tiff_libversion(void);
+int i_tiff_has_compression(char const *name);
+
+#endif
diff --git a/TIFF/t/t10tiff.t b/TIFF/t/t10tiff.t
new file mode 100644 (file)
index 0000000..77f16de
--- /dev/null
@@ -0,0 +1,730 @@
+#!perl -w
+use strict;
+use Test::More tests => 216;
+use Imager qw(:all);
+use Imager::Test qw(is_image is_image_similar test_image test_image_16 test_image_double test_image_raw);
+
+BEGIN { use_ok("Imager::File::TIFF"); }
+
+-d "testout"
+  or mkdir "testout";
+
+$|=1;  # give us some progress in the test harness
+init_log("testout/t106tiff.log",1);
+
+my $green=i_color_new(0,255,0,255);
+my $blue=i_color_new(0,0,255,255);
+my $red=i_color_new(255,0,0,255);
+
+my $img=test_image_raw();
+
+my $ver_string = Imager::File::TIFF::i_tiff_libversion();
+ok(my ($full, $major, $minor, $point) = 
+   $ver_string =~ /Version +((\d+)\.(\d+).(\d+))/,
+   "extract library version")
+  or diag("Could not extract from:\n$ver_string");
+diag("libtiff release $full") if $full;
+# make something we can compare
+my $cmp_ver = sprintf("%03d%03d%03d", $major, $minor, $point);
+if ($cmp_ver lt '003007000') {
+  diag("You have an old version of libtiff - $full, some tests will be skipped");
+}
+
+Imager::i_tags_add($img, "i_xres", 0, "300", 0);
+Imager::i_tags_add($img, "i_yres", 0, undef, 250);
+# resolutionunit is centimeters
+Imager::i_tags_add($img, "tiff_resolutionunit", 0, undef, 3);
+Imager::i_tags_add($img, "tiff_software", 0, "t106tiff.t", 0);
+open(FH,">testout/t106.tiff") || die "cannot open testout/t106.tiff for writing\n";
+binmode(FH); 
+my $IO = Imager::io_new_fd(fileno(FH));
+ok(Imager::File::TIFF::i_writetiff_wiol($img, $IO), "write low level")
+  or print "# ", Imager->_error_as_msg, "\n";
+close(FH);
+
+open(FH,"testout/t106.tiff") or die "cannot open testout/t106.tiff\n";
+binmode(FH);
+$IO = Imager::io_new_fd(fileno(FH));
+my $cmpimg = Imager::File::TIFF::i_readtiff_wiol($IO);
+ok($cmpimg, "read low-level");
+
+close(FH);
+
+print "# tiff average mean square pixel difference: ",sqrt(i_img_diff($img,$cmpimg))/150*150,"\n";
+
+ok(!i_img_diff($img, $cmpimg), "compare written and read image");
+
+# check the tags are ok
+my %tags = map { Imager::i_tags_get($cmpimg, $_) }
+  0 .. Imager::i_tags_count($cmpimg) - 1;
+ok(abs($tags{i_xres} - 300) < 0.5, "i_xres in range");
+ok(abs($tags{i_yres} - 250) < 0.5, "i_yres in range");
+is($tags{tiff_resolutionunit}, 3, "tiff_resolutionunit");
+is($tags{tiff_software}, 't106tiff.t', "tiff_software");
+is($tags{tiff_photometric}, 2, "tiff_photometric"); # PHOTOMETRIC_RGB is 2
+is($tags{tiff_bitspersample}, 8, "tiff_bitspersample");
+
+$IO = Imager::io_new_bufchain();
+
+ok(Imager::File::TIFF::i_writetiff_wiol($img, $IO), "write to buffer chain");
+my $tiffdata = Imager::io_slurp($IO);
+
+open(FH,"testout/t106.tiff");
+binmode FH;
+my $odata;
+{ local $/;
+  $odata = <FH>;
+}
+
+is($odata, $tiffdata, "same data in file as in memory");
+
+# test Micksa's tiff writer
+# a shortish fax page
+my $faximg = Imager::ImgRaw::new(1728, 2000, 1);
+my $black = i_color_new(0,0,0,255);
+my $white = i_color_new(255,255,255,255);
+# vaguely test-patterny
+i_box_filled($faximg, 0, 0, 1728, 2000, $white);
+i_box_filled($faximg, 100,100,1628, 200, $black);
+my $width = 1;
+my $pos = 100;
+while ($width+$pos < 1628) {
+  i_box_filled($faximg, $pos, 300, $pos+$width-1, 400, $black);
+  $pos += $width + 20;
+  $width += 2;
+}
+open FH, "> testout/t106tiff_fax.tiff"
+  or die "Cannot create testout/t106tiff_fax.tiff: $!";
+binmode FH;
+$IO = Imager::io_new_fd(fileno(FH));
+ok(Imager::File::TIFF::i_writetiff_wiol_faxable($faximg, $IO, 1), "write faxable, low level");
+close FH;
+
+# test the OO interface
+my $ooim = Imager->new;
+ok($ooim->read(file=>'testout/t106.tiff'), "read OO");
+ok($ooim->write(file=>'testout/t106_oo.tiff'), "write OO");
+
+# OO with the fax image
+my $oofim = Imager->new;
+ok($oofim->read(file=>'testout/t106tiff_fax.tiff'),
+   "read fax OO");
+
+# this should have tags set for the resolution
+%tags = map @$_, $oofim->tags;
+is($tags{i_xres}, 204, "fax i_xres");
+is($tags{i_yres}, 196, "fax i_yres");
+ok(!$tags{i_aspect_only}, "i_aspect_only");
+# resunit_inches
+is($tags{tiff_resolutionunit}, 2, "tiff_resolutionunit");
+is($tags{tiff_bitspersample}, 1, "tiff_bitspersample");
+is($tags{tiff_photometric}, 0, "tiff_photometric");
+
+ok($oofim->write(file=>'testout/t106_oo_fax.tiff', class=>'fax'),
+   "write OO, faxable");
+
+# the following should fail since there's no type and no filename
+my $oodata;
+ok(!$ooim->write(data=>\$oodata), "write with no type and no filename to guess with");
+
+# OO to data
+ok($ooim->write(data=>\$oodata, type=>'tiff'), "write to data")
+  or print "# ",$ooim->errstr, "\n";
+is($oodata, $tiffdata, "check data matches between memory and file");
+
+# make sure we can write non-fine mode
+ok($oofim->write(file=>'testout/t106_oo_faxlo.tiff', class=>'fax', fax_fine=>0), "write OO, fax standard mode");
+
+# paletted reads
+my $img4 = Imager->new;
+ok($img4->read(file=>'testimg/comp4.tif'), "reading 4-bit paletted")
+  or print "# ", $img4->errstr, "\n";
+is($img4->type, 'paletted', "image isn't paletted");
+print "# colors: ", $img4->colorcount,"\n";
+  cmp_ok($img4->colorcount, '<=', 16, "more than 16 colors!");
+#ok($img4->write(file=>'testout/t106_was4.ppm'),
+#   "Cannot write img4");
+# I know I'm using BMP before it's test, but comp4.tif started life 
+# as comp4.bmp
+my $bmp4 = Imager->new;
+ok($bmp4->read(file=>'testimg/comp4.bmp'), "reading 4-bit bmp!");
+my $diff = i_img_diff($img4->{IMG}, $bmp4->{IMG});
+print "# diff $diff\n";
+ok($diff == 0, "image mismatch");
+my $img4t = Imager->new;
+ok($img4t->read(file => 'testimg/comp4t.tif'), "read 4-bit paletted, tiled")
+  or print "# ", $img4t->errstr, "\n";
+is_image($bmp4, $img4t, "check tiled version matches");
+my $img8 = Imager->new;
+ok($img8->read(file=>'testimg/comp8.tif'), "reading 8-bit paletted");
+is($img8->type, 'paletted', "image isn't paletted");
+print "# colors: ", $img8->colorcount,"\n";
+#ok($img8->write(file=>'testout/t106_was8.ppm'),
+#   "Cannot write img8");
+ok($img8->colorcount == 256, "more colors than expected");
+my $bmp8 = Imager->new;
+ok($bmp8->read(file=>'testimg/comp8.bmp'), "reading 8-bit bmp!");
+$diff = i_img_diff($img8->{IMG}, $bmp8->{IMG});
+print "# diff $diff\n";
+ok($diff == 0, "image mismatch");
+my $bad = Imager->new;
+ok($bad->read(file=>'testimg/comp4bad.tif', 
+             allow_incomplete=>1), "bad image not returned");
+ok(scalar $bad->tags(name=>'i_incomplete'), "incomplete tag not set");
+ok($img8->write(file=>'testout/t106_pal8.tif'), "writing 8-bit paletted");
+my $cmp8 = Imager->new;
+ok($cmp8->read(file=>'testout/t106_pal8.tif'),
+   "reading 8-bit paletted");
+#print "# ",$cmp8->errstr,"\n";
+is($cmp8->type, 'paletted', "pal8 isn't paletted");
+is($cmp8->colorcount, 256, "pal8 bad colorcount");
+$diff = i_img_diff($img8->{IMG}, $cmp8->{IMG});
+print "# diff $diff\n";
+ok($diff == 0, "written image doesn't match read");
+ok($img4->write(file=>'testout/t106_pal4.tif'), "writing 4-bit paletted");
+ok(my $cmp4 = Imager->new->read(file=>'testout/t106_pal4.tif'),
+   "reading 4-bit paletted");
+is($cmp4->type, 'paletted', "pal4 isn't paletted");
+is($cmp4->colorcount, 16, "pal4 bad colorcount");
+$diff = i_img_diff($img4->{IMG}, $cmp4->{IMG});
+print "# diff $diff\n";
+ok($diff == 0, "written image doesn't match read");
+
+my $work;
+my $seekpos;
+sub io_writer {
+  my ($what) = @_;
+  if ($seekpos > length $work) {
+    $work .= "\0" x ($seekpos - length $work);
+  }
+  substr($work, $seekpos, length $what) = $what;
+  $seekpos += length $what;
+  
+  1;
+}
+sub io_reader {
+  my ($size, $maxread) = @_;
+  #print "io_reader($size, $maxread) pos $seekpos\n";
+  my $out = substr($work, $seekpos, $maxread);
+  $seekpos += length $out;
+  $out;
+}
+sub io_reader2 {
+  my ($size, $maxread) = @_;
+  #print "io_reader2($size, $maxread) pos $seekpos\n";
+  my $out = substr($work, $seekpos, $size);
+  $seekpos += length $out;
+  $out;
+}
+use IO::Seekable;
+sub io_seeker {
+  my ($offset, $whence) = @_;
+  #print "io_seeker($offset, $whence)\n";
+  if ($whence == SEEK_SET) {
+    $seekpos = $offset;
+  }
+  elsif ($whence == SEEK_CUR) {
+    $seekpos += $offset;
+  }
+  else { # SEEK_END
+    $seekpos = length($work) + $offset;
+  }
+  #print "-> $seekpos\n";
+  $seekpos;
+}
+my $did_close;
+sub io_closer {
+  ++$did_close;
+}
+
+# read via cb
+$work = $tiffdata;
+$seekpos = 0;
+my $IO2 = Imager::io_new_cb(undef, \&io_reader, \&io_seeker, undef);
+ok($IO2, "new readcb obj");
+my $img5 = Imager::File::TIFF::i_readtiff_wiol($IO2);
+ok($img5, "read via cb");
+ok(i_img_diff($img5, $img) == 0, "read from cb diff");
+
+# read via cb2
+$work = $tiffdata;
+$seekpos = 0;
+my $IO3 = Imager::io_new_cb(undef, \&io_reader2, \&io_seeker, undef);
+ok($IO3, "new readcb2 obj");
+my $img6 = Imager::File::TIFF::i_readtiff_wiol($IO3);
+ok($img6, "read via cb2");
+ok(i_img_diff($img6, $img) == 0, "read from cb2 diff");
+
+# write via cb
+$work = '';
+$seekpos = 0;
+my $IO4 = Imager::io_new_cb(\&io_writer, \&io_reader, \&io_seeker,
+                           \&io_closer);
+ok($IO4, "new writecb obj");
+ok(Imager::File::TIFF::i_writetiff_wiol($img, $IO4), "write to cb");
+is($work, $odata, "write cb match");
+ok($did_close, "write cb did close");
+open D1, ">testout/d1.tiff" or die;
+print D1 $work;
+close D1;
+open D2, ">testout/d2.tiff" or die;
+print D2 $tiffdata;
+close D2;
+
+# write via cb2
+$work = '';
+$seekpos = 0;
+$did_close = 0;
+my $IO5 = Imager::io_new_cb(\&io_writer, \&io_reader, \&io_seeker,
+                           \&io_closer, 1);
+ok($IO5, "new writecb obj 2");
+ok(Imager::File::TIFF::i_writetiff_wiol($img, $IO5), "write to cb2");
+is($work, $odata, "write cb2 match");
+ok($did_close, "write cb2 did close");
+
+open D3, ">testout/d3.tiff" or die;
+print D3 $work;
+close D3;
+
+# multi-image write/read
+my @imgs;
+push(@imgs, map $ooim->copy(), 1..3);
+for my $i (0..$#imgs) {
+  $imgs[$i]->addtag(name=>"tiff_pagename", value=>"Page ".($i+1));
+}
+my $rc = Imager->write_multi({file=>'testout/t106_multi.tif'}, @imgs);
+ok($rc, "writing multiple images to tiff");
+my @out = Imager->read_multi(file=>'testout/t106_multi.tif');
+ok(@out == @imgs, "reading multiple images from tiff");
+@out == @imgs or print "# ",scalar @out, " ",Imager->errstr,"\n";
+for my $i (0..$#imgs) {
+  ok(i_img_diff($imgs[$i]{IMG}, $out[$i]{IMG}) == 0,
+     "comparing image $i");
+  my ($tag) = $out[$i]->tags(name=>'tiff_pagename');
+  is($tag, "Page ".($i+1),
+     "tag doesn't match original image");
+}
+
+# writing even more images to tiff - we weren't handling more than five
+# correctly on read
+@imgs = map $ooim->copy(), 1..40;
+$rc = Imager->write_multi({file=>'testout/t106_multi2.tif'}, @imgs);
+ok($rc, "writing 40 images to tiff");
+@out = Imager->read_multi(file=>'testout/t106_multi2.tif');
+ok(@imgs == @out, "reading 40 images from tiff");
+# force some allocation activity - helps crash here if it's the problem
+@out = @imgs = ();
+
+# multi-image fax files
+ok(Imager->write_multi({file=>'testout/t106_faxmulti.tiff', class=>'fax'},
+                      $oofim, $oofim), "write multi fax image");
+@imgs = Imager->read_multi(file=>'testout/t106_faxmulti.tiff');
+ok(@imgs == 2, "reading multipage fax");
+ok(Imager::i_img_diff($imgs[0]{IMG}, $oofim->{IMG}) == 0,
+   "compare first fax image");
+ok(Imager::i_img_diff($imgs[1]{IMG}, $oofim->{IMG}) == 0,
+   "compare second fax image");
+
+my ($format) = $imgs[0]->tags(name=>'i_format');
+is($format, 'tiff', "check i_format tag");
+
+my $unit = $imgs[0]->tags(name=>'tiff_resolutionunit');
+ok(defined $unit && $unit == 2, "check tiff_resolutionunit tag");
+my $unitname = $imgs[0]->tags(name=>'tiff_resolutionunit_name');
+is($unitname, 'inch', "check tiff_resolutionunit_name tag");
+
+my $warned = Imager->new;
+ok($warned->read(file=>"testimg/tiffwarn.tif"), "read tiffwarn.tif");
+my ($warning) = $warned->tags(name=>'i_warning');
+ok(defined $warning && $warning =~ /unknown field with tag 28712/,
+   "check that warning tag set and correct");
+
+{ # support for reading a given page
+  # first build a simple test image
+  my $im1 = Imager->new(xsize=>50, ysize=>50);
+  $im1->box(filled=>1, color=>$blue);
+  $im1->addtag(name=>'tiff_pagename', value => "Page One");
+  my $im2 = Imager->new(xsize=>60, ysize=>60);
+  $im2->box(filled=>1, color=>$green);
+  $im2->addtag(name=>'tiff_pagename', value=>"Page Two");
+  
+  # read second page
+  my $page_file = 'testout/t106_pages.tif';
+  ok(Imager->write_multi({ file=> $page_file}, $im1, $im2),
+     "build simple multiimage for page tests");
+  my $imwork = Imager->new;
+  ok($imwork->read(file=>$page_file, page=>1),
+     "read second page");
+  is($im2->getwidth, $imwork->getwidth, "check width");
+  is($im2->getwidth, $imwork->getheight, "check height");
+  is(i_img_diff($imwork->{IMG}, $im2->{IMG}), 0,
+     "check image content");
+  my ($page_name) = $imwork->tags(name=>'tiff_pagename');
+  is($page_name, 'Page Two', "check tag we set");
+  
+  # try an out of range page
+  ok(!$imwork->read(file=>$page_file, page=>2),
+     "check out of range page");
+  is($imwork->errstr, "could not switch to page 2", "check message");
+}
+
+{ # test writing returns an error message correctly
+  # open a file read only and try to write to it
+  open TIFF, "> testout/t106_empty.tif" or die;
+  close TIFF;
+  open TIFF, "< testout/t106_empty.tif"
+    or skip "Cannot open testout/t106_empty.tif for reading", 8;
+  binmode TIFF;
+  my $im = Imager->new(xsize=>100, ysize=>100);
+  ok(!$im->write(fh => \*TIFF, type=>'tiff'),
+     "fail to write to read only handle");
+  cmp_ok($im->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
+        "check error message");
+  ok(!Imager->write_multi({ type => 'tiff', fh => \*TIFF }, $im),
+     "fail to write multi to read only handle");
+  cmp_ok(Imager->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
+        "check error message");
+  ok(!$im->write(fh => \*TIFF, type=>'tiff', class=>'fax'),
+     "fail to write to read only handle (fax)");
+  cmp_ok($im->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
+        "check error message");
+  ok(!Imager->write_multi({ type => 'tiff', fh => \*TIFF, class=>'fax' }, $im),
+     "fail to write multi to read only handle (fax)");
+  cmp_ok(Imager->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
+        "check error message");
+}
+
+{ # test reading returns an error correctly - use test script as an
+  # invalid TIFF file
+  my $im = Imager->new;
+  ok(!$im->read(file=>'t/t10tiff.t', type=>'tiff'),
+     "fail to read script as image");
+  # we get different magic number values depending on the platform
+  # byte ordering
+  cmp_ok($im->errstr, '=~',
+        "Error opening file: Not a TIFF (?:or MDI )?file, bad magic number (8483 \\(0x2123\\)|8993 \\(0x2321\\))", 
+        "check error message");
+  my @ims = Imager->read_multi(file =>'t/t106tiff.t', type=>'tiff');
+  ok(!@ims, "fail to read_multi script as image");
+  cmp_ok($im->errstr, '=~',
+        "Error opening file: Not a TIFF (?:or MDI )?file, bad magic number (8483 \\(0x2123\\)|8993 \\(0x2321\\))", 
+        "check error message");
+}
+
+{ # write_multi to data
+  my $data;
+  my $im = Imager->new(xsize => 50, ysize => 50);
+  ok(Imager->write_multi({ data => \$data, type=>'tiff' }, $im, $im),
+     "write multi to in memory");
+  ok(length $data, "make sure something written");
+  my @im = Imager->read_multi(data => $data);
+  is(@im, 2, "make sure we can read it back");
+  is(Imager::i_img_diff($im[0]{IMG}, $im->{IMG}), 0,
+     "check first image");
+  is(Imager::i_img_diff($im[1]{IMG}, $im->{IMG}), 0,
+     "check second image");
+}
+
+{ # handling of an alpha channel for various images
+  my $photo_rgb = 2;
+  my $photo_cmyk = 5;
+  my $photo_cielab = 8;
+  my @alpha_images =
+    (
+     [ 'srgb.tif',    3, $photo_rgb,    '003005005' ],
+     [ 'srgba.tif',   4, $photo_rgb,    '003005005' ],
+     [ 'srgbaa.tif',  4, $photo_rgb,    '003005005' ],
+     [ 'scmyk.tif',   3, $photo_cmyk,   '003005005' ],
+     [ 'scmyka.tif',  4, $photo_cmyk,   '003005005' ],
+     [ 'scmykaa.tif', 4, $photo_cmyk,   '003005005' ],
+     [ 'slab.tif',    3, $photo_cielab, '003006001' ],
+    );
+  
+  for my $test (@alpha_images) {
+    my ($input, $channels, $photo, $need_ver) = @$test;
+    
+  SKIP: {
+      my $skipped = $channels == 4 ? 4 : 3;
+      $need_ver le $cmp_ver
+       or skip("Your ancient tifflib is buggy/limited for this test", $skipped);
+      my $im = Imager->new;
+      ok($im->read(file => "testimg/$input"),
+        "read alpha test $input")
+       or print "# ", $im->errstr, "\n";
+      is($im->getchannels, $channels, "channels for $input match");
+      is($im->tags(name=>'tiff_photometric'), $photo,
+        "photometric for $input match");
+      $channels == 4
+       or next;
+      my $c = $im->getpixel(x => 0, 'y' => 7);
+      is(($c->rgba)[3], 0, "bottom row should have 0 alpha");
+    }
+  }
+}
+
+{
+  ok(grep($_ eq 'tiff', Imager->read_types), "check tiff in read types");
+  ok(grep($_ eq 'tiff', Imager->write_types), "check tiff in write types");
+}
+
+{ # reading tile based images
+  my $im = Imager->new;
+  ok($im->read(file => 'testimg/pengtile.tif'), "read tiled image")
+    or print "# ", $im->errstr, "\n";
+  # compare it
+  my $comp = Imager->new;
+  ok($comp->read(file => 'testimg/penguin-base.ppm'), 'read comparison image');
+  is_image($im, $comp, 'compare them');
+}
+
+SKIP:
+{ # failing to read tile based images
+  # we grab our tiled image and patch a tile offset to nowhere
+  ok(open(TIFF, '< testimg/pengtile.tif'), 'open pengtile.tif')
+    or skip 'cannot open testimg/pengtile.tif', 4;
+  
+  $cmp_ver ge '003005007'
+    or skip("Your ancient tifflib has bad error handling", 4);
+  binmode TIFF;
+  my $data = do { local $/; <TIFF>; };
+  
+  # patch a tile offset
+  substr($data, 0x1AFA0, 4) = pack("H*", "00000200");
+  
+  #open PIPE, "| bytedump -a | less" or die;
+  #print PIPE $data;
+  #close PIPE;
+  
+  my $allow = Imager->new;
+  ok($allow->read(data => $data, allow_incomplete => 1),
+     "read incomplete tiled");
+  ok($allow->tags(name => 'i_incomplete'), 'i_incomplete set');
+  is($allow->tags(name => 'i_lines_read'), 173, 
+     'check i_lines_read set appropriately');
+  
+  my $fail = Imager->new;
+  ok(!$fail->read(data => $data), "read fail tiled");
+}
+
+{ # read 16-bit/sample
+  my $im16 = Imager->new;
+  ok($im16->read(file => 'testimg/rgb16.tif'), "read 16-bit rgb");
+  is($im16->bits, 16, 'got a 16-bit image');
+  my $im16t = Imager->new;
+  ok($im16t->read(file => 'testimg/rgb16t.tif'), "read 16-bit rgb tiled");
+  is($im16t->bits, 16, 'got a 16-bit image');
+  is_image($im16, $im16t, 'check they match');
+  
+  my $grey16 = Imager->new;
+  ok($grey16->read(file => 'testimg/grey16.tif'), "read 16-bit grey")
+    or print "# ", $grey16->errstr, "\n";
+  is($grey16->bits, 16, 'got a 16-bit image');
+  is($grey16->getchannels, 1, 'and its grey');
+  my $comp16 = $im16->convert(matrix => [ [ 0.299, 0.587, 0.114 ] ]);
+  is_image($grey16, $comp16, 'compare grey to converted');
+  
+  my $grey32 = Imager->new;
+  ok($grey32->read(file => 'testimg/grey32.tif'), "read 32-bit grey")
+    or print "# ", $grey32->errstr, "\n";
+  is($grey32->bits, 'double', 'got a double image');
+  is($grey32->getchannels, 2, 'and its grey + alpha');
+  is($grey32->tags(name => 'tiff_bitspersample'), 32, 
+     "check bits per sample");
+  my $base = test_image_double->convert(preset =>'grey')
+    ->convert(preset => 'addalpha');
+  is_image($grey32, $base, 'compare to original');
+}
+
+{ # read 16, 32-bit/sample and compare to the original
+  my $rgba = Imager->new;
+  ok($rgba->read(file => 'testimg/srgba.tif'),
+     "read base rgba image");
+  my $rgba16 = Imager->new;
+  ok($rgba16->read(file => 'testimg/srgba16.tif'),
+     "read 16-bit/sample rgba image");
+  is_image($rgba, $rgba16, "check they match");
+  is($rgba16->bits, 16, 'check we got the right type');
+  
+  my $rgba32 = Imager->new;
+  ok($rgba32->read(file => 'testimg/srgba32.tif'),
+     "read 32-bit/sample rgba image");
+  is_image($rgba, $rgba32, "check they match");
+  is($rgba32->bits, 'double', 'check we got the right type');
+  
+  my $cmyka16 = Imager->new;
+  ok($cmyka16->read(file => 'testimg/scmyka16.tif'),
+     "read cmyk 16-bit")
+    or print "# ", $cmyka16->errstr, "\n";
+  is($cmyka16->bits, 16, "check we got the right type");
+  is_image_similar($rgba, $cmyka16, 10, "check image data");
+
+  # tiled, non-contig, should fallback to RGBA code
+  my $rgbatsep = Imager->new;
+  ok($rgbatsep->read(file => 'testimg/rgbatsep.tif'),
+     "read tiled, separated rgba image")
+    or diag($rgbatsep->errstr);
+  is_image($rgba, $rgbatsep, "check they match");
+}
+{ # read bi-level
+  my $pbm = Imager->new;
+  ok($pbm->read(file => 'testimg/imager.pbm'), "read original pbm");
+  my $tif = Imager->new;
+  ok($tif->read(file => 'testimg/imager.tif'), "read mono tif");
+  is_image($pbm, $tif, "compare them");
+  is($tif->type, 'paletted', 'check image type');
+  is($tif->colorcount, 2, 'check we got a "mono" image');
+}
+
+{ # check alpha channels scaled correctly for fallback handler
+  my $im = Imager->new;
+  ok($im->read(file=>'testimg/alpha.tif'), 'read alpha check image');
+  my @colors =
+    (
+     [ 0, 0, 0 ],
+     [ 255, 255, 255 ],
+     [ 127, 0, 127 ],
+     [ 127, 127, 0 ],
+    );
+  my @alphas = ( 255, 191, 127, 63 );
+  my $ok = 1;
+  my $msg = 'alpha check ok';
+ CHECKER:
+  for my $y (0 .. 3) {
+    for my $x (0 .. 3) {
+      my $c = $im->getpixel(x => $x, 'y' => $y);
+      my @c = $c->rgba;
+      my $alpha = pop @c;
+      if ($alpha != $alphas[$y]) {
+       $ok = 0;
+       $msg = "($x,$y) alpha mismatch $alpha vs $alphas[$y]";
+       last CHECKER;
+      }
+      my $expect = $colors[$x];
+      for my $ch (0 .. 2) {
+       if (abs($expect->[$ch]-$c[$ch]) > 3) {
+         $ok = 0;
+         $msg = "($x,$y)[$ch] color mismatch got $c[$ch] vs expected $expect->[$ch]";
+         last CHECKER;
+       }
+      }
+    }
+  }
+  ok($ok, $msg);
+}
+
+{ # check alpha channels scaled correctly for greyscale
+  my $im = Imager->new;
+  ok($im->read(file=>'testimg/gralpha.tif'), 'read alpha check grey image');
+  my @greys = ( 0, 255, 52, 112 );
+  my @alphas = ( 255, 191, 127, 63 );
+  my $ok = 1;
+  my $msg = 'alpha check ok';
+ CHECKER:
+  for my $y (0 .. 3) {
+    for my $x (0 .. 3) {
+      my $c = $im->getpixel(x => $x, 'y' => $y);
+      my ($grey, $alpha) = $c->rgba;
+      if ($alpha != $alphas[$y]) {
+       $ok = 0;
+       $msg = "($x,$y) alpha mismatch $alpha vs $alphas[$y]";
+       last CHECKER;
+      }
+      if (abs($greys[$x] - $grey) > 3) {
+       $ok = 0;
+       $msg = "($x,$y) grey mismatch $grey vs $greys[$x]";
+       last CHECKER;
+      }
+    }
+  }
+  ok($ok, $msg);
+}
+
+{ # 16-bit writes
+  my $orig = test_image_16();
+  my $data;
+  ok($orig->write(data => \$data, type => 'tiff', 
+                 tiff_compression => 'none'), "write 16-bit/sample");
+  my $im = Imager->new;
+  ok($im->read(data => $data), "read it back");
+  is_image($im, $orig, "check read data matches");
+  is($im->tags(name => 'tiff_bitspersample'), 16, "correct bits");
+  is($im->bits, 16, 'check image bits');
+  is($im->tags(name => 'tiff_photometric'), 2, "correct photometric");
+    is($im->tags(name => 'tiff_compression'), 'none', "no compression");
+  is($im->getchannels, 3, 'correct channels');
+}
+
+{ # 8-bit writes
+  # and check compression
+  my $compress = Imager::File::TIFF::i_tiff_has_compression('lzw') ? 'lzw' : 'packbits';
+  my $orig = test_image()->convert(preset=>'grey')
+    ->convert(preset => 'addalpha');
+  my $data;
+  ok($orig->write(data => \$data, type => 'tiff',
+                 tiff_compression=> $compress),
+     "write 8 bit")
+    or print "# ", $orig->errstr, "\n";
+  my $im = Imager->new;
+  ok($im->read(data => $data), "read it back");
+  is_image($im, $orig, "check read data matches");
+  is($im->tags(name => 'tiff_bitspersample'), 8, 'correct bits');
+  is($im->bits, 8, 'check image bits');
+  is($im->tags(name => 'tiff_photometric'), 1, 'correct photometric');
+  is($im->tags(name => 'tiff_compression'), $compress,
+     "$compress compression");
+  is($im->getchannels, 2, 'correct channels');
+}
+
+{ # double writes
+  my $orig = test_image_double()->convert(preset=>'addalpha');
+  my $data;
+  ok($orig->write(data => \$data, type => 'tiff', 
+                 tiff_compression => 'none'), 
+     "write 32-bit/sample from double")
+    or print "# ", $orig->errstr, "\n";
+  my $im = Imager->new;
+  ok($im->read(data => $data), "read it back");
+  is_image($im, $orig, "check read data matches");
+  is($im->tags(name => 'tiff_bitspersample'), 32, "correct bits");
+  is($im->bits, 'double', 'check image bits');
+  is($im->tags(name => 'tiff_photometric'), 2, "correct photometric");
+  is($im->tags(name => 'tiff_compression'), 'none', "no compression");
+  is($im->getchannels, 4, 'correct channels');
+}
+
+{ # bilevel
+  my $im = test_image()->convert(preset => 'grey')
+    ->to_paletted(make_colors => 'mono',
+                 translate => 'errdiff');
+  my $faxdata;
+  
+  # fax compression is written as miniswhite
+  ok($im->write(data => \$faxdata, type => 'tiff', 
+               tiff_compression => 'fax3'),
+     "write bilevel fax compressed");
+  my $fax = Imager->new;
+  ok($fax->read(data => $faxdata), "read it back");
+  ok($fax->is_bilevel, "got a bi-level image back");
+  is($fax->tags(name => 'tiff_compression'), 'fax3',
+     "check fax compression used");
+  is_image($fax, $im, "compare to original");
+  
+  # other compresion written as minisblack
+  my $packdata;
+  ok($im->write(data => \$packdata, type => 'tiff',
+               tiff_compression => 'jpeg'),
+     "write bilevel packbits compressed");
+  my $packim = Imager->new;
+  ok($packim->read(data => $packdata), "read it back");
+  ok($packim->is_bilevel, "got a bi-level image back");
+  is($packim->tags(name => 'tiff_compression'), 'packbits',
+     "check fallback compression used");
+  is_image($packim, $im, "compare to original");
+}
+
+{ # fallback handling of tiff
+  is(Imager::File::TIFF::i_tiff_has_compression('none'), 1, "can always do uncompresed");
+  is(Imager::File::TIFF::i_tiff_has_compression('xxx'), '', "can't do xxx compression");
+}
+
+
diff --git a/TIFF/testimg/alpha.tif b/TIFF/testimg/alpha.tif
new file mode 100644 (file)
index 0000000..b56a9a0
Binary files /dev/null and b/TIFF/testimg/alpha.tif differ
diff --git a/TIFF/testimg/comp4.bmp b/TIFF/testimg/comp4.bmp
new file mode 100644 (file)
index 0000000..9af4da4
Binary files /dev/null and b/TIFF/testimg/comp4.bmp differ
diff --git a/TIFF/testimg/comp4.tif b/TIFF/testimg/comp4.tif
new file mode 100755 (executable)
index 0000000..d561948
Binary files /dev/null and b/TIFF/testimg/comp4.tif differ
diff --git a/TIFF/testimg/comp4bad.tif b/TIFF/testimg/comp4bad.tif
new file mode 100755 (executable)
index 0000000..015ec3f
Binary files /dev/null and b/TIFF/testimg/comp4bad.tif differ
diff --git a/TIFF/testimg/comp4t.tif b/TIFF/testimg/comp4t.tif
new file mode 100644 (file)
index 0000000..0140a27
Binary files /dev/null and b/TIFF/testimg/comp4t.tif differ
diff --git a/TIFF/testimg/comp8.bmp b/TIFF/testimg/comp8.bmp
new file mode 100644 (file)
index 0000000..14ddacc
Binary files /dev/null and b/TIFF/testimg/comp8.bmp differ
diff --git a/TIFF/testimg/comp8.tif b/TIFF/testimg/comp8.tif
new file mode 100755 (executable)
index 0000000..5dc4f32
Binary files /dev/null and b/TIFF/testimg/comp8.tif differ
diff --git a/TIFF/testimg/gralpha.tif b/TIFF/testimg/gralpha.tif
new file mode 100644 (file)
index 0000000..7fa6def
Binary files /dev/null and b/TIFF/testimg/gralpha.tif differ
diff --git a/TIFF/testimg/grey16.tif b/TIFF/testimg/grey16.tif
new file mode 100755 (executable)
index 0000000..9dc3a21
Binary files /dev/null and b/TIFF/testimg/grey16.tif differ
diff --git a/TIFF/testimg/grey32.tif b/TIFF/testimg/grey32.tif
new file mode 100644 (file)
index 0000000..a3844b8
Binary files /dev/null and b/TIFF/testimg/grey32.tif differ
diff --git a/TIFF/testimg/imager.pbm b/TIFF/testimg/imager.pbm
new file mode 100644 (file)
index 0000000..610caf3
Binary files /dev/null and b/TIFF/testimg/imager.pbm differ
diff --git a/TIFF/testimg/imager.tif b/TIFF/testimg/imager.tif
new file mode 100644 (file)
index 0000000..8c2bfed
Binary files /dev/null and b/TIFF/testimg/imager.tif differ
diff --git a/TIFF/testimg/pengtile.tif b/TIFF/testimg/pengtile.tif
new file mode 100644 (file)
index 0000000..de7c5a2
Binary files /dev/null and b/TIFF/testimg/pengtile.tif differ
diff --git a/TIFF/testimg/penguin-base.ppm b/TIFF/testimg/penguin-base.ppm
new file mode 100644 (file)
index 0000000..4f7b5ed
--- /dev/null
@@ -0,0 +1,279 @@
+P6
+# CREATOR: The GIMP's PNM Filter Version 1.0
+164 180
+255
+þþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþúýþùýþùýþûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüýýûüüúþþüþþüþþüþþüþþüýýûýýûýýûýýûþþüýýûþþüýýûüüúýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýýýýýþþþýýý\9a\9a\9a\80\80\80\80\80\80\80\80\80\80\80\80\1f\1f\1f%%%\81\81\81\7f\7f\7f\80\80\80   þþþýýýýýýýýýþþýþþüþþüþÿûþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþýýþ××ÙZZ\\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 5\ 5\a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5aabÝÝÞýýýþþýþþüþÿûþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúþþüýýûþþüþþüýýüþþþ\98\98\98\e\e\1c\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5!!"\9e\9e\9eþþüýýûýþúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûýýûýýûþþý×××YYY\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4\ 1\ 1\ 1!!!\9e\9e\9cþþüýýûýýûýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûþþüýýüÖÖÖ\1a\1a\1a\ 4\ 4\ 6\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 3\ 3\ 5\ 1\ 1\ 2\ 4\ 4\ 4\ 3\ 3\ 3\1e\1e\1eÛÛÚüüúþþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþünnn\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 4\ 4\ 4\ 3\ 3\ 3\ 5\ 5\ 6\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 3\ 3\ 3\ 3zzyýýüþþýþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû¬¬¬\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4\10\10\10\1f\1f\1f\1f\1f\1f\13\13\13\b\b\b\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 2\ 6]]`ÜÜÝþþÿþþÿýýýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÔÔÒ\19\19\19\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 2\ 2\ 4\ 2\ 2\ 4
+
+
+\1e\1e\1e333CCC???---\14\14\14\ 5\ 5\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\a\1f\1e"ÚÚÜýýþüüüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýý...\ 1\ 1\ 1\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 5\ 5\a\r\r\ e%%%BBB___cccPPP222\19\19\19\b\b\b\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5xxyýýþýýûýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü««ª\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\f\f\r'''MMMoooyyydddCCC(((\15\15\15\a\a\a\ 1\ 1\ 1\ 3\ 3\ 4\ 2\ 2\ 2wwwýýüýþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûüüúýýû---\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ e\ e\ e+++OOOqqqtttbbbGGG333!!\1f\ f\ f\ f\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\1d\1d\1dÙÙØþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüüüúªª¨\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ f\ f\10---OOOggg]]]LLL888///%%%\16\16\16\ 6\ 6\ 6\ 2\ 2\ 3\ 2\ 2\ 4\ 3\ 3\ 3777ýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû--,\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 5\ 5\a\12\12\13(((AAAFFF<<<---!!!\19\19\19\17\17\17\v\v\v\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 2´´´þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÔÔÒ\17\17\17\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\ 3\ 3\ 5\ f\ f\ f   ***%%%\1a\1a\1a\10\10\10\a\a\a\ 4\ 4\ 4\ 5\ 5\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 2\ 6\ 2\ 1\ 6\ 2\ 2\ 5\ 3\ 3\ 5668ýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýýªª«\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5              
+\10\10\10\13\13\13
+
+
+\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5³³´ýýûþþüýýûþþüþþüþþýþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüûûû--.\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 6\ 6\ 6\ 5\ 5\ 5\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4667ýýüüüúüüúþþüþþüþþýþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýý++-\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\1c\1c\1dØØØýýüþþüþþüþþüþþüþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýý,,.\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 1\ 6\ 2\ 1\ 6\ 2\ 1\ 6\ 2\ 1\ 6\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2³³³ýýüþþûþþüþþüþþüþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 2\ 6\ 2\ 2\ 6\ 2\ 2\ 6\ 3\ 3\a\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4556üüûýýûþÿûþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3\a\a\a\a\a\a\r\r\r\ e\ e\ e\b\b     \ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 4\ 4\ 6
+
+\f\14\14\16  "\1f\1f!\b\b
+\ 2\ 2\ 4\ 2\ 2\ 6\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4555ýýûýýûþþúþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 1\ 1\ 1\a\a\a\v\v\v\a\a\a\ 6\ 6\ 6\14\14\14...++-\r\r\ f\ 4\ 4\ 6\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\12\12\12>>@FFH\12\12\14\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5556ýýýüüûþþúþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 4\ 4\ 4\ 6\ 6\ 6\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3
+
+
+!!"224\11\11\13\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 3\ 3\ 3\ 4\15\15\17335EEE;;;\16\16\16\ 2\ 2\ 2                   444889\ 6\ 6\b\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6²²²þþýþÿûþÿúþÿúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþü©©§\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ f\ f\11224PPP<<<\10\10\10\ 4\ 4\ 4&&&224
+
+\f\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 2\a\ 4\ 3\ 6\ 2\ 2\ 3\ 3\ 3\ 3\1e\1e\1dRRQttr\85\85\84\95\95\95\99\99\99\94\94\94\\\\ e\ e\ e\ 6\ 6\ 6...\1f\1f\1f\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4±±²ýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþü©©§\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\1c\1c\1eggh\97\97\97³³³­­­yyy)))\ 5\ 5\ 5\13\13\15\10\10\12\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 2\ 6\ 4\ 4\ 6\ 5\ 5\ 5000iig\83\83\81\92\92\90\9f\9f\9fªªª²²²¾¾¾¿¿¿qqq\11\11\11\a\a\a\11\11\11              
+\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6²²³þþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©§\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 2
+
+
+\\\\93\93\93´´´ÇÇÆÃÃÁ­­«~~},,,\ 6\ 6\ 6\b\b
+\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 3\a\ 2\ 2\ 4(()lll\93\93\91¦¦¤³³±¸¸·¿¿¿ÄÄÄÑÑÑÁÁÁ¢¢¢RRR\b\b\b\ 5\ 5\ 5\f\f\r\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5²²²ýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2'''\7f\7f\7f¥¥£ÁÁ¿ÒÒÐÑÑÏÊÊÈ­­¬yyy\13\13\13\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\r\r\ f]]]\99\99\97ÇÇÅââàìììòòòôôôóóóíííØØØ®®®{{{%%%\ 2\ 2\ 2\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4sstýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü©©©\ 2\ 2\ 4\ 2\ 2\ 5\ 4\ 4\ 5OOO¬¬¬ÞÞÜôôòûûùüüúüüúûûûãããDDD\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4((*§§¨ææäýýûþþýþþþíííÎÎÎçççýýýúúúñññ···YYY\ 6\ 6\ 6\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ©©©\ 1\ 1\ 3\ 2\ 2\ 6\b\b     |||èèèõõõ¢¢¢qqo  \9eððîýýüüüü\93\93\93\ 6\ 6\ 6\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 4\ 3\ 3\ 5\ 3\ 3\ 5JJJÉÉÉööôýýûûûú¨¨¨$$&\f\f\r'''\8a\8a\8aôôôýýýùùù­­­\16\16\16\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ©©ª\ 2\ 1\ 5\ 2\ 1\ 6\12\11\14¯¯±÷÷ù\90\90\90                   ***===kkkññïýýûÉÉÈ\18\18\18\ 6\ 6\ 6\ 3\ 3\ 3
+
+
+\ 5\ 5\ 5\ 2\ 2\ 3VVWÓÓÓûûùüüúººº\15\15\15\ 2\ 2\ 4888zzzGGGzzzõõõýýýååå777\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 3\ 2\a\ 2\ 1\a\1a\1a\1cÄÄÆìëí436\ 3\ 2\ 4:::xxw443\9b\9c\9aýýûÝÝÝ)))\ f\ f\ f\r\r\ e\1d\1d\1d\ f\ e\ e\ 4\ 3\ 3``aÔÕÕûûúóóòIII\ 2\ 2\ 1\ 2\ 2\ 2\r\r\rSSS}}}///ÄÄÄþþþ÷ø÷_`^\ 6\ 6\a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû¨¨¨\ 2\ 2\ 4\ 2\ 2\ 4\1c\1f\1eÄÇÇÄÃÇ\15\11\17\ 6\ 2\ 5\ f\ e\rYYUKLHTWVóöõààÝ331\16\17\18\1f ";;;HDC0,*`^bÒÔ×øüüÈÉË\15\15\16\ 3\ 3\0\ 3\ 3\ 1\ 6\ 5\ 4"!\1fYWW/.0\8c\8c\8eúýýøýù\81\88\80\ 4\ 6\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûÓÓÓ\16\16\17\ 3\ 2\ 5\1d\e!ÆÃź¹µ\10\11\ e\ 1\ 4\ 3\ 3\ 6\ 4+,*HDF.-.ääáÖÑË(#\1d
+\a\ 4\ 6\ 6\ 5\ 6\b\ 6\ e\ e\f\16\1a\14'+,³³¶ôôô¶¶º     
+\ e\ 2\ 2\ 4\ 5\ 3\v        \b\r\a\a\ 6\r\r\v\1e\1c\1cqnqûøüüøü\96\92\97\ 5\ 3\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüü,,.\ 3\ 2\ 5\1e\18\1dÀ½¼ÉËÅ\e\1e\1c\ 1\ 2\ 5\ 3\ 3\ 5\12\12\13)+-"%)ØÙ×\8e\88{\1a\ f\ 4 \14\0&\e\ 1$\19\0\1f\13\0\1a\12\ 2\16\ e\a\81wrðëæ¸·´      \v       \ 2\ 3\ 2\ 1\ 1
+\ 1\ 2\f\ 1\ 3\ 6\ 2\ 5\ 1\ 1\ 4\0qslüû÷úùö\94\92\8f\a\ 6\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýý**,\ 3\ 2\ 4\10\ e\ e«¬¬áäå.//\a\ 1\ 5\b\0\ 6\ 4\ 3\a\0\a\ 4#"\1d²¨\86\80m%Â¥\8a\eá\19É¢\14È\9c\16Í\9d\1eÃ\96\18\97v\16rc#¾\9dÏÌÂ\19\17\15\ 3\ 2\0\ 2\ 2\ 2\ 3\ 3\ 2\ 2\ 2\ 6\ 2\ 1\f\ 2\ 3\v\96\9a\98ûýõ÷ùð\82\83\7f\ 5\ 5\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4444þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ,,-\ 2\ 2\ 4\ 2\ 4\ 4\86\88\8cðñõ\8b\8a\87\11\r\f\a\0\a\b\ 1\ 2\14\v\0eF\v®\82\eË\9a\16êµ\17ì¸\fæ¶      Ã Â´\r׬\ fÅ\9e\10Ã\9b\13Ö®#ɦ2йuQF.\a\ 1\ 1\b\ 1\ 1\ 6\0\ 4\ 5\ 2\ 6\ 3\ 2\ 5/0/âåâýÿüëëëXVZ\ 5\ 4\a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5444ýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ,,-\ 2\ 2\ 3\0\ 4\ 1SSTåàäïîïSTV\b\ 2\ 36!\ 6\89e\16±\83\14°|\ 2Ú£\ fî¸\ fî»
+é¼
+á¹     Ã“­\ 6´\93
+\9dx\ 2Æ\9c\rè½\18ä»\17 \19mV\10"\13\ 2\b\ 2\ 2\ 3\ 3\ 1%'#ÀÅÂúÿþøüýÅÈÊ"!%\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\e\e\1c××Öþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ,,-\ 2\ 2\ 3\ 4\ 2\ 1"!\1fÃÂÄøöùëæÚzg7\9ar\16¿\89
+Ö\9f\ 4篠 Ã°Âµ\fñ·\fï¹\ eë½\ fèÁ\ fåÀ\räÀ\17á¾\1cçÈ\eîÑ\17êÊ\14çÃ\16ã¿\1cÍ©\1a\8fx\15o^ ÃÃ‚¦þùõýûúëíç|\7fz\ 3\ 5\a\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 4\ 4\ 4±±°ýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ,,-\ 2\ 2\ 5\ 5\ 1\a\a\ 6
+twxâÝÐϹ\87¬\83\1d½\88\ 3Ó\99\ eã­\15éµ\11ì¸\fë¹\bé¼\bç¿    Ã«Ã‡\ eîÍ\11îÒ\1eñÓ+ôÔ/÷Ö0öÕ.øÕ%öÑ\14óÉ\rî¿\14ß°\1cÈ¡*À¡KŰv¦\97r*!\14\ 5\ 2\ 1\ 3\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2±±°þþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþÿúþþüýýûýýý//0\ 1\ 1\ 4\ 1\ 3\ 1\ 2\ 3\ 22(\1d£\87Vª}!¿\86
+Ж\aܤ
+ç°\rëµ\fí¹
+ì¼     ÃªÂ¾
+êÁ\rìÇ\11ïÎ\13ðӠò×/ôØ>÷ÚDöÚ4õØ\1aöÕ\vöÐ\fôÍ\16òÇ\14ðÆ\ fë¿\16Ú°\1aÁ\99\19{W\ f\16\ e\0\ 1\ 3\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4±±±þþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþÿúþþüýýûüüü++-\ 3\ 2\a\ 3\ 2        \11\a\ 1YC\ e\9bx\13µ\84\aÊ\8d\ 6Ø\9b\ eâ«\fê´\vê´      Ã«Â·
+ì¼\rëÀ\fìÆ\ eîÌ\10ðÑ\15óÕ*õØ>÷ÚA÷Û=ôØ,öÙ\e÷Ø\14ù×\ føÛ\ fù×\12öÖ\12÷Õ\12öÑ\1eòÅ+Ö§)bL\ e
+\a\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5±±²ýýýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýý,,.\ 2\ 2\ 5    \ 1\ 4L2\f u\13²\80\ 6¿\88\ 4Ô\95\râ¡\13ä¯\ 4êµ\ 5ì¶\víº\10ë¾\ fëÄ\fìË\rìÎ\12ïÒ\1côÖ9øÙGùÚBöÙ*õÚ\16õØ\15õ×\14õ×\13õØ\ eøÙ\10ô×\12ëÎ\12ãÂ\15ôÇ+î»"\93s\19\14\r\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5rrsþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþýªª«\ 5\ 4\ 5\1c\10\ 3\85`\16¶x\b¿\80\ 3É\8f\ 3Û\9c\rç¦\13ç±\v츠  Ã«Â·\ví¼\11ìÂ\ fêÇ\bêÍ\fíÐ\eòÔ/÷ÚAøÙ@öØ-öØ\19öÙ\ e÷Ú\ eôØ\10ôØ\ e÷×\ föÏ\16áº\15±\87\ 5­\82\0Ùª\rà¯\11~_\11\ f\b\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4445ýýýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 3\ 2\ 3\a\94o\11¸w\ 3Å\82\ 5Ñ\96\ 5Þ¡\vè«\vé´\rë·\fíº\ eê½\rëÄ\vêË\aìÏ\10ðÓ'òÓ<õØ7õØ%ó×\13öØ\11÷×\12ö×\ fôÖ\ eóÖ\ fìË\18Ç\9b\rµ\84\ 3Â\8e\fÑ\9d Ã˜Â¡      Ã\9c\12fL\v
+\ 5\ 1\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\e\e\1cØØØþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþþþüþþüþþüþþüþþýªªª\ 3\ 2\ 2(   \90s\1a´}\fÈ\8c\rÓ\9c     ÃŸÂ¦      Ã§Â®\ 3î¹   Ã­Â¹\rì»\rë¿\vêÅ\bìÌ
+îÑ\15òÕ+÷Ø=õÖ*õØ\16ô×\10ö×\ e÷Ø\rõÕ\ fôÑ\17ܵ\16ª\84\ 5·\8a\ 6Ê\98\ 6Ó\9b\ 5Ü \bØ\9b\bÑ\9c\11dK\v
+\ 5\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4qqqþþýþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþþþþþþüþþüþþüþþýªªª\ 2\ 2\ 3\12\v\ 4T>\10\86_\v½\8d\16ؤ\13à¬\ 5ë´
+ï·\ fîº\rí½\fìÃ\fíÉ\ eíÍ\12ïÒ\19óÖ#ô×&öÖ\1a÷Ö\15ô×\ fñÓ\10ñÏ\17êÄ\19Ä\97\r«y\ 1Á\91\ 4Ð\9a       Ã•\9b\rÙ\9c\rÚ\9d\ eÕ\9a\ eÄ\92\1aL7\b\ 4\ 2\ 1\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5\ e\ e\10\f\f\ e\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 3\ 3\ 3333þþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþþþþþþüþþüþþüþþýªªª\ 2\ 2\ 3\ 5\ 1\ 1\1c\ e\ 3Z>\a\7fS\ 3·\85\11Ý®\10ë·\12ò·\11ï¼\fîÁ\fîÅ\10ñÍ\19ïÏ\eñÓ\eóÖ\18ó×\12öÕ\11õÔ\ fíÏ\rãÄ\14¿\98\13\9fo\ 6±|\vÉ\92\vÕ\97        Ãœ\98\rÝ\9a\fÚ\9d\vÎ\98\ 5Ã\90\ e\8fc\1d\1a\v\ 1\ 3\ 3\ 3\ 3\ 3\ 5\ 2\ 2\ 4\b\b
+SSUhhj'')\ 5\ 5\a\ 2\ 2\ 3\ 3\ 3\ 4\ 2\ 2\ 4\ 3\ 3\ 4\ 2\ 2\ 2±±°ýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 2\ 2\ 3\ 1\ 4\ 1
+\ 5\ 1C)\10vM\14\80U\ 3§\81\rÛ®\18ñ·\17ï¿\13îÇ\15ñÍ\1fóÐ'ôÔ%ñÔ\19ïÔ\14ïÑ\19èÈ\15Õ´\12¬\8b\10\8ce\ 5\9bm\a¼\87  ÃŽ\94      Ã•\99
+כ
+Ù\9f\ fÕ\9d\12É\94\13¶\88\e­\89?yfC\15\14\ e\ 1\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 6\ 6\b;;;yyyyyyQQQ**)
+
+\b\ 2\ 2\ 2\ 3\ 3\ 4\ 2\ 2\ 4qqqþþüýþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 2\ 2\ 4\0\ 1\ 5\ 5\ 6\ 5("\1e\90\7fg\83h%~W\ 4\8b\\ 3©{\fÇ \fÔ±\10Ù¸\17Û¼\1fÒ±\12έ\ fÂ\9c\12¨|\ e¡o\ 2\9di\ 6«v\rº\82\ eÉ\8c\vÒ\91\fÒ\93\vÑ\97\bÐ\97\fÅ\90\r»\8e!Ä \ʱ\94Ǻ°¸³®QQL\ 6\a\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4\e\e\eccc\80\80\80\81\81\81zzy442\ 2\ 2\ 3\ 2\ 2\ 4\ 3\ 3\ 5\1a\1a\1c××Öýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 2\ 2\ 4\ 2\ 2\ 6\ 3\ 4\ 4<A>³µ«³¨\83\8dl&\95h\ f\93i\f\98o  Â¦~
+Â¥\7f\ 5£}\ 6¢y\b§z\b°\7f\ 6º\85\bÃ\89\12Ä\87\ eÊ\8d\vÎ\92\aÎ\94\aÍ\92\fÊ\8c\ fÈ\87\11¸\84\1a»\94M˵\97Ê»ÄÃÀ¾½º¿¿¿\94\96\99\ f\ f\12\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 3\ 4\ 4\ 4777}}}\81\81\81\80\80\7faa`  !\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5pppþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýªª«\ 2\ 2\ 4\ 3\ 2\ 2\ f\v\v\ZS¾¾¹¾·³®\99u\90l\19\98i\ 4¢p\ 6À\92\ eÛ²\13Û´\ f׫\11Ò\9f\11Ð\96\ eÒ\95\10Ï\96\rÌ\93\vÊ\90\vÈ\8e\aÉ\90\ 5Á\8b\bµ\83\14±\850¾¦~ƼªÅ¹ÊÌÉÈÍÊÂÇÀ½¾¹©§§! "\ 3\ 3\ 4\ 2\ 2\ 2\ 3\ 3\ 3\ 3\ 3\ 3\13\13\13]]]\80\80\80~~}mmm445\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\1a\1a\1aÖÖÕþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúþþþjjl\ 2\ 2\ 4\ 4\ 2\ 2\13\10\13[XZ½¹º½»¾Áº³°\97p\96i\18\9ad\b¬w
+ȓ\11Ҟ\12ԝ\10Ҙ
+Ò\94\bÏ\90\bÊ\8e\aÃ\8c\ 4¿\87\ 5½~\b¾|\f·\81\e´\96Q½´\99º»¶»½¸¹½¶ÃÆÁÐÑÏÒÑÑÈÆÅ¼º¹TSS\ 6\ 6\ 6\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3\ 4\ 4\ 4;;;oopqqqBBB\v\v\r\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 3\ 3\ 4000ýýüþþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿÿýýýü,,.\ 2\ 2\ 4\ 3\ 2\ 2\ e\12\rU[W¸º·»½¸»¼ºÂ·®¶\9av\91g'\93e
+Â¥u\ 3¶\81\ 6¾\84       Ã€\85      Ã\85\v½\82\f·y\b°p\ 4°o\ 4°w\r²\84/¼\9emÆ»¦»½±¾¹·Á¼¾ÆÉÉÖÛØèèêõï÷õó÷ÛßÛ\9f¡\9e\14\14\14\ 1\ 1\ 1\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3                \v\16\16\18,,.\11\11\13\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4®®­þþüýýûüüúýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüújjj\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 3     \ e\bOTK¹½¶Âÿ¿¿¸¿½´Áº³º¨\8c\93{@\83d\ f\91h\a\9ah\b\9ei\b\9dh\a\9bi     \98e      \98e\f\9an\e¬\8eK¿±\8b½³»º»¿»¹Ã¿ÀÐÌÏçäç÷õûûüýûþøúý÷÷øø×ÖØOOO\ 4\ 4\ 4\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 4\ 4\ 5333þþüýýûüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÓÓÑ\16\16\15\ 2\ 2\ 4\ 2\ 2\ 4\0\ 3\a\r
+\ fb[_ØÔÖÖÔÖÈÅÄÀ½º¼½¼¾¼ºÃ»¬µ¢\83 \82V\94n4\95l%\93l"\99t0¦\84K±\99m¼³\98À¿´¾»µ¾º±¾¼µÁÂÁÎÓÌâçáò÷÷ýþýÿýùÿüöþýùýþýö÷÷²²²\17\17\17\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5                    Â®Â®Â­Ã¾Ã¾Ã¼Ã½Ã½Ã»Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã½Ã¾ÃºÃ¼Ã½Ã¸iig\ 2\ 2\ 2\ 3\ 3\ 5\ 2\ 2\ 6\ 2\ 3\ 5%$%ÏÎÏîííáááÌËÌ¿¾¾¼¼¼½¼½À½½Á½¹Â¼´¿¸­¾¶§½µ¤¾¶§Ã»²Ã½¶À¼¹½¼º¼»¹ÁÀ¾ÆÅÄÓÓÓãäáôõòþÿýýþüÿþüþþûþþüþþüýþûôôô[[[\ 6\ 6\ 6\ 3\ 3\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 1\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\a""#ÔÔÕýýüýþúþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûüüúüüú¨¨¦\ 4\ 4\ 2\ 3\ 3\ 3\ 2\ 2\ 4\ 3\ 3\ 6\ 6\ 6\ 6\8c\8c\8cúúúöööëëëÖÖÖÁÁÁ¾¾¾¿½¾¿¾¼¾½»¾½º½¼¸À¾¹Á¾ºÁ¾¸À¼¹¿»º¼º¹¿¾¼ÆÅÃÎÎÎÜÜÜçççòòðýýûýýûÿÿýþþüþþüþþüþþüþþüüüüÃÃÃ\1c\1c\1c\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ f\ f\11rrsýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûÒÒÐ\1f\1f\1d\15\15\13\f\f\v\ 2\ 2\ 4\ 4\ 4\ 5DDEßßßýýýýýýùùùìììÑÑѽ½½¾½¼¾½»¾½»À¿»¿¾º¾½¹¾¼¸¾½¹À½»¿½»ÁÀ¾ÌËÉ××Õääâïïï÷÷÷üüûýýûþþüýýûþþüþþüþþüþþüþþüþþüõõônnn\a\a\a\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 6\ 6\b\1e\1e\1fÔÔÒþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýýþþþ+++\16\16\16\1c\1c\1c\r\r\r\ 4\ 4\ 4\13\13\13µµ´÷÷õýýûþþüýýûúúøååãÄľ½º¾½¹¾½»¾¾»¾½¼¾¾»¾¾»¾½»¾½»ÃÂÀÐÏÍàßÝìëéööôûûùýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüûûúÎÎÎ&&&\ 4\ 4\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 4---þþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûþþüýýýggg\ 2\ 2\ 2\ 5\ 5\ 5
+
+
+\ 5\ 5\ 5\ 5\ 5\ 5nnnïïíýýûþþüþþüþþüýýûóóñÖÖÔÀ¿½¾½»¾½»¿¾¼¾½»¾½»¾¼¼¾¼½ÈÆÅÛÚØèçåóóñúúøûûùüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûøøøkkk\ 5\ 5\ 5\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3ªªªþþþýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûýýû¥¥¦\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3))'ÑÑÏýýûýýûþþüþþüþþüþþüûûùììê×ÖÔÆÅÃÂÁ¿½¼º¾½½½½½ÂÂÂÐÐÐâââñññùùøûûùþþüþþüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýýÁÁÁ\11\11\11\ 2\ 2\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\17\17\19ÓÓÔýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûüüúýýûÐÐÎ\15\15\16\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\b\b     \8c\8c\8aö÷óþþüÿÿýþþüþþüþþüþþüÿÿýüüúù÷÷íëìÝÛÜÕÕÕ×××ÜÜÜççåòòðùùøþþþýýýýýûþþüþþüþþüÿÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüôôóJJJ\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4kklþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûÑÑÏ\14\14\13\ 3\ 3\ 4\ 2\ 2\ 4\ 4\ 3\b\ 2\ 2\ 6\ 2\ 2\ 4888ääãýýùþþûþþüþþüþþüþþüþþüþþüþþüÿýþýüýòðñëêëðððøøøûûùûýúýþýþþþýýýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþþûþþüþþüýýý\8c\8c\8c\ 6\ 6\ 6\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 2\ 2\ 5\ 4\ 4\ 4kkjþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüýþùüüúýýýeef\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 2\a\a\a\9c\9c\9bûûùýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüúúøööôýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþÿüþþüþþüýýü¼¼¼\ e\ e\10\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5jjjýýüüüúþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûüüúýýûþþüddd\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2>>>ÛÛÚøøöüüúýýûþþüþþüþþüþþüþþüþþüþþüýýûýýûúúøüüúþþüþþüþþüÿÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþþûþþüþþüûûúâââ++-\ 4\ 4\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 4\ 4\ 6\ 3\ 3\ 5\16\16\18ÓÓÒþþüýýûÿÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúþþüþþüýýû¢¢¡\ 2\ 2\ 2\ 4\ 4\ 6\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4                 \89\89\89ççåøøöüüúþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüüüúûûùþþüÿÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿÿýþþüüüúùùùîîîMMM\ 5\ 5\a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\15\15\16ÑÑÐüüúýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûþþüýýûÏÏÏ\13\13\13\ 2\ 2\ 2\ 4\ 4\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\ 5---²²²æææõõóýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüùù÷ûûùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúùù÷÷÷õñññóóó\87\87\87\ 5\ 5\ 5\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 4\ 4\ 6\ 2\ 2\ 3\15\15\15ÒÒÒüüüþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûÏÏÏ\13\13\13\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 2\ 2\ 2\ 5\ 5\ 5???´´´ßßßôôôûûûþþýþþüþþüþþüýýûýýûýýûýýûþþüýýûûûùôôòööôûûùýýûþþüþþüýýûþþüþþüþþüþþüýýûýýûþþüþþüþþüþþüüüúýýûüüúúúøøøöððîêêèììëìììììì°°°\ e\ e\ e\ 5\ 5\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 3\ 3\ 3\15\15\15ÒÒÒþþþýýüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû###\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 3\ 3\ 3\ 6\ 6\ 6XXX©©©ÍÍÍìììøøøùùùüüüþþþþþþþþþýýýüüüúúú÷÷÷òòòñññêêêèèèðððöööùùùúúùüüúýýûûûùüüúúúøýýûýýûûûûûûûúúúùùùøøøøøøòòòïïïééçããâÛÛÛÛÛÛÞÞÞää䯯Æ\e\e\e                \v\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 3(((üüüþþýþþüþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüaa_\ 1\ 1\ 1\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 3\ 3\ 3
+
+
+ttt¢¢¢¶¶¶ÐÐÐçççðððñññöööúúúùùùùùùøøøòòòéééâââßßßäääàààßßßåååïïïööõùù÷øøö÷÷õùù÷ùù÷øøöóóñéééåååáááÝÝÝÛÛÛØØØÖÖÖÓÓÓÑÑÑÐÐÐÈÈÈÈÈÈÊÊÊØØØÜÜÜNNN\f\f\r\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2fffüüûýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÎÎÌ\11\11\11\ 3\ 3\ 3\ 3\ 3\ 4\ 2\ 1\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\a\a\a\19\19\19\85\85\85\9e\9e\9e¨¨¨ºººÌÌÌÜÜÜäääîîî÷÷÷úúúùùùúúúùùù÷÷÷íííßßßÞÞÞåååïïïñññøøøýýûýýûüüúýýûýýûúúøøøöóóñææåÚÚÚÒÒÒÉÉÉÅÅÅÄÄÄÂÂÂÂÂÂÀÀÀÁÁÁÀÀÀÂÂÂÂÂÂÉÉÉÝÝÛÊÊÉ001\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 3\ 2\ 2\ 2££¢þþüüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüþþüþþþýýýaab\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ f\ f\11&&&\8e\8e\8e¡¡¡¯¯¯ÃÃÃÒÒÒààßééçóóñûûùýýûþþüýýûþþüýýýöööåååæææ÷÷÷ýýýþþþþþþþþüýýûþþüþþüýýûþþüþþüýýûööõíííæææÛÛÛÒÒÒÌÌÌÉÉÉÅÅÅÄÄÄÂÂÂÀÀÀÁÁÁÀÀÀÀÀÀÊÊÊåååÇÇÆ""!\ 3\ 3\ 3\ 3\ 3\ 4\ 3\ 3\ 5$$&556\16\16\16\ 4\ 4\ 4\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 2\ 2\ 2%%%ýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúýýûþþüýýýÎÎÎ\12\12\14\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\11\11\13---\98\98\98¶¶¶ÉÉÉßßßííí÷÷öýýûýýûüüúýýûüüúþþüýýûþþþöööèèèôôôýýýþþþþþþþþþÿÿýýýûüüúýýûþþüþþüüüúýýûûûúüüüüüü÷÷÷ôôôìììäääÚÚÚÒÒÒÊÊÊÅÅÅÁÁÁÀÀÀÀÀÀÃÃÃÕÕÕðð¡\f\f\f\ 2\ 2\ 3\ 4\ 4\ 6\v\v\r::;@@@"""
+
+
+\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 2\ 2\ 2\ 2££¢üüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüþþüþþþ___\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 5\e\e\eaaa¸¸¸ÓÓÓæææööôüüúþþüþþüýýûýýûüüúýýûûûùýýûýýý÷÷÷ëëëõõõüüüýýýûûûûûûüüúûûùýýûûûùüüúüüúþþüýýûþþýþþþþþþúúúýýýýýýüüüúúúñññçççÜÜÜÐÐÐÇÇÇÃÃÃÁÁÁÉÉÉààÞððïlll\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\f\f\r222444\18\18\18\a\a\b\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4\ 2\ 2\ 2$$$üüüýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüýýûýýý"""\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4
+
+\f\17\17\19\ 5\ 5\a\ 2\ 2\ 4\v\v\v222¬¬¬ÔÔÔëëëøøöüüúûûùûûùýýûûûùýýûþþüüüúýýûýýûýýûúúøõõóøøöýýûþþüþþüþþüþþüþþüýýûüüúþþüýýûýýûüüúüüúûûùûûùþþüüüúýýûüüúýýûþþýýýý÷÷÷ìììÝÝÝÑÑÑÆÆÆÃÃÃÍÍÍëëëÝÝÝ)))\ 1\ 1\ 2\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\a\a\a%%%@@@\1d\1d\1d\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 4\13\13\13ÏÏÏþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüþþüÍÍÍ\12\12\12\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\18\18\1a668\e\e\1d\ 3\ 3\ 5\ 2\ 2\ 4\15\15\15\86\86\86ØØØíííúúøþþüýýûþþüûûùþþüýýûúúøýýûþþüýýûýýûüüúüüúûûùýýûûûùúúøýýûýýûûûùüüúüüúýýûüüúûûùýýûüüúûûùýýûüüúýýûþþüþþüýýûûûùþþýýýýþþþüüü÷÷÷èèèÙÙÙÈÈÈÃÃÃÔÔÔôôô\94\94\94\ 4\ 4\ 4\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 2\ 4\ 4\ 4\1c\1c\1c@@@\15\15\15\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5ccdüüûýýûýýûþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüüüú\9e\9e\9e\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4
+
+\f??A\18\18\1a\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4:::ÑÑÑòòòúúùýýûûûùüüúýýûþþüûûùýýûýýûüüúüüúþþüþþüþþüüüúüüúþþüþþüþþüþþüýýûÿÿýþþüýýûþþüþþüýýûþþüþþüþþüûûùüüúýýûûûùüüúþþüýýûýýûýýûüüúýýûüüúúúøííëÛÛÙÊÊÉÇÇÇáááããã000\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 3\ 2\ 2\ 2\ 4\ 4\ 4\1c\1c\1c444\b\b\b\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 4\ 4\ 6\ 3\ 3\ 5\13\13\15ÏÏÎýýûþþüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüýýû]]]\ 2\ 2\ 2\ 2\ 2\ 3\ 1\ 1\ 3  "99;\ 4\ 4\ 6\ 2\ 2\ 4\ 1\ 1\ 3\ 6\ 6\b\94\94\95ùùùüüûýýûþþüýýûýýûûûùýýûüüúýýûûûùýýûýýûýýûúúøýýûþþüýýûüüúûûùüüúüüúûûùüüúüüúüüúüüúüüúüüúüüúüüúþþüýýûþþüýýûþþüýýûüüúýýûüüúûûùýýûüüúþþüþþüýýûððîÜÜÝÉÉÉÍÍÍïïî\8f\8f\8f\ 3\ 3\ 3\ 3\ 3\ 4\ 3\ 2\ 6\ 3\ 3\ 4\r\r\v
+
+
+\a\a\a***(((\ 4\ 4\ 4\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4¡¡ üüúýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúýþûüüú\1f\1f\1f\ 3\ 3\ 3\ 3\ 3\ 5\a\a       668\18\18\1a\ 2\ 2\ 4\ 3\ 3\ 5\ 5\ 5\a668ãããüüüþþüýýûûûùüüúýýûýýûþþüýýûüüúýýûýýûýýûþþüþþüýýûýýûûûùþþüýýûþþüüüúþþüþþüýýûýýûþþüýýûþþüþþüýýûüüúüüúüüúûûùýýûüüúþþüüüúýýûþþüþþüýýûýýûûûùþþüýýûðððÙÙÚËËËÚÚØááá***\ 2\ 2\ 4\ 3\ 3\ 6\r\r\ e\e\e\19!! \19\19\19\10\10\10888\1a\1a\1a\ 4\ 4\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\ 4\ 4\ 6$$$þþüüüúüüúýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû\9e\9e\9d\ 2\ 2\ 4\ 4\ 3\ 6\ 2\ 2\ 2\1e\1e\1e777\ 5\ 5\ 6\ 2\ 2\ 4\ 2\ 2\ 2\b\b\b«««ýýüþþüüüúýýûýýûûûùýýûýýûüüúþþüþþüüüúüüúüüúýýûüüúýýûþþüýýûûûùýýûýýûþþüýýûýýûýýûýýûüüúýýûüüúûûùþþüþþüþþüþþüþþüþþüýýûýýûþþüþþüýýûüüúþþüþþüþþüüüúýýûýýûóóñââàÞÞÛññîqqo\ 2\ 2\ 1\ 4\ 4\ 4\15\15\15...<<<000\19\19\19\1e\1e\1e777\ 6\ 6\ 6\ 2\ 2\ 2\ 1\ 1\ 1\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\13\13\14ÏÏÏýýüüüúþÿûþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýû]]]\ 4\ 4\ 6\ 2\ 2\ 4              \bFFF\1c\1c\1c\ 1\ 1\ 3\ 3\ 3\ 5\ 3\ 3\ 3DDDëëéþþüþþüüüúýýûþþüþþüþþüüüúþþüûûùüüúüüúÿÿýþþüþþüüüúýýûûûùýýûýýûüüúüüúýýûúúøþþüþþüýýûþþüüüúýýûýýûüüúýýûýýûûûùüüúüüúûûùþþüúúøýýûþþüüüúüüúýýûüüúýýûûûùüüúþþüûûùúúöýýû»»¹\v\v
+\ 5\ 5\ 5\1c\1c\1c777FFF;;;###\v\v\v111$$$\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4bbbüüûýýûýýùþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü   \ 4\ 4\ 5\ 3\ 3\ 4\1f\1f\1e==<\ 5\ 5\ 5\ 2\ 2\ 4\ 1\ 1\ 3\ e\ e\ e¨¨¨ûûúýýûýýûüüúýýûûûùýýûüüúüüúþþüýýûþþüýýûûûùüüúüüúýýûûûùüüúûûùýýûüüúþþüþþüþþüúúøýýûûûùþþüþþüþþüþþüüüúþþüüüúýýûúúøþþüüüúýýûýýûýýûþþüüüúüüúüüúþþüþþüþþüüüúýýûýýûþÿûþþûççå000\ f\ f\ f"""999@@@000\1d\1d\1d\b\b\b\16\16\16@@@\v\v\v\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4""#þþýüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü\9d\9d\9c\ 2\ 2\ 2\ 2\ 2\ 4\ 4\ 4\ 6;;;\15\15\15\ 2\ 2\ 2\ 2\ 2\ 4\ 4\ 4\ 6HHHîîìýýûûûùþþüûûùþþüýýûýýûýýûýýûüüúüüúýýûúúøþþüþþüýýûüüúùù÷øøöýýûûûùýýûüüúüüúþþüþþüþþüþþüûûùýýûüüúþþüýýûýýûþþüýýûþþüüüúþþüýýûüüúüüúýýûþþüüüúüüúûûùüüúüüúýýûüüúûûùýýùüüùùù÷__^\11\11\11\1c\1c\1c%%%###\19\19\19\f\f\f\ 4\ 4\ 4\ 5\ 5\ 5???(((\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5   ýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþúþþûþþüýýý^^^\ 2\ 2\ 2\ 3\ 3\ 3\13\13\15<<<\ 6\ 6\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ f\ f\11¢¢¢ýýûýýûüüúýýûþþüûûùüüúýýûþþüýýûýýûÿÿýýýûþþüüüúüüúûûùööôëëéùù÷ýýûþþüûûùüüúûûùýýûýýûûûùþþüþþüþþüüüúýýûûûùüüúýýûüüúýýûþþüüüúýýûþþüûûùüüúþþüýýûþþüýýûþþüüüúüüúþþüþþüýþúüýúüüú\96\96\95
+
+
+\b\b\b
+
+
+\a\a\a\ 3\ 3\ 3\ 1\ 1\ 1\ 1\ 1\ 1\ 2\ 2\ 2\1c\1c\1cBBB\ 4\ 4\ 4\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 5\ 2\ 2\ 5aabþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþùýýûþþüÍÍÌ\10\10\10\ 4\ 4\ 4\ 3\ 3\ 3666###\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5000äääûûùýþúþþüüüúýýûþþüûûùýýûýýûþþüüüúýýûüüúüüúýýûýýûüüúòòðççåóóñýýûýýûýýûüüúÿÿýþþüýýûýýûûûùýýûýýûþþüþþüþþüýýûþþüþþüüüúþþüýýûýýûüüúþþüýýûýýûûûùüüúüüúüüúýýûþþüûûùýýûþþûýýúþþüÇÇÆ
+
+
+\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 4\ 2\ 2\ 4
+
+\f===                   \ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 3\ 2\ 5""$ýýýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüýøþÿúýýû\9c\9c\9b\ 3\ 3\ 5\ 4\ 4\ 6
+
+
+AAA
+
+
+\ 3\ 3\ 5\ 2\ 2\ 4\ f\ f\11\84\84\84úúúþþüýýùþþüþþüüüúþþüýýûýýûýýûüüúüüúüüúýýûüüúýýûýýûüüúïïíååãùù÷þþüüüúþþüýýûýýûýýûþþüüüúýýûûûùýýûýýûýýûýýûûûùýýûüüúþþüûûùýýûýýûýýûûûùýýûûûùþþüýýûþþüýýûüüúûûùþþüýýûýýùüýúýýûååä)))\ 2\ 2\ 3\ 1\ 1\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\a;;;\17\17\17\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 2\ 2\ 6\ 2\ 2\ 5\9e\9e\9fýýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþúýýúþþü\1d\1d\1d\ 3\ 3\ 4\ 4\ 4\ 6"""000\ 3\ 3\ 4\ 3\ 3\ 5\ 2\ 2\ 4'')ÓÓÓüüüüüúúûöýýûûûùþþüûûùýýûýýûýýûþþüýýûûûùýýûþþüüüúýýûúúøììêééçùù÷þþüýýûüüúýýûüüúüüúüüúþþüþþüýýûûûùþþüýýûÿÿýþþüþþüýýûûûùþþüþþüûûùþþüþþüþþüþþüûûùýýûüüúþþüþþüþþüýýûþþüýýúüýúüüúòòòDDD\ 3\ 3\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4666***\ 4\ 4\ 4\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 1\ 5\ 3\ 2\a\ 3\ 2\ 5\9f\9f þþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýüýýý\9b\9b\9b\ 3\ 3\ 3\ 3\ 3\ 5\ 4\ 4\ 6AAC\19\19\e\ 2\ 2\ 4\ 2\ 2\ 4
+
+\v``_ööôþþüþþüþþüüüúþþüûûùþþüüüúüüúýýûüüúüüúýýûýýûüüúþþüýýûûûùééçííìúúúûûûýýüþþüþþüþþüþþüüüúüüúüüúýýûþþüüüúýýûûûùýýûûûùýýûýýûüüúþþüýýûüüúýýûüüúþþüþþüþþüüüúúúøýýûýýûüüúüüúüüúþþüýýýüüü^^^\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4333)))\ 2\ 2\ 2\ 3\ 3\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5!!"ýýýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþþþþ\1c\1c\1c\ 2\ 2\ 2\ 3\ 3\ 3
+
+\vCCE           \v\ 3\ 3\ 5\ 2\ 2\ 4\a\a\a®®­üüúûûùüüúýýûýýûýýûþþüþþüþþüüüúýýûþþüüüúþþüþþüýýûýýûúúøøøöääâçççúúúýýýýýûýýûüüúûûùüüúýýûþþüýýûûûùüüúýýûþþüüüúýýûýýûüüúþþüýýûûûùÿÿýþþüþþüýýûûûùýýûýýûÿÿýýýûþþüüüúüüúþþüýýûûûùûûûüüü~~~\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4445$$$\ 3\ 3\ 3\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 4\ 4\ 6\ 2\ 2\ 4  !þþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýý\99\99\99\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\1a\1a\1c--/\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4../ÞÞÜýýûþþüþþüüüúýýûüüúüüúûûùþþüþþüüüúþþüýýûûûùýýûüüúþþüþþüööôââàèèçúúúüüüýýûüüúüüúýýûüüúþþüûûùýýûþþüþþüýýûüüúýýûüüúþþüûûùüüúüüúýýûûûùüüúüüúÿÿýþþüýýûüüúüüúüüúüüúþþüýýûüüúûûùýýûþþþùùù\97\97\97\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 1\ 1\ 3223\1f\1f\1f\ 3\ 3\ 3\ 1\ 1\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\12\12\13ÎÎÎþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ\1c\1c\1c\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3444\17\17\17\ 3\ 3\ 4\ 2\ 2\ 4\ 6\ 6\bZZ[ôôóûûùýýûüüúþþüüüúýýûþþüþþüüüúûûùýýûüüúüüúüüúýýûüüúûûùþþüôôòààÞæææøøøþþþýýüþþüþþüýýûþþüûûùýýûüüúüüúýýûþþüþþüþþüüüúþþüýýûþþüýýûþþüþþüýýûýýûýýûüüúþþüþþüýýûüüúýýûüüúþþüÿÿýþþüûûùýýüýýý¥¥¥\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5--.\16\16\16\ 3\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 1\ 1\ 2\9f\9f\9fþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿÿýþþüýýûýýûZZ[\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\ 5\ 5\ 5888\ e\ e\ e\ 2\ 2\ 2\ 3\ 3\ 5\ 5\ 5\a\88\88\89ýýûþþüýýûüüúýýûýýûýýûüüúþþüþþüþþüýýûüüúþþüüüúýýûüüúüüúþþüööôßßÝééé÷÷÷ýýýüüûüüúüüúüüúýýûûûùüüúýýûþþüýýûüüúüüúþþüýýûýýûûûùýýûýýûýýûýýûþþüýýûüüúýýûþþüüüúýýûþþüþþüüüúüüúûûùýýûüüúýýüþþþ¸¸¸\ 5\ 5\ 6\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\a223\ e\ e\ e\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\9e\9e\9eÿÿýýýûüüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüüúýýûËËÉ\ f\ f\10\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 3\a\a\a>>>\ e\ e\ e\ 1\ 1\ 1\ 2\ 2\ 4\11\11\13ÀÀÀûûùýýûýýûþþüþþüýýûþþüþþüûûùüüúýýûýýûýýûýýûþþüüüúýýûûûùýýûòòðßßÝçççøøøýýýýýûþþüþþüýýûüüúþþüþþüüüúýýûúúøþþüüüúýýûýýûþþüþþüýýûûûùýýûüüúûûùþþüýýûþþüþþüþþüûûùýýûýýûüüúüüúýýûþþüþþüüüûýýýÅÅÅ\a\a     \ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\b\b
+777\ 6\ 6\ 6\ 2\ 2\ 2\ 2\ 2\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3___ýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýûýýûþþüYYW\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 3                       BBB\13\13\13\ 2\ 2\ 2\ 2\ 2\ 4((*ÚÚÚþþüüüúþþüüüúüüúýýûûûùüüúýýûþþüýýûýýûþþüüüúýýûûûùþþüþþüüüúîîìÝÝÛççæ÷÷÷üüüûûúüüúûûùýýûýýûýýûýýûüüúþþüþþüûûùýýûüüúýýûüüúûûùþþüûûùûûùýýûüüúüüúýýûýýûýýûüüúþþüüüúþþüýýûÿÿýýýûúúøýýûüüüýýýÌÌÌ\v\v\r\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5\f\f\ e667\ 2\ 2\ 2\ 1\ 1\ 1\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3   Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¼Ã¼ÃºÃ¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã½Ã½Ã»Ã½Ã½Ã»\97\97\95\ 2\ 2\ 2\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4
+
+
+GGG\14\14\14\ 2\ 2\ 2\ 2\ 2\ 4556ßßßþþüþþüûûùþþüÿÿýûûùþþüþþüüüúýýûþþüýýûýýûþþüýýûþþüýýûþþüþþüððîÝÝÛçççùùùüüüýýûýýûýýûûûùüüúýýûýýûýýûüüúþþüþþüþþüýýûýýûýýûýýûþþüýýûþþüþþüþþüýýûýýûûûùþþüþþüþþüýýûüüúýýûüüúýýûýýûÿÿýþþýþþþÏÏÏ\ e\ e\10\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\14\14\16445\ 5\ 5\ 5\ 3\ 3\ 3\ 1\ 1\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3!!!ýýüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþ\1c\1c\1c\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ e\ e\10FFF\18\18\18\ 2\ 2\ 2\ 3\ 3\ 3FFFèèçúúøýþúÿÿüúúøþþüþþüüüúýýûûûùüüúýýûúúøüüúûûùýýûüüúüüúúúøýýûîîìÝÝÛççæúúúüüüýýûûûùþþüþþüþþüûûùýýûüüúþþüûûùýýûüüúüüúþþüýýûûûùüüúýýûýýûüüúýýûüüúýýûþþüüüúýýûúúøýýûþþüýýûýýûüüúýýûüüúüüûþþþÔÔÔ\13\12\15\ 2\ 1\ 6\ 2\ 1\ 6\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4##%##%\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3   Ã¾Ã¾Ã½Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã½Ã½Ã»\97\97\97\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 3\ 3\ 5\19\19\eKKK   \ 2\ 2\ 2\ 2\ 2\ 2WWWïïíýýûüüøüüúýýûüüúüüúýýûþþüþþüüüúýýûþþüþþüþþüþþüþþüþþüþþüûûùííëÞÞÜëëêúúúþþþþþüþþüûûùüüúýýûþþüüüúýýûûûùþþüýýûýýûýýûüüúûûùþþüýýûûûùüüúýýûýýûþþüûûùýýûýýûþþüýýûûûùüüúþþüþþüþþüýýûýýûýýüýýýÕÕÕ\15\14\18\ 2\ 1\ 6\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5--/\r\r\ f\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3   Ã¾Ã¾Ã½Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã½Ã½Ã»\96\96\96\ 3\ 3\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 4\ 4\ 6\13\13\15,,.PPP888\ 2\ 2\ 2\ 2\ 2\ 2cccññïþþüþþúýýúýýûüüúüüúýýûýýûþþüþþüûûùýýûüüúýýûúúøýýûüüúýýûýýûììêßßÝíííûûûüüüüüúüüúýýûÿÿýúúøþþüýýûýýûûûùýýûüüúüüúýýûýýûþþüûûùþþüþþüýýûüüúýýûûûùýýûýýûýýûüüúýýûþþüýýûýýûüüúýýûýýûüüúþþýüüüÕÕÕ\17\17\1a\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\v\v\r668\ 5\ 5\a\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3   Ã¾Ã¾Ã½Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼VVV\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 4\ 4\ 6\17\17\19;;=___NNN\ 3\ 3\ 3                      \81\81\81òòñûûùüüøþþûüüúýýûýýûþþüþþüûûùüüúþþüýýûýýûþþüþþüþþüýýûýýûûûùèèæßßÝíííüüüþþþýýüþþüýýûüüúþþüùù÷ýýûûûùþþüþþüýýûýýûüüúþþüüüúýýûüüúýýûüüúþþüþþüûûùþþüþþüýýûûûùýýûýýûýýûþþüþþüûûùþþüýýûûûûþþþ×××\17\17\19\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\17\17\18%%%\ 4\ 4\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3   Ã¾Ã¾Ã½Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼\18\18\18\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 5\ 5\a\15\15\17CCCXXX\ 5\ 5\ 5                       \82\82\82ôôòýýûþþúþþûþþüüüúýýûûûùþþüþþüûûùüüúýýûýýûüüúýýûûûùüüúýýûüüúêêèÝÝÛìììúúúüüüúúøýýûýýûýýûþþüýýûýýûÿÿýüüúüüúýýûþþüþþüûûùþþüþþüþþüýýûüüúúúøþþüýýûûûùüüúþþüþþüýýûýýûýýûüüúýýûýýûûûùýýûüüüýýýÐÐÐ\15\15\17\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 6\ 6\ 6,,,\ f\ f\ f\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3!!!ýýüýýûýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü\18\18\18\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\a\a \19\19\19JJJ\v\v\v\v\v\v\8a\8a\8aööôüüúüýùýýúþþüþþüüüúýýûûûùüüúýýûüüúýýûýýûþþüþþüþþüýýûýýûüüúêêèááßïïîúúúþþþþþüýýûýýûûûùüüúþþüüüúüüúüüúýýûüüúýýûûûùþþüüüúüüúûûùýýûýýûýýûûûùýýûýýûüüúûûùýýûüüúüüúýýûüüúüüúýýûþþüþþüúúúþþþÁÁÁ\v\v\f\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 3\13\13\13///\ 6\ 6\ 6\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3   Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¼Ã¼ÃºÃ¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼Ã¾Ã¾Ã¼\18\18\18\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\a\a\a***\1f\1f\1f\r\r\r\85\85\85øøöþþüþÿûþþûüüúüüúýýûûûùþþüýýûýýûýýûüüúüüúýýûúúøýýûýýûüüúýýûêêèââàòòñúúúýýýýýüþþüÿÿýþþüþþüýýûþþüþþüýýûüüúýýûþþüýýûüüúüüúýýûüüúýýûýýûþþüýýûûûùþþüÿÿýýýûþþüþþüþþüþþüþþüþþüûûùýýûþþüþþþýýý¯¯¯\ 6\ 6\a\ 2\ 2\ 4\ 3\ 3\ 5\ 6\ 6\a\1a\1a\1a///###\v\v\v\12\12\12\19\19\19\14\14\14
+
+
+\ 4\ 4\ 4\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3___ýýüýýûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýþþûþþüþþý\18\19\18\ 2\ 2\ 3\ 4\ 1\ 2\ 6\ 2\ 2\ 6\ 1\ 2
+\ 4\ 2     \ 5\ 3\ 4\ 2\ 1\ 3\ 3\ 2\ 4\ 4\ 5/./212xxxööôûüûüýùýþúþþüþþýýýûþþüüüúüüúûûùüüúýýûþþüþþüþþüüüúüüúüüúýýûëëéààÞññðýýýþþþûûúýýûüüúüüúýýûûûùýýûýýûþþüýýûýýûûûùýýûüüúýýûýýûýýûúúøýýûüüúúúøþþüýýûûûùüüúýýûûûùüüúýýûûûúýüûýýúüýùûüøýýüüüü\8c\8d\8c\ 2\ 3\ 3\ 3\ 3\ 5\17\17\19333'''\e\e\e\v\v\v\ 4\ 4\ 4\11\11\11\16\16\16"""***&&&\1e\1e\1e\12\12\12\a\a\a\ 2\ 2\ 3\ 2\ 2\ 5\ 2\ 2\ 5\ 2\ 2\ 2\9e\9e\9dÿÿþýýûýüùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþÿýÿþÿùûÿþüþÿ\94\96\96\ 6\ 3\ 1#\10\ 2eG\10\9ew\17·\8e\18¡\80\18YG\10\ f      \0\ 4\ 2\ 4\b\ 4\f96;yywíîíúþþúýùüý÷ýûýþýÿúúùýýûþþüýýûþþüþþüüüúúúøýýûýýûüüúýýûþþüüüüéééàààòòñûûùüüúþþüþþüýýûþþüýýûüüúüüúüüúûûùýýûüüúþþüþþüþþüýýûýýûýýûýýûüüúýýûþþüüüúþþüþþüüüúþþüþþüþþüüýûúýýýýýÿýùýÿ÷ùÿøüþúùúùbdd\ 2\ 3\ 2\15\13\12!\1f\1f\ e\ e\ f\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5
+
+\f\19\19\e,,-EEEKKK\19\18\18\ 2\ 4\b\ 2\ 2\a\ 6\ 1\ 1  \9bþýþÿýûþÿøýÿûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüúÿôüÿûÿþúýü÷ÿýôcO$«\85\18×¥\17ï¼\1añ¾\18ñ½\18æ· \9ax\1d!\11\ 2\ 3\ 4\ 1\ 4\b\ 4HIKÍÊÐúûûûýùþþüþýþýþûüýúýýûüüúüüúýýûþþüþþüýýûüüúýýûþþüýýûýýûüüüëëëàààòòñüüúüüúýýûûûùýýûüüúþþüüüúýýûýýûþþüüüúþþüüüúýýûýýûýýûýýûüüúþþüýýûüüúþþüþþüüüúþþüþþüûûùýýûüüúþþüûþøüûùýùùûúôúýóüýôèâß4..\12\ f\r\e\1a\18\ 5\ 4\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 4\1e\1e\1eZZZbb\\e \e\ 2\ 6\b$!"þüþÿüÿÿýúüÿüüÿþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûúÿùýþüÿûÿÿûùë⻵\8c ÃšÂ¤\ròµ\11ô½\rõ¿\fú»\12þ·\14ðµ\16Â¥\85\19 \15\ 2\ 2\ 5\ 3\f\r     ROSËÊÊùûõýýýúûøùý÷üýúüüúýýûýýûüüúýýûüüúþþüþþüýýûýýûýýûüüúûûûêêêßßßóóñûûùýýûþþüýýûüüúýýûýýûþþüþþüûûùýýûýýûþþüýýûýýûýýûýýûýýûýýûüüúýýûýýûûûùþþüýýûûûùýýûüüúûûùýýûüüúýüôýöÙïÞ®îÛ£íÛ¢îÚ\9fθ\845"
+%\1d\15\f\v  \ 3\ 2\ 2\ 2\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 3\ e\ e\ e888GG?32.\a       \f""&ýþùûÿôþþøýþùüÿûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûÿÿøÿüÿÿüÿýÿøÿýîͱ]Ð\98\11å®\10î·\ eñ¾\vð¾\fõ¼\14ú¼\ eø¿\ 4ê»\16©\82\e)\16\ 2\a\ 2\0
+\f\b:>3¿¿¼úøûýþüýþüþþüýýûüüúýýûþþüþþüýýûüüúþþüýýûüüúýýûþþüýýüêêêàààóóñýýûýýûüüúþþüýýûþþüüüúüüúûûùýýûúúøýýûûûùýýûüüúþþüþþüûûùþþüýýûþþüüüúüüúûûùþþüþþüþþüþþüýýûýýûýüøûíÉÙ³QÞ³ Ã«Â¾\1cíÀ\1fíÀ\1då»\1eÆ¢$PB\16\ 3\ 2\ 1\ 4\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 5\ 5\ 6\1d\1d\1d7770,-\1a\13\12\13\f\ 6e`aüþûøÿúûÿýÿýüÿþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþüÿüúüþûûþïØË\92¼\8a\17Ø\9c\fæ¯\rð¸\ fò¾     Ã±Ã€\vñÀ
+òÂ\ 2ó¿\ 5ö½\14ò¹\1e¬\82\1d%\14\ 2\ 1\ 5\ 2\a\f\ 2855´²´õöøþýýüûùþþüýýûüüúýýûüüúýýûþþüûûùüüúýýûûûùýýûûûúèèèßßß÷÷õüüúüüúýýûüüúýýûüüúýýûþþüýýûþþüþþüýýûüüúýýûüüúüüúûûùþþüüüúýýûüüúþþüþþüþþüûûùýýûüüúúúøýýûüüúýûóëÌ|â³\16ôÉ   Ã·Ã–\vôÙ\10öÖ\16õÏ\17å¾#RB\r\ 3\ 2\ 1\ 3\ 1\ 1\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\ 5"""%%%\1a\19\18\18\10\ 3\80l\18×Åyÿýâýýðùÿùûüþÿüþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüûÿþüþüúþ÷þûç·\90.Ì\91\ eÝ£\aï®\11ö²\12ø¹\10÷½\rô½\rö¼\ f÷½\rõ¾\fô¾\16ê´\1e\90r\17\16\ f\ 2\ 4\ 2\a\v        
+-.*¢£\9föòôýüüúúøýýûþþüþþüþþüüüúüüúüüúüüúýýûüüúþþüûûûëëëàààññïýýûþþüþþüüüúýýûýýûüüúýýûûûùüüúýýûþþüýýûüüúþþüýýûþþüýýûüüúþþüýýûþþüüüúýýûýýûýýûýýûþþüýýûýýûþüôä½kâ¥\rò·\ròÂ\10óÍ\10õÐ\f÷Ï\ fد\16?.\0\ 3\ 2\ 1\ 3\ 1\ 1\ 2\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\11\11\12   \11\11\11      
+\ 6<-\ 5Ƨ\1dðÍ"æÊ=õð¹ûþûúÿúüþùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûûÿöýýøÿûë˪gÁ\89\11Ô\9a\và§\vï®\10÷µ\rùº\rø¼\ e÷¼\10÷¼\11÷¾\fô¿\ 6óÁ\aõÀ\10Þµ\13uW\r\12\ 4\ 3\ 3\ 3\ 5\ 5\a\ 4"$\e\83\83\85íííýýûûûùüüúûûùýýûýýûþþüüüúüüúýýûûûùýýûüüüêêêÜÜÜëëéøøöûûùþþüýýûýýûýýûþþüÿÿýýýûýýûüüúýýûüüúýýûüüúûûùýýûüüúýýûüüúýýûþþüüüúýýûüüúýýûüüúüüúýýûûûùþýõãÃrÜ¥\ eñ²\ fõ»\12ò       Ã³Ãˆ\bìÅ\ f»\98\172$\0\ 3\ 2\0\ 3\ 1\ 2\ 2\ 2\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 5\ 5\ 6\ 6\ 6\ 6\ 3\ 3\ 2\1a\ e\ 2\91q\16êÆ\18ôÍ\ 6úÓ\16éØkÿýéúýýüÿüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþþýþþýþþüþþûþþüþþüþþüþþøþþóþþïþþíþþìþþíþþïÿýéìå¿Ç¥[¿\86\11Ï\95\ fÚ£\ 5æ¬\vî¶\10ò½\10ôÀ\vó¾   Ã³Â¿\ eò¿\ fò¿\ eö¾\fø¾
+òÀ\aó½\10Ñ¡\19M6
+\ 5\ 3\ 6\ 2\ 5\ 4\ 4\ 5\ 2\14\15\18UVUÔÔÒúúøüüúýýûþþüýýûýýûýýûýýûþþüýýûûûùüüüöööêêêííëúúøþþüûûùýýûüüúýýûýýûüüúþþüýýûþþüþþüþþüûûùýýûýýûþþüýýûüüúýýûýýûþþüýýûýýûüüúýýûýýûþþüýýûüüúýüôãÄpÚ£\rî±\ eö¾\rñÂ\ 4í¿\ eã¶\18®\85\14\0\ 5\ 3\ 1\ 3\ 2\ 3\ 2\ 1\ 3\ 2\ 2\ 3\ 2\ 2\ 3\ 2\ 2\ 3\ 1\ 2\ 4\ 2\ 2\ 5\ 2\ 2\ 4\ 2\ 2\ 5\ 2\ 2\ 4\ 1\ 2\ 2\ 2\ 2\ 3\ 3\ 2\ 3\b\ 5\ 1`E ÃÂµ\19îÅ   Ã®Ãˆ
+îË\10äÄ<íè¾üüúÿþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþùýÿøþþÿûÿþÿüýþý÷øÿþÿûöÿüêÏ¿\98ÕÁy°\88%¶\86\16¶\85\16±\83\e­\80 Â°\80\18¶\82\13Ã\8b\10Ð\96\rÚ\9e\vãª\vê±\vòº\ fó½\fô¾\võ¾\fõ¾\fô¾\fô¾\fõ¾\fõ¾\fòÀ
+ó½\13ð»\15´\90\13(\1c\ 2   \ 3\ 2\ 2\ 1\ 1\ 3\ 4\v        
+\f??>ÃÃÁüûùüüøýþùýþúûýúýýûúúøüüúüüúýýûþþþýýýùùùøø÷úúøýýûýýûûûùþþüüüúþþüþþüûûùýýûüüúûûùüüúýýûüüúýýûýýûûûùþþüûûùüüúüüúþþüþþüþþüþþüýýûúúøüüüýýýüúôæÇwÙ¢\11î²\ fô¼\rñ¿
+î¹\rá­\11µ\84\ eB+\ 1
+\ 4\0\ 5\ 1\ 5\ 2\ 2\ 3\ 2\ 3\0\ 2\ 3\0\0\ 4\ 1\0\ 5\ 3\0\ 3\a\ 3\ 2\a\ 5\0\ 6\ 3\ 1\ 4\ 2\ 5\0\ 2\ 4\ 6\b\ 1\ 5\ 3º\94\18îÀ\11íÂ\aîÂ
+ðÀ\fäµ!ÛÏ\97ýþÿÿýþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþÿøýÿùþÿùýÿûþûÿÿýúýþøçÝ·¯\84!¾\8c\12Í\97\10×\9c\vÚ\9c\v×\9a\rÓ\96\ eË\90\fÉ\8f\fÏ\95\ eÖ\9c\ fÜ \fã¨\fê°\fòº\ fô¼\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fò¾\bõ½\ fò¾\11ß¹\1e\88j\15\11\a\0\ 6\ 2\ 2\ 2\ 2\ 4\ 1\ 2\ 2\ 6\ 6\ 6###\97\96\95ñðîýýûüýûýÿüþþüýýûþþüþþüüüúúúùûûûýýýýýüüüúýýûýýûÿÿýþþüýýûüüúýýûþþüþþüüüúþþüüüúýýûýýûþþüýýûþþüýýûþþüýýûýýûýýûüüúýýûýýûþþüýýûøøøîîîãàÚÛºiÚ£\13ì°\rô»\ fï»\fç±\aݦ\vÀ\8b\11eC\r\16\b\0\ 5\ 3\ 3\ 1\ 4\ 4\ 1\ 2\ 4\ 5\0\ 6\ 6\0
+\ 3\0     \0\ 4\ 6\ 1\ 3\ 1\ 5\ 2\ 2\ 2\ 3\ 3\0\ 6\ 3\ 3\ 3\ 2$\ f\ 1\9aq\16Ý­\13ê¼\fé»\ríº\rô½\vêµ\1cÞÐ\96ýþüÿýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþþýýÿÿüþþÿùýþöþüúÿùî­\89*Î\8f
+ژ
+Ý 
+á¨\ eá¨\ fà§\rÝ£\aߤ\aÞ¤\fà¦\ eå«\ fé¯\ fî³\ eó¹\ eô½\fô½\võ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\f÷¿\b÷½\fñÀ\ eðÇ\12Ѩ\17XC\ e      \ 3\0\ 3\ 1\0\ 2\ 2\ 3\ 3\ 3\ 5\ 1\ 1\ 3\14\13\14}{|éèçûûùþþüûûùüüúûûùüüúþþüýýûþþþýýýüüûüüúýýûüüúüüúûûùþþüýýûüüúýýûýýûüüúýýûþþüþþüýýûüüúûûùýýûûûùýýûýýûûûùýýûþþüýýûüüúþþüûûùáááÉÉÉÇľԳaØ \ fï²\ fñ·\ eì·\vå®\aÛ¢\ 6Á\8b    \98m\14?'\ 1\10
+\ 3\ 3\a    \ 1\ 2\b\ 5\0\ 5\ 6\0\ 5\ 3\ 1\ 5\ 2\ 2\ 1\ 2\ 3\ 1\0\ 1\ 5\ 2\ 4         \ 2\ 4+\12\ 4\8ec\1cÏ\99\rä±   Ã¦Â·
+ê·\ eîµ\fô·\rå¬\19ÝÍ\8eþþüþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüûÿÿýýÿÿüýÿþøüýúþýõÒÀ\90»\88\12Ó\99\vÜ£\rã®\ fç´\10è´\10ê²\11ê°\ fæ«\bæ«\ 6ì±
+ñ¶\ fñ·\róº\rõ½\fõ¾\fõ¾\võ¾\fõ¾\fô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\bó½\ eòÀ\röÇ\ 4è¿\ f®\8b\1d$\18\ 4\ 5\ 1\ 1\ 2\ 1\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\f
+\r][\ÔÒÒüûùþþüýýûüüúýýûûûùüüúýýûûûùýýûüüúþþüþþüþþüýýûýýûüüúþþüýýûüüúüüúüüúüüúüüúûûùþþüþþüþþüýýûûûùþþüýýûûûùýýûýýûýýûüüúèèæËËÊÅÅůĽӰ_Ù¡\10ê¬\fï´\ fé³\rä«    ÃšÂ \ 3Ç\8e\ 6¯|        \8ee\14;"\ 5\r\ 3\ 1\ 6\ 1\ 3\ 5\ 1\ 2\ 4\ 1\ 2\ 1\ 3\ 1\ 6\ 2\0\b\0\ 2\v\ 1\ 4 \ e\ 1[:
+\9fo\12È\91\ eØ¡\fâ¯\ eé·\fì·\vó¸\vö¹\ fç°\18ßÎ\94ýþÿýÿüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûüÿõþÿüÿþûÿþøüþÿþþö¾¢^È\8a\18Ù \ræ¯\ fì´\rð¶
+ó·\fóµ\rô·\12ò¶\10ñ·\vôº\rõ»\ eö¼\ eõ½\ eõ½\ eõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¾\fñ¼\10ò½\rôÀ\ 5ïÇ\ fر\16u]\13\ e\ 5\ 2\ 4\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 6\ 3\ 3\ 5    \b
+423µ´³ùù÷ûûùýýûýýûþþüüüúýýûþþüûûùþþüúúøýýûûûùûûùýýûýýûýýûüüúýýûüüúýýûûûùþþüýýûûûùýýûüüúþþüþþüûûùþþüýýûýýûýýûýýûûûùÚÚØÄÄÃÄÄÄÇľѯaÚ¡\13é¬\rë°\rè±\ eäª
+Ý¢\ 4Î\95\b»\85\b®{\ e\9fr\16tP\rK1\b8%\ 6.\1e\ 4+\1c\ 15"\ 5N3\11wV\14\9cr\13°|\ fÂ\8a        Ã– \ 2Þ©\ 3ä°\ 6í¶     Ã³Â»\rõ¹\10ô»\fë¹\10êÙ\97ýüúüþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþÿôþÿúþþÿÿýùüÿûþýòÅ¥VÌ\8d\14Ý¡\ eè­\ fð²\rö¶\røº\ e÷»\ró½\vñ¾   Ã´Â¼
+ö½\fõ¾\fõ¾\fõ½\ eõ½\ eõ¼\rõ¼\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó¾\ fó¾\11ó»\ró¾\ fòÄ\réÄ\13¾\99\15:(\ 6\a\ 1\0\ 4\ 2\ 2\ 3\ 1\ 3\ 2\ 2\ 6\ 3\ 2\a\ 3\ 3\ 5\ 5\ 5\ 6\1f\1d\1e\91\91\91òòòûûúüüúýýûýýûüüúýýûÿÿýþþüþþüþþüþþüþþüüüúüüúûûùüüúýýûþþüýýûþþüûûùÿÿýþþüýýûýýûýýûþþüûûùüüúüüúþþüüüúüüúùù÷××ÕÄÄÃÄÄÄÈſЮdÓ\9a\11ã§  Ã¨Â¯\vé³\10å¬\vá¥\ 5Ô\9a\bÅ\8e\v¾\84\f»}\vµz
+ªx\r v\13\9fv\16¢w\ e¥x\f©z\13¬|\f·\82\aÆ\8c\rÔ\98\râª\bè³
+ï¹
+õº     Ã´Âº\rõ»\12ó¼\ fð¾\ fÕ¶AÿüÙÿüúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýþýþÿûÿûÿýûüþÿÿÿì«\85(Ê\92\11Þ¤\aê°     Ã±Â·\vôº\võ½\fô¾\fò¿
+òÀ\bõ¾\võ¾\fô½\vó¾\fó¾\fõ¾\fõ¼\võ¼\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¾\rõ½\ eô»\vó»\10ô¾\rðÈ\ eà¹\12\8cj\11\14\b\0\ 5\ 1\0\ 3\ 1\ 1\ 3\ 3\ 4\ 3\ 3\a\ 3\ 3\a\ 3\ 3\ 5\ 4\ 4\ 5\ f\ f\ f|||ïïïýýüüüúýýûýýûüüúýýûûûùýýûýýûýýûýýûýýûþþüþþüþþüýýûüüúûûùþþüûûùýýûþþüüüúýýûýýûûûùþþüþþüýýûüüúüüúüüú÷÷õ××ÕÅÅÅÄÄÄÆÃ¾Ë¨bÑ\98\14ᥠ   Ã§Â¯\vç³\ eç®\vä©\ 6Ù\9f  Ã\97\ 4É\8e\ 3Æ\86        Ã…\85\vÁ\84   Â¼\80\b¼\7f\r¾\7f\fÁ\82
+Æ
+Ä\8d\aË\95\ 5Ö\9d\vâ¦\11í±\13ñ¸\10óº\f÷º\rô¼\ fó½\ eô¾\10ó¸\ fæ¶\19ØÁbÿýåþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýýýþþúÿùÿþüüþúýüñÀ [Ä\91\ eÝ£\rç­\ eìµ\fò»\rõ½\ eö¼\ fø½\10ø¼\ eö¾\fõ¾\fò½\vó¾\fó¿\võ¾\vö½\vö½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö¾
+ö½\võ½
+÷»\vô¼\ fôÄ\bëÈ\15΢\1aL7\ e     \ 2\0\ 5\ 1\ 1\ 2\ 2\ 4\ 1\ 1\ 5\ 2\ 2\ 6\ 2\ 2\ 4\ 3\ 3\ 4\ 3\ 3\ 3\11\11\11\86\86\86ôôóþþüýýûýýûþþüÿÿýþþüýýüýýûýýûûûùýýûüüúüüúüüúþþüþþüþþüûûùþþüýýûþþüýýûüüúþþüþþüüüúûûùúúøýýûýýûýýûööõ××ÕÅÅÅÃÃÃÅýƤ`È\90\11Ü \b孠ç³\fè¯\væ«\bݤ\vØ\9b\fÒ\95\rÍ\93\ eÇ\90\aÈ\91\ 3É\8f\aÇ\8c\vÆ\8c\vÉ\90  Ã‹\91      Ã”\95
+Ü\9e\aá©\bé´\ró½\ fø½\aø½\bø»\14ô¾\11ó¿\vô¾\bö¶\rô´\1aÜ®\1fåÚ\95þþõþþüþþüþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýþüÿþüÿýÿýüýýüþþøÕÁ\89Â\8c\14Ù\9f
+æ¬\fí´\fñ¹\fõ½\ eõ½\ eõ½\ eõ½\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö½\fö½\fõ¼\vó¼\vñ¿\vòÆ\11ç»\10§\81\13$\13\ 2\ 6\0\ 3\ 2\ 2\a\ 1\ 2\ 6\ 2\ 2\ 5\ 2\ 2\ 5\ 1\ 3\ 1\ 2\ 2\ 3\ 3\ 3\ 5\1d\1d\1e°°°úúøþþüûûùüüúüüúýýûûûùüüúýýûüüúýýüýýûüüúüüúýýûûûùþþüþþüüüúýýûûûùýýûüüúûûùüüúýýûþþüþþüþÿûþþûýûüùøúÜÛÜÆÆÅÅÅÃÅüÀ¡]Â\8b\13Õ\9a\vᨠ      Ã§Â°\fê°   Ã¬Â¯      Ã¢Â¨\aÞ¤   Ã˜\9d\bÔ\9a\bÓ\9a
+Ñ\97\bÏ\96\bÏ\97       Ã\97\bÓ\98\ 6Ø\9c\aÜ¡\b㨠 Ã§Â®      Ã¯Â¸\rõ½\rô½
+õ½\fõ½\ eô¾\rõ¾\fõ¾\rô»\rò¸\10ìµ\11Ñ®-ðê±ýþ÷úýþþýþÿüÿüÿýûÿûüÿúþÿúþþûûÿýúÿýÿýýÿûüýþûüÿüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýüüÿüýÿüÿþúþýûýý÷ÖÃ\8eÁ\8c\15Ù\9e\vã¨\vë²
+ñ¹\rô¼\rõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö½\fö½\fô½\vñ¾\vñÂ\ròÅ\13Ö­\16uU\ f\f\ 5\ 2\ 3\ 2\ 6\ 2\ 3\0\ 4\0\ 6\ 3\0\a\ 1\ 2\a\ 1\ 1\ 4\ 2\ 2\ 4\a\a\a[[[ííëúúøþþüþþüþþüýýûüüúüüúþþüýýûüüúþþüüüúûûùýýûüüúüüúýýûýýûýýûýýûÿÿýþþüýýûþþüýýûûûùýýûüýùûüùýýüûûûåååÊÊÉÄÄÂÆÃ¾½\9f[»\85\ eÓ\98
+ঠ    Ã¥Â®
+ì±     Ã®Â²      Ã¨Â¯\vä«\vᦠ       ÃžÂ£      Ã›Â¡
+ڡ\fٟ\vڠ\f٠
+Ü¢     ÃŸÂ¤\båª\fç®\víµ\ró»\ fõ½\rô½\võ¾\rõ½\ eõ¾\rõ¾\võ¾\fó¼\fñ¹\rñ¹\ fï³\eÍ¡.ëã±ûþøúÿúÿýüÿúÿþþúûÿùÿýÿÿýýýÿøûÿøþþþÿýüüÿùüÿûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýúüÿúýÿúÿÿ÷þþúþýöÖÆ\96¼\88\12Õ\9a
+á¦\fë±\ eñ¸\rô¼\rõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fò½\vô½\võ¾\fö½\fõ½\vò½\vð¿\vóÄ\10é¿\11Ã\9a\12>-\b\ 5\ 2\0\ 3\ 2\ 1\ 6\ 1\0\ 3\ 1\ 4\ 2\ 1\b\ 2\ 1\ 5\ 2\ 2\ 4\ 2\ 2\ 2***ááßýýûüüúüüúýýûþþüýýûþþüüüúûûùýýûûûùþþüþþüýýûþþüýýûýýûüüúþþüýýûýýûûûùýýûýýûýýûýýûþþüýýûþþüüýúûûùììêÒÑÏÄÃÃÈÿº\9bW»\85\10Ð\94\bÞ£\bå­
+î´\vñµ
+í´\fê²\fç®       Ã£Â©\a⨠  Ã£Â¨
+à¦\bà¦\bã¨
+ã©
+å«
+ç­     Ã¬Â³\fï¶\fó»\ eô½\fõ¾\fõ¾\ eõ½\ eõ¾\rõ¾\võ¾\võ¾\fô¼\ròº\rñ¶\14î®\19Ï\9d+ñè·øÿïüÿöÿüýþþûüÿøþþüÿûÿÿýúþÿ÷ýþÿþþüýÿúýÿýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýúýÿúþÿüþÿøþþúÿþùèß¹¾\8b\19Õ\99\rÞ¢\fè®\rð·\rô¼\ fô¼\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó¾\fó¾\fõ¾\fõ¾\fõ¾\fó½\vò½\vôÀ\ eõÇ\15Þ¶\12\98v\13\17\f\ 2\ 3\ 1\ 3\ 3\ 2\ 1\ 2\ 3\0\ 3\ 1\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 4!!!××Öüüúýýûþþüüüúüüúûûùþþüþþüÿÿýþþüþþüüüúüüúüüúùù÷ýýûþþüüüúüüúþþüýýûüüúûûùýýûþþüýýûýýûüüûýýûýþùýýøîïêÖÖÓÆÅÄ\9f\9a\94\87f#¸\82\ fÒ\96
+Þ£\bå®
+í³     Ã²Â·      Ã°Â¸\rð·\rî´\vë°     Ã¨Â­\bæ«\bå«\aå¬\bäª\ 6è¯\bé°\bì´\vî¶\fòº\rô¼\ eõ¾\rõ¾\fõ½\rõ¾\rõ¾\fõ¾\võ¾\vô½
+õ¾\vô¾\fï¹\11í¹\12ë¸\11Ù¬,òè³üþóùÿúüÿüûÿøüÿôÿüýÿûÿþþýüþÿýÿüþþýþþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþüýÿþÿýÿýÿùþþþÿýüÿýâ¼\8b\1fÑ\95\rÞ¢\ fé¯\10î¶\fó»\ eõ½\ eõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó¾\fò½\võ¾\fõ¾\fõ¾\fõ¾\fô½\vô¾\fïÁ\ fîÅ\14Ñ¥\ ebI\r\b\ 5\ 2\ 1\ 3\a\ 2\ 2\ 5\ 3\ 2\ 1\ 2\ 2\ 2\ 3\ 3\ 5\ 3\ 3\ 3)))ßßÝþþüýýûýýûþþüýýûþþüûûùýýûýýûüüúýýûþþüþþüýýûþþüüüúýýûþþüüüúüüúþþüýýûþþüûûùüüúýýûüüúüüüþþüýþøüü÷íîêÖÔÔ¹¶´IB:sS\10·\81\ eÐ\94     ÃžÂ£\b䬠  Ã¯Âµ\võº\vòº\ròº\ fò¸\ eð¶\rïµ\fí³\ví³\ví³\ví³
+íµ     Ã¯Â·\vï·
+òº\fòº\vô¼\rõ¾\rõ¾\fõ½\rõ¾\rõ¾\fõ¾\võ¾\võ¾\võ¾\fõ¾\fó¾\fî¼
+î¾\vî¹\ fä°"ؼkþþßýý÷üüÿúÿúúýúýýÿüþþüÿýýÿûÿýûÿýýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþüýÿþÿýÿûÿúÿþÿÿýÿÿýíº\8a!Ð\94\rÜ \ eç¬\ eñ¸\ eó»\rô¼\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó¼
+õ¾\fô½\võ¾\fô¿\fëÁ Ã³Ã…\víÀ\14¿\98\198,\ 6\ 2\ 2\ 4\ 5\0\ f\ 2\ 1\ 3\ 3\ 3\ 4\ 3\ 3\ 5                     \83\83\83÷÷õýýûýýûüüúýýûüüúüüúýýûýýûüüúüüúüüúýýûûûùûûùüüúþþüüüúüüúûûùýýûýýûüüúýýûýýûýýûüüúüüúýýýüýûûý÷üþùðñðÂÀÁLHD\1e\16\ayY\11º\84\10Ò\96\vÞ¤
+å®\vî´  Ã´Â¸      Ã²Âº\ró¼\ fô¼\ fó»\ eòº\ eó¹\ eó¹\ eó¹\ eó¹\ eò¹\fô¼\fó¼
+ô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö¾\ eô½\fõ¾\ f÷¼\föº\ fñº\19Ô«,ÚÉ\8cÿüïýüýúþúøþ÷ýÿúýÿúþÿùÿþ÷ÿþùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþúýÿýÿýÿúÿ÷þþýÿýþÿþñº\8b#Î\92\vÛ\9e\vè®\ eï¶\fô¼\ eõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö½\fö½\fö½\fó¼
+õ¾\fõ¾\fó¼
+õ¿\fîÂ\bòÂ\fòÇ\11áµ\r\8eq\v\1a\f\ 1\ 6\0\a\ 2\ 2\ 2\ 2\ 2\ 2\1c\1c\1e\88\88\88óóóþþüüüúüüúüüúýýûüüúýýûýýûýýûýýûýýûüüúýýûýýûþþüýýûýýûúúøþþüýýûþþüþþüþþüþþüüüúüüúýýûýýûýýüýýûýÿùúüúÈÈÌD@D\ f \a\1c\14\ 3xX\f¸\82\rÒ\96
+Ý¢     Ã¤Â­
+ðµ\fô¹
+òº\rô½\ fõ½\ eõ½\rõ½\rõ½\rö½\rö½\rö½\rõ½\fö¿\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\rõ½\ eõ½\ eõ½\ eõ¾\vø½\ e÷½\r÷¼\11ú¼\12õº
+ð½\14浠ǤCÿûâüýûûÿöþþûÿýüþÿúþÿûþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûÿþùþÿûÿýÿúÿ÷þþýÿüûþþò½\8f$Î\92
+ڞ
+å«
+ð·\fô¼\fô¾\fõ¾\fô½\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö½\fõ¼\vö½\fö½\fõ¾\fö¿\rö¿\rô½\vò¿
+î¾\10ôÄ\11ðÉ\ fϤ\12gH\f4,\1fVWR\9b\9c\9bçççþþþûûüüýûûûùýýüýþûþþüýýûüüúüüúüüúüüúüüúýýûûûùüüúüüúûûùýýûýýûüüúüüúýýûüüúüüúýýûûûùüüúýýûüüúüüúúúøüýùÊËÊ337\ 4\ 2\ 6\a\ 2\0#\1a\ 3~\\ e¶\81\vÓ\97\vÞ¤
+ç¯\rð¶\fô¹\vô¼\ eó¾\ró¿\vó¿\vô¾\võ¾
+ö¾\vö¾\vö¾\vö¾\fô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\rõ½\ eõ½\ eõ½\ eõ½\ eò¾\10ôÀ\vö¾\bõ½
+òÀ     Ã³Ã€\v÷½\10õ¸\10â²\19æÖ\96þüýûþúÿýýÿüÿþþþûþÿýþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþûÿýþûÿýýÿûÿûþÿû÷ýýå¼\8c\1dÎ\91 Ãš\9d\fæª
+ò¸\ eóº\võ¼\rô¼\ eô¼\10õ½\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó½\ 6ò»\11ë½\12êÉ\vå¿\v¿\8e\16¬\8bWöôéùýùûýùûûýþüÿþýùþþúúúûûý÷üþùþþüþþüþþüþþüýýûþþüþþüþþüþþüÿÿýþþüûûùþþüþþüûûùýýùüýøýþùþþúýýûýýûýýûýýûýþûø÷ø¯¯­###\ 3\ 1\ 4\ 1\ 2\a\ 4\ 3\ 40\1f\ 1\86]\f¶\82\rÑ\99
+ߥ\bè®\vîµ\vó»\fô»\rô¼\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\võ¾\võ¾\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fð¿\11ñ¿   Ã¹Â½\ 5ú»\ fõ½\ fñ¿\vñ¼\ eõ·\11ê¬\ eìÕ\94üýúüþøþþûþýýÿýýûÿüüÿüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúÿþüüÿüþÿûÿüþþýùçâ¹¾\8b\19Î\91        Ãš\9e
+è­\fó¹\ eô»\vô»\fõ½\ fó»\ eõ½\rõ¾\fõ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\fõ½\ fõ¼\rï½\vèÁ\fèÀ\ eÚ©\13 y\1cƹ\98üüøûüûüüúüüùüü÷þýúþþþýþûüüùüüúûûùüüúüüúúúøýýûüüúüüúýýûýýûýýûþþüüüúýýûÿÿýþþúýþùýþùüüúüüúûûùüüúüüúóôò\83\81\84\11\10\10\ 3\ 3\ 2\ 3\ 2\ 4\ 1\ 2\ 6\ 6\ 4\ 2:&\ 2\89_\f¶\82\rÑ\9a
+à¦\bé®\vï¶\vó¼\fõ¼\ eõ½\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\rõ¾\fõ½\rõ¾\rõ¾\fõ¾\fõ¾\fö½\ f÷½\vö¾\ 5ô½\võº\13ó¸\11ó¹\12è³\ eܪ\11ç×\94üüúþýÿýýþþþýÿþýýþþýþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿúþþüþÿúþþþûþøÕÂ\84¾\87\12Ï\91\bÛ\9f
+è­\fñ·\fô»\vô»\fõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ró»\12ö»        ÃµÂ½\bê½\ eìÂ\12ç¹\vÈ\9e\16\95w/èÞÒüùûüý÷ýÿôýþùýüýýýýûüüúûùüüúýýûûûùþþüþþüýýûýýûýýûþþüýýûüüúýýûüüúüüúüüúüüúüüúýýûÿÿýüüúýýûýýûáááXYY\ 6\ 5 \ 3\ 2\ 3\ 2\ 2\ 3\ 3\ 1\ 3\ 2\ 2\ 5    \ 5\ 1D/\ 6\89^
+³\7f
+Ð\99     Ã¢Â§      ÃªÂ¯\rï¶\fô¼\fõ½\ eõ½\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ eõ½\10õ½\ eõ½\ eõ½\ eõ¾\fõ¾\fõ¾\fø½\ 6÷¾\ 6ó¿\ró½\ eô¹\ fíµ\vè²\vä§\vÒ¥-ïê»ýÿýþüÿþþýüÿýþþýþþýþþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿþýÿùÿýüÿþýúýüýþòŤPÀ\85\rÍ\90\ 5Ü¡   Ã©Â®\vó¹\rô»\võ¼\vó¼
+õ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¾\fñ½\ fö»\v÷»\fî¼\ eè¾      Ã­Ãƒ\vÙ¬\ f­\83\15\98\83Y÷òîýüûùýóûýøýüþûûûýÿýýýûýýûþþüûûùüüúüüúüüúþþüüüúüüúüüúýýûþþüþþüýýûþþüþþüýýûüüúþþüþþýööö\9f\9f\9f$$$\ 2\ 3\ 3\ 4\ 3\a\ 5\ 4\ 6\ 2\ 2\ 4\ 3\ 1\ 2\ 3\ 2\ 3\v\ 6\0J3\ 6\87\\ 5°|\aÏ\98\bã¨\vë°\rï¶\fó»\vô¼\fõ½\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ eõ½\ eõ½\ eõ¾\fõ¾\võ¾\võ¾\võ¾\vö¾\fõ¾\ eó¾\ fîº\ eìµ\10åª\vÝ¡\vÕ\97\1cäË\8eþýóüÿüþûüþþøûÿûýÿüÿþ÷ÿþùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýýþÿýÿúÿýþþþÿýþùÿý߸\84 Ãƒ\86
+Ó\96\ 6å«\ eñ¶\11óº\rõ¼\rõ¼\rõ¾\fõ¾\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fö¿\rõ¾\fó½\vñÀ\fó¼\v÷»\ fï¼\ fæ½\ 6è¿      Ã¡Â±\ eÄ\91\r\83e\15¬\9b\83ýøùûþûüþúþýþýýþûüøüüùýýûýýûýýûþþüüüúýýûûûùüüúýýûþþüýýûüüúúúøüüúüüúüüúýýûýýüööö¹¹¹BBB\a\a\a\ 1\ 1\ 1\ 1\ 2\ 2\ 3\ 1\ 6\ 3\ 1\ 4\ 2\ 2\ 4\ 3\ 1\ 3\ 3\ 1\ 1\ e\b\ 1Q9\ 6\89\\ 6±}\bÏ\98\bã©\vë°\rð·\ró»\võ¼\fõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾
+õ¾     ÃµÂ¾
+ö¾\fõ¾\ró»\10öº\17ó·\11íµ\ fâ¦\12Û\99\12Í\94 Ã‰Â«mÿúòþýÿýÿüÿýýþþøúÿûüÿýÿþ÷ÿÿøþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýýþÿþþûÿýþþýÿþýïÑÁ\84¼\81\rÉ\8c
+Û      Ã¬Â²\11ó¹\10óº\fô»\fõ¼\rõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô½\vô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾\fó½\vñ¿\vó¾\vô¼\fðº\ fä¶\aå¹\b߯\fË\96\v x\ eZ>\ f£\97\92óôõûþûûúûýýýûý÷ýþúüüúýýûüüúýýûýýûüüúþþüþþüýýûýýûþþüüüúüüúüüúýýûýýüûûûËËËSSS                       \ 4\ 4\ 5\ 3\ 3\ 5\ 4\ 4\ 6\ 1\ 3\ 3\ 3\ 1\ 6\ 3\ 1\ 4\ 1\ 2\ 4\ 3\ 1\ 4\ 4\ 2\ 1\15\ e\ 2W<\a\88[\ 3±|  ÃŽ\96\bâ§
+ê¯\fñ¸\ eó¼
+õ½\rö¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\võ¾
+õ¾\võ½\fó»\róº\ fñ·\12ïµ\ eé®\bã¢
+Ö\96\10Á\95+ÓÄ\89ÿþìýÿüþÿúþþüþüÿÿýþûÿýýþÿÿýüþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿüÿþúÿþûýþÿÿýæ¯\84(Æ\89   Ã’\97
+â¨\vñ¸\12ó¹\róº\võ¼\rö¼\ fö¾\ fõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô½\ eô½\võ¼\fóº\ fè´\bâ±\ 5ܪ
+Ó\9b\10°}\vwR\a.\1e\ 5\ZWÎÏÎüûøúúùùüøúüùþþüüüúüüúüüúýýûüüúüüúüüúýýûýýûüüúüüúýýûüüúééç­­­SSS\f\f\f\ 2\ 2\ 2\ 4\ 4\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 3\ 3\ 3\ 1\ 5\ 2\ 2\ 4\ 1\ 2\ 4\ 3\ 1\ 3\ 3\ 1\0\1c\14\ 5Y=\a\8a\\ 5²}
+Ï\96     Ã¡Â¦      ÃªÂ¯\fð·\ró¼
+õ½\fõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¼\rô¼\11ð·\10ì³\10è­\ eÛ¢
+Ò\9e\ eÅ\92\18ʧXìã½úÿîüÿöüþ÷þþøþþûýþþÿýþüÿýþþÿþýýþÿúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûýÿùÿþùþÿùüÿýäÞ»»\86\13Ç\8b\ 3Ø\9e\f⨠      Ã«Â²
+ôº\r󺠠ô»\fõ»\ eô¼\ eô¼\rõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¼\rö¼\ fõº\ e÷»\ eð·\vâ¬\ 6Ü¥\vÒ\99\f¹\7f\f\8db\bN:\b\13\r\ 3\ f\ e\ eSRO¡¡ ÒÔÔìíìøøöûûùýýûûûùûûùüüúüüúùù÷ùù÷ññïßßݼ¼º\89\89\87PPN\16\16\14\ 4\ 4\ 4\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 4\ 1\ 3\ 2\ 3\ 1\ 5\ 2\ 2\ 4\ 1\ 2\ 4\ 3\ 2\ 3\ 4\ 1\0#\17\b\=\ 6\8e`\ 6´\7f\vÎ\96\bá¦
+é¯\vð·\fó¼\võ½\fö¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\rõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fô¼\vó»\vóº\vô¼\rô½\ eò¼\rï¸\ré±\rÞ¥\bÙ\9f    Ã‘\99\ eÈ\92\14³\87,îâ¿ýýôûü÷ÿýûþûþþüÿÿûÿþþûüÿ÷ÿþùþÿúþýþþþúþÿøþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüúÿúÿþýÿþûÿýúÏÂ\8c¼\88\ fÍ\8a\ 4Õ\9a\aâ¤\fè¬\vïµ\fò¹\vòº\róº\10ôº\13ô¹\12öº\ e÷¼\fö½\vó¼
+ô¼\rö½\r÷½\f÷½\vô½\vó¿\vó¿
+õ¾
+õ¾
+õ¾\võ¾\vö½\võ¾\võ¾\võ¾\fõ¾\fõ¾\fõ¾\fô½\vö¿\rô½\võ½\fö½\ eóº\vð¸\væ®\bÝ¥
+Ӛ
+¼\83\b\98f  iG\v'\16\ 1\ 5\ 2\ 3\ 1\ 2     \ 2\ 4\ 5\14\13\14*))GGGaaawww\82\82\82wwwfffXXXPPPEEE$$$\v\v\v\a\a\a\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 2\ 4\ 3\ 1\ 5\ 3\ 1\ 6\ 1\ 2\ 4\0\ 3\ 2\a\ 5\02!\ 5eB\ 6\96e\ 5·\80
+̕\fݤ
+è°     Ã±Â·\fô»\rô¼\rõ¾\fõ¾\vô½
+õ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ eö½\fø½        Ã¸Â½\vö½\ eõ¼\ eôº\ fóµ\11õ¶\10ó¸\10î¸\12è´\fá¬\ 6Õ\9e\ 6Ë\94\13¾\89\1c¿¦_èä½ÿüçÿýùýýþþÿûþþûÿýþþþÿþþýþþûþþûþþüþþüþþýþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþÿûÿÿþóÿþñÓÄ\8d·\85\14Ê\86\10Ï\93\r×\9f\ 6ߨ\bç°\fé°\vîµ\10ï¶\ eñ¸\rò¸\vò¶\fò¸\ró»\rô¼\ eô¼\10ó»\ eö½\ fö½\fõ½\ fõ½\ eõ¾\fõ¾\fõ¾\fö½\fõ¼\fõ¼\fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fõ½\ eõ½\ eö¾\ fö¾\rõ½\ eö½\ eôº\ eï¶\fè®\vÛ¢ Ã‘\98\v»\81\b\9di\frL\v<&\ 5
+\ 4\ 2\ 1\ 2\a\ 2\ 3\ 5\ 3\ 2\ 4\ 3\ 3\ 4\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 1\ 1\ 1\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 3\ 3\ 2\ 1\ 5\ 3\ 1\ 6\ 1\ 2\ 5\ 1\ 3\ 3\v\a\ 1;(        kH\b\99g\ 6·\80\vÊ\92\vÛ£
+ç­\bî´
+ö¼\ fõ½\rõ¾\fõ¾\fõ¾\fô½\võ¾\fõ¾\fõ¾\fõ¾\fõ¾
+õ½
+ö½\fõ½\fó½\fï¹\fî¶\ fî³\ eï²\12ê¯\ e㬠    ÃšÂ¢\vÐ\94\11»\82\19º\98QçÞºÿüçÿýïþýùüüþþÿþþÿúþÿúÿýýþþþþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿúÿüÿÿüþÿýöÑÂ\93³\81\18Ç\86\ 6Ê\8b\ 4Ñ\95\ 6×\9b\aÝ¡     Ã£Â¦\rã¨\vä«\vã®\aå±\ 6è¯\fê¯\fë³\vîµ\fî¸\10î¸\10ò¹\ fòº\ fôº\ fôº\10ôº\ eô»\ eõ¼\ eö½\ e÷½\10ö¼\ fõ¾\fõ¾\fõ¾\fõ¾\fõ¾\fö¾\ eõ½\ eõ½\ eö½\f÷¾\ eö½\10ó¹\ fí³\fäª\vÚ \rÎ\95\r¶}\ 6\9af\auL\ 6M4      \15
+\ 1\ 2\ 1\ 4\ 1\ 3\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 3\ 2\ 2\ 2\ 4\ 3\0\a\ 2\ 1\ 6\ 1\ 2\ 4\v\ 6\ 1?) oJ\b\99g\a¶\7f\fÇ\8e
+ٟ
+媠    Ã¯Â´\fóº\ eõ¼\ eö½\ eö½\ eö½\ eö½\ eö½\ eö½\ eö½\ eö½\ eö½\aô½
+ô»\14ñ¸\13ëµ\fç±\ 6ä¬\bã©\rà¦\fÙ\9d\bÑ\92\vÀ\86\14\9cs'æÛ¼þýøþþûþý÷ÿüúþýÿüüþüþýþÿùþÿùÿþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûúÿõûþÿýÿøþÿõçÞ½§}&¹}\10¾\82  Â¾\86\vÄ\8b
+Ì\90     Ã•\95      Ãš\99      Ã›\9c\vÛ\9f   ÃœÂ¡\bÞ¡\và¤
+⦠    Ã£Â©      Ã¥Âª\vè®\ eê°\ eî´\ fñ¶\ fó¶\ eô·\ eó¸\ eôº\ fò¸\fóº\fö½\ eõ¾\fõ¾\fõ¾\võ¾\vô½
+õ¾\fô½\vô¼\fõ½\võ¼\vôº\ eó¹\ fé°\vߦ
+Ó\9a\vÆ\8b  Â¯w\ 4\96b\ 4zP\ 6Y<\f%\15\a\ 5\ 1\ 2\ 1\ 2\ 2\ 1\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 1\ 3\ 2\ 2\ 2\ 4\ 3\0\a\ 2\ 1\ 6\ 2\ 2\ 4\ e\a\ 1B,\vnH\ 5\96c\ 4²{\vÂ\89        Ã”\99      ÃŸÂ¤\aë®\vò·\ eó¹\fô»\fõ¼\rö½\ eö½\rõ¼\vô»
+óº
+ò¹
+ò¹     Ã±Â·\ fîµ\16é¯\11ä©\vâ¥
+ܟ
+×\9a     ÃŽ\94\aÂ\8a\r©{!˸\89þüîüýùúýùûÿüüýýýýþýýÿûüýýÿûþÿøþÿùÿþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüþþýþÿüÿùþÿùÿûöèÚ¶\9dy% x\r«z
+°z\a·~\b¹~\ 6¿\81
+\85\fĉ\fɎ\r͐
+ӕ
+Õ\97\bÕ\98\ 6×\9a\aÜ\9f\fÝ¡\và¥\fä©   Ã¦Â«
+è­\vê¯\vî´\rñ¸\ eòº\ fòº\ró»\rö¾\ fó¼\vô½\vô½\võ¾\fô½\vô½\vóº   ÃµÂ¼\vó¹\rïµ\ e㪠    Ã˜\9e      Ã‰\90\b¹\80\ 5¦p\ 5\92_\ 6zP\ 5[>\v'\17\a\ 6\ 1\ 2\ 2\ 2\ 2\ 2\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 3\ 3\ 5\ 1\ 3\ 2\ 2\ 2\ 4\ 4\0\ 6\ 3\ 1\ 6\ 3\ 2\ 4\r\ 6\ 2@*\viD\ 4\90^\ 4¬t
+¼\83
+Γ
+Ü \vå©\fî³\ fñ·\ eò¹\fóº\vô»\vô»
+ô»
+ò¹
+ôº\ eó¹\ eñ¶\ eë±\ fæ¬\fá¥\ 6Þ\9e\ 6Ø\94\vÓ\91\10Ç\8d\vµ\82\17¶\9bTãܺýýôþýúÿþ÷ýÿöúÿùüÿüýÿýýÿüýÿúýÿøþÿùþÿûÿýþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýÿüÿÿüþÿÿóþÿöþýýÿûôÿûéáٸî\80«\8fQ\8di\18\97o\ f\9fr\b¦t\ 6®w Â´z\v¸}\f½\81
+À\84\aÃ\88\aÄ\87\ 6Æ\8a    Ãˆ\8d\bÌ\91   Ã‘\98\bÕ\9b   Ã™\9f\fÝ£\rߥ\fã¨\fç­\fì²\ fñ·\11ò·\10ó¹\10óº\rôº\fóº\fò¹\vôº\ eóº\rò¸\ eï´\ eç­\rÛ¢
+Î\94\b¾\85\b¬t\ 4\9be\ 6\8b[\bsK\ 4V:\b%\16\ 6\ 5\ 1\ 3\ 2\ 3\ 4\ 2\ 3\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 3\ 3\ 5\ 1\ 1\ 3\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 1\ 1\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 1\ 1\ 4\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 1\ 1\ 3\ 1\ 1\ 3\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 3\ 3\ 5\ 1\ 2\ 4\ 2\ 1\ 6\ 4\0\ 6\ 3\ 1\ 3\ 2\ 2\ 1\ e\b\ 3=(\vb@\ 3\88W\ 3Â¥n\v³{      Ã„\8a      Ã”\99\fÝ    Ã¦Âª\fë°\fïµ\fñ·\fò¸\róº\ró¹\rò¸\rñ¶\ fë±\fè­
+ã¨\ 6Þ¤\aÙ\9a\vÐ\8f\aÆ\88\ 2·\83\v©\7f(ɹ\8cÿüèÿÿòøþøùÿýþýþÿüýÿýüþÿúþÿúþÿùþÿøþÿùþÿúþþýþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýüÿýûÿüÿÿýÿûüùüþýüþûýüúýýöþþòþþëâÙ¼Á¯\82ª\8eK\90e\v\9ak\ 5¢n\f¨s\ f®w\f®v\a³y
+³y
+¶{     Â¸~      Âº\81\a½\84\bÁ\88        Ã†\8d\vË\91\vÒ\97\vØ\9e\rÜ£\ eâ¦\rè«\ fë¯\ fï´\11ó¹\12ñ¶\ eó¸\11ò¸\11ï´\ eì±\ fç¬\ fÝ£\ eÑ\98\vÄ\8b\v³{\v¡i\ 6\92\\a\7fQ\ 5iE\ 3M7\b \14\a\ 4\ 1\ 6\ 2\ 2\ 4\ 3\ 1\ 2\ 3\ 3\ 3\ 2\ 2\ 2\ 3\ 3\ 3\ 3\ 3\ 3\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 2\ 2\ 4\ 3\ 3\ 5\ 3\ 3\ 5\ 2\ 2\ 4\ 2\ 2\ 5\ 1\ 2\ 6\ 2\ 1\a\ 4\0\ 6\ 3\ 1\ 1\ 2\ 3\0\r \ 38&\v[:\ 3\80R\ 2\9be\b«t\bº\81\aÊ\8f   Ã–\9b
+ߤ
+äª
+è®
+ì³\rì³\fì³\fî´\ fê°\ eç¬\ eã¨\rÝ¡        Ã•\9a\ 5Ï\95   Ãˆ\8b\11º}\v¨w\b\96w$èß¼ÿû÷ýüûúþúùþýüþÿþþÿÿýþÿýþÿýýþþûþÿûþÿúþþûþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûûÿøûÿ÷ýþþÿýÿýþøûþúüýþþüüÿýúýýúýýúþþüþýùÿüñÿýå¿´\8eª\8bI\87]\ f\8c`\v\97g\f\9bh
+\9dh\a¡k\ 6£l\ 5§o\ 6©q\a­t\a²y\b·}\b½\82\ 6Ä\89\bÌ\92\vÒ\96
+Ù\9c\vÚ\9e\bÞ¢\bâ§
+ç«\vè¬\fé®\ fåª\rà¥\fÙ\9c
+Í\92\aÂ\88\ 6·~\b¦n\b\94]\ 4\86S\ 4uI\ 4^=\ 2B-\a\13
+\ 2\ 4\ 2\a\ 2\ 2\ 5\ 3\ 1\ 2\ 2\ 1\ 2\ 3\ 3\ 3\ 3\ 3\ 3ggg\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\80\81\80\80\81\80\80\81\80\80\81\81\81\82\80\80\81\80\80\81$$&\ 3\ 3\b\ 3\ 1\b\ 4\0\ 5\ 2\ 1\ 1\ 1\ 3\0
+\a\ 23#
+V7\ 4|N\ 3\96a\b¥o\b´{\ 6À\85\ 4Ë\91\ 5Ö\9c\bÝ¢\aá§
+ᨠ    Ã£Âª\vä«\vãª\vߥ
+۟
+֙\bД
+È\8b\ f¼\81\f±y\ 6\9cj    \86`&äÚÆûýùùþüýýüýûüÿüýþýûþÿúýÿúûÿûýþþÿýÿÿýþÿýþÿýþþþÿþþýþÿûþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþþûþþüþþýþþûþþüþþýþþüþþüþþüþþüþþýþþýþþüþþûþþùÿýôþýïÿý庮\89\9a\85SvS\13\84X\f\8b[    \8d[\ 6\91]\ 4\97b\ 4\9eg\ 4¢l\ 5§p\ 4«v\ 4²~\ 6º\84      Â¾\88      Ã‚\8c\bÈ\91   Ã\95\aÓ\98\bÚ\9d\vÛ\9b\vÕ\97\fÐ\92\vÈ\8a
+¾\82     Â±x\a¢l\ 6\91]\ 4\84T\ 3wJ\ 1fA\ 5O5\r+\1d
+\a\ 3\0ghhåææýûüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýþþýþþýþþýþþýþþýþþýýþýþþýþüüãâã\80\80\82\82\81|QD+N3\ 4qG\ 5\8d\
+\9dh\ 6¬t\ 5¶|\ 6¾\86    Ã‡\8c\aÎ\93\ 5Ñ\98
+Ò\99\vÓ\9a  Ã‘\9a\ 5Ñ\99\ 6Í\94\ 6È\8d\ 5Â\86\ 4º\81\b³{
+¨q\ 6\92e\11¨\93hÿýðüþüýþÿþþýþþüþþüþþüþþüþþüþþüþþüþþýþþýþþüþþüþþüþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿþûýûýþúýüöþþòÿýìÜÕÀ­\9e\85\8f{PcG\12oP\ f{W\v\84Y   \8bZ\ 5\97a\a\9de\aÂ¥l\ 2ªq\ 4®u\b²y\f¶}\v¹\80      Â½\83      Â¿\86\a½\85\ 5¹\81\ 6±y\ 5§o\ 4\9ad\ 2\8dZ\ 3\80P\ 5vH\biB\ 6W9\b?*\v\14
+\ 1,*(åæåüýüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüýûýþûþýûýüýýýÿþþù¥\9d\87G0\be@\ 3\81S\ 5\94a\ 4¤l\ 4­u\a³{
+¶~\a»\82\ 4Á\85\ 4Ä\87\aÅ\88 Ã„\88      Ã\87
+»\84
+³}     Â®x\b¨q\b\99h\ 3\83]     Â¦\92hÿûïýüùüýûýþùþÿûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýüøþþúýþûüþüúþüüýúýþùþý÷þüôÿýñÛÕÀ« \81\8dxQa@\fpG\a\80Q\ 6\8bX\ 5\90[\ 5\98b
+\9ce
+ i
+£l
+£o     Â¡o\a\9el\ 3\9dj\ 4\94a\ 1\8e\\ 2\86V\ 3{N\ 3pE\ 6e=\bV9\vF3\ f\85zgêçßýþüüþþþÿýþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþýþýüýüùýýüüþþüýøÕÑÁ>,\ fU7\ 6pI\ 5\87X\ 6\98d\ 5£l\b©r\fªt
+­v\b²y\ 6µz\a·{
+¶y\f´w\r®u\ e¥p
+\9dl\b\93c
+wS\f\9d\8efþþñýþûüûüýûþþÿùýÿøþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýþÿüÿþüþýüýþýþýüúÿýùÿþùÿþùþýøÿÿúþüøÿüõÿû\89\87uQ`A\ fpK\ fzR\v\83V\ 5\87W\0\8aY\ 1\8bZ\ 2\8aY\ 4\8aX\ 5\88U\ 6\85S\ 6~N\ 5wK\ 4nH\ 5`?\ 4W9\a@/\10«¥\91ÿýôýýüûýþýþþýþúÿþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýýüûÿþûýþûúýüüýúÿýõ¥\9d\8eA.\fV9\ 6mG\ 5\85V\ 6\93`\ 6\9cf\b\9fj\b¢l\a£p\a¢o\ 4§q\ 6¦m\ 3Â¥l\ 6\9fi     \93a\ 6\87Y\ 4oJ
+\9a\88lþûõøþùúþúýüþþûþýýüýþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûýÿüýÿýýÿþþþþþþþþþþÿýþÿüýÿýûþÿúüÿûüÿýýÿþþþüÿþ÷ÚÖÁ¦\9a|]H\1d^A   hE\ 4oF\ 1uI\ 2zK\ 5|K\ 6yH\ 4tD\ 4rG
+hC\bY<\ 6N6\bA-    ÂªÂ¤\92ÿýöýýüüþÿûÿÿýÿýþÿúÿýúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýþþýþÿûýÿúýÿûþþüÿþúÿýö¢\9d\89?/\ fP4\ad?\ 2wL\ 3\85W\ 4\8e^\ 5\95b\ 6\98g
+\96f\a\94d\ 3\94c\ 2\8e_\ 4\82X oK\v`A\r\97\88mÿüõþüýýþüýþýþþþÿþûþþþþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþÿùþþøþÿøýÿùüÿùûÿùûÿùûÿúþýþÿýþýÿýüÿýüÿþüÿýýÿúþÿ÷þþ÷þýôÿýï­¢\8f\84rVP5\10Z:\fa>
+c>\ 6a<\ 4_;\bX8    P5\fF2\10\N6ºµ¥þüõüüûþþÿüýÿýþþýÿûþÿúÿþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþûþþöìêÛXK2G0\vR6\ 5^>\ 3iE\ 3oH\ 4wL\axM\auK\ 4mH\ 3bC\bS;\ f\83v[ߨÌýüøûýùÿýýÿûÿÿýýþþüþþþÿþùþÿùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿýþÿüþÿýþÿýýÿþûþþûþþûýÿúýÿøýÿøýÿùþþýþýÿþýÿÿþýÿþúþþüýýýýüûþþüýü÷ÿýð­£\90¡\96|M=\1c>-\f>,\ f^O6\9d\94\7fïìÜÿûõþýüýüüýüüýüýûûüþÿûþÿùþÿúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþþûýÿýþþþÿþýÿþüþþüþþýýÿüþþúÿýöëèÛ\9b\93}\N1?-\fF0\ eI0\rI0\fE/\f\85vV\9e\95}ÞÚÌþüøýýþúþýûþúüúúþüþÿþüüÿúüÿýÿþúþþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüüÿýüÿýüÿýýÿþþþþÿýþÿýþÿýÿþþÿþþþÿþúÿþøÿþùÿþüþþþþþþÿüüýûúýþûúþúùÿúùþùûþùýþùþþ÷þý÷ÿýöÿüõÿþöþþ÷üþüûýþþýûÿýûþüüþýýÿþúþÿùþÿúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþÿûþþüýþþþþÿÿþýÿýûþþûýÿýúþûüýüüüüüüüþþûýü÷ÿþöÿüöÿýôþýóþþ÷ýýøþþûýýúþþûýþúüþüüþûýþùüþúüþýüÿ÷ýÿôÿýýþýÿþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýþüþþüþþüþþüþþüþþýþþýþþýþþýþþüþþûþþûþþüþþüþþüþþüþþüþþüþþüýþüþþüþþüþþüþþüþþüþþüþþüþþûþþûþþüþþýþþüþþüþþüþþüþþüþþûþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþýþþüþþüþþüþþüþþüþþüþþýþþýþþüþþüþþüþþüþþûþþûþþüþþüþþüþþüþþüþþûþþüþþüþþûþþüþþüþþûþþûþþýþþýþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü
\ No newline at end of file
diff --git a/TIFF/testimg/rgb16.tif b/TIFF/testimg/rgb16.tif
new file mode 100644 (file)
index 0000000..19fa32b
Binary files /dev/null and b/TIFF/testimg/rgb16.tif differ
diff --git a/TIFF/testimg/rgb16t.tif b/TIFF/testimg/rgb16t.tif
new file mode 100644 (file)
index 0000000..4ae3247
Binary files /dev/null and b/TIFF/testimg/rgb16t.tif differ
diff --git a/TIFF/testimg/rgbatsep.tif b/TIFF/testimg/rgbatsep.tif
new file mode 100644 (file)
index 0000000..f1f88f3
Binary files /dev/null and b/TIFF/testimg/rgbatsep.tif differ
diff --git a/TIFF/testimg/scmyk.tif b/TIFF/testimg/scmyk.tif
new file mode 100644 (file)
index 0000000..58a39c7
Binary files /dev/null and b/TIFF/testimg/scmyk.tif differ
diff --git a/TIFF/testimg/scmyka.tif b/TIFF/testimg/scmyka.tif
new file mode 100644 (file)
index 0000000..582bb42
Binary files /dev/null and b/TIFF/testimg/scmyka.tif differ
diff --git a/TIFF/testimg/scmyka16.tif b/TIFF/testimg/scmyka16.tif
new file mode 100644 (file)
index 0000000..e24fbd4
Binary files /dev/null and b/TIFF/testimg/scmyka16.tif differ
diff --git a/TIFF/testimg/scmykaa.tif b/TIFF/testimg/scmykaa.tif
new file mode 100644 (file)
index 0000000..5145d8d
Binary files /dev/null and b/TIFF/testimg/scmykaa.tif differ
diff --git a/TIFF/testimg/slab.tif b/TIFF/testimg/slab.tif
new file mode 100644 (file)
index 0000000..1750daa
Binary files /dev/null and b/TIFF/testimg/slab.tif differ
diff --git a/TIFF/testimg/srgb.tif b/TIFF/testimg/srgb.tif
new file mode 100644 (file)
index 0000000..003c9ea
Binary files /dev/null and b/TIFF/testimg/srgb.tif differ
diff --git a/TIFF/testimg/srgba.tif b/TIFF/testimg/srgba.tif
new file mode 100644 (file)
index 0000000..dbe2bbe
Binary files /dev/null and b/TIFF/testimg/srgba.tif differ
diff --git a/TIFF/testimg/srgba16.tif b/TIFF/testimg/srgba16.tif
new file mode 100644 (file)
index 0000000..e6d8e5f
Binary files /dev/null and b/TIFF/testimg/srgba16.tif differ
diff --git a/TIFF/testimg/srgba32.tif b/TIFF/testimg/srgba32.tif
new file mode 100644 (file)
index 0000000..7725f5f
Binary files /dev/null and b/TIFF/testimg/srgba32.tif differ
diff --git a/TIFF/testimg/srgbaa.tif b/TIFF/testimg/srgbaa.tif
new file mode 100644 (file)
index 0000000..3214858
Binary files /dev/null and b/TIFF/testimg/srgbaa.tif differ
diff --git a/TIFF/testimg/tiffwarn.tif b/TIFF/testimg/tiffwarn.tif
new file mode 100644 (file)
index 0000000..bdc7029
Binary files /dev/null and b/TIFF/testimg/tiffwarn.tif differ
diff --git a/image.c b/image.c
index dfd6f1cf6b4d94cb3037bf8b6354d264f9576c8b..74a4f0bd89172b9a495e40ddb94efff1b0efb9bb 100644 (file)
--- a/image.c
+++ b/image.c
@@ -2310,10 +2310,13 @@ i_test_format_probe(io_glue *data, int length) {
 /*
 =item i_img_is_monochrome(img, &zero_is_white)
 
 /*
 =item i_img_is_monochrome(img, &zero_is_white)
 
+=category Image Information
+
 Tests an image to check it meets our monochrome tests.
 
 The idea is that a file writer can use this to test where it should
 Tests an image to check it meets our monochrome tests.
 
 The idea is that a file writer can use this to test where it should
-write the image in whatever bi-level format it uses, eg. pbm for pnm.
+write the image in whatever bi-level format it uses, eg. C<pbm> for
+C<pnm>.
 
 For performance of encoders we require monochrome images:
 
 
 For performance of encoders we require monochrome images:
 
@@ -2325,12 +2328,12 @@ be paletted
 
 =item *
 
 
 =item *
 
-have a palette of two colors, containing only (0,0,0) and
-(255,255,255) in either order.
+have a palette of two colors, containing only C<(0,0,0)> and
+C<(255,255,255)> in either order.
 
 =back
 
 
 =back
 
-zero_is_white is set to non-zero iff the first palette entry is white.
+C<zero_is_white> is set to non-zero if the first palette entry is white.
 
 =cut
 */
 
 =cut
 */
index 347a75c03a23aebf3f1693c1dc2f2ad5e80fd252..770a69e12799e662a0cbcc196ccaaf07a08e85fb 100644 (file)
--- a/imager.h
+++ b/imager.h
@@ -387,39 +387,6 @@ i_readjpeg_wiol(io_glue *ig, int length, char** iptc_itext, int *itlength);
 undef_int i_writejpeg_wiol(i_img *im, io_glue *ig, int qfactor);
 #endif /* HAVE_LIBJPEG */
 
 undef_int i_writejpeg_wiol(i_img *im, io_glue *ig, int qfactor);
 #endif /* HAVE_LIBJPEG */
 
-#ifdef HAVE_LIBTIFF
-i_img   * i_readtiff_wiol(io_glue *ig, int allow_incomplete, int page);
-i_img  ** i_readtiff_multi_wiol(io_glue *ig, int length, int *count);
-undef_int i_writetiff_wiol(i_img *im, io_glue *ig);
-undef_int i_writetiff_multi_wiol(io_glue *ig, i_img **imgs, int count);
-undef_int i_writetiff_wiol_faxable(i_img *im, io_glue *ig, int fine);
-undef_int i_writetiff_multi_wiol_faxable(io_glue *ig, i_img **imgs, int count, int fine);
-char const * i_tiff_libversion(void);
-int i_tiff_has_compression(char const *name);
-
-#endif /* HAVE_LIBTIFF */
-
-#ifdef HAVE_LIBGIF
-i_img *i_readgif(int fd, int **colour_table, int *colours);
-i_img *i_readgif_wiol(io_glue *ig, int **colour_table, int *colours);
-i_img *i_readgif_scalar(char *data, int length, int **colour_table, int *colours);
-i_img *i_readgif_callback(i_read_callback_t callback, char *userdata, int **colour_table, int *colours);
-i_img *i_readgif_single_wiol(io_glue *ig, int page);
-extern i_img **i_readgif_multi(int fd, int *count);
-extern i_img **i_readgif_multi_scalar(char *data, int length, int *count);
-extern i_img **i_readgif_multi_callback(i_read_callback_t callback, char *userdata, int *count);
-extern i_img **i_readgif_multi_wiol(io_glue *ig, int *count);
-undef_int i_writegif(i_img *im,int fd,int colors,int pixdev,int fixedlen,i_color fixed[]);
-undef_int i_writegifmc(i_img *im,int fd,int colors);
-undef_int i_writegifex(i_img *im,int fd);
-undef_int i_writegif_gen(i_quantize *quant, int fd, i_img **imgs, int count);
-undef_int i_writegif_callback(i_quantize *quant, i_write_callback_t cb, char *userdata, int maxbuffer, i_img **imgs, int count);
-undef_int i_writegif_wiol(io_glue *ig, i_quantize *quant, 
-                          i_img **imgs, int count);
-void i_qdist(i_img *im);
-
-#endif /* HAVE_LIBGIF */
-
 i_img   * i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, int intrl);
 undef_int i_writeraw_wiol(i_img* im, io_glue *ig);
 
 i_img   * i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, int intrl);
 undef_int i_writeraw_wiol(i_img* im, io_glue *ig);
 
diff --git a/imext.c b/imext.c
index c7a5e5c607308f77b983b4145584727ed637b18e..09f4e5d6419959d2ef58b0232faf305614178853 100644 (file)
--- a/imext.c
+++ b/imext.c
@@ -117,6 +117,9 @@ im_ext_funcs imager_function_table =
     /* IMAGER_API_LEVEL 4 functions */
     i_img_alloc,
     i_img_init,
     /* IMAGER_API_LEVEL 4 functions */
     i_img_alloc,
     i_img_init,
+
+    /* IMAGER_API_LEVEL 5 functions */
+    i_img_is_monochrome
   };
 
 /* in general these functions aren't called by Imager internally, but
   };
 
 /* in general these functions aren't called by Imager internally, but
diff --git a/imext.h b/imext.h
index 13fef9086991e87630993c842272b035ec8cd728..acd8267103dca62fb7d3391a5341a1e029c1fe77 100644 (file)
--- a/imext.h
+++ b/imext.h
@@ -106,6 +106,11 @@ extern im_ext_funcs *imager_function_ext_table;
 
 #endif
 
 
 #endif
 
+#define i_gsamp_bits(im, l, r, y, samps, chans, count, bits) \
+  (((im)->i_f_gsamp_bits) ? ((im)->i_f_gsamp_bits)((im), (l), (r), (y), (samps), (chans), (count), (bits)) : -1)
+#define i_psamp_bits(im, l, r, y, samps, chans, count, bits) \
+  (((im)->i_f_psamp_bits) ? ((im)->i_f_psamp_bits)((im), (l), (r), (y), (samps), (chans), (count), (bits)) : -1)
+
 #define i_new_fill_solid(c, combine) ((im_extt->f_i_new_fill_solid)((c), (combine)))
 #define i_new_fill_solidf(c, combine) ((im_extt->f_i_new_fill_solidf)((c), (combine)))
 #define i_new_fill_hatch(fg, bg, combine, hatch, cust_hatch, dx, dy) \
 #define i_new_fill_solid(c, combine) ((im_extt->f_i_new_fill_solid)((c), (combine)))
 #define i_new_fill_solidf(c, combine) ((im_extt->f_i_new_fill_solidf)((c), (combine)))
 #define i_new_fill_hatch(fg, bg, combine, hatch, cust_hatch, dx, dy) \
@@ -203,4 +208,6 @@ extern im_ext_funcs *imager_function_ext_table;
 #define i_img_alloc() ((im_extt->f_i_img_alloc)())
 #define i_img_init(img) ((im_extt->f_i_img_init)(img))
 
 #define i_img_alloc() ((im_extt->f_i_img_alloc)())
 #define i_img_init(img) ((im_extt->f_i_img_init)(img))
 
+#define i_img_is_monochrome(img, zero_is_white) ((im_extt->f_i_img_is_monochrome)((img), (zero_is_white)))
+
 #endif
 #endif
index fc3dcf7ac5eb27dcf9a42bf435d95b3771ffbbca..c94090bc6a944d43caf992810a1bf41e9dc201a4 100644 (file)
@@ -18,7 +18,7 @@
  will result in an increment of IMAGER_API_LEVEL.
 */
 
  will result in an increment of IMAGER_API_LEVEL.
 */
 
-#define IMAGER_API_LEVEL 4
+#define IMAGER_API_LEVEL 6
 
 typedef struct {
   int version;
 
 typedef struct {
   int version;
@@ -156,6 +156,10 @@ typedef struct {
   void (*f_i_img_init)(i_img *);
 
   /* IMAGER_API_LEVEL 5 functions will be added here */
   void (*f_i_img_init)(i_img *);
 
   /* IMAGER_API_LEVEL 5 functions will be added here */
+  /* added i_psampf?_bits macros */
+  int (*f_i_img_is_monochrome)(i_img *, int *zero_is_white);
+
+  /* IMAGER_API_LEVEL 6 functions will be added here */
 } im_ext_funcs;
 
 #define PERL_FUNCTION_TABLE_NAME "Imager::__ext_func_table"
 } im_ext_funcs;
 
 #define PERL_FUNCTION_TABLE_NAME "Imager::__ext_func_table"
index 6759c1db41121aaba5c30a42375029cc0b41f6e0..df36a7219eabffc55c232c66e7167eba94047cf9 100644 (file)
@@ -1046,6 +1046,36 @@ Return true if the image has an alpha channel.
 =for comment
 From: File immacros.h
 
 =for comment
 From: File immacros.h
 
+=item i_img_is_monochrome(img, &zero_is_white)
+
+
+Tests an image to check it meets our monochrome tests.
+
+The idea is that a file writer can use this to test where it should
+write the image in whatever bi-level format it uses, eg. C<pbm> for
+C<pnm>.
+
+For performance of encoders we require monochrome images:
+
+=over
+
+=item *
+
+be paletted
+
+=item *
+
+have a palette of two colors, containing only C<(0,0,0)> and
+C<(255,255,255)> in either order.
+
+=back
+
+C<zero_is_white> is set to non-zero if the first palette entry is white.
+
+
+=for comment
+From: File image.c
+
 =item i_img_setmask(C<im>, C<ch_mask>)
 
 Set the image channel mask for C<im> to C<ch_mask>.
 =item i_img_setmask(C<im>, C<ch_mask>)
 
 Set the image channel mask for C<im> to C<ch_mask>.
index 3564e4bfc7f75b09949343e1e0a4a87e392765e1..16f53d91bc6ddf7f95cc9e663ea11b00d940afed 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use Test::More;
 use Imager qw(:all);
 
 use Test::More;
 use Imager qw(:all);
 
-i_has_format("tiff")
+$Imager::formats{"tiff"}
   and plan skip_all => "tiff support available - this tests the lack of it";
 
 plan tests => 12;
   and plan skip_all => "tiff support available - this tests the lack of it";
 
 plan tests => 12;
diff --git a/t/t106tiff.t b/t/t106tiff.t
deleted file mode 100644 (file)
index 62f3f72..0000000
+++ /dev/null
@@ -1,730 +0,0 @@
-#!perl -w
-use strict;
-use Test::More;
-use Imager qw(:all);
-use Imager::Test qw(is_image is_image_similar test_image test_image_16 test_image_double test_image_raw);
-
-i_has_format("tiff")
-  or plan skip_all => "no tiff support";
-
-plan tests => 215;
-
-$|=1;  # give us some progress in the test harness
-init_log("testout/t106tiff.log",1);
-
-my $green=i_color_new(0,255,0,255);
-my $blue=i_color_new(0,0,255,255);
-my $red=i_color_new(255,0,0,255);
-
-my $img=test_image_raw();
-
-my $ver_string = Imager::i_tiff_libversion();
-ok(my ($full, $major, $minor, $point) = 
-   $ver_string =~ /Version +((\d+)\.(\d+).(\d+))/,
-   "extract library version")
-  or diag("Could not extract from:\n$ver_string");
-diag("libtiff release $full") if $full;
-# make something we can compare
-my $cmp_ver = sprintf("%03d%03d%03d", $major, $minor, $point);
-if ($cmp_ver lt '003007000') {
-  diag("You have an old version of libtiff - $full, some tests will be skipped");
-}
-
-Imager::i_tags_add($img, "i_xres", 0, "300", 0);
-Imager::i_tags_add($img, "i_yres", 0, undef, 250);
-# resolutionunit is centimeters
-Imager::i_tags_add($img, "tiff_resolutionunit", 0, undef, 3);
-Imager::i_tags_add($img, "tiff_software", 0, "t106tiff.t", 0);
-open(FH,">testout/t106.tiff") || die "cannot open testout/t106.tiff for writing\n";
-binmode(FH); 
-my $IO = Imager::io_new_fd(fileno(FH));
-ok(i_writetiff_wiol($img, $IO), "write low level")
-  or print "# ", Imager->_error_as_msg, "\n";
-close(FH);
-
-open(FH,"testout/t106.tiff") or die "cannot open testout/t106.tiff\n";
-binmode(FH);
-$IO = Imager::io_new_fd(fileno(FH));
-my $cmpimg = i_readtiff_wiol($IO, -1);
-ok($cmpimg, "read low-level");
-
-close(FH);
-
-print "# tiff average mean square pixel difference: ",sqrt(i_img_diff($img,$cmpimg))/150*150,"\n";
-
-ok(!i_img_diff($img, $cmpimg), "compare written and read image");
-
-# check the tags are ok
-my %tags = map { Imager::i_tags_get($cmpimg, $_) }
-  0 .. Imager::i_tags_count($cmpimg) - 1;
-ok(abs($tags{i_xres} - 300) < 0.5, "i_xres in range");
-ok(abs($tags{i_yres} - 250) < 0.5, "i_yres in range");
-is($tags{tiff_resolutionunit}, 3, "tiff_resolutionunit");
-is($tags{tiff_software}, 't106tiff.t', "tiff_software");
-is($tags{tiff_photometric}, 2, "tiff_photometric"); # PHOTOMETRIC_RGB is 2
-is($tags{tiff_bitspersample}, 8, "tiff_bitspersample");
-
-$IO = Imager::io_new_bufchain();
-
-ok(Imager::i_writetiff_wiol($img, $IO), "write to buffer chain");
-my $tiffdata = Imager::io_slurp($IO);
-
-open(FH,"testout/t106.tiff");
-binmode FH;
-my $odata;
-{ local $/;
-  $odata = <FH>;
-}
-
-is($odata, $tiffdata, "same data in file as in memory");
-
-# test Micksa's tiff writer
-# a shortish fax page
-my $faximg = Imager::ImgRaw::new(1728, 2000, 1);
-my $black = i_color_new(0,0,0,255);
-my $white = i_color_new(255,255,255,255);
-# vaguely test-patterny
-i_box_filled($faximg, 0, 0, 1728, 2000, $white);
-i_box_filled($faximg, 100,100,1628, 200, $black);
-my $width = 1;
-my $pos = 100;
-while ($width+$pos < 1628) {
-  i_box_filled($faximg, $pos, 300, $pos+$width-1, 400, $black);
-  $pos += $width + 20;
-  $width += 2;
-}
-open FH, "> testout/t106tiff_fax.tiff"
-  or die "Cannot create testout/t106tiff_fax.tiff: $!";
-binmode FH;
-$IO = Imager::io_new_fd(fileno(FH));
-ok(i_writetiff_wiol_faxable($faximg, $IO, 1), "write faxable, low level");
-close FH;
-
-# test the OO interface
-my $ooim = Imager->new;
-ok($ooim->read(file=>'testout/t106.tiff'), "read OO");
-ok($ooim->write(file=>'testout/t106_oo.tiff'), "write OO");
-
-# OO with the fax image
-my $oofim = Imager->new;
-ok($oofim->read(file=>'testout/t106tiff_fax.tiff'),
-   "read fax OO");
-
-# this should have tags set for the resolution
-%tags = map @$_, $oofim->tags;
-is($tags{i_xres}, 204, "fax i_xres");
-is($tags{i_yres}, 196, "fax i_yres");
-ok(!$tags{i_aspect_only}, "i_aspect_only");
-# resunit_inches
-is($tags{tiff_resolutionunit}, 2, "tiff_resolutionunit");
-is($tags{tiff_bitspersample}, 1, "tiff_bitspersample");
-is($tags{tiff_photometric}, 0, "tiff_photometric");
-
-ok($oofim->write(file=>'testout/t106_oo_fax.tiff', class=>'fax'),
-   "write OO, faxable");
-
-# the following should fail since there's no type and no filename
-my $oodata;
-ok(!$ooim->write(data=>\$oodata), "write with no type and no filename to guess with");
-
-# OO to data
-ok($ooim->write(data=>\$oodata, type=>'tiff'), "write to data")
-  or print "# ",$ooim->errstr, "\n";
-is($oodata, $tiffdata, "check data matches between memory and file");
-
-# make sure we can write non-fine mode
-ok($oofim->write(file=>'testout/t106_oo_faxlo.tiff', class=>'fax', fax_fine=>0), "write OO, fax standard mode");
-
-# paletted reads
-my $img4 = Imager->new;
-ok($img4->read(file=>'testimg/comp4.tif'), "reading 4-bit paletted")
-  or print "# ", $img4->errstr, "\n";
-is($img4->type, 'paletted', "image isn't paletted");
-print "# colors: ", $img4->colorcount,"\n";
-  cmp_ok($img4->colorcount, '<=', 16, "more than 16 colors!");
-#ok($img4->write(file=>'testout/t106_was4.ppm'),
-#   "Cannot write img4");
-# I know I'm using BMP before it's test, but comp4.tif started life 
-# as comp4.bmp
-my $bmp4 = Imager->new;
-ok($bmp4->read(file=>'testimg/comp4.bmp'), "reading 4-bit bmp!");
-my $diff = i_img_diff($img4->{IMG}, $bmp4->{IMG});
-print "# diff $diff\n";
-ok($diff == 0, "image mismatch");
-my $img4t = Imager->new;
-ok($img4t->read(file => 'testimg/comp4t.tif'), "read 4-bit paletted, tiled")
-  or print "# ", $img4t->errstr, "\n";
-is_image($bmp4, $img4t, "check tiled version matches");
-my $img8 = Imager->new;
-ok($img8->read(file=>'testimg/comp8.tif'), "reading 8-bit paletted");
-is($img8->type, 'paletted', "image isn't paletted");
-print "# colors: ", $img8->colorcount,"\n";
-#ok($img8->write(file=>'testout/t106_was8.ppm'),
-#   "Cannot write img8");
-ok($img8->colorcount == 256, "more colors than expected");
-my $bmp8 = Imager->new;
-ok($bmp8->read(file=>'testimg/comp8.bmp'), "reading 8-bit bmp!");
-$diff = i_img_diff($img8->{IMG}, $bmp8->{IMG});
-print "# diff $diff\n";
-ok($diff == 0, "image mismatch");
-my $bad = Imager->new;
-ok($bad->read(file=>'testimg/comp4bad.tif', 
-             allow_incomplete=>1), "bad image not returned");
-ok(scalar $bad->tags(name=>'i_incomplete'), "incomplete tag not set");
-ok($img8->write(file=>'testout/t106_pal8.tif'), "writing 8-bit paletted");
-my $cmp8 = Imager->new;
-ok($cmp8->read(file=>'testout/t106_pal8.tif'),
-   "reading 8-bit paletted");
-#print "# ",$cmp8->errstr,"\n";
-is($cmp8->type, 'paletted', "pal8 isn't paletted");
-is($cmp8->colorcount, 256, "pal8 bad colorcount");
-$diff = i_img_diff($img8->{IMG}, $cmp8->{IMG});
-print "# diff $diff\n";
-ok($diff == 0, "written image doesn't match read");
-ok($img4->write(file=>'testout/t106_pal4.tif'), "writing 4-bit paletted");
-ok(my $cmp4 = Imager->new->read(file=>'testout/t106_pal4.tif'),
-   "reading 4-bit paletted");
-is($cmp4->type, 'paletted', "pal4 isn't paletted");
-is($cmp4->colorcount, 16, "pal4 bad colorcount");
-$diff = i_img_diff($img4->{IMG}, $cmp4->{IMG});
-print "# diff $diff\n";
-ok($diff == 0, "written image doesn't match read");
-
-my $work;
-my $seekpos;
-sub io_writer {
-  my ($what) = @_;
-  if ($seekpos > length $work) {
-    $work .= "\0" x ($seekpos - length $work);
-  }
-  substr($work, $seekpos, length $what) = $what;
-  $seekpos += length $what;
-  
-  1;
-}
-sub io_reader {
-  my ($size, $maxread) = @_;
-  #print "io_reader($size, $maxread) pos $seekpos\n";
-  my $out = substr($work, $seekpos, $maxread);
-  $seekpos += length $out;
-  $out;
-}
-sub io_reader2 {
-  my ($size, $maxread) = @_;
-  #print "io_reader2($size, $maxread) pos $seekpos\n";
-  my $out = substr($work, $seekpos, $size);
-  $seekpos += length $out;
-  $out;
-}
-use IO::Seekable;
-sub io_seeker {
-  my ($offset, $whence) = @_;
-  #print "io_seeker($offset, $whence)\n";
-  if ($whence == SEEK_SET) {
-    $seekpos = $offset;
-  }
-  elsif ($whence == SEEK_CUR) {
-    $seekpos += $offset;
-  }
-  else { # SEEK_END
-    $seekpos = length($work) + $offset;
-  }
-  #print "-> $seekpos\n";
-  $seekpos;
-}
-my $did_close;
-sub io_closer {
-  ++$did_close;
-}
-
-# read via cb
-$work = $tiffdata;
-$seekpos = 0;
-my $IO2 = Imager::io_new_cb(undef, \&io_reader, \&io_seeker, undef);
-ok($IO2, "new readcb obj");
-my $img5 = i_readtiff_wiol($IO2, -1);
-ok($img5, "read via cb");
-ok(i_img_diff($img5, $img) == 0, "read from cb diff");
-
-# read via cb2
-$work = $tiffdata;
-$seekpos = 0;
-my $IO3 = Imager::io_new_cb(undef, \&io_reader2, \&io_seeker, undef);
-ok($IO3, "new readcb2 obj");
-my $img6 = i_readtiff_wiol($IO3, -1);
-ok($img6, "read via cb2");
-ok(i_img_diff($img6, $img) == 0, "read from cb2 diff");
-
-# write via cb
-$work = '';
-$seekpos = 0;
-my $IO4 = Imager::io_new_cb(\&io_writer, \&io_reader, \&io_seeker,
-                           \&io_closer);
-ok($IO4, "new writecb obj");
-ok(i_writetiff_wiol($img, $IO4), "write to cb");
-is($work, $odata, "write cb match");
-ok($did_close, "write cb did close");
-open D1, ">testout/d1.tiff" or die;
-print D1 $work;
-close D1;
-open D2, ">testout/d2.tiff" or die;
-print D2 $tiffdata;
-close D2;
-
-# write via cb2
-$work = '';
-$seekpos = 0;
-$did_close = 0;
-my $IO5 = Imager::io_new_cb(\&io_writer, \&io_reader, \&io_seeker,
-                           \&io_closer, 1);
-ok($IO5, "new writecb obj 2");
-ok(i_writetiff_wiol($img, $IO5), "write to cb2");
-is($work, $odata, "write cb2 match");
-ok($did_close, "write cb2 did close");
-
-open D3, ">testout/d3.tiff" or die;
-print D3 $work;
-close D3;
-
-# multi-image write/read
-my @imgs;
-push(@imgs, map $ooim->copy(), 1..3);
-for my $i (0..$#imgs) {
-  $imgs[$i]->addtag(name=>"tiff_pagename", value=>"Page ".($i+1));
-}
-my $rc = Imager->write_multi({file=>'testout/t106_multi.tif'}, @imgs);
-ok($rc, "writing multiple images to tiff");
-my @out = Imager->read_multi(file=>'testout/t106_multi.tif');
-ok(@out == @imgs, "reading multiple images from tiff");
-@out == @imgs or print "# ",scalar @out, " ",Imager->errstr,"\n";
-for my $i (0..$#imgs) {
-  ok(i_img_diff($imgs[$i]{IMG}, $out[$i]{IMG}) == 0,
-     "comparing image $i");
-  my ($tag) = $out[$i]->tags(name=>'tiff_pagename');
-  is($tag, "Page ".($i+1),
-     "tag doesn't match original image");
-}
-
-# writing even more images to tiff - we weren't handling more than five
-# correctly on read
-@imgs = map $ooim->copy(), 1..40;
-$rc = Imager->write_multi({file=>'testout/t106_multi2.tif'}, @imgs);
-ok($rc, "writing 40 images to tiff");
-@out = Imager->read_multi(file=>'testout/t106_multi2.tif');
-ok(@imgs == @out, "reading 40 images from tiff");
-# force some allocation activity - helps crash here if it's the problem
-@out = @imgs = ();
-
-# multi-image fax files
-ok(Imager->write_multi({file=>'testout/t106_faxmulti.tiff', class=>'fax'},
-                      $oofim, $oofim), "write multi fax image");
-@imgs = Imager->read_multi(file=>'testout/t106_faxmulti.tiff');
-ok(@imgs == 2, "reading multipage fax");
-ok(Imager::i_img_diff($imgs[0]{IMG}, $oofim->{IMG}) == 0,
-   "compare first fax image");
-ok(Imager::i_img_diff($imgs[1]{IMG}, $oofim->{IMG}) == 0,
-   "compare second fax image");
-
-my ($format) = $imgs[0]->tags(name=>'i_format');
-is($format, 'tiff', "check i_format tag");
-
-my $unit = $imgs[0]->tags(name=>'tiff_resolutionunit');
-ok(defined $unit && $unit == 2, "check tiff_resolutionunit tag");
-my $unitname = $imgs[0]->tags(name=>'tiff_resolutionunit_name');
-is($unitname, 'inch', "check tiff_resolutionunit_name tag");
-
-my $warned = Imager->new;
-ok($warned->read(file=>"testimg/tiffwarn.tif"), "read tiffwarn.tif");
-my ($warning) = $warned->tags(name=>'i_warning');
-ok(defined $warning && $warning =~ /unknown field with tag 28712/,
-   "check that warning tag set and correct");
-
-{ # support for reading a given page
-  # first build a simple test image
-  my $im1 = Imager->new(xsize=>50, ysize=>50);
-  $im1->box(filled=>1, color=>$blue);
-  $im1->addtag(name=>'tiff_pagename', value => "Page One");
-  my $im2 = Imager->new(xsize=>60, ysize=>60);
-  $im2->box(filled=>1, color=>$green);
-  $im2->addtag(name=>'tiff_pagename', value=>"Page Two");
-  
-  # read second page
-  my $page_file = 'testout/t106_pages.tif';
-  ok(Imager->write_multi({ file=> $page_file}, $im1, $im2),
-     "build simple multiimage for page tests");
-  my $imwork = Imager->new;
-  ok($imwork->read(file=>$page_file, page=>1),
-     "read second page");
-  is($im2->getwidth, $imwork->getwidth, "check width");
-  is($im2->getwidth, $imwork->getheight, "check height");
-  is(i_img_diff($imwork->{IMG}, $im2->{IMG}), 0,
-     "check image content");
-  my ($page_name) = $imwork->tags(name=>'tiff_pagename');
-  is($page_name, 'Page Two', "check tag we set");
-  
-  # try an out of range page
-  ok(!$imwork->read(file=>$page_file, page=>2),
-     "check out of range page");
-  is($imwork->errstr, "could not switch to page 2", "check message");
-}
-
-{ # test writing returns an error message correctly
-  # open a file read only and try to write to it
-  open TIFF, "> testout/t106_empty.tif" or die;
-  close TIFF;
-  open TIFF, "< testout/t106_empty.tif"
-    or skip "Cannot open testout/t106_empty.tif for reading", 8;
-  binmode TIFF;
-  my $im = Imager->new(xsize=>100, ysize=>100);
-  ok(!$im->write(fh => \*TIFF, type=>'tiff'),
-     "fail to write to read only handle");
-  cmp_ok($im->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
-        "check error message");
-  ok(!Imager->write_multi({ type => 'tiff', fh => \*TIFF }, $im),
-     "fail to write multi to read only handle");
-  cmp_ok(Imager->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
-        "check error message");
-  ok(!$im->write(fh => \*TIFF, type=>'tiff', class=>'fax'),
-     "fail to write to read only handle (fax)");
-  cmp_ok($im->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
-        "check error message");
-  ok(!Imager->write_multi({ type => 'tiff', fh => \*TIFF, class=>'fax' }, $im),
-     "fail to write multi to read only handle (fax)");
-  cmp_ok(Imager->errstr, '=~', 'Could not create TIFF object: Error writing TIFF header: write\(\)',
-        "check error message");
-}
-
-{ # test reading returns an error correctly - use test script as an
-  # invalid TIFF file
-  my $im = Imager->new;
-  ok(!$im->read(file=>'t/t106tiff.t', type=>'tiff'),
-     "fail to read script as image");
-  # we get different magic number values depending on the platform
-  # byte ordering
-  cmp_ok($im->errstr, '=~',
-        "Error opening file: Not a TIFF (?:or MDI )?file, bad magic number (8483 \\(0x2123\\)|8993 \\(0x2321\\))", 
-        "check error message");
-  my @ims = Imager->read_multi(file =>'t/t106tiff.t', type=>'tiff');
-  ok(!@ims, "fail to read_multi script as image");
-  cmp_ok($im->errstr, '=~',
-        "Error opening file: Not a TIFF (?:or MDI )?file, bad magic number (8483 \\(0x2123\\)|8993 \\(0x2321\\))", 
-        "check error message");
-}
-
-{ # write_multi to data
-  my $data;
-  my $im = Imager->new(xsize => 50, ysize => 50);
-  ok(Imager->write_multi({ data => \$data, type=>'tiff' }, $im, $im),
-     "write multi to in memory");
-  ok(length $data, "make sure something written");
-  my @im = Imager->read_multi(data => $data);
-  is(@im, 2, "make sure we can read it back");
-  is(Imager::i_img_diff($im[0]{IMG}, $im->{IMG}), 0,
-     "check first image");
-  is(Imager::i_img_diff($im[1]{IMG}, $im->{IMG}), 0,
-     "check second image");
-}
-
-{ # handling of an alpha channel for various images
-  my $photo_rgb = 2;
-  my $photo_cmyk = 5;
-  my $photo_cielab = 8;
-  my @alpha_images =
-    (
-     [ 'srgb.tif',    3, $photo_rgb,    '003005005' ],
-     [ 'srgba.tif',   4, $photo_rgb,    '003005005' ],
-     [ 'srgbaa.tif',  4, $photo_rgb,    '003005005' ],
-     [ 'scmyk.tif',   3, $photo_cmyk,   '003005005' ],
-     [ 'scmyka.tif',  4, $photo_cmyk,   '003005005' ],
-     [ 'scmykaa.tif', 4, $photo_cmyk,   '003005005' ],
-     [ 'slab.tif',    3, $photo_cielab, '003006001' ],
-    );
-  
-  for my $test (@alpha_images) {
-    my ($input, $channels, $photo, $need_ver) = @$test;
-    
-  SKIP: {
-      my $skipped = $channels == 4 ? 4 : 3;
-      $need_ver le $cmp_ver
-       or skip("Your ancient tifflib is buggy/limited for this test", $skipped);
-      my $im = Imager->new;
-      ok($im->read(file => "testimg/$input"),
-        "read alpha test $input")
-       or print "# ", $im->errstr, "\n";
-      is($im->getchannels, $channels, "channels for $input match");
-      is($im->tags(name=>'tiff_photometric'), $photo,
-        "photometric for $input match");
-      $channels == 4
-       or next;
-      my $c = $im->getpixel(x => 0, 'y' => 7);
-      is(($c->rgba)[3], 0, "bottom row should have 0 alpha");
-    }
-  }
-}
-
-{
-  ok(grep($_ eq 'tiff', Imager->read_types), "check tiff in read types");
-  ok(grep($_ eq 'tiff', Imager->write_types), "check tiff in write types");
-}
-
-{ # reading tile based images
-  my $im = Imager->new;
-  ok($im->read(file => 'testimg/pengtile.tif'), "read tiled image")
-    or print "# ", $im->errstr, "\n";
-  # compare it
-  my $comp = Imager->new;
-  ok($comp->read(file => 'testimg/penguin-base.ppm'), 'read comparison image');
-  is_image($im, $comp, 'compare them');
-}
-
-SKIP:
-{ # failing to read tile based images
-  # we grab our tiled image and patch a tile offset to nowhere
-  ok(open(TIFF, '< testimg/pengtile.tif'), 'open pengtile.tif')
-    or skip 'cannot open testimg/pengtile.tif', 4;
-  
-  $cmp_ver ge '003005007'
-    or skip("Your ancient tifflib has bad error handling", 4);
-  binmode TIFF;
-  my $data = do { local $/; <TIFF>; };
-  
-  # patch a tile offset
-  substr($data, 0x1AFA0, 4) = pack("H*", "00000200");
-  
-  #open PIPE, "| bytedump -a | less" or die;
-  #print PIPE $data;
-  #close PIPE;
-  
-  my $allow = Imager->new;
-  ok($allow->read(data => $data, allow_incomplete => 1),
-     "read incomplete tiled");
-  ok($allow->tags(name => 'i_incomplete'), 'i_incomplete set');
-  is($allow->tags(name => 'i_lines_read'), 173, 
-     'check i_lines_read set appropriately');
-  
-  my $fail = Imager->new;
-  ok(!$fail->read(data => $data), "read fail tiled");
-}
-
-{ # read 16-bit/sample
-  my $im16 = Imager->new;
-  ok($im16->read(file => 'testimg/rgb16.tif'), "read 16-bit rgb");
-  is($im16->bits, 16, 'got a 16-bit image');
-  my $im16t = Imager->new;
-  ok($im16t->read(file => 'testimg/rgb16t.tif'), "read 16-bit rgb tiled");
-  is($im16t->bits, 16, 'got a 16-bit image');
-  is_image($im16, $im16t, 'check they match');
-  
-  my $grey16 = Imager->new;
-  ok($grey16->read(file => 'testimg/grey16.tif'), "read 16-bit grey")
-    or print "# ", $grey16->errstr, "\n";
-  is($grey16->bits, 16, 'got a 16-bit image');
-  is($grey16->getchannels, 1, 'and its grey');
-  my $comp16 = $im16->convert(matrix => [ [ 0.299, 0.587, 0.114 ] ]);
-  is_image($grey16, $comp16, 'compare grey to converted');
-  
-  my $grey32 = Imager->new;
-  ok($grey32->read(file => 'testimg/grey32.tif'), "read 32-bit grey")
-    or print "# ", $grey32->errstr, "\n";
-  is($grey32->bits, 'double', 'got a double image');
-  is($grey32->getchannels, 2, 'and its grey + alpha');
-  is($grey32->tags(name => 'tiff_bitspersample'), 32, 
-     "check bits per sample");
-  my $base = test_image_double->convert(preset =>'grey')
-    ->convert(preset => 'addalpha');
-  is_image($grey32, $base, 'compare to original');
-}
-
-{ # read 16, 32-bit/sample and compare to the original
-  my $rgba = Imager->new;
-  ok($rgba->read(file => 'testimg/srgba.tif'),
-     "read base rgba image");
-  my $rgba16 = Imager->new;
-  ok($rgba16->read(file => 'testimg/srgba16.tif'),
-     "read 16-bit/sample rgba image");
-  is_image($rgba, $rgba16, "check they match");
-  is($rgba16->bits, 16, 'check we got the right type');
-  
-  my $rgba32 = Imager->new;
-  ok($rgba32->read(file => 'testimg/srgba32.tif'),
-     "read 32-bit/sample rgba image");
-  is_image($rgba, $rgba32, "check they match");
-  is($rgba32->bits, 'double', 'check we got the right type');
-  
-  my $cmyka16 = Imager->new;
-  ok($cmyka16->read(file => 'testimg/scmyka16.tif'),
-     "read cmyk 16-bit")
-    or print "# ", $cmyka16->errstr, "\n";
-  is($cmyka16->bits, 16, "check we got the right type");
-  is_image_similar($rgba, $cmyka16, 10, "check image data");
-
-  # tiled, non-contig, should fallback to RGBA code
-  my $rgbatsep = Imager->new;
-  ok($rgbatsep->read(file => 'testimg/rgbatsep.tif'),
-     "read tiled, separated rgba image")
-    or diag($rgbatsep->errstr);
-  is_image($rgba, $rgbatsep, "check they match");
-}
-{ # read bi-level
-  my $pbm = Imager->new;
-  ok($pbm->read(file => 'testimg/imager.pbm'), "read original pbm");
-  my $tif = Imager->new;
-  ok($tif->read(file => 'testimg/imager.tif'), "read mono tif");
-  is_image($pbm, $tif, "compare them");
-  is($tif->type, 'paletted', 'check image type');
-  is($tif->colorcount, 2, 'check we got a "mono" image');
-}
-
-{ # check alpha channels scaled correctly for fallback handler
-  my $im = Imager->new;
-  ok($im->read(file=>'testimg/alpha.tif'), 'read alpha check image');
-  my @colors =
-    (
-     [ 0, 0, 0 ],
-     [ 255, 255, 255 ],
-     [ 127, 0, 127 ],
-     [ 127, 127, 0 ],
-    );
-  my @alphas = ( 255, 191, 127, 63 );
-  my $ok = 1;
-  my $msg = 'alpha check ok';
- CHECKER:
-  for my $y (0 .. 3) {
-    for my $x (0 .. 3) {
-      my $c = $im->getpixel(x => $x, 'y' => $y);
-      my @c = $c->rgba;
-      my $alpha = pop @c;
-      if ($alpha != $alphas[$y]) {
-       $ok = 0;
-       $msg = "($x,$y) alpha mismatch $alpha vs $alphas[$y]";
-       last CHECKER;
-      }
-      my $expect = $colors[$x];
-      for my $ch (0 .. 2) {
-       if (abs($expect->[$ch]-$c[$ch]) > 3) {
-         $ok = 0;
-         $msg = "($x,$y)[$ch] color mismatch got $c[$ch] vs expected $expect->[$ch]";
-         last CHECKER;
-       }
-      }
-    }
-  }
-  ok($ok, $msg);
-}
-
-{ # check alpha channels scaled correctly for greyscale
-  my $im = Imager->new;
-  ok($im->read(file=>'testimg/gralpha.tif'), 'read alpha check grey image');
-  my @greys = ( 0, 255, 52, 112 );
-  my @alphas = ( 255, 191, 127, 63 );
-  my $ok = 1;
-  my $msg = 'alpha check ok';
- CHECKER:
-  for my $y (0 .. 3) {
-    for my $x (0 .. 3) {
-      my $c = $im->getpixel(x => $x, 'y' => $y);
-      my ($grey, $alpha) = $c->rgba;
-      if ($alpha != $alphas[$y]) {
-       $ok = 0;
-       $msg = "($x,$y) alpha mismatch $alpha vs $alphas[$y]";
-       last CHECKER;
-      }
-      if (abs($greys[$x] - $grey) > 3) {
-       $ok = 0;
-       $msg = "($x,$y) grey mismatch $grey vs $greys[$x]";
-       last CHECKER;
-      }
-    }
-  }
-  ok($ok, $msg);
-}
-
-{ # 16-bit writes
-  my $orig = test_image_16();
-  my $data;
-  ok($orig->write(data => \$data, type => 'tiff', 
-                 tiff_compression => 'none'), "write 16-bit/sample");
-  my $im = Imager->new;
-  ok($im->read(data => $data), "read it back");
-  is_image($im, $orig, "check read data matches");
-  is($im->tags(name => 'tiff_bitspersample'), 16, "correct bits");
-  is($im->bits, 16, 'check image bits');
-  is($im->tags(name => 'tiff_photometric'), 2, "correct photometric");
-    is($im->tags(name => 'tiff_compression'), 'none', "no compression");
-  is($im->getchannels, 3, 'correct channels');
-}
-
-{ # 8-bit writes
-  # and check compression
-  my $compress = Imager::i_tiff_has_compression('lzw') ? 'lzw' : 'packbits';
-  my $orig = test_image()->convert(preset=>'grey')
-    ->convert(preset => 'addalpha');
-  my $data;
-  ok($orig->write(data => \$data, type => 'tiff',
-                 tiff_compression=> $compress),
-     "write 8 bit")
-    or print "# ", $orig->errstr, "\n";
-  my $im = Imager->new;
-  ok($im->read(data => $data), "read it back");
-  is_image($im, $orig, "check read data matches");
-  is($im->tags(name => 'tiff_bitspersample'), 8, 'correct bits');
-  is($im->bits, 8, 'check image bits');
-  is($im->tags(name => 'tiff_photometric'), 1, 'correct photometric');
-  is($im->tags(name => 'tiff_compression'), $compress,
-     "$compress compression");
-  is($im->getchannels, 2, 'correct channels');
-}
-
-{ # double writes
-  my $orig = test_image_double()->convert(preset=>'addalpha');
-  my $data;
-  ok($orig->write(data => \$data, type => 'tiff', 
-                 tiff_compression => 'none'), 
-     "write 32-bit/sample from double")
-    or print "# ", $orig->errstr, "\n";
-  my $im = Imager->new;
-  ok($im->read(data => $data), "read it back");
-  is_image($im, $orig, "check read data matches");
-  is($im->tags(name => 'tiff_bitspersample'), 32, "correct bits");
-  is($im->bits, 'double', 'check image bits');
-  is($im->tags(name => 'tiff_photometric'), 2, "correct photometric");
-  is($im->tags(name => 'tiff_compression'), 'none', "no compression");
-  is($im->getchannels, 4, 'correct channels');
-}
-
-{ # bilevel
-  my $im = test_image()->convert(preset => 'grey')
-    ->to_paletted(make_colors => 'mono',
-                 translate => 'errdiff');
-  my $faxdata;
-  
-  # fax compression is written as miniswhite
-  ok($im->write(data => \$faxdata, type => 'tiff', 
-               tiff_compression => 'fax3'),
-     "write bilevel fax compressed");
-  my $fax = Imager->new;
-  ok($fax->read(data => $faxdata), "read it back");
-  ok($fax->is_bilevel, "got a bi-level image back");
-  is($fax->tags(name => 'tiff_compression'), 'fax3',
-     "check fax compression used");
-  is_image($fax, $im, "compare to original");
-  
-  # other compresion written as minisblack
-  my $packdata;
-  ok($im->write(data => \$packdata, type => 'tiff',
-               tiff_compression => 'jpeg'),
-     "write bilevel packbits compressed");
-  my $packim = Imager->new;
-  ok($packim->read(data => $packdata), "read it back");
-  ok($packim->is_bilevel, "got a bi-level image back");
-  is($packim->tags(name => 'tiff_compression'), 'packbits',
-     "check fallback compression used");
-  is_image($packim, $im, "compare to original");
-}
-
-{ # fallback handling of tiff
-  is(Imager::i_tiff_has_compression('none'), 1, "can always do uncompresed");
-  is(Imager::i_tiff_has_compression('xxx'), '', "can't do xxx compression");
-}
-
-
index 1da09f02ba8f3378fe005862d12ceb20f942e752..ff38449d44445c99eda86dff2397d17d5994da2e 100644 (file)
@@ -45,7 +45,7 @@ my %files;
                  { file => "testimg/test.raw", xsize=>150, ysize=>150, type=>'raw', interleave => 0},
                  { file => "testimg/penguin-base.ppm"  },
                  { file => "GIF/testimg/expected.gif"  },
                  { file => "testimg/test.raw", xsize=>150, ysize=>150, type=>'raw', interleave => 0},
                  { file => "testimg/penguin-base.ppm"  },
                  { file => "GIF/testimg/expected.gif"  },
-                 { file => "testimg/comp8.tif" },
+                 { file => "TIFF/testimg/comp8.tif" },
                   { file => "testimg/winrgb24.bmp" },
                   { file => "testimg/test.tga" }, );
 my %writeopts =
                   { file => "testimg/winrgb24.bmp" },
                   { file => "testimg/test.tga" }, );
 my %writeopts =
index 5f7836da0fef3c21e7fa42ffdab484998eab6a0b..f19036881e97903131a8f9b56ba7f9da7387ad74 100644 (file)
@@ -4,7 +4,7 @@ use Imager;
 use Imager::Test qw(is_image);
 use Test::More;
 
 use Imager::Test qw(is_image);
 use Test::More;
 
-Imager::i_has_format("tiff")
+$Imager::formats{"tiff"}
   or plan skip_all => "no tiff support";
 
 plan tests => 2;
   or plan skip_all => "no tiff support";
 
 plan tests => 2;
diff --git a/testimg/alpha.tif b/testimg/alpha.tif
deleted file mode 100644 (file)
index b56a9a0..0000000
Binary files a/testimg/alpha.tif and /dev/null differ
diff --git a/testimg/comp4.tif b/testimg/comp4.tif
deleted file mode 100755 (executable)
index d561948..0000000
Binary files a/testimg/comp4.tif and /dev/null differ
diff --git a/testimg/comp4bad.tif b/testimg/comp4bad.tif
deleted file mode 100755 (executable)
index 015ec3f..0000000
Binary files a/testimg/comp4bad.tif and /dev/null differ
diff --git a/testimg/comp4t.tif b/testimg/comp4t.tif
deleted file mode 100644 (file)
index 0140a27..0000000
Binary files a/testimg/comp4t.tif and /dev/null differ
diff --git a/testimg/comp8.tif b/testimg/comp8.tif
deleted file mode 100755 (executable)
index 5dc4f32..0000000
Binary files a/testimg/comp8.tif and /dev/null differ
diff --git a/testimg/gralpha.tif b/testimg/gralpha.tif
deleted file mode 100644 (file)
index 7fa6def..0000000
Binary files a/testimg/gralpha.tif and /dev/null differ
diff --git a/testimg/grey16.tif b/testimg/grey16.tif
deleted file mode 100755 (executable)
index 9dc3a21..0000000
Binary files a/testimg/grey16.tif and /dev/null differ
diff --git a/testimg/grey32.tif b/testimg/grey32.tif
deleted file mode 100644 (file)
index a3844b8..0000000
Binary files a/testimg/grey32.tif and /dev/null differ
diff --git a/testimg/imager.tif b/testimg/imager.tif
deleted file mode 100644 (file)
index 8c2bfed..0000000
Binary files a/testimg/imager.tif and /dev/null differ
diff --git a/testimg/pengtile.tif b/testimg/pengtile.tif
deleted file mode 100644 (file)
index de7c5a2..0000000
Binary files a/testimg/pengtile.tif and /dev/null differ
diff --git a/testimg/rgb16.tif b/testimg/rgb16.tif
deleted file mode 100644 (file)
index 19fa32b..0000000
Binary files a/testimg/rgb16.tif and /dev/null differ
diff --git a/testimg/rgb16t.tif b/testimg/rgb16t.tif
deleted file mode 100644 (file)
index 4ae3247..0000000
Binary files a/testimg/rgb16t.tif and /dev/null differ
diff --git a/testimg/rgbatsep.tif b/testimg/rgbatsep.tif
deleted file mode 100644 (file)
index f1f88f3..0000000
Binary files a/testimg/rgbatsep.tif and /dev/null differ
diff --git a/testimg/scmyk.tif b/testimg/scmyk.tif
deleted file mode 100644 (file)
index 58a39c7..0000000
Binary files a/testimg/scmyk.tif and /dev/null differ
diff --git a/testimg/scmyka.tif b/testimg/scmyka.tif
deleted file mode 100644 (file)
index 582bb42..0000000
Binary files a/testimg/scmyka.tif and /dev/null differ
diff --git a/testimg/scmyka16.tif b/testimg/scmyka16.tif
deleted file mode 100644 (file)
index e24fbd4..0000000
Binary files a/testimg/scmyka16.tif and /dev/null differ
diff --git a/testimg/scmykaa.tif b/testimg/scmykaa.tif
deleted file mode 100644 (file)
index 5145d8d..0000000
Binary files a/testimg/scmykaa.tif and /dev/null differ
diff --git a/testimg/slab.tif b/testimg/slab.tif
deleted file mode 100644 (file)
index 1750daa..0000000
Binary files a/testimg/slab.tif and /dev/null differ
diff --git a/testimg/srgb.tif b/testimg/srgb.tif
deleted file mode 100644 (file)
index 003c9ea..0000000
Binary files a/testimg/srgb.tif and /dev/null differ
diff --git a/testimg/srgba.tif b/testimg/srgba.tif
deleted file mode 100644 (file)
index dbe2bbe..0000000
Binary files a/testimg/srgba.tif and /dev/null differ
diff --git a/testimg/srgba16.tif b/testimg/srgba16.tif
deleted file mode 100644 (file)
index e6d8e5f..0000000
Binary files a/testimg/srgba16.tif and /dev/null differ
diff --git a/testimg/srgba32.tif b/testimg/srgba32.tif
deleted file mode 100644 (file)
index 7725f5f..0000000
Binary files a/testimg/srgba32.tif and /dev/null differ
diff --git a/testimg/srgbaa.tif b/testimg/srgbaa.tif
deleted file mode 100644 (file)
index 3214858..0000000
Binary files a/testimg/srgbaa.tif and /dev/null differ
diff --git a/testimg/tiffwarn.tif b/testimg/tiffwarn.tif
deleted file mode 100644 (file)
index bdc7029..0000000
Binary files a/testimg/tiffwarn.tif and /dev/null differ
diff --git a/tiff.c b/tiff.c
deleted file mode 100644 (file)
index 23a0e82..0000000
--- a/tiff.c
+++ /dev/null
@@ -1,2565 +0,0 @@
-#include "imager.h"
-#include <tiffio.h>
-#include "iolayer.h"
-#include "imageri.h"
-
-/* needed to implement our substitute TIFFIsCODECConfigured */
-#if TIFFLIB_VERSION < 20031121
-static int TIFFIsCODECConfigured(uint16 scheme);
-#endif
-
-/*
-=head1 NAME
-
-tiff.c - implements reading and writing tiff files, uses io layer.
-
-=head1 SYNOPSIS
-
-   io_glue *ig = io_new_fd( fd );
-   i_img *im   = i_readtiff_wiol(ig, -1); // no limit on how much is read
-   // or 
-   io_glue *ig = io_new_fd( fd );
-   return_code = i_writetiff_wiol(im, ig); 
-
-=head1 DESCRIPTION
-
-tiff.c implements the basic functions to read and write tiff files.
-It uses the iolayer and needs either a seekable source or an entire
-memory mapped buffer.
-
-=head1 FUNCTION REFERENCE
-
-Some of these functions are internal.
-
-=over
-
-=cut
-*/
-
-#define byteswap_macro(x) \
-     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |     \
-      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
-
-#define CLAMP8(x) ((x) < 0 ? 0 : (x) > 255 ? 255 : (x))
-#define CLAMP16(x) ((x) < 0 ? 0 : (x) > 65535 ? 65535 : (x))
-
-struct tag_name {
-  char *name;
-  uint32 tag;
-};
-
-static i_img *read_one_rgb_tiled(TIFF *tif, int width, int height, int allow_incomplete);
-static i_img *read_one_rgb_lines(TIFF *tif, int width, int height, int allow_incomplete);
-
-static struct tag_name text_tag_names[] =
-{
-  { "tiff_documentname", TIFFTAG_DOCUMENTNAME, },
-  { "tiff_imagedescription", TIFFTAG_IMAGEDESCRIPTION, },
-  { "tiff_make", TIFFTAG_MAKE, },
-  { "tiff_model", TIFFTAG_MODEL, },
-  { "tiff_pagename", TIFFTAG_PAGENAME, },
-  { "tiff_software", TIFFTAG_SOFTWARE, },
-  { "tiff_datetime", TIFFTAG_DATETIME, },
-  { "tiff_artist", TIFFTAG_ARTIST, },
-  { "tiff_hostcomputer", TIFFTAG_HOSTCOMPUTER, },
-};
-
-static struct tag_name 
-compress_values[] =
-  {
-    { "none",     COMPRESSION_NONE },
-    { "ccittrle", COMPRESSION_CCITTRLE },
-    { "fax3",     COMPRESSION_CCITTFAX3 },
-    { "t4",       COMPRESSION_CCITTFAX3 },
-    { "fax4",     COMPRESSION_CCITTFAX4 },
-    { "t6",       COMPRESSION_CCITTFAX4 },
-    { "lzw",      COMPRESSION_LZW },
-    { "jpeg",     COMPRESSION_JPEG },
-    { "packbits", COMPRESSION_PACKBITS },
-    { "deflate",  COMPRESSION_ADOBE_DEFLATE },
-    { "zip",      COMPRESSION_ADOBE_DEFLATE },
-    { "oldzip",   COMPRESSION_DEFLATE },
-    { "ccittrlew", COMPRESSION_CCITTRLEW },
-  };
-
-static const int compress_value_count = 
-  sizeof(compress_values) / sizeof(*compress_values);
-
-static int 
-myTIFFIsCODECConfigured(uint16 scheme);
-
-typedef struct read_state_tag read_state_t;
-/* the setup function creates the image object, allocates the line buffer */
-typedef int (*read_setup_t)(read_state_t *state);
-
-/* the putter writes the image data provided by the getter to the
-   image, x, y, width, height describe the target area of the image,
-   extras is the extra number of pixels stored for each scanline in
-   the raster buffer, (for tiles against the right side of the
-   image) */
-
-typedef int (*read_putter_t)(read_state_t *state, int x, int y, int width, 
-                            int height, int extras);
-
-/* reads from a tiled or strip image and calls the putter.
-   This may need a second type for handling non-contiguous images
-   at some point */
-typedef int (*read_getter_t)(read_state_t *state, read_putter_t putter);
-
-struct read_state_tag {
-  TIFF *tif;
-  i_img *img;
-  void *raster;
-  unsigned long pixels_read;
-  int allow_incomplete;
-  void *line_buf;
-  uint32 width, height;
-  uint16 bits_per_sample;
-  uint16 photometric;
-
-  /* the total number of channels (samples per pixel) */
-  int samples_per_pixel;
-
-  /* if non-zero, which channel is the alpha channel, typically 3 for rgb */
-  int alpha_chan;
-
-  /* whether or not to scale the color channels based on the alpha
-     channel.  TIFF has 2 types of alpha channel, if the alpha channel
-     we use is EXTRASAMPLE_ASSOCALPHA then the color data will need to
-     be scaled to match Imager's conventions */
-  int scale_alpha;
-};
-
-static int tile_contig_getter(read_state_t *state, read_putter_t putter);
-static int strip_contig_getter(read_state_t *state, read_putter_t putter);
-
-static int setup_paletted(read_state_t *state);
-static int paletted_putter8(read_state_t *, int, int, int, int, int);
-static int paletted_putter4(read_state_t *, int, int, int, int, int);
-
-static int setup_16_rgb(read_state_t *state);
-static int setup_16_grey(read_state_t *state);
-static int putter_16(read_state_t *, int, int, int, int, int);
-
-static int setup_8_rgb(read_state_t *state);
-static int setup_8_grey(read_state_t *state);
-static int putter_8(read_state_t *, int, int, int, int, int);
-
-static int setup_32_rgb(read_state_t *state);
-static int setup_32_grey(read_state_t *state);
-static int putter_32(read_state_t *, int, int, int, int, int);
-
-static int setup_bilevel(read_state_t *state);
-static int putter_bilevel(read_state_t *, int, int, int, int, int);
-
-static int setup_cmyk8(read_state_t *state);
-static int putter_cmyk8(read_state_t *, int, int, int, int, int);
-
-static int setup_cmyk16(read_state_t *state);
-static int putter_cmyk16(read_state_t *, int, int, int, int, int);
-
-static const int text_tag_count = 
-  sizeof(text_tag_names) / sizeof(*text_tag_names);
-
-static void error_handler(char const *module, char const *fmt, va_list ap) {
-  mm_log((1, "tiff error fmt %s\n", fmt));
-  i_push_errorvf(0, fmt, ap);
-}
-
-#define WARN_BUFFER_LIMIT 10000
-static char *warn_buffer = NULL;
-static int warn_buffer_size = 0;
-
-static void warn_handler(char const *module, char const *fmt, va_list ap) {
-  char buf[1000];
-
-  buf[0] = '\0';
-#ifdef HAVE_SNPRINTF
-  vsnprintf(buf, sizeof(buf), fmt, ap);
-#else
-  vsprintf(buf, fmt, ap);
-#endif
-  mm_log((1, "tiff warning %s\n", buf));
-
-  if (!warn_buffer || strlen(warn_buffer)+strlen(buf)+2 > warn_buffer_size) {
-    int new_size = warn_buffer_size + strlen(buf) + 2;
-    char *old_buffer = warn_buffer;
-    if (new_size > WARN_BUFFER_LIMIT) {
-      new_size = WARN_BUFFER_LIMIT;
-    }
-    warn_buffer = myrealloc(warn_buffer, new_size);
-    if (!old_buffer) *warn_buffer = '\0';
-    warn_buffer_size = new_size;
-  }
-  if (strlen(warn_buffer)+strlen(buf)+2 <= warn_buffer_size) {
-    strcat(warn_buffer, buf);
-    strcat(warn_buffer, "\n");
-  }
-}
-
-static int save_tiff_tags(TIFF *tif, i_img *im);
-
-static void 
-pack_4bit_to(unsigned char *dest, const unsigned char *src, int count);
-
-
-static toff_t sizeproc(thandle_t x) {
-       return 0;
-}
-
-
-/*
-=item comp_seek(h, o, w)
-
-Compatability for 64 bit systems like latest freebsd (internal)
-
-   h - tiff handle, cast an io_glue object
-   o - offset
-   w - whence
-
-=cut
-*/
-
-static
-toff_t
-comp_seek(thandle_t h, toff_t o, int w) {
-  io_glue *ig = (io_glue*)h;
-  return (toff_t) ig->seekcb(ig, o, w);
-}
-
-/*
-=item comp_mmap(thandle_t, tdata_t*, toff_t*)
-
-Dummy mmap stub.
-
-This shouldn't ever be called but newer tifflibs want it anyway.
-
-=cut
-*/
-
-static 
-int
-comp_mmap(thandle_t h, tdata_t*p, toff_t*off) {
-  return -1;
-}
-
-/*
-=item comp_munmap(thandle_t h, tdata_t p, toff_t off)
-
-Dummy munmap stub.
-
-This shouldn't ever be called but newer tifflibs want it anyway.
-
-=cut
-*/
-
-static void
-comp_munmap(thandle_t h, tdata_t p, toff_t off) {
-  /* do nothing */
-}
-
-static i_img *read_one_tiff(TIFF *tif, int allow_incomplete) {
-  i_img *im;
-  uint32 width, height;
-  uint16 samples_per_pixel;
-  int tiled, error;
-  float xres, yres;
-  uint16 resunit;
-  int gotXres, gotYres;
-  uint16 photometric;
-  uint16 bits_per_sample;
-  uint16 planar_config;
-  uint16 inkset;
-  uint16 compress;
-  int i;
-  read_state_t state;
-  read_setup_t setupf = NULL;
-  read_getter_t getterf = NULL;
-  read_putter_t putterf = NULL;
-
-  error = 0;
-
-  TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
-  TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
-  TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel);
-  tiled = TIFFIsTiled(tif);
-  TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &photometric);
-  TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &bits_per_sample);
-  TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planar_config);
-  TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
-
-  mm_log((1, "i_readtiff_wiol: width=%d, height=%d, channels=%d\n", width, height, samples_per_pixel));
-  mm_log((1, "i_readtiff_wiol: %stiled\n", tiled?"":"not "));
-  mm_log((1, "i_readtiff_wiol: %sbyte swapped\n", TIFFIsByteSwapped(tif)?"":"not "));
-
-  /* yes, this if() is horrible */
-  if (photometric == PHOTOMETRIC_PALETTE && bits_per_sample <= 8) {
-    setupf = setup_paletted;
-    if (bits_per_sample == 8)
-      putterf = paletted_putter8;
-    else if (bits_per_sample == 4)
-      putterf = paletted_putter4;
-    else
-      mm_log((1, "unsupported paletted bits_per_sample %d\n", bits_per_sample));
-  }
-  else if (bits_per_sample == 16 
-          && photometric == PHOTOMETRIC_RGB
-          && samples_per_pixel >= 3) {
-    setupf = setup_16_rgb;
-    putterf = putter_16;
-  }
-  else if (bits_per_sample == 16
-          && photometric == PHOTOMETRIC_MINISBLACK) {
-    setupf = setup_16_grey;
-    putterf = putter_16;
-  }
-  else if (bits_per_sample == 8
-          && photometric == PHOTOMETRIC_MINISBLACK) {
-    setupf = setup_8_grey;
-    putterf = putter_8;
-  }
-  else if (bits_per_sample == 8
-          && photometric == PHOTOMETRIC_RGB) {
-    setupf = setup_8_rgb;
-    putterf = putter_8;
-  }
-  else if (bits_per_sample == 32 
-          && photometric == PHOTOMETRIC_RGB
-          && samples_per_pixel >= 3) {
-    setupf = setup_32_rgb;
-    putterf = putter_32;
-  }
-  else if (bits_per_sample == 32
-          && photometric == PHOTOMETRIC_MINISBLACK) {
-    setupf = setup_32_grey;
-    putterf = putter_32;
-  }
-  else if (bits_per_sample == 1
-          && (photometric == PHOTOMETRIC_MINISBLACK
-              || photometric == PHOTOMETRIC_MINISWHITE)
-          && samples_per_pixel == 1) {
-    setupf = setup_bilevel;
-    putterf = putter_bilevel;
-  }
-  else if (bits_per_sample == 8
-          && photometric == PHOTOMETRIC_SEPARATED
-          && inkset == INKSET_CMYK
-          && samples_per_pixel >= 4) {
-    setupf = setup_cmyk8;
-    putterf = putter_cmyk8;
-  }
-  else if (bits_per_sample == 16
-          && photometric == PHOTOMETRIC_SEPARATED
-          && inkset == INKSET_CMYK
-          && samples_per_pixel >= 4) {
-    setupf = setup_cmyk16;
-    putterf = putter_cmyk16;
-  }
-  if (tiled) {
-    if (planar_config == PLANARCONFIG_CONTIG)
-      getterf = tile_contig_getter;
-  }
-  else {
-    if (planar_config == PLANARCONFIG_CONTIG)
-      getterf = strip_contig_getter;
-  }
-  if (setupf && getterf && putterf) {
-    unsigned long total_pixels = (unsigned long)width * height;
-    memset(&state, 0, sizeof(state));
-    state.tif = tif;
-    state.allow_incomplete = allow_incomplete;
-    state.width = width;
-    state.height = height;
-    state.bits_per_sample = bits_per_sample;
-    state.samples_per_pixel = samples_per_pixel;
-    state.photometric = photometric;
-
-    if (!setupf(&state))
-      return NULL;
-    if (!getterf(&state, putterf) || !state.pixels_read) {
-      if (state.img)
-       i_img_destroy(state.img);
-      if (state.raster)
-       _TIFFfree(state.raster);
-      if (state.line_buf)
-       myfree(state.line_buf);
-      
-      return NULL;
-    }
-
-    if (allow_incomplete && state.pixels_read < total_pixels) {
-      i_tags_setn(&(state.img->tags), "i_incomplete", 1);
-      i_tags_setn(&(state.img->tags), "i_lines_read", 
-                 state.pixels_read / width);
-    }
-    im = state.img;
-    
-    if (state.raster)
-      _TIFFfree(state.raster);
-    if (state.line_buf)
-      myfree(state.line_buf);
-  }
-  else {
-    if (tiled) {
-      im = read_one_rgb_tiled(tif, width, height, allow_incomplete);
-    }
-    else {
-      im = read_one_rgb_lines(tif, width, height, allow_incomplete);
-    }
-  }
-
-  if (!im)
-    return NULL;
-
-  /* general metadata */
-  i_tags_addn(&im->tags, "tiff_bitspersample", 0, bits_per_sample);
-  i_tags_addn(&im->tags, "tiff_photometric", 0, photometric);
-  TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress);
-    
-  /* resolution tags */
-  TIFFGetFieldDefaulted(tif, TIFFTAG_RESOLUTIONUNIT, &resunit);
-  gotXres = TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres);
-  gotYres = TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres);
-  if (gotXres || gotYres) {
-    if (!gotXres)
-      xres = yres;
-    else if (!gotYres)
-      yres = xres;
-    i_tags_addn(&im->tags, "tiff_resolutionunit", 0, resunit);
-    if (resunit == RESUNIT_CENTIMETER) {
-      /* from dots per cm to dpi */
-      xres *= 2.54;
-      yres *= 2.54;
-      i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "centimeter", -1, 0);
-    }
-    else if (resunit == RESUNIT_NONE) {
-      i_tags_addn(&im->tags, "i_aspect_only", 0, 1);
-      i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "none", -1, 0);
-    }
-    else if (resunit == RESUNIT_INCH) {
-      i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "inch", -1, 0);
-    }
-    else {
-      i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "unknown", -1, 0);
-    }
-    /* tifflib doesn't seem to provide a way to get to the original rational
-       value of these, which would let me provide a more reasonable
-       precision. So make up a number. */
-    i_tags_set_float2(&im->tags, "i_xres", 0, xres, 6);
-    i_tags_set_float2(&im->tags, "i_yres", 0, yres, 6);
-  }
-
-  /* Text tags */
-  for (i = 0; i < text_tag_count; ++i) {
-    char *data;
-    if (TIFFGetField(tif, text_tag_names[i].tag, &data)) {
-      mm_log((1, "i_readtiff_wiol: tag %d has value %s\n", 
-             text_tag_names[i].tag, data));
-      i_tags_add(&im->tags, text_tag_names[i].name, 0, data, 
-                strlen(data), 0);
-    }
-  }
-
-  i_tags_add(&im->tags, "i_format", 0, "tiff", -1, 0);
-  if (warn_buffer && *warn_buffer) {
-    i_tags_add(&im->tags, "i_warning", 0, warn_buffer, -1, 0);
-    *warn_buffer = '\0';
-  }
-
-  for (i = 0; i < compress_value_count; ++i) {
-    if (compress_values[i].tag == compress) {
-      i_tags_add(&im->tags, "tiff_compression", 0, compress_values[i].name, -1, 0);
-      break;
-    }
-  }
-  
-  return im;
-}
-
-/*
-=item i_readtiff_wiol(im, ig)
-
-=cut
-*/
-i_img*
-i_readtiff_wiol(io_glue *ig, int allow_incomplete, int page) {
-  TIFF* tif;
-  TIFFErrorHandler old_handler;
-  TIFFErrorHandler old_warn_handler;
-  i_img *im;
-
-  i_clear_error();
-  old_handler = TIFFSetErrorHandler(error_handler);
-  old_warn_handler = TIFFSetWarningHandler(warn_handler);
-  if (warn_buffer)
-    *warn_buffer = '\0';
-
-  /* Add code to get the filename info from the iolayer */
-  /* Also add code to check for mmapped code */
-
-  io_glue_commit_types(ig);
-  mm_log((1, "i_readtiff_wiol(ig %p, allow_incomplete %d, page %d)\n", ig, allow_incomplete, page));
-  
-  tif = TIFFClientOpen("(Iolayer)", 
-                      "rm", 
-                      (thandle_t) ig,
-                      (TIFFReadWriteProc) ig->readcb,
-                      (TIFFReadWriteProc) ig->writecb,
-                      (TIFFSeekProc) comp_seek,
-                      (TIFFCloseProc) ig->closecb,
-                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
-                      (TIFFMapFileProc) comp_mmap,
-                      (TIFFUnmapFileProc) comp_munmap);
-  
-  if (!tif) {
-    mm_log((1, "i_readtiff_wiol: Unable to open tif file\n"));
-    i_push_error(0, "Error opening file");
-    TIFFSetErrorHandler(old_handler);
-    TIFFSetWarningHandler(old_warn_handler);
-    return NULL;
-  }
-
-  if (page != 0) {
-    if (!TIFFSetDirectory(tif, page)) {
-      mm_log((1, "i_readtiff_wiol: Unable to switch to directory %d\n", page));
-      i_push_errorf(0, "could not switch to page %d", page);
-      TIFFSetErrorHandler(old_handler);
-      TIFFSetWarningHandler(old_warn_handler);
-      TIFFClose(tif);
-      return NULL;
-    }
-  }
-
-  im = read_one_tiff(tif, allow_incomplete);
-
-  if (TIFFLastDirectory(tif)) mm_log((1, "Last directory of tiff file\n"));
-  TIFFSetErrorHandler(old_handler);
-  TIFFSetWarningHandler(old_warn_handler);
-  TIFFClose(tif);
-  return im;
-}
-
-/*
-=item i_readtiff_multi_wiol(ig, length, *count)
-
-Reads multiple images from a TIFF.
-
-=cut
-*/
-i_img**
-i_readtiff_multi_wiol(io_glue *ig, int length, int *count) {
-  TIFF* tif;
-  TIFFErrorHandler old_handler;
-  TIFFErrorHandler old_warn_handler;
-  i_img **results = NULL;
-  int result_alloc = 0;
-  int dirnum = 0;
-
-  i_clear_error();
-  old_handler = TIFFSetErrorHandler(error_handler);
-  old_warn_handler = TIFFSetWarningHandler(warn_handler);
-  if (warn_buffer)
-    *warn_buffer = '\0';
-
-  /* Add code to get the filename info from the iolayer */
-  /* Also add code to check for mmapped code */
-
-  io_glue_commit_types(ig);
-  mm_log((1, "i_readtiff_wiol(ig %p, length %d)\n", ig, length));
-  
-  tif = TIFFClientOpen("(Iolayer)", 
-                      "rm", 
-                      (thandle_t) ig,
-                      (TIFFReadWriteProc) ig->readcb,
-                      (TIFFReadWriteProc) ig->writecb,
-                      (TIFFSeekProc) comp_seek,
-                      (TIFFCloseProc) ig->closecb,
-                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
-                      (TIFFMapFileProc) comp_mmap,
-                      (TIFFUnmapFileProc) comp_munmap);
-  
-  if (!tif) {
-    mm_log((1, "i_readtiff_wiol: Unable to open tif file\n"));
-    i_push_error(0, "Error opening file");
-    TIFFSetErrorHandler(old_handler);
-    TIFFSetWarningHandler(old_warn_handler);
-    return NULL;
-  }
-
-  *count = 0;
-  do {
-    i_img *im = read_one_tiff(tif, 0);
-    if (!im)
-      break;
-    if (++*count > result_alloc) {
-      if (result_alloc == 0) {
-        result_alloc = 5;
-        results = mymalloc(result_alloc * sizeof(i_img *));
-      }
-      else {
-        i_img **newresults;
-        result_alloc *= 2;
-        newresults = myrealloc(results, result_alloc * sizeof(i_img *));
-       if (!newresults) {
-         i_img_destroy(im); /* don't leak it */
-         break;
-       }
-       results = newresults;
-      }
-    }
-    results[*count-1] = im;
-  } while (TIFFSetDirectory(tif, ++dirnum));
-
-  TIFFSetWarningHandler(old_warn_handler);
-  TIFFSetErrorHandler(old_handler);
-  TIFFClose(tif);
-  return results;
-}
-
-undef_int
-i_writetiff_low_faxable(TIFF *tif, i_img *im, int fine) {
-  uint32 width, height;
-  unsigned char *linebuf = NULL;
-  uint32 y;
-  int rc;
-  uint32 x;
-  uint32 rowsperstrip;
-  float vres = fine ? 196 : 98;
-  int luma_chan;
-
-  width    = im->xsize;
-  height   = im->ysize;
-
-  switch (im->channels) {
-  case 1:
-  case 2:
-    luma_chan = 0;
-    break;
-  case 3:
-  case 4:
-    luma_chan = 1;
-    break;
-  default:
-    /* This means a colorspace we don't handle yet */
-    mm_log((1, "i_writetiff_wiol_faxable: don't handle %d channel images.\n", im->channels));
-    return 0;
-  }
-
-  /* Add code to get the filename info from the iolayer */
-  /* Also add code to check for mmapped code */
-
-
-  mm_log((1, "i_writetiff_wiol_faxable: width=%d, height=%d, channels=%d\n", width, height, im->channels));
-  
-  if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH,      width)   )
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField width=%d failed\n", width)); return 0; }
-  if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH,     height)  )
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField length=%d failed\n", height)); return 0; }
-  if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1))
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField samplesperpixel=1 failed\n")); return 0; }
-  if (!TIFFSetField(tif, TIFFTAG_ORIENTATION,  ORIENTATION_TOPLEFT))
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Orientation=topleft\n")); return 0; }
-  if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE,   1)        )
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField bitpersample=1\n")); return 0; }
-  if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG))
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField planarconfig\n")); return 0; }
-  if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE))
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField photometric=%d\n", PHOTOMETRIC_MINISBLACK)); return 0; }
-  if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, 3))
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField compression=3\n")); return 0; }
-
-  linebuf = (unsigned char *)_TIFFmalloc( TIFFScanlineSize(tif) );
-  
-  if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
-    mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField rowsperstrip=-1\n")); return 0; }
-
-  TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
-  TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rc);
-
-  mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField rowsperstrip=%d\n", rowsperstrip));
-  mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField scanlinesize=%d\n", TIFFScanlineSize(tif) ));
-  mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField planarconfig=%d == %d\n", rc, PLANARCONFIG_CONTIG));
-
-  if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float)204))
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Xresolution=204\n")); return 0; }
-  if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, vres))
-    { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Yresolution=196\n")); return 0; }
-  if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH)) {
-    mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField ResolutionUnit=%d\n", RESUNIT_INCH)); return 0; 
-  }
-
-  if (!save_tiff_tags(tif, im)) {
-    return 0;
-  }
-
-  for (y=0; y<height; y++) {
-    int linebufpos=0;
-    for(x=0; x<width; x+=8) { 
-      int bits;
-      int bitpos;
-      i_sample_t luma[8];
-      uint8 bitval = 128;
-      linebuf[linebufpos]=0;
-      bits = width-x; if(bits>8) bits=8;
-      i_gsamp(im, x, x+8, y, luma, &luma_chan, 1);
-      for(bitpos=0;bitpos<bits;bitpos++) {
-       linebuf[linebufpos] |= ((luma[bitpos] < 128) ? bitval : 0);
-       bitval >>= 1;
-      }
-      linebufpos++;
-    }
-    if (TIFFWriteScanline(tif, linebuf, y, 0) < 0) {
-      mm_log((1, "i_writetiff_wiol_faxable: TIFFWriteScanline failed.\n"));
-      break;
-    }
-  }
-  if (linebuf) _TIFFfree(linebuf);
-
-  return 1;
-}
-
-static uint16
-find_compression(char const *name, uint16 *compress) {
-  int i;
-
-  for (i = 0; i < compress_value_count; ++i) {
-    if (strcmp(compress_values[i].name, name) == 0) {
-      *compress = (uint16)compress_values[i].tag;
-      return 1;
-    }
-  }
-  *compress = COMPRESSION_NONE;
-
-  return 0;
-}
-
-static uint16
-get_compression(i_img *im, uint16 def_compress) {
-  int entry;
-  int value;
-
-  if (i_tags_find(&im->tags, "tiff_compression", 0, &entry)
-      && im->tags.tags[entry].data) {
-    uint16 compress;
-    if (find_compression(im->tags.tags[entry].data, &compress)
-       && myTIFFIsCODECConfigured(compress))
-      return compress;
-  }
-  if (i_tags_get_int(&im->tags, "tiff_compression", 0, &value)) {
-    if ((uint16)value == value
-       && myTIFFIsCODECConfigured((uint16)value))
-      return (uint16)value;
-  }
-
-  return def_compress;
-}
-
-int
-i_tiff_has_compression(const char *name) {
-  uint16 compress;
-
-  if (!find_compression(name, &compress))
-    return 0;
-
-  return myTIFFIsCODECConfigured(compress);
-}
-
-static int
-set_base_tags(TIFF *tif, i_img *im, uint16 compress, uint16 photometric, 
-             uint16 bits_per_sample, uint16 samples_per_pixel) {
-  double xres, yres;
-  int resunit;
-  int got_xres, got_yres;
-  int aspect_only;
-
-  if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, im->xsize)) {
-    i_push_error(0, "write TIFF: setting width tag");
-    return 0;
-  }
-  if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, im->ysize)) {
-    i_push_error(0, "write TIFF: setting length tag");
-    return 0;
-  }
-  if (!TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT)) {
-    i_push_error(0, "write TIFF: setting orientation tag");
-    return 0;
-  }
-  if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) {
-    i_push_error(0, "write TIFF: setting planar configuration tag");
-    return 0;
-  }
-  if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric)) {
-    i_push_error(0, "write TIFF: setting photometric tag");
-    return 0;
-  }
-  if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, compress)) {
-    i_push_error(0, "write TIFF: setting compression tag");
-    return 0;
-  }
-  if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bits_per_sample)) {
-    i_push_error(0, "write TIFF: setting bits per sample tag");
-    return 0;
-  }
-  if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, samples_per_pixel)) {
-    i_push_error(0, "write TIFF: setting samples per pixel tag");
-    return 0;
-  }
-
-  got_xres = i_tags_get_float(&im->tags, "i_xres", 0, &xres);
-  got_yres = i_tags_get_float(&im->tags, "i_yres", 0, &yres);
-  if (!i_tags_get_int(&im->tags, "i_aspect_only", 0,&aspect_only))
-    aspect_only = 0;
-  if (!i_tags_get_int(&im->tags, "tiff_resolutionunit", 0, &resunit))
-    resunit = RESUNIT_INCH;
-  if (got_xres || got_yres) {
-    if (!got_xres)
-      xres = yres;
-    else if (!got_yres)
-      yres = xres;
-    if (aspect_only) {
-      resunit = RESUNIT_NONE;
-    }
-    else {
-      if (resunit == RESUNIT_CENTIMETER) {
-       xres /= 2.54;
-       yres /= 2.54;
-      }
-      else {
-       resunit  = RESUNIT_INCH;
-      }
-    }
-    if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, (float)xres)) {
-      i_push_error(0, "write TIFF: setting xresolution tag");
-      return 0;
-    }
-    if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, (float)yres)) {
-      i_push_error(0, "write TIFF: setting yresolution tag");
-      return 0;
-    }
-    if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, (uint16)resunit)) {
-      i_push_error(0, "write TIFF: setting resolutionunit tag");
-      return 0;
-    }
-  }
-
-  return 1;
-}
-
-static int 
-write_one_bilevel(TIFF *tif, i_img *im, int zero_is_white) {
-  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
-  uint16 photometric;
-  unsigned char *in_row;
-  unsigned char *out_row;
-  unsigned out_size;
-  int x, y;
-  int invert;
-
-  mm_log((1, "tiff - write_one_bilevel(tif %p, im %p, zero_is_white %d)\n", 
-         tif, im, zero_is_white));
-
-  /* ignore a silly choice */
-  if (compress == COMPRESSION_JPEG)
-    compress = COMPRESSION_PACKBITS;
-
-  switch (compress) {
-  case COMPRESSION_CCITTRLE:
-  case COMPRESSION_CCITTFAX3:
-  case COMPRESSION_CCITTFAX4:
-    /* natural fax photometric */
-    photometric = PHOTOMETRIC_MINISWHITE;
-    break;
-
-  default:
-    /* natural for most computer images */
-    photometric = PHOTOMETRIC_MINISBLACK;
-    break;
-  }
-
-  if (!set_base_tags(tif, im, compress, photometric, 1, 1))
-    return 0;
-
-  if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
-    i_push_error(0, "write TIFF: setting rows per strip tag");
-    return 0; 
-  }
-
-  out_size = TIFFScanlineSize(tif);
-  out_row = (unsigned char *)_TIFFmalloc( out_size );
-  in_row = mymalloc(im->xsize);
-
-  invert = (photometric == PHOTOMETRIC_MINISWHITE) != (zero_is_white != 0);
-
-  for (y = 0; y < im->ysize; ++y) {
-    int mask = 0x80;
-    unsigned char *outp = out_row;
-    memset(out_row, 0, out_size);
-    i_gpal(im, 0, im->xsize, y, in_row);
-    for (x = 0; x < im->xsize; ++x) {
-      if (invert ? !in_row[x] : in_row[x]) {
-       *outp |= mask;
-      }
-      mask >>= 1;
-      if (!mask) {
-       ++outp;
-       mask = 0x80;
-      }
-    }
-    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
-      _TIFFfree(out_row);
-      myfree(in_row);
-      i_push_error(0, "write TIFF: write scan line failed");
-      return 0;
-    }
-  }
-
-  _TIFFfree(out_row);
-  myfree(in_row);
-
-  return 1;
-}
-
-static int
-set_palette(TIFF *tif, i_img *im, int size) {
-  int count;
-  uint16 *colors;
-  uint16 *out[3];
-  i_color c;
-  int i, ch;
-  
-  colors = (uint16 *)_TIFFmalloc(sizeof(uint16) * 3 * size);
-  out[0] = colors;
-  out[1] = colors + size;
-  out[2] = colors + 2 * size;
-    
-  count = i_colorcount(im);
-  for (i = 0; i < count; ++i) {
-    i_getcolors(im, i, &c, 1);
-    for (ch = 0; ch < 3; ++ch)
-      out[ch][i] = c.channel[ch] * 257;
-  }
-  for (; i < size; ++i) {
-    for (ch = 0; ch < 3; ++ch)
-      out[ch][i] = 0;
-  }
-  if (!TIFFSetField(tif, TIFFTAG_COLORMAP, out[0], out[1], out[2])) {
-    _TIFFfree(colors);
-    i_push_error(0, "write TIFF: setting color map");
-    return 0;
-  }
-  _TIFFfree(colors);
-  
-  return 1;
-}
-
-static int
-write_one_paletted8(TIFF *tif, i_img *im) {
-  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
-  unsigned char *out_row;
-  unsigned out_size;
-  int y;
-
-  mm_log((1, "tiff - write_one_paletted8(tif %p, im %p)\n", tif, im));
-
-  /* ignore a silly choice */
-  if (compress == COMPRESSION_JPEG ||
-      compress == COMPRESSION_CCITTRLE ||
-      compress == COMPRESSION_CCITTFAX3 ||
-      compress == COMPRESSION_CCITTFAX4)
-    compress = COMPRESSION_PACKBITS;
-
-  if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
-    i_push_error(0, "write TIFF: setting rows per strip tag");
-    return 0; 
-  }
-
-  if (!set_base_tags(tif, im, compress, PHOTOMETRIC_PALETTE, 8, 1))
-    return 0;
-
-  if (!set_palette(tif, im, 256))
-    return 0;
-
-  out_size = TIFFScanlineSize(tif);
-  out_row = (unsigned char *)_TIFFmalloc( out_size );
-
-  for (y = 0; y < im->ysize; ++y) {
-    i_gpal(im, 0, im->xsize, y, out_row);
-    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
-      _TIFFfree(out_row);
-      i_push_error(0, "write TIFF: write scan line failed");
-      return 0;
-    }
-  }
-
-  _TIFFfree(out_row);
-
-  return 1;
-}
-
-static int
-write_one_paletted4(TIFF *tif, i_img *im) {
-  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
-  unsigned char *in_row;
-  unsigned char *out_row;
-  unsigned out_size;
-  int y;
-
-  mm_log((1, "tiff - write_one_paletted4(tif %p, im %p)\n", tif, im));
-
-  /* ignore a silly choice */
-  if (compress == COMPRESSION_JPEG ||
-      compress == COMPRESSION_CCITTRLE ||
-      compress == COMPRESSION_CCITTFAX3 ||
-      compress == COMPRESSION_CCITTFAX4)
-    compress = COMPRESSION_PACKBITS;
-
-  if (!set_base_tags(tif, im, compress, PHOTOMETRIC_PALETTE, 4, 1))
-    return 0;
-
-  if (!set_palette(tif, im, 16))
-    return 0;
-
-  if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
-    i_push_error(0, "write TIFF: setting rows per strip tag");
-    return 0; 
-  }
-
-  in_row = mymalloc(im->xsize);
-  out_size = TIFFScanlineSize(tif);
-  out_row = (unsigned char *)_TIFFmalloc( out_size );
-
-  for (y = 0; y < im->ysize; ++y) {
-    i_gpal(im, 0, im->xsize, y, in_row);
-    memset(out_row, 0, out_size);
-    pack_4bit_to(out_row, in_row, im->xsize);
-    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
-      _TIFFfree(out_row);
-      i_push_error(0, "write TIFF: write scan line failed");
-      return 0;
-    }
-  }
-
-  myfree(in_row);
-  _TIFFfree(out_row);
-
-  return 1;
-}
-
-static int
-set_direct_tags(TIFF *tif, i_img *im, uint16 compress, 
-               uint16 bits_per_sample) {
-  uint16 extras = EXTRASAMPLE_ASSOCALPHA;
-  uint16 extra_count = im->channels == 2 || im->channels == 4;
-  uint16 photometric = im->channels >= 3 ? 
-    PHOTOMETRIC_RGB : PHOTOMETRIC_MINISBLACK;
-
-  if (!set_base_tags(tif, im, compress, photometric, bits_per_sample, 
-                    im->channels)) {
-    return 0;
-  }
-  
-  if (extra_count) {
-    if (!TIFFSetField(tif, TIFFTAG_EXTRASAMPLES, extra_count, &extras)) {
-      i_push_error(0, "write TIFF: setting extra samples tag");
-      return 0;
-    }
-  }
-
-  if (compress == COMPRESSION_JPEG) {
-    int jpeg_quality;
-    if (i_tags_get_int(&im->tags, "tiff_jpegquality", 0, &jpeg_quality)
-       && jpeg_quality >= 0 && jpeg_quality <= 100) {
-      if (!TIFFSetField(tif, TIFFTAG_JPEGQUALITY, jpeg_quality)) {
-       i_push_error(0, "write TIFF: setting jpeg quality pseudo-tag");
-       return 0;
-      }
-    }
-  }
-
-  return 1;
-}
-
-static int 
-write_one_32(TIFF *tif, i_img *im) {
-  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
-  unsigned *in_row;
-  size_t out_size;
-  uint32 *out_row;
-  int y;
-  size_t sample_count = im->xsize * im->channels;
-  size_t sample_index;
-    
-  mm_log((1, "tiff - write_one_32(tif %p, im %p)\n", tif, im));
-
-  /* only 8 and 12 bit samples are supported by jpeg compression */
-  if (compress == COMPRESSION_JPEG)
-    compress = COMPRESSION_PACKBITS;
-
-  if (!set_direct_tags(tif, im, compress, 32))
-    return 0;
-
-  in_row = mymalloc(sample_count * sizeof(unsigned));
-  out_size = TIFFScanlineSize(tif);
-  out_row = (uint32 *)_TIFFmalloc( out_size );
-
-  for (y = 0; y < im->ysize; ++y) {
-    if (i_gsamp_bits(im, 0, im->xsize, y, in_row, NULL, im->channels, 32) <= 0) {
-      i_push_error(0, "Cannot read 32-bit samples");
-      return 0;
-    }
-    for (sample_index = 0; sample_index < sample_count; ++sample_index)
-      out_row[sample_index] = in_row[sample_index];
-    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
-      myfree(in_row);
-      _TIFFfree(out_row);
-      i_push_error(0, "write TIFF: write scan line failed");
-      return 0;
-    }
-  }
-
-  myfree(in_row);
-  _TIFFfree(out_row);
-  
-  return 1;
-}
-
-static int 
-write_one_16(TIFF *tif, i_img *im) {
-  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
-  unsigned *in_row;
-  size_t out_size;
-  uint16 *out_row;
-  int y;
-  size_t sample_count = im->xsize * im->channels;
-  size_t sample_index;
-    
-  mm_log((1, "tiff - write_one_16(tif %p, im %p)\n", tif, im));
-
-  /* only 8 and 12 bit samples are supported by jpeg compression */
-  if (compress == COMPRESSION_JPEG)
-    compress = COMPRESSION_PACKBITS;
-
-  if (!set_direct_tags(tif, im, compress, 16))
-    return 0;
-
-  in_row = mymalloc(sample_count * sizeof(unsigned));
-  out_size = TIFFScanlineSize(tif);
-  out_row = (uint16 *)_TIFFmalloc( out_size );
-
-  for (y = 0; y < im->ysize; ++y) {
-    if (i_gsamp_bits(im, 0, im->xsize, y, in_row, NULL, im->channels, 16) <= 0) {
-      i_push_error(0, "Cannot read 16-bit samples");
-      return 0;
-    }
-    for (sample_index = 0; sample_index < sample_count; ++sample_index)
-      out_row[sample_index] = in_row[sample_index];
-    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
-      myfree(in_row);
-      _TIFFfree(out_row);
-      i_push_error(0, "write TIFF: write scan line failed");
-      return 0;
-    }
-  }
-
-  myfree(in_row);
-  _TIFFfree(out_row);
-  
-  return 1;
-}
-
-static int 
-write_one_8(TIFF *tif, i_img *im) {
-  uint16 compress = get_compression(im, COMPRESSION_PACKBITS);
-  size_t out_size;
-  unsigned char *out_row;
-  int y;
-  size_t sample_count = im->xsize * im->channels;
-    
-  mm_log((1, "tiff - write_one_8(tif %p, im %p)\n", tif, im));
-
-  if (!set_direct_tags(tif, im, compress, 8))
-    return 0;
-
-  out_size = TIFFScanlineSize(tif);
-  if (out_size < sample_count)
-    out_size = sample_count;
-  out_row = (unsigned char *)_TIFFmalloc( out_size );
-
-  for (y = 0; y < im->ysize; ++y) {
-    if (i_gsamp(im, 0, im->xsize, y, out_row, NULL, im->channels) <= 0) {
-      i_push_error(0, "Cannot read 8-bit samples");
-      return 0;
-    }
-    if (TIFFWriteScanline(tif, out_row, y, 0) < 0) {
-      _TIFFfree(out_row);
-      i_push_error(0, "write TIFF: write scan line failed");
-      return 0;
-    }
-  }
-  _TIFFfree(out_row);
-  
-  return 1;
-}
-
-static int
-i_writetiff_low(TIFF *tif, i_img *im) {
-  uint32 width, height;
-  uint16 channels;
-  int zero_is_white;
-
-  width    = im->xsize;
-  height   = im->ysize;
-  channels = im->channels;
-
-  mm_log((1, "i_writetiff_low: width=%d, height=%d, channels=%d, bits=%d\n", width, height, channels, im->bits));
-  if (im->type == i_palette_type) {
-    mm_log((1, "i_writetiff_low: paletted, colors=%d\n", i_colorcount(im)));
-  }
-  
-  if (i_img_is_monochrome(im, &zero_is_white)) {
-    if (!write_one_bilevel(tif, im, zero_is_white))
-      return 0;
-  }
-  else if (im->type == i_palette_type) {
-    if (i_colorcount(im) <= 16) {
-      if (!write_one_paletted4(tif, im))
-       return 0;
-    }
-    else {
-      if (!write_one_paletted8(tif, im))
-       return 0;
-    }
-  }
-  else if (im->bits > 16) {
-    if (!write_one_32(tif, im))
-      return 0;
-  }
-  else if (im->bits > 8) {
-    if (!write_one_16(tif, im))
-      return 0;
-  }
-  else {
-    if (!write_one_8(tif, im))
-      return 0;
-  }
-
-  if (!save_tiff_tags(tif, im))
-    return 0;
-
-  return 1;
-}
-
-/*
-=item i_writetiff_multi_wiol(ig, imgs, count, fine_mode)
-
-Stores an image in the iolayer object.
-
-   ig - io_object that defines source to write to 
-   imgs,count - the images to write
-
-=cut 
-*/
-
-undef_int
-i_writetiff_multi_wiol(io_glue *ig, i_img **imgs, int count) {
-  TIFF* tif;
-  TIFFErrorHandler old_handler;
-  int i;
-
-  old_handler = TIFFSetErrorHandler(error_handler);
-
-  io_glue_commit_types(ig);
-  i_clear_error();
-  mm_log((1, "i_writetiff_multi_wiol(ig 0x%p, imgs 0x%p, count %d)\n", 
-          ig, imgs, count));
-
-  /* FIXME: Enable the mmap interface */
-  
-  tif = TIFFClientOpen("No name", 
-                      "wm",
-                      (thandle_t) ig, 
-                      (TIFFReadWriteProc) ig->readcb,
-                      (TIFFReadWriteProc) ig->writecb,
-                      (TIFFSeekProc)      comp_seek,
-                      (TIFFCloseProc)     ig->closecb, 
-                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
-                      (TIFFMapFileProc)   comp_mmap,
-                      (TIFFUnmapFileProc) comp_munmap);
-  
-
-
-  if (!tif) {
-    mm_log((1, "i_writetiff_multi_wiol: Unable to open tif file for writing\n"));
-    i_push_error(0, "Could not create TIFF object");
-    TIFFSetErrorHandler(old_handler);
-    return 0;
-  }
-
-  for (i = 0; i < count; ++i) {
-    if (!i_writetiff_low(tif, imgs[i])) {
-      TIFFClose(tif);
-      TIFFSetErrorHandler(old_handler);
-      return 0;
-    }
-
-    if (!TIFFWriteDirectory(tif)) {
-      i_push_error(0, "Cannot write TIFF directory");
-      TIFFClose(tif);
-      TIFFSetErrorHandler(old_handler);
-      return 0;
-    }
-  }
-
-  TIFFSetErrorHandler(old_handler);
-  (void) TIFFClose(tif);
-
-  return 1;
-}
-
-/*
-=item i_writetiff_multi_wiol_faxable(ig, imgs, count, fine_mode)
-
-Stores an image in the iolayer object.
-
-   ig - io_object that defines source to write to 
-   imgs,count - the images to write
-   fine_mode - select fine or normal mode fax images
-
-=cut 
-*/
-
-
-undef_int
-i_writetiff_multi_wiol_faxable(io_glue *ig, i_img **imgs, int count, int fine) {
-  TIFF* tif;
-  int i;
-  TIFFErrorHandler old_handler;
-
-  old_handler = TIFFSetErrorHandler(error_handler);
-
-  io_glue_commit_types(ig);
-  i_clear_error();
-  mm_log((1, "i_writetiff_multi_wiol(ig 0x%p, imgs 0x%p, count %d)\n", 
-          ig, imgs, count));
-
-  /* FIXME: Enable the mmap interface */
-  
-  tif = TIFFClientOpen("No name", 
-                      "wm",
-                      (thandle_t) ig, 
-                      (TIFFReadWriteProc) ig->readcb,
-                      (TIFFReadWriteProc) ig->writecb,
-                      (TIFFSeekProc)      comp_seek,
-                      (TIFFCloseProc)     ig->closecb, 
-                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
-                      (TIFFMapFileProc)   comp_mmap,
-                      (TIFFUnmapFileProc) comp_munmap);
-  
-
-
-  if (!tif) {
-    mm_log((1, "i_writetiff_mulit_wiol: Unable to open tif file for writing\n"));
-    i_push_error(0, "Could not create TIFF object");
-    TIFFSetErrorHandler(old_handler);
-    return 0;
-  }
-
-  for (i = 0; i < count; ++i) {
-    if (!i_writetiff_low_faxable(tif, imgs[i], fine)) {
-      TIFFClose(tif);
-      TIFFSetErrorHandler(old_handler);
-      return 0;
-    }
-
-    if (!TIFFWriteDirectory(tif)) {
-      i_push_error(0, "Cannot write TIFF directory");
-      TIFFClose(tif);
-      TIFFSetErrorHandler(old_handler);
-      return 0;
-    }
-  }
-
-  (void) TIFFClose(tif);
-  TIFFSetErrorHandler(old_handler);
-
-  return 1;
-}
-
-/*
-=item i_writetiff_wiol(im, ig)
-
-Stores an image in the iolayer object.
-
-   im - image object to write out
-   ig - io_object that defines source to write to 
-
-=cut 
-*/
-undef_int
-i_writetiff_wiol(i_img *img, io_glue *ig) {
-  TIFF* tif;
-  TIFFErrorHandler old_handler;
-
-  old_handler = TIFFSetErrorHandler(error_handler);
-
-  io_glue_commit_types(ig);
-  i_clear_error();
-  mm_log((1, "i_writetiff_wiol(img %p, ig 0x%p)\n", img, ig));
-
-  /* FIXME: Enable the mmap interface */
-
-  tif = TIFFClientOpen("No name", 
-                      "wm",
-                      (thandle_t) ig, 
-                      (TIFFReadWriteProc) ig->readcb,
-                      (TIFFReadWriteProc) ig->writecb,
-                      (TIFFSeekProc)      comp_seek,
-                      (TIFFCloseProc)     ig->closecb, 
-                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
-                      (TIFFMapFileProc)   comp_mmap,
-                      (TIFFUnmapFileProc) comp_munmap);
-  
-
-
-  if (!tif) {
-    mm_log((1, "i_writetiff_wiol: Unable to open tif file for writing\n"));
-    i_push_error(0, "Could not create TIFF object");
-    TIFFSetErrorHandler(old_handler);
-    return 0;
-  }
-
-  if (!i_writetiff_low(tif, img)) {
-    TIFFClose(tif);
-    TIFFSetErrorHandler(old_handler);
-    return 0;
-  }
-
-  (void) TIFFClose(tif);
-  TIFFSetErrorHandler(old_handler);
-
-  return 1;
-}
-
-
-
-/*
-=item i_writetiff_wiol_faxable(i_img *, io_glue *)
-
-Stores an image in the iolayer object in faxable tiff format.
-
-   im - image object to write out
-   ig - io_object that defines source to write to 
-
-Note, this may be rewritten to use to simply be a call to a
-lower-level function that gives more options for writing tiff at some
-point.
-
-=cut
-*/
-
-undef_int
-i_writetiff_wiol_faxable(i_img *im, io_glue *ig, int fine) {
-  TIFF* tif;
-  TIFFErrorHandler old_handler;
-
-  old_handler = TIFFSetErrorHandler(error_handler);
-
-  io_glue_commit_types(ig);
-  i_clear_error();
-  mm_log((1, "i_writetiff_wiol(img %p, ig 0x%p)\n", im, ig));
-
-  /* FIXME: Enable the mmap interface */
-  
-  tif = TIFFClientOpen("No name", 
-                      "wm",
-                      (thandle_t) ig, 
-                      (TIFFReadWriteProc) ig->readcb,
-                      (TIFFReadWriteProc) ig->writecb,
-                      (TIFFSeekProc)      comp_seek,
-                      (TIFFCloseProc)     ig->closecb, 
-                      ig->sizecb ? (TIFFSizeProc) ig->sizecb : (TIFFSizeProc) sizeproc,
-                      (TIFFMapFileProc)   comp_mmap,
-                      (TIFFUnmapFileProc) comp_munmap);
-  
-
-
-  if (!tif) {
-    mm_log((1, "i_writetiff_wiol: Unable to open tif file for writing\n"));
-    i_push_error(0, "Could not create TIFF object");
-    TIFFSetErrorHandler(old_handler);
-    return 0;
-  }
-
-  if (!i_writetiff_low_faxable(tif, im, fine)) {
-    TIFFClose(tif);
-    TIFFSetErrorHandler(old_handler);
-    return 0;
-  }
-
-  (void) TIFFClose(tif);
-  TIFFSetErrorHandler(old_handler);
-
-  return 1;
-}
-
-static int save_tiff_tags(TIFF *tif, i_img *im) {
-  int i;
-  for (i = 0; i < text_tag_count; ++i) {
-    int entry;
-    if (i_tags_find(&im->tags, text_tag_names[i].name, 0, &entry)) {
-      if (!TIFFSetField(tif, text_tag_names[i].tag, 
-                       im->tags.tags[entry].data)) {
-       i_push_errorf(0, "cannot save %s to TIFF", text_tag_names[i].name);
-       return 0;
-      }
-    }
-  }
-  return 1;
-}
-
-
-static void
-unpack_4bit_to(unsigned char *dest, const unsigned char *src, 
-              int src_byte_count) {
-  while (src_byte_count > 0) {
-    *dest++ = *src >> 4;
-    *dest++ = *src++ & 0xf;
-    --src_byte_count;
-  }
-}
-
-static void pack_4bit_to(unsigned char *dest, const unsigned char *src, 
-                        int pixel_count) {
-  int i = 0;
-  while (i < pixel_count) {
-    if ((i & 1) == 0) {
-      *dest = *src++ << 4;
-    }
-    else {
-      *dest++ |= *src++;
-    }
-    ++i;
-  }
-}
-
-static i_img *
-make_rgb(TIFF *tif, int width, int height, int *alpha_chan) {
-  uint16 photometric;
-  uint16 channels, in_channels;
-  uint16 extra_count;
-  uint16 *extras;
-
-  TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &in_channels);
-  TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &photometric);
-
-  switch (photometric) {
-  case PHOTOMETRIC_SEPARATED:
-    channels = 3;
-    break;
-  
-  case PHOTOMETRIC_MINISWHITE:
-  case PHOTOMETRIC_MINISBLACK:
-    /* the TIFF RGBA functions expand single channel grey into RGB,
-       so reduce it, we move the alpha channel into the right place 
-       if needed */
-    channels = 1;
-    break;
-
-  default:
-    channels = 3;
-    break;
-  }
-  /* TIFF images can have more than one alpha channel, but Imager can't
-     this ignores the possibility of 2 channel images with 2 alpha,
-     but there's not much I can do about that */
-  *alpha_chan = 0;
-  if (TIFFGetField(tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)
-      && extra_count) {
-    *alpha_chan = channels++;
-  }
-
-  return i_img_8_new(width, height, channels);
-}
-
-static i_img *
-read_one_rgb_lines(TIFF *tif, int width, int height, int allow_incomplete) {
-  i_img *im;
-  uint32* raster = NULL;
-  uint32 rowsperstrip, row;
-  i_color *line_buf;
-  int alpha_chan;
-  int rc;
-
-  im = make_rgb(tif, width, height, &alpha_chan);
-  if (!im)
-    return NULL;
-
-  rc = TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
-  mm_log((1, "i_readtiff_wiol: rowsperstrip=%d rc = %d\n", rowsperstrip, rc));
-  
-  if (rc != 1 || rowsperstrip==-1) {
-    rowsperstrip = height;
-  }
-  
-  raster = (uint32*)_TIFFmalloc(width * rowsperstrip * sizeof (uint32));
-  if (!raster) {
-    i_img_destroy(im);
-    i_push_error(0, "No space for raster buffer");
-    return NULL;
-  }
-
-  line_buf = mymalloc(sizeof(i_color) * width);
-  
-  for( row = 0; row < height; row += rowsperstrip ) {
-    uint32 newrows, i_row;
-    
-    if (!TIFFReadRGBAStrip(tif, row, raster)) {
-      if (allow_incomplete) {
-       i_tags_setn(&im->tags, "i_lines_read", row);
-       i_tags_setn(&im->tags, "i_incomplete", 1);
-       break;
-      }
-      else {
-       i_push_error(0, "could not read TIFF image strip");
-       _TIFFfree(raster);
-       i_img_destroy(im);
-       return NULL;
-      }
-    }
-    
-    newrows = (row+rowsperstrip > height) ? height-row : rowsperstrip;
-    mm_log((1, "newrows=%d\n", newrows));
-    
-    for( i_row = 0; i_row < newrows; i_row++ ) { 
-      uint32 x;
-      i_color *outp = line_buf;
-
-      for(x = 0; x<width; x++) {
-       uint32 temp = raster[x+width*(newrows-i_row-1)];
-       outp->rgba.r = TIFFGetR(temp);
-       outp->rgba.g = TIFFGetG(temp);
-       outp->rgba.b = TIFFGetB(temp);
-
-       if (alpha_chan) {
-         /* the libtiff RGBA code expands greyscale into RGBA, so put the
-            alpha in the right place and scale it */
-         int ch;
-         outp->channel[alpha_chan] = TIFFGetA(temp);
-         if (outp->channel[alpha_chan]) {
-           for (ch = 0; ch < alpha_chan; ++ch) {
-             outp->channel[ch] = outp->channel[ch] * 255 / outp->channel[alpha_chan];
-           }
-         }
-       }
-
-       outp++;
-      }
-      i_plin(im, 0, width, i_row+row, line_buf);
-    }
-  }
-
-  myfree(line_buf);
-  _TIFFfree(raster);
-  
-  return im;
-}
-
-/* adapted from libtiff 
-
-  libtiff's TIFFReadRGBATile succeeds even when asked to read an
-  invalid tile, which means we have no way of knowing whether the data
-  we received from it is valid or not.
-
-  So the caller here has set stoponerror to 1 so that
-  TIFFRGBAImageGet() will fail.
-
-  read_one_rgb_tiled() then takes that into account for i_incomplete
-  or failure.
- */
-static int
-myTIFFReadRGBATile(TIFFRGBAImage *img, uint32 col, uint32 row, uint32 * raster)
-
-{
-    int        ok;
-    uint32     tile_xsize, tile_ysize;
-    uint32     read_xsize, read_ysize;
-    uint32     i_row;
-
-    /*
-     * Verify that our request is legal - on a tile file, and on a
-     * tile boundary.
-     */
-    
-    TIFFGetFieldDefaulted(img->tif, TIFFTAG_TILEWIDTH, &tile_xsize);
-    TIFFGetFieldDefaulted(img->tif, TIFFTAG_TILELENGTH, &tile_ysize);
-    if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 )
-    {
-      i_push_errorf(0, "Row/col passed to myTIFFReadRGBATile() must be top"
-                   "left corner of a tile.");
-      return 0;
-    }
-
-    /*
-     * The TIFFRGBAImageGet() function doesn't allow us to get off the
-     * edge of the image, even to fill an otherwise valid tile.  So we
-     * figure out how much we can read, and fix up the tile buffer to
-     * a full tile configuration afterwards.
-     */
-
-    if( row + tile_ysize > img->height )
-        read_ysize = img->height - row;
-    else
-        read_ysize = tile_ysize;
-    
-    if( col + tile_xsize > img->width )
-        read_xsize = img->width - col;
-    else
-        read_xsize = tile_xsize;
-
-    /*
-     * Read the chunk of imagery.
-     */
-    
-    img->row_offset = row;
-    img->col_offset = col;
-
-    ok = TIFFRGBAImageGet(img, raster, read_xsize, read_ysize );
-        
-    /*
-     * If our read was incomplete we will need to fix up the tile by
-     * shifting the data around as if a full tile of data is being returned.
-     *
-     * This is all the more complicated because the image is organized in
-     * bottom to top format. 
-     */
-
-    if( read_xsize == tile_xsize && read_ysize == tile_ysize )
-        return( ok );
-
-    for( i_row = 0; i_row < read_ysize; i_row++ ) {
-        memmove( raster + (tile_ysize - i_row - 1) * tile_xsize,
-                 raster + (read_ysize - i_row - 1) * read_xsize,
-                 read_xsize * sizeof(uint32) );
-        _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize,
-                     0, sizeof(uint32) * (tile_xsize - read_xsize) );
-    }
-
-    for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) {
-        _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize,
-                     0, sizeof(uint32) * tile_xsize );
-    }
-
-    return (ok);
-}
-
-static i_img *
-read_one_rgb_tiled(TIFF *tif, int width, int height, int allow_incomplete) {
-  i_img *im;
-  uint32* raster = NULL;
-  int ok = 1;
-  uint32 row, col;
-  uint32 tile_width, tile_height;
-  unsigned long pixels = 0;
-  char         emsg[1024] = "";
-  TIFFRGBAImage img;
-  i_color *line;
-  int alpha_chan;
-  
-  im = make_rgb(tif, width, height, &alpha_chan);
-  if (!im)
-    return NULL;
-  
-  if (!TIFFRGBAImageOK(tif, emsg) 
-      || !TIFFRGBAImageBegin(&img, tif, 1, emsg)) {
-    i_push_error(0, emsg);
-    i_img_destroy(im);
-    return( 0 );
-  }
-
-  TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width);
-  TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height);
-  mm_log((1, "i_readtiff_wiol: tile_width=%d, tile_height=%d\n", tile_width, tile_height));
-  
-  raster = (uint32*)_TIFFmalloc(tile_width * tile_height * sizeof (uint32));
-  if (!raster) {
-    i_img_destroy(im);
-    i_push_error(0, "No space for raster buffer");
-    TIFFRGBAImageEnd(&img);
-    return NULL;
-  }
-  line = mymalloc(tile_width * sizeof(i_color));
-  
-  for( row = 0; row < height; row += tile_height ) {
-    for( col = 0; col < width; col += tile_width ) {
-      
-      /* Read the tile into an RGBA array */
-      if (myTIFFReadRGBATile(&img, col, row, raster)) {
-       uint32 i_row, x;
-       uint32 newrows = (row+tile_height > height) ? height-row : tile_height;
-       uint32 newcols = (col+tile_width  > width ) ? width-col  : tile_width;
-
-       mm_log((1, "i_readtiff_wiol: tile(%d, %d) newcols=%d newrows=%d\n", col, row, newcols, newrows));
-       for( i_row = 0; i_row < newrows; i_row++ ) {
-         i_color *outp = line;
-         for(x = 0; x < newcols; x++) {
-           uint32 temp = raster[x+tile_width*(tile_height-i_row-1)];
-           outp->rgba.r = TIFFGetR(temp);
-           outp->rgba.g = TIFFGetG(temp);
-           outp->rgba.b = TIFFGetB(temp);
-           outp->rgba.a = TIFFGetA(temp);
-
-           if (alpha_chan) {
-             /* the libtiff RGBA code expands greyscale into RGBA, so put the
-                alpha in the right place and scale it */
-             int ch;
-             outp->channel[alpha_chan] = TIFFGetA(temp);
-             
-             if (outp->channel[alpha_chan]) {
-               for (ch = 0; ch < alpha_chan; ++ch) {
-                 outp->channel[ch] = outp->channel[ch] * 255 / outp->channel[alpha_chan];
-               }
-             }
-           }
-
-           ++outp;
-         }
-         i_plin(im, col, col+newcols, row+i_row, line);
-       }
-       pixels += newrows * newcols;
-      }
-      else {
-       if (allow_incomplete) {
-         ok = 0;
-       }
-       else {
-         goto error;
-       }
-      }
-    }
-  }
-
-  if (!ok) {
-    if (pixels == 0) {
-      i_push_error(0, "TIFF: No image data could be read from the image");
-      goto error;
-    }
-
-    /* incomplete image */
-    i_tags_setn(&im->tags, "i_incomplete", 1);
-    i_tags_setn(&im->tags, "i_lines_read", pixels / width);
-  }
-
-  myfree(line);
-  TIFFRGBAImageEnd(&img);
-  _TIFFfree(raster);
-  
-  return im;
-
- error:
-  myfree(line);
-  _TIFFfree(raster);
-  TIFFRGBAImageEnd(&img);
-  i_img_destroy(im);
-  return NULL;
-}
-
-char const *
-i_tiff_libversion(void) {
-  return TIFFGetVersion();
-}
-
-static int 
-setup_paletted(read_state_t *state) {
-  uint16 *maps[3];
-  int i, ch;
-  int color_count = 1 << state->bits_per_sample;
-
-  state->img = i_img_pal_new(state->width, state->height, 3, 256);
-  if (!state->img)
-    return 0;
-
-  /* setup the color map */
-  if (!TIFFGetField(state->tif, TIFFTAG_COLORMAP, maps+0, maps+1, maps+2)) {
-    i_push_error(0, "Cannot get colormap for paletted image");
-    i_img_destroy(state->img);
-    return 0;
-  }
-  for (i = 0; i < color_count; ++i) {
-    i_color c;
-    for (ch = 0; ch < 3; ++ch) {
-      c.channel[ch] = Sample16To8(maps[ch][i]);
-    }
-    i_addcolors(state->img, &c, 1);
-  }
-
-  return 1;
-}
-
-static int 
-tile_contig_getter(read_state_t *state, read_putter_t putter) {
-  uint32 tile_width, tile_height;
-  uint32 this_tile_height, this_tile_width;
-  uint32 rows_left, cols_left;
-  uint32 x, y;
-
-  state->raster = _TIFFmalloc(TIFFTileSize(state->tif));
-  if (!state->raster) {
-    i_push_error(0, "tiff: Out of memory allocating tile buffer");
-    return 0;
-  }
-
-  TIFFGetField(state->tif, TIFFTAG_TILEWIDTH, &tile_width);
-  TIFFGetField(state->tif, TIFFTAG_TILELENGTH, &tile_height);
-  rows_left = state->height;
-  for (y = 0; y < state->height; y += this_tile_height) {
-    this_tile_height = rows_left > tile_height ? tile_height : rows_left;
-
-    cols_left = state->width;
-    for (x = 0; x < state->width; x += this_tile_width) {
-      this_tile_width = cols_left > tile_width ? tile_width : cols_left;
-
-      if (TIFFReadTile(state->tif,
-                      state->raster,
-                      x, y, 0, 0) < 0) {
-       if (!state->allow_incomplete) {
-         return 0;
-       }
-      }
-      else {
-       putter(state, x, y, this_tile_width, this_tile_height, tile_width - this_tile_width);
-      }
-
-      cols_left -= this_tile_width;
-    }
-
-    rows_left -= this_tile_height;
-  }
-
-  return 1;
-}
-
-static int 
-strip_contig_getter(read_state_t *state, read_putter_t putter) {
-  uint32 rows_per_strip;
-  tsize_t strip_size = TIFFStripSize(state->tif);
-  uint32 y, strip_rows, rows_left;
-
-  state->raster = _TIFFmalloc(strip_size);
-  if (!state->raster) {
-    i_push_error(0, "tiff: Out of memory allocating strip buffer");
-    return 0;
-  }
-  
-  TIFFGetFieldDefaulted(state->tif, TIFFTAG_ROWSPERSTRIP, &rows_per_strip);
-  rows_left = state->height;
-  for (y = 0; y < state->height; y += strip_rows) {
-    strip_rows = rows_left > rows_per_strip ? rows_per_strip : rows_left;
-    if (TIFFReadEncodedStrip(state->tif,
-                            TIFFComputeStrip(state->tif, y, 0),
-                            state->raster,
-                            strip_size) < 0) {
-      if (!state->allow_incomplete)
-       return 0;
-    }
-    else {
-      putter(state, 0, y, state->width, strip_rows, 0);
-    }
-    rows_left -= strip_rows;
-  }
-
-  return 1;
-}
-
-static int 
-paletted_putter8(read_state_t *state, int x, int y, int width, int height, int extras) {
-  unsigned char *p = state->raster;
-
-  state->pixels_read += (unsigned long) width * height;
-  while (height > 0) {
-    i_ppal(state->img, x, x + width, y, p);
-    p += width + extras;
-    --height;
-    ++y;
-  }
-
-  return 1;
-}
-
-static int 
-paletted_putter4(read_state_t *state, int x, int y, int width, int height, int extras) {
-  uint32 img_line_size = (width + 1) / 2;
-  uint32 skip_line_size = (width + extras + 1) / 2;
-  unsigned char *p = state->raster;
-
-  if (!state->line_buf)
-    state->line_buf = mymalloc(state->width);
-
-  state->pixels_read += (unsigned long) width * height;
-  while (height > 0) {
-    unpack_4bit_to(state->line_buf, p, img_line_size);
-    i_ppal(state->img, x, x + width, y, state->line_buf);
-    p += skip_line_size;
-    --height;
-    ++y;
-  }
-
-  return 1;
-}
-
-static void
-rgb_channels(read_state_t *state, int *out_channels) {
-  uint16 extra_count;
-  uint16 *extras;
-  
-  /* safe defaults */
-  *out_channels = 3;
-  state->alpha_chan = 0;
-  state->scale_alpha = 0;
-
-  /* plain RGB */
-  if (state->samples_per_pixel == 3)
-    return;
-  if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
-    mm_log((1, "tiff: samples != 3 but no extra samples tag\n"));
-    return;
-  }
-
-  if (!extra_count) {
-    mm_log((1, "tiff: samples != 3 but no extra samples listed"));
-    return;
-  }
-
-  ++*out_channels;
-  state->alpha_chan = 3;
-  switch (*extras) {
-  case EXTRASAMPLE_UNSPECIFIED:
-  case EXTRASAMPLE_ASSOCALPHA:
-    state->scale_alpha = 1;
-    break;
-
-  case EXTRASAMPLE_UNASSALPHA:
-    state->scale_alpha = 0;
-    break;
-
-  default:
-    mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
-           *extras));
-    state->scale_alpha = 1;
-    break;
-  }
-  mm_log((1, "tiff alpha channel %d scale %d\n", state->alpha_chan, state->scale_alpha));
-}
-
-static void
-grey_channels(read_state_t *state, int *out_channels) {
-  uint16 extra_count;
-  uint16 *extras;
-  
-  /* safe defaults */
-  *out_channels = 1;
-  state->alpha_chan = 0;
-  state->scale_alpha = 0;
-
-  /* plain grey */
-  if (state->samples_per_pixel == 1)
-    return;
-  if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
-    mm_log((1, "tiff: samples != 1 but no extra samples tag\n"));
-    return;
-  }
-
-  if (!extra_count) {
-    mm_log((1, "tiff: samples != 1 but no extra samples listed"));
-    return;
-  }
-
-  ++*out_channels;
-  state->alpha_chan = 1;
-  switch (*extras) {
-  case EXTRASAMPLE_UNSPECIFIED:
-  case EXTRASAMPLE_ASSOCALPHA:
-    state->scale_alpha = 1;
-    break;
-
-  case EXTRASAMPLE_UNASSALPHA:
-    state->scale_alpha = 0;
-    break;
-
-  default:
-    mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
-           *extras));
-    state->scale_alpha = 1;
-    break;
-  }
-}
-
-static int
-setup_16_rgb(read_state_t *state) {
-  int out_channels;
-
-  rgb_channels(state, &out_channels);
-
-  state->img = i_img_16_new(state->width, state->height, out_channels);
-  if (!state->img)
-    return 0;
-  state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
-
-  return 1;
-}
-
-static int
-setup_16_grey(read_state_t *state) {
-  int out_channels;
-
-  grey_channels(state, &out_channels);
-
-  state->img = i_img_16_new(state->width, state->height, out_channels);
-  if (!state->img)
-    return 0;
-  state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
-
-  return 1;
-}
-
-static int 
-putter_16(read_state_t *state, int x, int y, int width, int height, 
-         int row_extras) {
-  uint16 *p = state->raster;
-  int out_chan = state->img->channels;
-
-  state->pixels_read += (unsigned long) width * height;
-  while (height > 0) {
-    int i;
-    int ch;
-    unsigned *outp = state->line_buf;
-
-    for (i = 0; i < width; ++i) {
-      for (ch = 0; ch < out_chan; ++ch) {
-       outp[ch] = p[ch];
-      }
-      if (state->alpha_chan && state->scale_alpha && outp[state->alpha_chan]) {
-       for (ch = 0; ch < state->alpha_chan; ++ch) {
-         int result = 0.5 + (outp[ch] * 65535.0 / outp[state->alpha_chan]);
-         outp[ch] = CLAMP16(result);
-       }
-      }
-      p += state->samples_per_pixel;
-      outp += out_chan;
-    }
-
-    i_psamp_bits(state->img, x, x + width, y, state->line_buf, NULL, out_chan, 16);
-
-    p += row_extras * state->samples_per_pixel;
-    --height;
-    ++y;
-  }
-
-  return 1;
-}
-
-static int
-setup_8_rgb(read_state_t *state) {
-  int out_channels;
-
-  rgb_channels(state, &out_channels);
-
-  state->img = i_img_8_new(state->width, state->height, out_channels);
-  if (!state->img)
-    return 0;
-  state->line_buf = mymalloc(sizeof(unsigned) * state->width * out_channels);
-
-  return 1;
-}
-
-static int
-setup_8_grey(read_state_t *state) {
-  int out_channels;
-
-  grey_channels(state, &out_channels);
-
-  state->img = i_img_8_new(state->width, state->height, out_channels);
-  if (!state->img)
-    return 0;
-  state->line_buf = mymalloc(sizeof(i_color) * state->width * out_channels);
-
-  return 1;
-}
-
-static int 
-putter_8(read_state_t *state, int x, int y, int width, int height, 
-         int row_extras) {
-  unsigned char *p = state->raster;
-  int out_chan = state->img->channels;
-
-  state->pixels_read += (unsigned long) width * height;
-  while (height > 0) {
-    int i;
-    int ch;
-    i_color *outp = state->line_buf;
-
-    for (i = 0; i < width; ++i) {
-      for (ch = 0; ch < out_chan; ++ch) {
-       outp->channel[ch] = p[ch];
-      }
-      if (state->alpha_chan && state->scale_alpha 
-         && outp->channel[state->alpha_chan]) {
-       for (ch = 0; ch < state->alpha_chan; ++ch) {
-         int result = (outp->channel[ch] * 255 + 127) / outp->channel[state->alpha_chan];
-       
-         outp->channel[ch] = CLAMP8(result);
-       }
-      }
-      p += state->samples_per_pixel;
-      outp++;
-    }
-
-    i_plin(state->img, x, x + width, y, state->line_buf);
-
-    p += row_extras * state->samples_per_pixel;
-    --height;
-    ++y;
-  }
-
-  return 1;
-}
-
-static int
-setup_32_rgb(read_state_t *state) {
-  int out_channels;
-
-  rgb_channels(state, &out_channels);
-
-  state->img = i_img_double_new(state->width, state->height, out_channels);
-  if (!state->img)
-    return 0;
-  state->line_buf = mymalloc(sizeof(i_fcolor) * state->width);
-
-  return 1;
-}
-
-static int
-setup_32_grey(read_state_t *state) {
-  int out_channels;
-
-  grey_channels(state, &out_channels);
-
-  state->img = i_img_double_new(state->width, state->height, out_channels);
-  if (!state->img)
-    return 0;
-  state->line_buf = mymalloc(sizeof(i_fcolor) * state->width);
-
-  return 1;
-}
-
-static int 
-putter_32(read_state_t *state, int x, int y, int width, int height, 
-         int row_extras) {
-  uint32 *p = state->raster;
-  int out_chan = state->img->channels;
-
-  state->pixels_read += (unsigned long) width * height;
-  while (height > 0) {
-    int i;
-    int ch;
-    i_fcolor *outp = state->line_buf;
-
-    for (i = 0; i < width; ++i) {
-      for (ch = 0; ch < out_chan; ++ch) {
-       outp->channel[ch] = p[ch] / 4294967295.0;
-      }
-      if (state->alpha_chan && state->scale_alpha && outp->channel[state->alpha_chan]) {
-       for (ch = 0; ch < state->alpha_chan; ++ch)
-         outp->channel[ch] /= outp->channel[state->alpha_chan];
-      }
-      p += state->samples_per_pixel;
-      outp++;
-    }
-
-    i_plinf(state->img, x, x + width, y, state->line_buf);
-
-    p += row_extras * state->samples_per_pixel;
-    --height;
-    ++y;
-  }
-
-  return 1;
-}
-
-static int
-setup_bilevel(read_state_t *state) {
-  i_color black, white;
-  state->img = i_img_pal_new(state->width, state->height, 1, 256);
-  if (!state->img)
-    return 0;
-  black.channel[0] = black.channel[1] = black.channel[2] = 
-    black.channel[3] = 0;
-  white.channel[0] = white.channel[1] = white.channel[2] = 
-    white.channel[3] = 255;
-  if (state->photometric == PHOTOMETRIC_MINISBLACK) {
-    i_addcolors(state->img, &black, 1);
-    i_addcolors(state->img, &white, 1);
-  }
-  else {
-    i_addcolors(state->img, &white, 1);
-    i_addcolors(state->img, &black, 1);
-  }
-  state->line_buf = mymalloc(state->width);
-
-  return 1;
-}
-
-static int 
-putter_bilevel(read_state_t *state, int x, int y, int width, int height, 
-              int row_extras) {
-  unsigned char *line_in = state->raster;
-  size_t line_size = (width + row_extras + 7) / 8;
-  
-  /* tifflib returns the bits in MSB2LSB order even when the file is
-     in LSB2MSB, so we only need to handle MSB2LSB */
-  state->pixels_read += (unsigned long) width * height;
-  while (height > 0) {
-    int i;
-    unsigned char *outp = state->line_buf;
-    unsigned char *inp = line_in;
-    unsigned mask = 0x80;
-
-    for (i = 0; i < width; ++i) {
-      *outp++ = *inp & mask ? 1 : 0;
-      mask >>= 1;
-      if (!mask) {
-       ++inp;
-       mask = 0x80;
-      }
-    }
-
-    i_ppal(state->img, x, x + width, y, state->line_buf);
-
-    line_in += line_size;
-    --height;
-    ++y;
-  }
-
-  return 1;
-}
-
-static void
-cmyk_channels(read_state_t *state, int *out_channels) {
-  uint16 extra_count;
-  uint16 *extras;
-  
-  /* safe defaults */
-  *out_channels = 3;
-  state->alpha_chan = 0;
-  state->scale_alpha = 0;
-
-  /* plain CMYK */
-  if (state->samples_per_pixel == 4)
-    return;
-  if (!TIFFGetField(state->tif, TIFFTAG_EXTRASAMPLES, &extra_count, &extras)) {
-    mm_log((1, "tiff: CMYK samples != 4 but no extra samples tag\n"));
-    return;
-  }
-
-  if (!extra_count) {
-    mm_log((1, "tiff: CMYK samples != 4 but no extra samples listed"));
-    return;
-  }
-
-  ++*out_channels;
-  state->alpha_chan = 4;
-  switch (*extras) {
-  case EXTRASAMPLE_UNSPECIFIED:
-  case EXTRASAMPLE_ASSOCALPHA:
-    state->scale_alpha = 1;
-    break;
-
-  case EXTRASAMPLE_UNASSALPHA:
-    state->scale_alpha = 0;
-    break;
-
-  default:
-    mm_log((1, "tiff: unknown extra sample type %d, treating as assoc alpha\n",
-           *extras));
-    state->scale_alpha = 1;
-    break;
-  }
-}
-
-static int
-setup_cmyk8(read_state_t *state) {
-  int channels;
-
-  cmyk_channels(state, &channels);
-  state->img = i_img_8_new(state->width, state->height, channels);
-
-  state->line_buf = mymalloc(sizeof(i_color) * state->width);
-
-  return 1;
-}
-
-static int 
-putter_cmyk8(read_state_t *state, int x, int y, int width, int height, 
-              int row_extras) {
-  unsigned char *p = state->raster;
-
-  state->pixels_read += (unsigned long) width * height;
-  while (height > 0) {
-    int i;
-    int ch;
-    i_color *outp = state->line_buf;
-
-    for (i = 0; i < width; ++i) {
-      unsigned char c, m, y, k;
-      c = p[0];
-      m = p[1];
-      y = p[2];
-      k = 255 - p[3];
-      outp->rgba.r = (k * (255 - c)) / 255;
-      outp->rgba.g = (k * (255 - m)) / 255;
-      outp->rgba.b = (k * (255 - y)) / 255;
-      if (state->alpha_chan) {
-       outp->rgba.a = p[state->alpha_chan];
-       if (state->scale_alpha 
-           && outp->rgba.a) {
-         for (ch = 0; ch < 3; ++ch) {
-           int result = (outp->channel[ch] * 255 + 127) / outp->rgba.a;
-           outp->channel[ch] = CLAMP8(result);
-         }
-       }
-      }
-      p += state->samples_per_pixel;
-      outp++;
-    }
-
-    i_plin(state->img, x, x + width, y, state->line_buf);
-
-    p += row_extras * state->samples_per_pixel;
-    --height;
-    ++y;
-  }
-
-  return 1;
-}
-
-static int
-setup_cmyk16(read_state_t *state) {
-  int channels;
-
-  cmyk_channels(state, &channels);
-  state->img = i_img_16_new(state->width, state->height, channels);
-
-  state->line_buf = mymalloc(sizeof(unsigned) * state->width * channels);
-
-  return 1;
-}
-
-static int 
-putter_cmyk16(read_state_t *state, int x, int y, int width, int height, 
-              int row_extras) {
-  uint16 *p = state->raster;
-  int out_chan = state->img->channels;
-
-  mm_log((4, "putter_cmyk16(%p, %d, %d, %d, %d, %d)\n", x, y, width, height, row_extras));
-
-  state->pixels_read += (unsigned long) width * height;
-  while (height > 0) {
-    int i;
-    int ch;
-    unsigned *outp = state->line_buf;
-
-    for (i = 0; i < width; ++i) {
-      unsigned c, m, y, k;
-      c = p[0];
-      m = p[1];
-      y = p[2];
-      k = 65535 - p[3];
-      outp[0] = (k * (65535U - c)) / 65535U;
-      outp[1] = (k * (65535U - m)) / 65535U;
-      outp[2] = (k * (65535U - y)) / 65535U;
-      if (state->alpha_chan) {
-       outp[3] = p[state->alpha_chan];
-       if (state->scale_alpha 
-           && outp[3]) {
-         for (ch = 0; ch < 3; ++ch) {
-           int result = (outp[ch] * 65535 + 32767) / outp[3];
-           outp[3] = CLAMP16(result);
-         }
-       }
-      }
-      p += state->samples_per_pixel;
-      outp += out_chan;
-    }
-
-    i_psamp_bits(state->img, x, x + width, y, state->line_buf, NULL, out_chan, 16);
-
-    p += row_extras * state->samples_per_pixel;
-    --height;
-    ++y;
-  }
-
-  return 1;
-}
-
-/*
-
-  Older versions of tifflib we support don't define this, so define it
-  ourselves.
-
-  If you want this detection to do anything useful, use a newer
-  release of tifflib.
-
- */
-#if TIFFLIB_VERSION < 20031121
-
-int 
-TIFFIsCODECConfigured(uint16 scheme) {
-  switch (scheme) {
-    /* these schemes are all shipped with tifflib */
- case COMPRESSION_NONE:
- case COMPRESSION_PACKBITS:
- case COMPRESSION_CCITTRLE:
- case COMPRESSION_CCITTRLEW:
- case COMPRESSION_CCITTFAX3:
- case COMPRESSION_CCITTFAX4:
-    return 1;
-
-    /* these require external library support */
-  default:
- case COMPRESSION_JPEG:
- case COMPRESSION_LZW:
- case COMPRESSION_DEFLATE:
- case COMPRESSION_ADOBE_DEFLATE:
-    return 0;
-  }
-}
-
-#endif
-
-static int 
-myTIFFIsCODECConfigured(uint16 scheme) {
-#if TIFFLIB_VERSION < 20040724
-  if (scheme == COMPRESSION_LZW)
-    return 0;
-#endif
-
-  return TIFFIsCODECConfigured(scheme);
-}
-
-/*
-=back
-
-=head1 AUTHOR
-
-Arnar M. Hrafnkelsson <addi@umich.edu>, Tony Cook <tony@imager.perl.org>
-
-=head1 SEE ALSO
-
-Imager(3)
-
-=cut
-*/